@workflow/core 5.0.0-beta.1 → 5.0.0-beta.11
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 +1 -1
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.js +1 -1
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.js +1 -1
- package/dist/classify-error.d.ts +11 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +56 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +147 -0
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +7 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +18 -3
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +18 -13
- package/dist/global.d.ts +4 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +28 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +77 -31
- package/dist/private.js +3 -3
- package/dist/runtime/constants.d.ts +48 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +91 -8
- package/dist/runtime/get-port-lazy.d.ts +10 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +30 -0
- package/dist/runtime/get-world-lazy.d.ts +32 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +56 -0
- package/dist/runtime/helpers.d.ts +38 -5
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +141 -25
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +191 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +5 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +31 -6
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +4 -1
- package/dist/runtime/start.js +9 -4
- package/dist/runtime/step-executor.d.ts +42 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +493 -0
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +217 -115
- package/dist/runtime/suspension-handler.d.ts +22 -4
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +90 -73
- package/dist/runtime/world-init.d.ts +75 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +75 -0
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +47 -18
- package/dist/runtime.d.ts +8 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +802 -320
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +45 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +90 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/encryption.d.ts +32 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +67 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/index.d.ts +18 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +20 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +68 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +417 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +88 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +45 -0
- package/dist/serialization/types.d.ts +228 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +21 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +16 -2
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +103 -5
- package/dist/serialization.d.ts +217 -226
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +956 -645
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +40 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +44 -6
- package/dist/step/context-storage.d.ts +16 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +44 -4
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +97 -19
- package/dist/symbols.d.ts +26 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +27 -1
- package/dist/telemetry/semantic-conventions.d.ts +2 -2
- package/dist/telemetry/semantic-conventions.js +1 -1
- package/dist/telemetry.js +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +18 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +28 -5
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +3 -2
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/vm/uuid.js +1 -1
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +260 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +3 -2
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +13 -4
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +74 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +66 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +22 -3
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +83 -31
- package/docs/api-reference/create-webhook.mdx +37 -18
- package/docs/api-reference/experimental-set-attributes.mdx +63 -0
- package/docs/api-reference/get-workflow-metadata.mdx +34 -0
- package/docs/api-reference/index.mdx +3 -0
- package/docs/foundations/cancellation.mdx +460 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- 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/versioning.mdx +263 -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/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +16 -7
- package/docs/foundations/common-patterns.mdx +0 -265
package/README.md
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AttributeChange } from '@workflow/world';
|
|
2
|
+
interface AttributeChangeOptions {
|
|
3
|
+
allowReservedAttributes?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: AttributeChangeOptions): AttributeChange[];
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=attribute-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-changes.d.ts","sourceRoot":"","sources":["../src/attribute-changes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,UAAU,sBAAsB;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,sBAA2B,GACnC,eAAe,EAAE,CA4BnB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FatalError } from '@workflow/errors';
|
|
2
|
+
import { AttributeValidationError, validateAttributeChanges, } from '@workflow/world';
|
|
3
|
+
export function normalizeAttributeChanges(attrs, options = {}) {
|
|
4
|
+
if (attrs === null || typeof attrs !== 'object' || Array.isArray(attrs)) {
|
|
5
|
+
throw new FatalError(`experimental_setAttributes requires a plain object, got ${attrs === null ? 'null' : Array.isArray(attrs) ? 'array' : typeof attrs}`);
|
|
6
|
+
}
|
|
7
|
+
const changes = Object.entries(attrs).map(([key, value]) => ({
|
|
8
|
+
key,
|
|
9
|
+
value: value === undefined ? null : value,
|
|
10
|
+
}));
|
|
11
|
+
if (changes.length === 0)
|
|
12
|
+
return changes;
|
|
13
|
+
const allowReservedAttributes = options.allowReservedAttributes === true;
|
|
14
|
+
try {
|
|
15
|
+
validateAttributeChanges(changes, { allowReservedAttributes });
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err instanceof AttributeValidationError) {
|
|
19
|
+
throw new FatalError(err.message);
|
|
20
|
+
}
|
|
21
|
+
throw err;
|
|
22
|
+
}
|
|
23
|
+
return changes;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXR0cmlidXRlLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFNekIsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUF5QyxFQUN6QyxVQUFrQyxFQUFFO0lBRXBDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxVQUFVLENBQ2xCLDJEQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQ3BFLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFzQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixHQUFHO1FBQ0gsS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztLQUMxQyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFekMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDO0lBQ3pFLElBQUksQ0FBQztRQUNILHdCQUF3QixDQUFDLE9BQU8sRUFBRSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxZQUFZLHdCQUF3QixFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEF0dHJpYnV0ZUNoYW5nZSxcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbmludGVyZmFjZSBBdHRyaWJ1dGVDaGFuZ2VPcHRpb25zIHtcbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IEF0dHJpYnV0ZUNoYW5nZU9wdGlvbnMgPSB7fVxuKTogQXR0cmlidXRlQ2hhbmdlW10ge1xuICBpZiAoYXR0cnMgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgYGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzIHJlcXVpcmVzIGEgcGxhaW4gb2JqZWN0LCBnb3QgJHtcbiAgICAgICAgYXR0cnMgPT09IG51bGwgPyAnbnVsbCcgOiBBcnJheS5pc0FycmF5KGF0dHJzKSA/ICdhcnJheScgOiB0eXBlb2YgYXR0cnNcbiAgICAgIH1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEF0dHJpYnV0ZUNoYW5nZVtdID0gT2JqZWN0LmVudHJpZXMoYXR0cnMpLm1hcChcbiAgICAoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgdmFsdWU6IHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUsXG4gICAgfSlcbiAgKTtcbiAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSByZXR1cm4gY2hhbmdlcztcblxuICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gIHRyeSB7XG4gICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKGNoYW5nZXMsIHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBdHRyaWJ1dGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBGYXRhbEVycm9yKGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG4iXX0=
|
package/dist/capabilities.js
CHANGED
|
@@ -62,4 +62,4 @@ export function getRunCapabilities(workflowCoreVersion) {
|
|
|
62
62
|
}
|
|
63
63
|
return { supportedFormats: formats };
|
|
64
64
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0sb0JBQW9CLENBQUM7QUFjNUI7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9CLEdBR3JCO0lBQ0gsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDdEUsa0JBQWtCO0lBQ2xCLDZEQUE2RDtJQUM3RCxxRUFBcUU7Q0FDdEUsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUF5QyxJQUFJLEdBQUcsQ0FBQztJQUNyRSxtQkFBbUIsQ0FBQyxVQUFVO0NBQy9CLENBQUMsQ0FBQztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQTBCLGdCQUFnQixDQUFDLENBQUM7SUFFbkUsS0FBSyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDMUQsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDYXBhYmlsaXRpZXMgdGFibGUgZm9yIHdvcmtmbG93IHJ1bnMgYmFzZWQgb24gdGhlaXIgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uLlxuICpcbiAqIFdoZW4gcmVzdW1pbmcgYSBob29rIG9yIHdlYmhvb2ssIHRoZSBwYXlsb2FkIG11c3QgYmUgZW5jb2RlZCBpbiBhIGZvcm1hdFxuICogdGhhdCB0aGUgKnRhcmdldCogd29ya2Zsb3cgcnVuJ3MgZGVwbG95bWVudCBjYW4gZGVjb2RlLiBUaGlzIG1vZHVsZSBwcm92aWRlc1xuICogYSB3YXkgdG8gbG9vayB1cCB3aGF0IHNlcmlhbGl6YXRpb24gZm9ybWF0cyBhIGdpdmVuIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvblxuICogc3VwcG9ydHMsIHNvIHRoYXQgbmV3ZXIgZGVwbG95bWVudHMgY2FuIGF2b2lkIGVuY29kaW5nIHBheWxvYWRzIGluIGZvcm1hdHNcbiAqIHRoYXQgb2xkZXIgZGVwbG95bWVudHMgZG9uJ3QgdW5kZXJzdGFuZCAoZS5nLiwgdGhlIGBlbmNyYCBlbmNyeXB0aW9uIGZvcm1hdCkuXG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IGZvcm1hdFxuICpcbiAqIFdoZW4gYSBuZXcgc2VyaWFsaXphdGlvbiBmb3JtYXQgaXMgaW50cm9kdWNlZDpcbiAqIDEuIEFkZCB0aGUgZm9ybWF0IGNvbnN0YW50IHRvIGBTZXJpYWxpemF0aW9uRm9ybWF0YCBpbiBgc2VyaWFsaXphdGlvbi50c2BcbiAqIDIuIEFkZCBhbiBlbnRyeSB0byBgRk9STUFUX1ZFUlNJT05fVEFCTEVgIGJlbG93IHdpdGggdGhlIG1pbmltdW1cbiAqICAgIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0XG4gKiAzLiBUaGUgYGdldFJ1bkNhcGFiaWxpdGllcygpYCBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBpdFxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICovXG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7XG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG4gIHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0aWVzIG9mIGEgd29ya2Zsb3cgcnVuIGJhc2VkIG9uIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ2FwYWJpbGl0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBzZXQgb2Ygc2VyaWFsaXphdGlvbiBmb3JtYXQgcHJlZml4ZXMgdGhhdCB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlLlxuICAgKiBVc2UgYHN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKWAgdG8gY2hlY2tcbiAgICogaWYgZW5jcnlwdGlvbiBpcyBzdXBwb3J0ZWQsIGV0Yy5cbiAgICovXG4gIHN1cHBvcnRlZEZvcm1hdHM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPjtcbn1cblxuLyoqXG4gKiBNYXBzIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlkZW50aWZpZXJzIHRvIHRoZSBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWBcbiAqIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uIEZvcm1hdHMgbm90IGxpc3RlZCBoZXJlIGFyZVxuICogYXNzdW1lZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucyAoZS5nLiwgYGRldmxgKS5cbiAqL1xuY29uc3QgRk9STUFUX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBtaW5WZXJzaW9uOiAnNC4yLjAtYmV0YS42NCcgfSxcbiAgLy8gRnV0dXJlIGVudHJpZXM6XG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkNCT1IsIG1pblZlcnNpb246ICc1LngueScgfSxcbiAgLy8geyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEX1YyLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG5dO1xuXG4vKipcbiAqIFRoZSBzZXQgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucywgcmVnYXJkbGVzcyBvZlxuICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uLiBUaGVzZSBhcmUgdGhlIGJhc2VsaW5lIGZvcm1hdHMgdGhhdCB3ZXJlIHByZXNlbnRcbiAqIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzcGVjVmVyc2lvbiAyIHByb3RvY29sLlxuICovXG5jb25zdCBCQVNFTElORV9GT1JNQVRTOiBSZWFkb25seVNldDxTZXJpYWxpemF0aW9uRm9ybWF0VHlwZT4gPSBuZXcgU2V0KFtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuXSk7XG5cbi8qKlxuICogTG9vayB1cCB3aGF0IHNlcmlhbGl6YXRpb24gY2FwYWJpbGl0aWVzIGEgd29ya2Zsb3cgcnVuIHN1cHBvcnRzIGJhc2VkIG9uXG4gKiBpdHMgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHN0cmluZyAoZnJvbSBgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uYCkuXG4gKlxuICogV2hlbiB0aGUgdmVyc2lvbiBpcyBgdW5kZWZpbmVkYCwgbm90IGEgc3RyaW5nLCBvciBub3QgYSB2YWxpZCBzZW12ZXIgc3RyaW5nXG4gKiAoZS5nLiB2ZXJ5IG9sZCBydW5zIHRoYXQgcHJlZGF0ZSB0aGUgZmllbGQsIG9yIGNvcnJ1cHRlZCBtZXRhZGF0YSksXG4gKiB3ZSBhc3N1bWUgdGhlIG1vc3QgY29uc2VydmF0aXZlIGNhcGFiaWxpdGllcyAoYmFzZWxpbmUgZm9ybWF0cyBvbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSdW5DYXBhYmlsaXRpZXMge1xuICBpZiAoIXdvcmtmbG93Q29yZVZlcnNpb24gfHwgIXNlbXZlci52YWxpZCh3b3JrZmxvd0NvcmVWZXJzaW9uKSkge1xuICAgIHJldHVybiB7IHN1cHBvcnRlZEZvcm1hdHM6IEJBU0VMSU5FX0ZPUk1BVFMgfTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHMgPSBuZXcgU2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPihCQVNFTElORV9GT1JNQVRTKTtcblxuICBmb3IgKGNvbnN0IHsgZm9ybWF0LCBtaW5WZXJzaW9uIH0gb2YgRk9STUFUX1ZFUlNJT05fVEFCTEUpIHtcbiAgICBpZiAoc2VtdmVyLmd0ZSh3b3JrZmxvd0NvcmVWZXJzaW9uLCBtaW5WZXJzaW9uKSkge1xuICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBzdXBwb3J0ZWRGb3JtYXRzOiBmb3JtYXRzIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V8-only (Node, Bun, Chrome, Deno). Rewrites `err.stack` so the top frame is
|
|
3
|
+
* the caller of `stackStartFn` instead of the framework function that threw.
|
|
4
|
+
* Without this, terminal overlays (Next.js, Turbopack, VS Code) render the
|
|
5
|
+
* code frame at our `throw` site inside `@workflow/core`, which is useless
|
|
6
|
+
* to the user.
|
|
7
|
+
*
|
|
8
|
+
* No-op on engines that don't expose `Error.captureStackTrace` — the stack
|
|
9
|
+
* degrades gracefully to the default behavior.
|
|
10
|
+
*
|
|
11
|
+
* Kept in its own tiny module so callers that can't participate in the
|
|
12
|
+
* `context-errors.ts` ↔ `workflow/get-workflow-metadata.ts` import cycle can
|
|
13
|
+
* still pull in the helper without pulling in the full error classes.
|
|
14
|
+
*/
|
|
15
|
+
export declare function redirectStackToCaller(err: Error, stackStartFn: Function): void;
|
|
16
|
+
//# sourceMappingURL=capture-stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-stack.d.ts","sourceRoot":"","sources":["../src/capture-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,KAAK,EAEV,YAAY,EAAE,QAAQ,GACrB,IAAI,CAON"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V8-only (Node, Bun, Chrome, Deno). Rewrites `err.stack` so the top frame is
|
|
3
|
+
* the caller of `stackStartFn` instead of the framework function that threw.
|
|
4
|
+
* Without this, terminal overlays (Next.js, Turbopack, VS Code) render the
|
|
5
|
+
* code frame at our `throw` site inside `@workflow/core`, which is useless
|
|
6
|
+
* to the user.
|
|
7
|
+
*
|
|
8
|
+
* No-op on engines that don't expose `Error.captureStackTrace` — the stack
|
|
9
|
+
* degrades gracefully to the default behavior.
|
|
10
|
+
*
|
|
11
|
+
* Kept in its own tiny module so callers that can't participate in the
|
|
12
|
+
* `context-errors.ts` ↔ `workflow/get-workflow-metadata.ts` import cycle can
|
|
13
|
+
* still pull in the helper without pulling in the full error classes.
|
|
14
|
+
*/
|
|
15
|
+
export function redirectStackToCaller(err,
|
|
16
|
+
// biome-ignore lint/complexity/noBannedTypes: signature matches Error.captureStackTrace
|
|
17
|
+
stackStartFn) {
|
|
18
|
+
const capture = Error.captureStackTrace;
|
|
19
|
+
capture?.(err, stackStartFn);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jYXB0dXJlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEdBQVU7QUFDVix3RkFBd0Y7QUFDeEYsWUFBc0I7SUFFdEIsTUFBTSxPQUFPLEdBQ1gsS0FHRCxDQUFDLGlCQUFpQixDQUFDO0lBQ3BCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWOC1vbmx5IChOb2RlLCBCdW4sIENocm9tZSwgRGVubykuIFJld3JpdGVzIGBlcnIuc3RhY2tgIHNvIHRoZSB0b3AgZnJhbWUgaXNcbiAqIHRoZSBjYWxsZXIgb2YgYHN0YWNrU3RhcnRGbmAgaW5zdGVhZCBvZiB0aGUgZnJhbWV3b3JrIGZ1bmN0aW9uIHRoYXQgdGhyZXcuXG4gKiBXaXRob3V0IHRoaXMsIHRlcm1pbmFsIG92ZXJsYXlzIChOZXh0LmpzLCBUdXJib3BhY2ssIFZTIENvZGUpIHJlbmRlciB0aGVcbiAqIGNvZGUgZnJhbWUgYXQgb3VyIGB0aHJvd2Agc2l0ZSBpbnNpZGUgYEB3b3JrZmxvdy9jb3JlYCwgd2hpY2ggaXMgdXNlbGVzc1xuICogdG8gdGhlIHVzZXIuXG4gKlxuICogTm8tb3Agb24gZW5naW5lcyB0aGF0IGRvbid0IGV4cG9zZSBgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VgIOKAlCB0aGUgc3RhY2tcbiAqIGRlZ3JhZGVzIGdyYWNlZnVsbHkgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gKlxuICogS2VwdCBpbiBpdHMgb3duIHRpbnkgbW9kdWxlIHNvIGNhbGxlcnMgdGhhdCBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiB0aGVcbiAqIGBjb250ZXh0LWVycm9ycy50c2Ag4oaUIGB3b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEudHNgIGltcG9ydCBjeWNsZSBjYW5cbiAqIHN0aWxsIHB1bGwgaW4gdGhlIGhlbHBlciB3aXRob3V0IHB1bGxpbmcgaW4gdGhlIGZ1bGwgZXJyb3IgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihcbiAgZXJyOiBFcnJvcixcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBzaWduYXR1cmUgbWF0Y2hlcyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZVxuICBzdGFja1N0YXJ0Rm46IEZ1bmN0aW9uXG4pOiB2b2lkIHtcbiAgY29uc3QgY2FwdHVyZSA9IChcbiAgICBFcnJvciBhcyB1bmtub3duIGFzIHtcbiAgICAgIGNhcHR1cmVTdGFja1RyYWNlPzogKHRhcmdldDogb2JqZWN0LCBmbjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgfVxuICApLmNhcHR1cmVTdGFja1RyYWNlO1xuICBjYXB0dXJlPy4oZXJyLCBzdGFja1N0YXJ0Rm4pO1xufVxuIl19
|
|
@@ -58,4 +58,4 @@ export function getSerializationClass(classId, global
|
|
|
58
58
|
) {
|
|
59
59
|
return getRegistry(global).get(classId);
|
|
60
60
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzcy1zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt2RDs7Ozs7R0FLRztBQUNILFNBQVMsV0FBVyxDQUFDLFNBQThCLFVBQVU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsQ0FBOEIsQ0FBQztJQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsdUJBQXVCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILHNHQUFzRztBQUN0RyxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBZSxFQUFFLEdBQWE7SUFDdkUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO1FBQ3BDLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUSxFQUFFLEtBQUs7UUFDZixVQUFVLEVBQUUsS0FBSztRQUNqQixZQUFZLEVBQUUsS0FBSztLQUNwQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQWUsRUFDZixNQUEyQjtBQUMzQixzR0FBc0c7O0lBRXRHLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGFzcyBzZXJpYWxpemF0aW9uIHV0aWxpdGllcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBzZXBhcmF0ZSBmcm9tIHByaXZhdGUudHMgdG8gYXZvaWQgcHVsbGluZyBpbiBOb2RlLmpzLW9ubHlcbiAqIGRlcGVuZGVuY2llcyAobGlrZSBhc3luY19ob29rcyB2aWEgZ2V0LWNsb3N1cmUtdmFycy50cykgd2hlbiB1c2VkIGluXG4gKiB3b3JrZmxvdyBidW5kbGVzLlxuICovXG5cbmltcG9ydCB7IFdPUktGTE9XX0NMQVNTX1JFR0lTVFJZIH0gZnJvbSAnLi9zeW1ib2xzLmpzJztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBXZSBuZWVkIHRvIHVzZSBGdW5jdGlvbiB0byByZXByZXNlbnQgY2xhc3MgY29uc3RydWN0b3JzXG50eXBlIENsYXNzUmVnaXN0cnkgPSBNYXA8c3RyaW5nLCBGdW5jdGlvbj47XG5cbi8qKlxuICogR2V0IG9yIGNyZWF0ZSB0aGUgY2xhc3MgcmVnaXN0cnkgb24gdGhlIGdpdmVuIGdsb2JhbCBvYmplY3QuXG4gKiBUaGlzIHdvcmtzIGlzb21vcnBoaWNhbGx5IGluIGJvdGggc3RlcCBtb2RlIChtYWluIGNvbnRleHQpIGFuZCB3b3JrZmxvdyBtb2RlIChWTSBjb250ZXh0KS5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlLiBEZWZhdWx0cyB0byBnbG9iYWxUaGlzLCBidXQgY2FuIGJlIGEgVk0ncyBnbG9iYWwuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMpOiBDbGFzc1JlZ2lzdHJ5IHtcbiAgY29uc3QgZyA9IGdsb2JhbCBhcyBhbnk7XG4gIGxldCByZWdpc3RyeSA9IGdbV09SS0ZMT1dfQ0xBU1NfUkVHSVNUUlldIGFzIENsYXNzUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG4gIGlmICghcmVnaXN0cnkpIHtcbiAgICByZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICBnW1dPUktGTE9XX0NMQVNTX1JFR0lTVFJZXSA9IHJlZ2lzdHJ5O1xuICB9XG4gIHJldHVybiByZWdpc3RyeTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNsYXNzIGNvbnN0cnVjdG9yIGZvciBzZXJpYWxpemF0aW9uLlxuICogVGhpcyBhbGxvd3MgY2xhc3MgY29uc3RydWN0b3JzIHRvIGJlIGRlc2VyaWFsaXplZCBieSBsb29raW5nIHVwIHRoZSBjbGFzc0lkLlxuICpcbiAqIE5vdGU6IFRoZSBTV0MgcGx1Z2luIG5vdyBpbmxpbmVzIGVxdWl2YWxlbnQgcmVnaXN0cmF0aW9uIGxvZ2ljIGFzIGFcbiAqIHNlbGYtY29udGFpbmVkIElJRkUgKHVzaW5nIHRoZSBzYW1lIGdsb2JhbFRoaXMgU3ltYm9sLWtleWVkIHJlZ2lzdHJ5KSxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGltcG9ydGVkIGJ5IGdlbmVyYXRlZCBjb2RlLiBJdCBpcyByZXRhaW5lZFxuICogZm9yIHByb2dyYW1tYXRpYyB1c2UgYW5kIHRlc3RpbmcuXG4gKlxuICogQWxzbyBzZXRzIHRoZSBgY2xhc3NJZGAgcHJvcGVydHkgb24gdGhlIGNsYXNzIHNvIHRoZSBzZXJpYWxpemVyIGNhbiBmaW5kIGl0XG4gKiB3aGVuIHNlcmlhbGl6aW5nIGluc3RhbmNlcyAoZS5nLiwgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBXZSBuZWVkIHRvIHVzZSBGdW5jdGlvbiB0byByZXByZXNlbnQgY2xhc3MgY29uc3RydWN0b3JzXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZXJpYWxpemF0aW9uQ2xhc3MoY2xhc3NJZDogc3RyaW5nLCBjbHM6IEZ1bmN0aW9uKSB7XG4gIGdldFJlZ2lzdHJ5KCkuc2V0KGNsYXNzSWQsIGNscyk7XG4gIC8vIFNldCBjbGFzc0lkIG9uIHRoZSBjbGFzcyBmb3Igc2VyaWFsaXphdGlvblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xzLCAnY2xhc3NJZCcsIHtcbiAgICB2YWx1ZTogY2xhc3NJZCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgY2xhc3MgY29uc3RydWN0b3IgYnkgSUQgKHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbilcbiAqXG4gKiBAcGFyYW0gY2xhc3NJZCAtIFRoZSBjbGFzcyBJRCB0byBsb29rIHVwXG4gKiBAcGFyYW0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBvYmplY3QgdG8gY2hlY2suIFRoaXMgZW5zdXJlcyB3b3JrZmxvdyBjb2RlIHJ1bm5pbmdcbiAqICAgICAgICAgICAgICAgICBpbiBhIFZNIG9ubHkgYWNjZXNzZXMgY2xhc3NlcyByZWdpc3RlcmVkIG9uIHRoZSBWTSdzIGdsb2JhbCxcbiAqICAgICAgICAgICAgICAgICBtYXRjaGluZyBwcm9kdWN0aW9uIHNlcnZlcmxlc3MgYmVoYXZpb3Igd2hlcmUgd29ya2Zsb3cgY29kZVxuICogICAgICAgICAgICAgICAgIHJ1bnMgaW4gaXNvbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXphdGlvbkNsYXNzKFxuICBjbGFzc0lkOiBzdHJpbmcsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IFdlIG5lZWQgdG8gdXNlIEZ1bmN0aW9uIHRvIHJlcHJlc2VudCBjbGFzcyBjb25zdHJ1Y3RvcnNcbik6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFJlZ2lzdHJ5KGdsb2JhbCkuZ2V0KGNsYXNzSWQpO1xufVxuIl19
|
package/dist/classify-error.d.ts
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
import { type RunErrorCode } from '@workflow/errors';
|
|
1
|
+
import { type RunErrorCode, WorkflowWorldError } from '@workflow/errors';
|
|
2
2
|
/**
|
|
3
3
|
* Classify an error that caused a workflow run to fail.
|
|
4
4
|
*
|
|
5
5
|
* After the structural separation of infrastructure vs user code error
|
|
6
6
|
* handling, the only errors that reach the `run_failed` try/catch are:
|
|
7
7
|
* - User code errors (throws from workflow functions, propagated step failures)
|
|
8
|
-
* - WorkflowRuntimeError and subclasses (
|
|
9
|
-
*
|
|
8
|
+
* - WorkflowRuntimeError and subclasses (missing timestamps, workflow/step
|
|
9
|
+
* not registered, corrupted event log, etc.)
|
|
10
|
+
*
|
|
11
|
+
* Uses each subclass's `.is()` static (a name-based duck check) instead of
|
|
12
|
+
* a single `instanceof` check because workflows execute in a separate
|
|
13
|
+
* `vm` realm: the VM-context `WorkflowRuntimeError` and the host-context
|
|
14
|
+
* one are distinct classes, so `instanceof` returns `false` for any error
|
|
15
|
+
* thrown inside the workflow VM and we'd misclassify genuine runtime
|
|
16
|
+
* errors as user errors.
|
|
10
17
|
*/
|
|
18
|
+
export declare function isWorldContractError(err: unknown): err is WorkflowWorldError;
|
|
11
19
|
export declare function classifyRunError(err: unknown): RunErrorCode;
|
|
12
20
|
//# sourceMappingURL=classify-error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify-error.d.ts","sourceRoot":"","sources":["../src/classify-error.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"classify-error.d.ts","sourceRoot":"","sources":["../src/classify-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAKjB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AA0B1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,kBAAkB,CAe5E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAe3D"}
|
package/dist/classify-error.js
CHANGED
|
@@ -1,17 +1,67 @@
|
|
|
1
|
-
import { RUN_ERROR_CODES, WorkflowRuntimeError, } from '@workflow/errors';
|
|
1
|
+
import { CorruptedEventLogError, RUN_ERROR_CODES, RuntimeDecryptionError, StepNotRegisteredError, WorkflowNotRegisteredError, WorkflowRuntimeError, WorkflowWorldError, } from '@workflow/errors';
|
|
2
|
+
const WORLD_CONTRACT_ERROR_CODES = new Set([
|
|
3
|
+
'PARSE_ERROR',
|
|
4
|
+
'SCHEMA_VALIDATION',
|
|
5
|
+
RUN_ERROR_CODES.WORLD_CONTRACT_ERROR,
|
|
6
|
+
]);
|
|
7
|
+
/**
|
|
8
|
+
* Set of error names that should classify as generic `RUNTIME_ERROR`. Each
|
|
9
|
+
* `*.is()` static does a name-based duck check, so subclassing alone is
|
|
10
|
+
* not enough — we have to enumerate every concrete subclass we want to
|
|
11
|
+
* recognize. Keep in sync with the `WorkflowRuntimeError` class hierarchy
|
|
12
|
+
* in `@workflow/errors`.
|
|
13
|
+
*/
|
|
14
|
+
const RUNTIME_ERROR_CHECKS = [
|
|
15
|
+
WorkflowRuntimeError.is,
|
|
16
|
+
StepNotRegisteredError.is,
|
|
17
|
+
WorkflowNotRegisteredError.is,
|
|
18
|
+
// SDK-level encryption failures (most notably AES-GCM auth-tag
|
|
19
|
+
// mismatches surfacing as a native `OperationError` from
|
|
20
|
+
// `AESCipherJob.onDone`) are wrapped in `RuntimeDecryptionError` at
|
|
21
|
+
// the encryption module boundary.
|
|
22
|
+
RuntimeDecryptionError.is,
|
|
23
|
+
];
|
|
2
24
|
/**
|
|
3
25
|
* Classify an error that caused a workflow run to fail.
|
|
4
26
|
*
|
|
5
27
|
* After the structural separation of infrastructure vs user code error
|
|
6
28
|
* handling, the only errors that reach the `run_failed` try/catch are:
|
|
7
29
|
* - User code errors (throws from workflow functions, propagated step failures)
|
|
8
|
-
* - WorkflowRuntimeError and subclasses (
|
|
9
|
-
*
|
|
30
|
+
* - WorkflowRuntimeError and subclasses (missing timestamps, workflow/step
|
|
31
|
+
* not registered, corrupted event log, etc.)
|
|
32
|
+
*
|
|
33
|
+
* Uses each subclass's `.is()` static (a name-based duck check) instead of
|
|
34
|
+
* a single `instanceof` check because workflows execute in a separate
|
|
35
|
+
* `vm` realm: the VM-context `WorkflowRuntimeError` and the host-context
|
|
36
|
+
* one are distinct classes, so `instanceof` returns `false` for any error
|
|
37
|
+
* thrown inside the workflow VM and we'd misclassify genuine runtime
|
|
38
|
+
* errors as user errors.
|
|
10
39
|
*/
|
|
40
|
+
export function isWorldContractError(err) {
|
|
41
|
+
if (!WorkflowWorldError.is(err) || err.status !== undefined) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const cause = 'cause' in err ? err.cause : undefined;
|
|
45
|
+
return ((err.code !== undefined && WORLD_CONTRACT_ERROR_CODES.has(err.code)) ||
|
|
46
|
+
err.message.startsWith('Failed to parse response body for ') ||
|
|
47
|
+
err.message.startsWith('Schema validation failed for ') ||
|
|
48
|
+
(typeof cause === 'object' &&
|
|
49
|
+
cause !== null &&
|
|
50
|
+
'name' in cause &&
|
|
51
|
+
cause.name === 'ZodError'));
|
|
52
|
+
}
|
|
11
53
|
export function classifyRunError(err) {
|
|
12
|
-
if (err
|
|
13
|
-
return RUN_ERROR_CODES.
|
|
54
|
+
if (CorruptedEventLogError.is(err)) {
|
|
55
|
+
return RUN_ERROR_CODES.CORRUPTED_EVENT_LOG;
|
|
56
|
+
}
|
|
57
|
+
if (isWorldContractError(err)) {
|
|
58
|
+
return RUN_ERROR_CODES.WORLD_CONTRACT_ERROR;
|
|
59
|
+
}
|
|
60
|
+
for (const isMatch of RUNTIME_ERROR_CHECKS) {
|
|
61
|
+
if (isMatch(err)) {
|
|
62
|
+
return RUN_ERROR_CODES.RUNTIME_ERROR;
|
|
63
|
+
}
|
|
14
64
|
}
|
|
15
65
|
return RUN_ERROR_CODES.USER_ERROR;
|
|
16
66
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xhc3NpZnktZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDekMsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixlQUFlLENBQUMsb0JBQW9CO0NBQ3JDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0Isb0JBQW9CLENBQUMsRUFBRTtJQUN2QixzQkFBc0IsQ0FBQyxFQUFFO0lBQ3pCLDBCQUEwQixDQUFDLEVBQUU7SUFDN0IsK0RBQStEO0lBQy9ELHlEQUF5RDtJQUN6RCxvRUFBb0U7SUFDcEUsa0NBQWtDO0lBQ2xDLHNCQUFzQixDQUFDLEVBQUU7Q0FDMUIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUFZO0lBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckQsT0FBTyxDQUNMLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsQ0FBQztRQUM1RCxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQztRQUN2RCxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDeEIsS0FBSyxLQUFLLElBQUk7WUFDZCxNQUFNLElBQUksS0FBSztZQUNmLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVk7SUFDM0MsSUFBSSxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxPQUFPLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sZUFBZSxDQUFDLG9CQUFvQixDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDM0MsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixPQUFPLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQyxVQUFVLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcblxuY29uc3QgV09STERfQ09OVFJBQ1RfRVJST1JfQ09ERVMgPSBuZXcgU2V0KFtcbiAgJ1BBUlNFX0VSUk9SJyxcbiAgJ1NDSEVNQV9WQUxJREFUSU9OJyxcbiAgUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuXSk7XG5cbi8qKlxuICogU2V0IG9mIGVycm9yIG5hbWVzIHRoYXQgc2hvdWxkIGNsYXNzaWZ5IGFzIGdlbmVyaWMgYFJVTlRJTUVfRVJST1JgLiBFYWNoXG4gKiBgKi5pcygpYCBzdGF0aWMgZG9lcyBhIG5hbWUtYmFzZWQgZHVjayBjaGVjaywgc28gc3ViY2xhc3NpbmcgYWxvbmUgaXNcbiAqIG5vdCBlbm91Z2gg4oCUIHdlIGhhdmUgdG8gZW51bWVyYXRlIGV2ZXJ5IGNvbmNyZXRlIHN1YmNsYXNzIHdlIHdhbnQgdG9cbiAqIHJlY29nbml6ZS4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgY2xhc3MgaGllcmFyY2h5XG4gKiBpbiBgQHdvcmtmbG93L2Vycm9yc2AuXG4gKi9cbmNvbnN0IFJVTlRJTUVfRVJST1JfQ0hFQ0tTID0gW1xuICBXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyxcbiAgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvci5pcyxcbiAgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IuaXMsXG4gIC8vIFNESy1sZXZlbCBlbmNyeXB0aW9uIGZhaWx1cmVzIChtb3N0IG5vdGFibHkgQUVTLUdDTSBhdXRoLXRhZ1xuICAvLyBtaXNtYXRjaGVzIHN1cmZhY2luZyBhcyBhIG5hdGl2ZSBgT3BlcmF0aW9uRXJyb3JgIGZyb21cbiAgLy8gYEFFU0NpcGhlckpvYi5vbkRvbmVgKSBhcmUgd3JhcHBlZCBpbiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYXRcbiAgLy8gdGhlIGVuY3J5cHRpb24gbW9kdWxlIGJvdW5kYXJ5LlxuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzLFxuXTtcblxuLyoqXG4gKiBDbGFzc2lmeSBhbiBlcnJvciB0aGF0IGNhdXNlZCBhIHdvcmtmbG93IHJ1biB0byBmYWlsLlxuICpcbiAqIEFmdGVyIHRoZSBzdHJ1Y3R1cmFsIHNlcGFyYXRpb24gb2YgaW5mcmFzdHJ1Y3R1cmUgdnMgdXNlciBjb2RlIGVycm9yXG4gKiBoYW5kbGluZywgdGhlIG9ubHkgZXJyb3JzIHRoYXQgcmVhY2ggdGhlIGBydW5fZmFpbGVkYCB0cnkvY2F0Y2ggYXJlOlxuICogLSBVc2VyIGNvZGUgZXJyb3JzICh0aHJvd3MgZnJvbSB3b3JrZmxvdyBmdW5jdGlvbnMsIHByb3BhZ2F0ZWQgc3RlcCBmYWlsdXJlcylcbiAqIC0gV29ya2Zsb3dSdW50aW1lRXJyb3IgYW5kIHN1YmNsYXNzZXMgKG1pc3NpbmcgdGltZXN0YW1wcywgd29ya2Zsb3cvc3RlcFxuICogICBub3QgcmVnaXN0ZXJlZCwgY29ycnVwdGVkIGV2ZW50IGxvZywgZXRjLilcbiAqXG4gKiBVc2VzIGVhY2ggc3ViY2xhc3MncyBgLmlzKClgIHN0YXRpYyAoYSBuYW1lLWJhc2VkIGR1Y2sgY2hlY2spIGluc3RlYWQgb2ZcbiAqIGEgc2luZ2xlIGBpbnN0YW5jZW9mYCBjaGVjayBiZWNhdXNlIHdvcmtmbG93cyBleGVjdXRlIGluIGEgc2VwYXJhdGVcbiAqIGB2bWAgcmVhbG06IHRoZSBWTS1jb250ZXh0IGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIHRoZSBob3N0LWNvbnRleHRcbiAqIG9uZSBhcmUgZGlzdGluY3QgY2xhc3Nlcywgc28gYGluc3RhbmNlb2ZgIHJldHVybnMgYGZhbHNlYCBmb3IgYW55IGVycm9yXG4gKiB0aHJvd24gaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSBhbmQgd2UnZCBtaXNjbGFzc2lmeSBnZW51aW5lIHJ1bnRpbWVcbiAqIGVycm9ycyBhcyB1c2VyIGVycm9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV29ybGRDb250cmFjdEVycm9yKGVycjogdW5rbm93bik6IGVyciBpcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBpZiAoIVdvcmtmbG93V29ybGRFcnJvci5pcyhlcnIpIHx8IGVyci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNhdXNlID0gJ2NhdXNlJyBpbiBlcnIgPyBlcnIuY2F1c2UgOiB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgKGVyci5jb2RlICE9PSB1bmRlZmluZWQgJiYgV09STERfQ09OVFJBQ1RfRVJST1JfQ09ERVMuaGFzKGVyci5jb2RlKSkgfHxcbiAgICBlcnIubWVzc2FnZS5zdGFydHNXaXRoKCdGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgYm9keSBmb3IgJykgfHxcbiAgICBlcnIubWVzc2FnZS5zdGFydHNXaXRoKCdTY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICcpIHx8XG4gICAgKHR5cGVvZiBjYXVzZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGNhdXNlICE9PSBudWxsICYmXG4gICAgICAnbmFtZScgaW4gY2F1c2UgJiZcbiAgICAgIGNhdXNlLm5hbWUgPT09ICdab2RFcnJvcicpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVJ1bkVycm9yKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB7XG4gIGlmIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0c7XG4gIH1cblxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgUlVOVElNRV9FUlJPUl9DSEVDS1MpIHtcbiAgICBpZiAoaXNNYXRjaChlcnIpKSB7XG4gICAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gICAgfVxuICB9XG4gIHJldHVybiBSVU5fRVJST1JfQ09ERVMuVVNFUl9FUlJPUjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ContextViolationError, type DocsUrl, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError } from './context-violation-error.js';
|
|
2
|
+
export { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, };
|
|
3
|
+
/**
|
|
4
|
+
* Thrown when an API that MUST NOT run inside a workflow function is called
|
|
5
|
+
* from one (e.g. `resumeHook()`, which would cause determinism issues).
|
|
6
|
+
* The message names the specific workflow that made the offending call.
|
|
7
|
+
*/
|
|
8
|
+
export declare class UnavailableInWorkflowContextError extends ContextViolationError {
|
|
9
|
+
name: string;
|
|
10
|
+
constructor(functionName: string, docsUrl: DocsUrl);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Throw a {@link NotInWorkflowContextError} whose stack trace points at the
|
|
14
|
+
* user code that called `stackStartFn`, not at our framework internals.
|
|
15
|
+
*
|
|
16
|
+
* Prefer this over `throw new NotInWorkflowContextError(...)` so tooling
|
|
17
|
+
* (Next.js error overlay, VS Code terminal linkifier, Sentry, etc.) shows
|
|
18
|
+
* the user's call site as the relevant frame.
|
|
19
|
+
*/
|
|
20
|
+
export declare function throwNotInWorkflowContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
|
|
21
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
22
|
+
export declare function throwNotInStepContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
|
|
23
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
24
|
+
export declare function throwNotInWorkflowOrStepContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
|
|
25
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
26
|
+
export declare function throwUnavailableInWorkflowContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
|
|
27
|
+
//# sourceMappingURL=context-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-errors.d.ts","sourceRoot":"","sources":["../src/context-errors.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAErB,KAAK,OAAO,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,8BAA8B,CAAC;AAUtC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,GAChC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iCAAkC,SAAQ,qBAAqB;IAC1E,IAAI,SAAuC;gBAE/B,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CAgDnD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { redirectStackToCaller } from './capture-stack.js';
|
|
2
|
+
import { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, } from './context-violation-error.js';
|
|
3
|
+
import { WORKFLOW_CONTEXT_SYMBOL, } from './workflow/get-workflow-metadata.js';
|
|
4
|
+
// Re-export the structural base + subclasses so the public surface is a
|
|
5
|
+
// single import point. The base + simpler subclasses live in
|
|
6
|
+
// `context-violation-error.ts` because `get-workflow-metadata.ts` needs to
|
|
7
|
+
// throw one without creating an import cycle with this file.
|
|
8
|
+
export { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, };
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when an API that MUST NOT run inside a workflow function is called
|
|
11
|
+
* from one (e.g. `resumeHook()`, which would cause determinism issues).
|
|
12
|
+
* The message names the specific workflow that made the offending call.
|
|
13
|
+
*/
|
|
14
|
+
export class UnavailableInWorkflowContextError extends ContextViolationError {
|
|
15
|
+
name = 'UnavailableInWorkflowContextError';
|
|
16
|
+
constructor(functionName, docsUrl) {
|
|
17
|
+
const ctx = globalThis[WORKFLOW_CONTEXT_SYMBOL];
|
|
18
|
+
const workflowName = ctx?.workflowName;
|
|
19
|
+
// Apply dim styling to `workflow/` / `step/` prefixes in the qualified
|
|
20
|
+
// name so the part the user named stands out.
|
|
21
|
+
const nameSegs = (() => {
|
|
22
|
+
if (!workflowName)
|
|
23
|
+
return null;
|
|
24
|
+
const m = workflowName.match(/^(workflow\/|step\/)(.*)$/);
|
|
25
|
+
if (m)
|
|
26
|
+
return [{ dim: m[1] }, { text: m[2] }];
|
|
27
|
+
return [{ text: workflowName }];
|
|
28
|
+
})();
|
|
29
|
+
const contextLine = nameSegs
|
|
30
|
+
? {
|
|
31
|
+
type: 'plain',
|
|
32
|
+
segments: [
|
|
33
|
+
{ text: 'this call was made from the ' },
|
|
34
|
+
...nameSegs,
|
|
35
|
+
{ text: ' workflow context.' },
|
|
36
|
+
],
|
|
37
|
+
}
|
|
38
|
+
: {
|
|
39
|
+
type: 'plain',
|
|
40
|
+
segments: [{ text: 'this call was made from a workflow context.' }],
|
|
41
|
+
};
|
|
42
|
+
super({
|
|
43
|
+
title: [
|
|
44
|
+
{ code: functionName },
|
|
45
|
+
{ text: ' cannot be called from a workflow context.' },
|
|
46
|
+
],
|
|
47
|
+
details: [
|
|
48
|
+
{
|
|
49
|
+
type: 'plain',
|
|
50
|
+
segments: [
|
|
51
|
+
{
|
|
52
|
+
text: 'calling this in a workflow context can cause determinism issues.',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
contextLine,
|
|
57
|
+
{ type: 'docs', url: docsUrl },
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Throw a {@link NotInWorkflowContextError} whose stack trace points at the
|
|
64
|
+
* user code that called `stackStartFn`, not at our framework internals.
|
|
65
|
+
*
|
|
66
|
+
* Prefer this over `throw new NotInWorkflowContextError(...)` so tooling
|
|
67
|
+
* (Next.js error overlay, VS Code terminal linkifier, Sentry, etc.) shows
|
|
68
|
+
* the user's call site as the relevant frame.
|
|
69
|
+
*/
|
|
70
|
+
export function throwNotInWorkflowContext(functionName, docsUrl,
|
|
71
|
+
// biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
|
|
72
|
+
stackStartFn) {
|
|
73
|
+
const err = new NotInWorkflowContextError(functionName, docsUrl);
|
|
74
|
+
redirectStackToCaller(err, stackStartFn);
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
78
|
+
export function throwNotInStepContext(functionName, docsUrl,
|
|
79
|
+
// biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
|
|
80
|
+
stackStartFn) {
|
|
81
|
+
const err = new NotInStepContextError(functionName, docsUrl);
|
|
82
|
+
redirectStackToCaller(err, stackStartFn);
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
86
|
+
export function throwNotInWorkflowOrStepContext(functionName, docsUrl,
|
|
87
|
+
// biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
|
|
88
|
+
stackStartFn) {
|
|
89
|
+
const err = new NotInWorkflowOrStepContextError(functionName, docsUrl);
|
|
90
|
+
redirectStackToCaller(err, stackStartFn);
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
/** See {@link throwNotInWorkflowContext}. */
|
|
94
|
+
export function throwUnavailableInWorkflowContext(functionName, docsUrl,
|
|
95
|
+
// biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
|
|
96
|
+
stackStartFn) {
|
|
97
|
+
const err = new UnavailableInWorkflowContextError(functionName, docsUrl);
|
|
98
|
+
redirectStackToCaller(err, stackStartFn);
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUNMLHFCQUFxQixFQUdyQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixHQUNoQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCx1QkFBdUIsR0FFeEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3Qyx3RUFBd0U7QUFDeEUsNkRBQTZEO0FBQzdELDJFQUEyRTtBQUMzRSw2REFBNkQ7QUFDN0QsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixHQUNoQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxpQ0FBa0MsU0FBUSxxQkFBcUI7SUFDMUUsSUFBSSxHQUFHLG1DQUFtQyxDQUFDO0lBRTNDLFlBQVksWUFBb0IsRUFBRSxPQUFnQjtRQUNoRCxNQUFNLEdBQUcsR0FBSSxVQUFrQixDQUFDLHVCQUF1QixDQUUxQyxDQUFDO1FBQ2QsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLFlBQVksQ0FBQztRQUV2Qyx1RUFBdUU7UUFDdkUsOENBQThDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUM7Z0JBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFVLENBQUM7WUFDdkQsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFVLENBQUM7UUFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLE1BQU0sV0FBVyxHQUFXLFFBQVE7WUFDbEMsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRTtvQkFDUixFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRTtvQkFDeEMsR0FBRyxRQUFRO29CQUNYLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2lCQUMvQjthQUNGO1lBQ0gsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLDZDQUE2QyxFQUFFLENBQUM7YUFDcEUsQ0FBQztRQUVOLEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRTtnQkFDTCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ3RCLEVBQUUsSUFBSSxFQUFFLDRDQUE0QyxFQUFFO2FBQ3ZEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRTt3QkFDUjs0QkFDRSxJQUFJLEVBQUUsa0VBQWtFO3lCQUN6RTtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXO2dCQUNYLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsWUFBb0IsRUFDcEIsT0FBZ0I7QUFDaEIsOEVBQThFO0FBQzlFLFlBQXNCO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUkseUJBQXlCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsQ0FBQztBQUNaLENBQUM7QUFFRCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUFvQixFQUNwQixPQUFnQjtBQUNoQiw4RUFBOEU7QUFDOUUsWUFBc0I7SUFFdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QscUJBQXFCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxDQUFDO0FBQ1osQ0FBQztBQUVELDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsK0JBQStCLENBQzdDLFlBQW9CLEVBQ3BCLE9BQWdCO0FBQ2hCLDhFQUE4RTtBQUM5RSxZQUFzQjtJQUV0QixNQUFNLEdBQUcsR0FBRyxJQUFJLCtCQUErQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLENBQUM7QUFDWixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsWUFBb0IsRUFDcEIsT0FBZ0I7QUFDaEIsOEVBQThFO0FBQzlFLFlBQXNCO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksaUNBQWlDLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWRpcmVjdFN0YWNrVG9DYWxsZXIgfSBmcm9tICcuL2NhcHR1cmUtc3RhY2suanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dFZpb2xhdGlvbkVycm9yLFxuICB0eXBlIERldGFpbCxcbiAgdHlwZSBEb2NzVXJsLFxuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG59IGZyb20gJy4vY29udGV4dC12aW9sYXRpb24tZXJyb3IuanMnO1xuaW1wb3J0IHtcbiAgV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0wsXG4gIHR5cGUgV29ya2Zsb3dNZXRhZGF0YSxcbn0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuXG4vLyBSZS1leHBvcnQgdGhlIHN0cnVjdHVyYWwgYmFzZSArIHN1YmNsYXNzZXMgc28gdGhlIHB1YmxpYyBzdXJmYWNlIGlzIGFcbi8vIHNpbmdsZSBpbXBvcnQgcG9pbnQuIFRoZSBiYXNlICsgc2ltcGxlciBzdWJjbGFzc2VzIGxpdmUgaW5cbi8vIGBjb250ZXh0LXZpb2xhdGlvbi1lcnJvci50c2AgYmVjYXVzZSBgZ2V0LXdvcmtmbG93LW1ldGFkYXRhLnRzYCBuZWVkcyB0b1xuLy8gdGhyb3cgb25lIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlIHdpdGggdGhpcyBmaWxlLlxuZXhwb3J0IHtcbiAgQ29udGV4dFZpb2xhdGlvbkVycm9yLFxuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG59O1xuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IE1VU1QgTk9UIHJ1biBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBjYWxsZWRcbiAqIGZyb20gb25lIChlLmcuIGByZXN1bWVIb29rKClgLCB3aGljaCB3b3VsZCBjYXVzZSBkZXRlcm1pbmlzbSBpc3N1ZXMpLlxuICogVGhlIG1lc3NhZ2UgbmFtZXMgdGhlIHNwZWNpZmljIHdvcmtmbG93IHRoYXQgbWFkZSB0aGUgb2ZmZW5kaW5nIGNhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3IgZXh0ZW5kcyBDb250ZXh0VmlvbGF0aW9uRXJyb3Ige1xuICBuYW1lID0gJ1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcic7XG5cbiAgY29uc3RydWN0b3IoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGRvY3NVcmw6IERvY3NVcmwpIHtcbiAgICBjb25zdCBjdHggPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSBhc1xuICAgICAgfCBXb3JrZmxvd01ldGFkYXRhXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBjdHg/LndvcmtmbG93TmFtZTtcblxuICAgIC8vIEFwcGx5IGRpbSBzdHlsaW5nIHRvIGB3b3JrZmxvdy9gIC8gYHN0ZXAvYCBwcmVmaXhlcyBpbiB0aGUgcXVhbGlmaWVkXG4gICAgLy8gbmFtZSBzbyB0aGUgcGFydCB0aGUgdXNlciBuYW1lZCBzdGFuZHMgb3V0LlxuICAgIGNvbnN0IG5hbWVTZWdzID0gKCgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dOYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IG0gPSB3b3JrZmxvd05hbWUubWF0Y2goL14od29ya2Zsb3dcXC98c3RlcFxcLykoLiopJC8pO1xuICAgICAgaWYgKG0pIHJldHVybiBbeyBkaW06IG1bMV0gfSwgeyB0ZXh0OiBtWzJdIH1dIGFzIGNvbnN0O1xuICAgICAgcmV0dXJuIFt7IHRleHQ6IHdvcmtmbG93TmFtZSB9XSBhcyBjb25zdDtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgY29udGV4dExpbmU6IERldGFpbCA9IG5hbWVTZWdzXG4gICAgICA/IHtcbiAgICAgICAgICB0eXBlOiAncGxhaW4nLFxuICAgICAgICAgIHNlZ21lbnRzOiBbXG4gICAgICAgICAgICB7IHRleHQ6ICd0aGlzIGNhbGwgd2FzIG1hZGUgZnJvbSB0aGUgJyB9LFxuICAgICAgICAgICAgLi4ubmFtZVNlZ3MsXG4gICAgICAgICAgICB7IHRleHQ6ICcgd29ya2Zsb3cgY29udGV4dC4nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgdHlwZTogJ3BsYWluJyxcbiAgICAgICAgICBzZWdtZW50czogW3sgdGV4dDogJ3RoaXMgY2FsbCB3YXMgbWFkZSBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nIH1dLFxuICAgICAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgdGl0bGU6IFtcbiAgICAgICAgeyBjb2RlOiBmdW5jdGlvbk5hbWUgfSxcbiAgICAgICAgeyB0ZXh0OiAnIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIHdvcmtmbG93IGNvbnRleHQuJyB9LFxuICAgICAgXSxcbiAgICAgIGRldGFpbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwbGFpbicsXG4gICAgICAgICAgc2VnbWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogJ2NhbGxpbmcgdGhpcyBpbiBhIHdvcmtmbG93IGNvbnRleHQgY2FuIGNhdXNlIGRldGVybWluaXNtIGlzc3Vlcy4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0TGluZSxcbiAgICAgICAgeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93IGEge0BsaW5rIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3J9IHdob3NlIHN0YWNrIHRyYWNlIHBvaW50cyBhdCB0aGVcbiAqIHVzZXIgY29kZSB0aGF0IGNhbGxlZCBgc3RhY2tTdGFydEZuYCwgbm90IGF0IG91ciBmcmFtZXdvcmsgaW50ZXJuYWxzLlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgYHRocm93IG5ldyBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yKC4uLilgIHNvIHRvb2xpbmdcbiAqIChOZXh0LmpzIGVycm9yIG92ZXJsYXksIFZTIENvZGUgdGVybWluYWwgbGlua2lmaWVyLCBTZW50cnksIGV0Yy4pIHNob3dzXG4gKiB0aGUgdXNlcidzIGNhbGwgc2l0ZSBhcyB0aGUgcmVsZXZhbnQgZnJhbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd05vdEluV29ya2Zsb3dDb250ZXh0KFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgZG9jc1VybDogRG9jc1VybCxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBtYXRjaGVzIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlXG4gIHN0YWNrU3RhcnRGbjogRnVuY3Rpb25cbik6IG5ldmVyIHtcbiAgY29uc3QgZXJyID0gbmV3IE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IoZnVuY3Rpb25OYW1lLCBkb2NzVXJsKTtcbiAgcmVkaXJlY3RTdGFja1RvQ2FsbGVyKGVyciwgc3RhY2tTdGFydEZuKTtcbiAgdGhyb3cgZXJyO1xufVxuXG4vKiogU2VlIHtAbGluayB0aHJvd05vdEluV29ya2Zsb3dDb250ZXh0fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd05vdEluU3RlcENvbnRleHQoXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICBkb2NzVXJsOiBEb2NzVXJsLFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IG1hdGNoZXMgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VcbiAgc3RhY2tTdGFydEZuOiBGdW5jdGlvblxuKTogbmV2ZXIge1xuICBjb25zdCBlcnIgPSBuZXcgTm90SW5TdGVwQ29udGV4dEVycm9yKGZ1bmN0aW9uTmFtZSwgZG9jc1VybCk7XG4gIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihlcnIsIHN0YWNrU3RhcnRGbik7XG4gIHRocm93IGVycjtcbn1cblxuLyoqIFNlZSB7QGxpbmsgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dH0uICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dChcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGRvY3NVcmw6IERvY3NVcmwsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogbWF0Y2hlcyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZVxuICBzdGFja1N0YXJ0Rm46IEZ1bmN0aW9uXG4pOiBuZXZlciB7XG4gIGNvbnN0IGVyciA9IG5ldyBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yKGZ1bmN0aW9uTmFtZSwgZG9jc1VybCk7XG4gIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihlcnIsIHN0YWNrU3RhcnRGbik7XG4gIHRocm93IGVycjtcbn1cblxuLyoqIFNlZSB7QGxpbmsgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dH0uICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0KFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgZG9jc1VybDogRG9jc1VybCxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBtYXRjaGVzIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlXG4gIHN0YWNrU3RhcnRGbjogRnVuY3Rpb25cbik6IG5ldmVyIHtcbiAgY29uc3QgZXJyID0gbmV3IFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcihmdW5jdGlvbk5hbWUsIGRvY3NVcmwpO1xuICByZWRpcmVjdFN0YWNrVG9DYWxsZXIoZXJyLCBzdGFja1N0YXJ0Rm4pO1xuICB0aHJvdyBlcnI7XG59XG4iXX0=
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `docs:` line URL. The leading protocol is part of the type so call sites
|
|
3
|
+
* can't accidentally pass a protocol-relative or bare path.
|
|
4
|
+
*/
|
|
5
|
+
export type DocsUrl = `https://${string}`;
|
|
6
|
+
declare const INSPECT_CUSTOM: unique symbol;
|
|
7
|
+
/**
|
|
8
|
+
* Structured data for a framed error. The base class takes this and renders
|
|
9
|
+
* it to plain text (for `.message` / `.stack` / structured logs) or to an
|
|
10
|
+
* ANSI-framed string (for terminal display via `util.inspect` / `toString`).
|
|
11
|
+
*
|
|
12
|
+
* Keeping the pieces structured means we never have to strip ANSI back out
|
|
13
|
+
* once it's in the message — we just don't put it there in the first place.
|
|
14
|
+
*/
|
|
15
|
+
export interface FramedContent {
|
|
16
|
+
/** Headline. `{ code: 'foo()' }` segments render as backticked inline code. */
|
|
17
|
+
readonly title: readonly Segment[];
|
|
18
|
+
/** One framed branch per entry. The last uses `╰▶`, others use `├▶`. */
|
|
19
|
+
readonly details: readonly Detail[];
|
|
20
|
+
}
|
|
21
|
+
export type Segment = {
|
|
22
|
+
readonly text: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly code: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly dim: string;
|
|
27
|
+
};
|
|
28
|
+
export type Detail = {
|
|
29
|
+
readonly type: 'plain';
|
|
30
|
+
readonly segments: readonly Segment[];
|
|
31
|
+
} | {
|
|
32
|
+
readonly type: 'docs';
|
|
33
|
+
readonly url: DocsUrl;
|
|
34
|
+
};
|
|
35
|
+
export declare function renderPlain(c: FramedContent): string;
|
|
36
|
+
export declare function renderPretty(c: FramedContent): string;
|
|
37
|
+
/**
|
|
38
|
+
* Base class for structured context-violation errors.
|
|
39
|
+
*
|
|
40
|
+
* Design notes:
|
|
41
|
+
*
|
|
42
|
+
* - `.message` is **plain text** (no ANSI escape bytes). Structured logs,
|
|
43
|
+
* log drains, CBOR-serialized event data, and anything else that reads
|
|
44
|
+
* `err.message` / `err.stack` as a string gets clean output — no mojibake
|
|
45
|
+
* in JSON, no `\x1B[...m` noise in Vercel logs.
|
|
46
|
+
*
|
|
47
|
+
* - The ANSI-framed version is rendered **lazily** via `toString()` and
|
|
48
|
+
* `[util.inspect.custom]`. When the error is thrown and Node prints it
|
|
49
|
+
* via `util.inspect`, the user sees the colored, framed box. When it's
|
|
50
|
+
* attached to a structured log field, the consumer sees plain text.
|
|
51
|
+
*
|
|
52
|
+
* - `fatal = true` marks these as non-retryable. Calling `createHook()`
|
|
53
|
+
* from a step function will never succeed no matter how many retries —
|
|
54
|
+
* burning attempts just produces duplicated log output. The runtime's
|
|
55
|
+
* `FatalError.is(err)` gate recognizes any error with `fatal: true`.
|
|
56
|
+
*/
|
|
57
|
+
export declare abstract class ContextViolationError extends Error {
|
|
58
|
+
#private;
|
|
59
|
+
/** Non-retryable — see class doc. */
|
|
60
|
+
readonly fatal = true;
|
|
61
|
+
constructor(content: FramedContent);
|
|
62
|
+
/**
|
|
63
|
+
* `console.log(err)` and most Node internals route through `util.inspect`,
|
|
64
|
+
* which respects this symbol. Returning a custom string here means the
|
|
65
|
+
* thrown error prints as a pretty frame in the terminal while `.message`
|
|
66
|
+
* and `.stack` stay plain.
|
|
67
|
+
*/
|
|
68
|
+
[INSPECT_CUSTOM](): string;
|
|
69
|
+
toString(): string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Thrown when an API that must run inside a workflow function is called
|
|
73
|
+
* from outside a workflow context (e.g. from a step function or from
|
|
74
|
+
* regular application code).
|
|
75
|
+
*/
|
|
76
|
+
export declare class NotInWorkflowContextError extends ContextViolationError {
|
|
77
|
+
name: string;
|
|
78
|
+
constructor(functionName: string, docsUrl: DocsUrl);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Thrown when an API that must run inside a step function is called from
|
|
82
|
+
* outside a step context.
|
|
83
|
+
*/
|
|
84
|
+
export declare class NotInStepContextError extends ContextViolationError {
|
|
85
|
+
name: string;
|
|
86
|
+
constructor(functionName: string, docsUrl: DocsUrl);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Thrown when an API that must run inside either a workflow or step function
|
|
90
|
+
* is called from regular application code.
|
|
91
|
+
*/
|
|
92
|
+
export declare class NotInWorkflowOrStepContextError extends ContextViolationError {
|
|
93
|
+
name: string;
|
|
94
|
+
constructor(functionName: string, docsUrl: DocsUrl);
|
|
95
|
+
}
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=context-violation-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-violation-error.d.ts","sourceRoot":"","sources":["../src/context-violation-error.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,MAAM,EAAE,CAAC;AAE1C,QAAA,MAAM,cAAc,eAA2C,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7B,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAwBrD,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAapD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAGrD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,qBAAsB,SAAQ,KAAK;;IACvD,qCAAqC;IACrC,QAAQ,CAAC,KAAK,QAAQ;gBAIV,OAAO,EAAE,aAAa;IAKlC;;;;;OAKG;IACH,CAAC,cAAc,CAAC,IAAI,MAAM;IAgB1B,QAAQ,IAAI,MAAM;CAGnB;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,qBAAqB;IAClE,IAAI,SAA+B;gBAEvB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,qBAAqB;IAC9D,IAAI,SAA2B;gBAEnB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;IACxE,IAAI,SAAqC;gBAE7B,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD"}
|