@workflow/cli 5.0.0-beta.3 → 5.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,6 +41,28 @@ declare class ExpiredDataRef {
41
41
  }
42
42
  /** Check if a value is an ExpiredDataRef (for custom table formatting in CLI) */
43
43
  export declare function isExpiredRef(value: unknown): value is ExpiredDataRef;
44
+ /**
45
+ * The set of revivers used by CLI inspect output.
46
+ *
47
+ * Built on top of `getCommonRevivers()` from `@workflow/core` so that the
48
+ * CLI stays in sync with the runtime's reviver set automatically. Without
49
+ * this, every new reviver added to core (e.g. `FatalError`,
50
+ * `RetryableError`, the built-in `Error` subclasses) would silently
51
+ * disappear from CLI output: devalue throws "Unknown type X" for
52
+ * unrecognized reduced types, and `hydrateResourceIO` swallows that error
53
+ * and surfaces the raw `Uint8Array` payload to consumers — which then
54
+ * shows up as `step.error` / `run.error` byte dumps instead of usable
55
+ * `{ message, stack, … }` objects.
56
+ *
57
+ * On top of the common set we layer:
58
+ * - A `toJSON` shim on each Error reviver so non-enumerable
59
+ * `Error.prototype` fields survive `JSON.stringify` for `--json` output
60
+ * while leaving `util.inspect` rendering untouched
61
+ * - `observabilityRevivers` for streams / step+workflow function refs
62
+ * - CLI-specific overrides that produce display-friendly placeholders
63
+ * for `Class` / `Instance` (the runtime versions need full class
64
+ * identity which the CLI doesn't have access to)
65
+ */
44
66
  export declare function getCLIRevivers(): Revivers;
45
67
  /**
46
68
  * Hydrate the serialized data fields of a resource for CLI display.
@@ -1 +1 @@
1
- {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/hydration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAQL,KAAK,QAAQ,EAEd,MAAM,qCAAqC,CAAC;AAI7C;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAC7B,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,GACpD,IAAI,CAAC;AAGT,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,WAAW,EACX,KAAK,QAAQ,EACb,eAAe,EACf,KAAK,SAAS,EACd,UAAU,GACX,MAAM,qCAAqC,CAAC;AA8B7C;;;;;;GAMG;AACH,cAAM,gBAAgB;IACpB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM;IAI1B,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB;AAKD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAExE;AAMD;;;;;;GAMG;AACH,cAAM,cAAc;IAClB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM;IAI1B,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB;AAKD,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAEpE;AAMD,wBAAgB,cAAc,IAAI,QAAQ,CAyFzC;AA8HD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,CAAC,EACX,WAAW,CAAC,EAAE,qBAAqB,GAClC,OAAO,CAAC,CAAC,CAAC,CASZ"}
1
+ {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/hydration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAQL,KAAK,QAAQ,EAEd,MAAM,qCAAqC,CAAC;AAI7C;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAC7B,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,GACpD,IAAI,CAAC;AAGT,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,WAAW,EACX,KAAK,QAAQ,EACb,eAAe,EACf,KAAK,SAAS,EACd,UAAU,GACX,MAAM,qCAAqC,CAAC;AA8B7C;;;;;;GAMG;AACH,cAAM,gBAAgB;IACpB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM;IAI1B,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB;AAKD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAExE;AAMD;;;;;;GAMG;AACH,cAAM,cAAc;IAClB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM;IAI1B,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB;AAKD,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAEpE;AAsED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CA6DzC;AA8HD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,CAAC,EACX,WAAW,CAAC,EAAE,qBAAqB,GAClC,OAAO,CAAC,CAAC,CAAC,CASZ"}
@@ -5,7 +5,7 @@
5
5
  * `util.inspect.custom` to ClassInstanceRef for pretty CLI output.
6
6
  */
7
7
  import { inspect } from 'node:util';
8
- import { maybeDecrypt } from '@workflow/core/serialization';
8
+ import { getCommonRevivers, maybeDecrypt } from '@workflow/core/serialization';
9
9
  import { ClassInstanceRef, extractClassName, hydrateResourceIO as hydrateResourceIOGeneric, isEncryptedData, isExpiredStub, isRunRef, observabilityRevivers, serializedInstanceToRef, } from '@workflow/core/serialization-format';
10
10
  import { parseClassName } from '@workflow/utils/parse-name';
11
11
  import chalk from 'chalk';
@@ -87,30 +87,102 @@ export function isExpiredRef(value) {
87
87
  // ---------------------------------------------------------------------------
88
88
  // CLI revivers (Node.js, uses Buffer)
89
89
  // ---------------------------------------------------------------------------
90
+ /**
91
+ * The set of reducer keys whose `getCommonRevivers()` output produces a
92
+ * native `Error` instance. We wrap each of these with an additional
93
+ * `toJSON` attachment in CLI mode (see `wrapErrorReviverWithToJSON`).
94
+ */
95
+ const ERROR_REVIVER_KEYS = [
96
+ 'AggregateError',
97
+ 'DOMException',
98
+ 'Error',
99
+ 'EvalError',
100
+ 'FatalError',
101
+ 'RangeError',
102
+ 'ReferenceError',
103
+ 'RetryableError',
104
+ 'SyntaxError',
105
+ 'TypeError',
106
+ 'URIError',
107
+ ];
108
+ /**
109
+ * Wraps a runtime Error reviver so that the produced instance carries a
110
+ * non-enumerable `toJSON` method. The runtime revivers return real `Error`
111
+ * instances (good for `util.inspect`, `instanceof`, `toString`, etc.), but
112
+ * `Error.prototype`'s `name` / `message` / `stack` / `cause` are
113
+ * non-enumerable and would be dropped by `JSON.stringify` — which is how
114
+ * the CLI emits its `--json` output. Adding `toJSON` (which `JSON.stringify`
115
+ * calls but `util.inspect` ignores) gives us the best of both worlds:
116
+ * round-tripped errors render cleanly in both modes without the
117
+ * data-versus-display tradeoff that plain-object revivers would force.
118
+ *
119
+ * Subclass-specific enumerable fields (e.g. `RetryableError.retryAfter`,
120
+ * `AggregateError.errors`, `FatalError.fatal`) are picked up automatically
121
+ * via `Object.assign` after the base fields, so we don't have to enumerate
122
+ * them per-subclass.
123
+ */
124
+ function wrapErrorReviverWithToJSON(reviver) {
125
+ return (value) => {
126
+ const result = reviver(value);
127
+ if (!(result instanceof Error))
128
+ return result;
129
+ Object.defineProperty(result, 'toJSON', {
130
+ value: function () {
131
+ const json = {
132
+ name: this.name,
133
+ message: this.message,
134
+ stack: this.stack,
135
+ };
136
+ if ('cause' in this) {
137
+ json.cause = this.cause;
138
+ }
139
+ // Pick up subclass-specific enumerable fields (e.g. FatalError.fatal,
140
+ // RetryableError.retryAfter, AggregateError.errors).
141
+ Object.assign(json, this);
142
+ return json;
143
+ },
144
+ enumerable: false,
145
+ writable: true,
146
+ configurable: true,
147
+ });
148
+ return result;
149
+ };
150
+ }
151
+ /**
152
+ * The set of revivers used by CLI inspect output.
153
+ *
154
+ * Built on top of `getCommonRevivers()` from `@workflow/core` so that the
155
+ * CLI stays in sync with the runtime's reviver set automatically. Without
156
+ * this, every new reviver added to core (e.g. `FatalError`,
157
+ * `RetryableError`, the built-in `Error` subclasses) would silently
158
+ * disappear from CLI output: devalue throws "Unknown type X" for
159
+ * unrecognized reduced types, and `hydrateResourceIO` swallows that error
160
+ * and surfaces the raw `Uint8Array` payload to consumers — which then
161
+ * shows up as `step.error` / `run.error` byte dumps instead of usable
162
+ * `{ message, stack, … }` objects.
163
+ *
164
+ * On top of the common set we layer:
165
+ * - A `toJSON` shim on each Error reviver so non-enumerable
166
+ * `Error.prototype` fields survive `JSON.stringify` for `--json` output
167
+ * while leaving `util.inspect` rendering untouched
168
+ * - `observabilityRevivers` for streams / step+workflow function refs
169
+ * - CLI-specific overrides that produce display-friendly placeholders
170
+ * for `Class` / `Instance` (the runtime versions need full class
171
+ * identity which the CLI doesn't have access to)
172
+ */
90
173
  export function getCLIRevivers() {
91
- function reviveArrayBuffer(value) {
92
- const base64 = value === '.' ? '' : value;
93
- const buffer = Buffer.from(base64, 'base64');
94
- const arrayBuffer = new ArrayBuffer(buffer.length);
95
- const uint8Array = new Uint8Array(arrayBuffer);
96
- uint8Array.set(buffer);
97
- return arrayBuffer;
98
- }
174
+ const baseRevivers = getCommonRevivers(globalThis);
175
+ const errorRevivers = Object.fromEntries(ERROR_REVIVER_KEYS.flatMap((key) => {
176
+ const reviver = baseRevivers[key];
177
+ return reviver ? [[key, wrapErrorReviverWithToJSON(reviver)]] : [];
178
+ }));
99
179
  return {
100
- ArrayBuffer: reviveArrayBuffer,
101
- BigInt: (value) => BigInt(value),
102
- BigInt64Array: (value) => new BigInt64Array(reviveArrayBuffer(value)),
103
- BigUint64Array: (value) => new BigUint64Array(reviveArrayBuffer(value)),
104
- Date: (value) => new Date(value),
105
- Error: (value) => {
106
- const error = new Error(value.message);
107
- error.name = value.name;
108
- error.stack = value.stack;
109
- return error;
110
- },
111
- Float32Array: (value) => new Float32Array(reviveArrayBuffer(value)),
112
- Float64Array: (value) => new Float64Array(reviveArrayBuffer(value)),
113
- Headers: (value) => new Headers(value),
180
+ ...baseRevivers,
181
+ ...errorRevivers,
182
+ // O11y-specific revivers (streams, step functions → display objects).
183
+ ...observabilityRevivers,
184
+ // Node `Request` / `Response` revivers that don't rely on running an
185
+ // actual fetch handler — used to render request/response IO inline.
114
186
  Request: (value) => {
115
187
  // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype
116
188
  const ctor = { Request: function () { } }.Request;
@@ -142,14 +214,6 @@ export function getCLIRevivers() {
142
214
  });
143
215
  return obj;
144
216
  },
145
- Int8Array: (value) => new Int8Array(reviveArrayBuffer(value)),
146
- Int16Array: (value) => new Int16Array(reviveArrayBuffer(value)),
147
- Int32Array: (value) => new Int32Array(reviveArrayBuffer(value)),
148
- Map: (value) => new Map(value),
149
- RegExp: (value) => new RegExp(value.source, value.flags),
150
- // O11y-specific revivers (streams, step functions → display objects).
151
- // Spread FIRST so CLI-specific overrides below take precedence.
152
- ...observabilityRevivers,
153
217
  // CLI-specific overrides for class instances with inspect.custom
154
218
  Class: (value) => `<class:${extractClassName(value.classId)}>`,
155
219
  Instance: (value) => {
@@ -160,13 +224,6 @@ export function getCLIRevivers() {
160
224
  }
161
225
  return new CLIClassInstanceRef(extractClassName(value.classId), value.classId, value.data);
162
226
  },
163
- Set: (value) => new Set(value),
164
- URL: (value) => new URL(value),
165
- URLSearchParams: (value) => new URLSearchParams(value === '.' ? '' : value),
166
- Uint8Array: (value) => new Uint8Array(reviveArrayBuffer(value)),
167
- Uint8ClampedArray: (value) => new Uint8ClampedArray(reviveArrayBuffer(value)),
168
- Uint16Array: (value) => new Uint16Array(reviveArrayBuffer(value)),
169
- Uint32Array: (value) => new Uint32Array(reviveArrayBuffer(value)),
170
227
  };
171
228
  }
172
229
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../../src/lib/inspect/hydration.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CLI-specific hydration for o11y display.\n *\n * Node.js revivers that use `Buffer.from()` for base64 decoding and add\n * `util.inspect.custom` to ClassInstanceRef for pretty CLI output.\n */\n\nimport { inspect } from 'node:util';\nimport { maybeDecrypt } from '@workflow/core/serialization';\nimport {\n ClassInstanceRef,\n extractClassName,\n hydrateResourceIO as hydrateResourceIOGeneric,\n isEncryptedData,\n isExpiredStub,\n isRunRef,\n observabilityRevivers,\n type Revivers,\n serializedInstanceToRef,\n} from '@workflow/core/serialization-format';\nimport { parseClassName } from '@workflow/utils/parse-name';\nimport chalk from 'chalk';\n\n/**\n * A function that resolves an encryption key for a run, or null to skip\n * decryption. Accepts a runId — the resolver is responsible for looking\n * up the WorkflowRun internally (with caching) if the World needs it.\n */\nexport type EncryptionKeyResolver =\n | ((runId: string) => Promise<Uint8Array | undefined>)\n | null;\n\n// Re-export types and utilities that consumers need\nexport {\n CLASS_INSTANCE_REF_TYPE,\n ClassInstanceRef,\n ENCRYPTED_PLACEHOLDER,\n extractStreamIds,\n isClassInstanceRef,\n isEncryptedData,\n isStreamId,\n isStreamRef,\n type Revivers,\n STREAM_REF_TYPE,\n type StreamRef,\n truncateId,\n} from '@workflow/core/serialization-format';\n\n// ---------------------------------------------------------------------------\n// CLI ClassInstanceRef with inspect.custom\n// ---------------------------------------------------------------------------\n\n/**\n * Extended ClassInstanceRef with Node.js `util.inspect.custom` for\n * pretty CLI output: `ClassName@filename { ...data }`\n */\nclass CLIClassInstanceRef extends ClassInstanceRef {\n [inspect.custom](\n _depth: number,\n options: import('node:util').InspectOptionsStylized\n ): string {\n const dataStr = inspect(this.data, { ...options, depth: options.depth });\n const parsed = parseClassName(this.classId);\n const moduleSpecifier = parsed?.moduleSpecifier ?? this.classId;\n const fileName = moduleSpecifier.split('/').pop() ?? moduleSpecifier;\n const styledFileName = options.stylize\n ? options.stylize(`@${fileName}`, 'undefined')\n : `@${fileName}`;\n return `${this.className}${styledFileName} ${dataStr}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI encrypted data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for encrypted data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim yellow \"🔒 Encrypted\") instead of a plain quoted string.\n * Also provides `toJSON()` for `--json` output.\n */\nclass EncryptedDataRef {\n [inspect.custom](): string {\n return chalk.dim.yellow('\\u{1F512} Encrypted');\n }\n\n toJSON(): string {\n return '\\u{1F512} Encrypted';\n }\n\n toString(): string {\n return '\\u{1F512} Encrypted';\n }\n}\n\n/** Singleton encrypted data placeholder for CLI display */\nconst ENCRYPTED_REF = new EncryptedDataRef();\n\n/** Check if a value is an EncryptedDataRef (for custom table formatting in CLI) */\nexport function isEncryptedRef(value: unknown): value is EncryptedDataRef {\n return value instanceof EncryptedDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI expired data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for expired data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim gray \"<data expired>\") instead of a raw stub object.\n * Also provides `toJSON()` for `--json` output.\n */\nclass ExpiredDataRef {\n [inspect.custom](): string {\n return chalk.gray('<data expired>');\n }\n\n toJSON(): string {\n return '<data expired>';\n }\n\n toString(): string {\n return '<data expired>';\n }\n}\n\n/** Singleton expired data placeholder for CLI display */\nconst EXPIRED_REF = new ExpiredDataRef();\n\n/** Check if a value is an ExpiredDataRef (for custom table formatting in CLI) */\nexport function isExpiredRef(value: unknown): value is ExpiredDataRef {\n return value instanceof ExpiredDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI revivers (Node.js, uses Buffer)\n// ---------------------------------------------------------------------------\n\nexport function getCLIRevivers(): Revivers {\n function reviveArrayBuffer(value: string): ArrayBuffer {\n const base64 = value === '.' ? '' : value;\n const buffer = Buffer.from(base64, 'base64');\n const arrayBuffer = new ArrayBuffer(buffer.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(buffer);\n return arrayBuffer;\n }\n\n return {\n ArrayBuffer: reviveArrayBuffer,\n BigInt: (value: string) => BigInt(value),\n BigInt64Array: (value: string) =>\n new BigInt64Array(reviveArrayBuffer(value)),\n BigUint64Array: (value: string) =>\n new BigUint64Array(reviveArrayBuffer(value)),\n Date: (value) => new Date(value),\n Error: (value) => {\n const error = new Error(value.message);\n error.name = value.name;\n error.stack = value.stack;\n return error;\n },\n Float32Array: (value: string) => new Float32Array(reviveArrayBuffer(value)),\n Float64Array: (value: string) => new Float64Array(reviveArrayBuffer(value)),\n Headers: (value) => new Headers(value),\n Request: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Request: function () {} }.Request!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n method: value.method,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n duplex: value.duplex,\n ...(value.responseWritable\n ? { responseWritable: value.responseWritable }\n : {}),\n });\n return obj;\n },\n Response: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Response: function () {} }.Response!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n status: value.status,\n statusText: value.statusText,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n redirected: value.redirected,\n type: value.type,\n });\n return obj;\n },\n Int8Array: (value: string) => new Int8Array(reviveArrayBuffer(value)),\n Int16Array: (value: string) => new Int16Array(reviveArrayBuffer(value)),\n Int32Array: (value: string) => new Int32Array(reviveArrayBuffer(value)),\n Map: (value) => new Map(value),\n RegExp: (value) => new RegExp(value.source, value.flags),\n // O11y-specific revivers (streams, step functions → display objects).\n // Spread FIRST so CLI-specific overrides below take precedence.\n ...observabilityRevivers,\n // CLI-specific overrides for class instances with inspect.custom\n Class: (value) => `<class:${extractClassName(value.classId)}>`,\n Instance: (value) => {\n // Run instances are rendered as RunRef for clickable rendering\n const runRef = serializedInstanceToRef(value);\n if (isRunRef(runRef)) {\n return runRef;\n }\n return new CLIClassInstanceRef(\n extractClassName(value.classId),\n value.classId,\n value.data\n );\n },\n Set: (value) => new Set(value),\n URL: (value) => new URL(value),\n URLSearchParams: (value) => new URLSearchParams(value === '.' ? '' : value),\n Uint8Array: (value: string) => new Uint8Array(reviveArrayBuffer(value)),\n Uint8ClampedArray: (value: string) =>\n new Uint8ClampedArray(reviveArrayBuffer(value)),\n Uint16Array: (value: string) => new Uint16Array(reviveArrayBuffer(value)),\n Uint32Array: (value: string) => new Uint32Array(reviveArrayBuffer(value)),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pre-built CLI revivers (cached)\n// ---------------------------------------------------------------------------\n\nlet cachedRevivers: Revivers | null = null;\n\nfunction getRevivers(): Revivers {\n if (!cachedRevivers) {\n cachedRevivers = getCLIRevivers();\n }\n return cachedRevivers;\n}\n\n// ---------------------------------------------------------------------------\n// Decryption helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-process a resource's data fields: if the resolver is provided and\n * the field is encrypted, decrypt it before generic hydration.\n *\n * Uses core's `maybeDecrypt()` which handles the 'encr' prefix stripping\n * and AES-GCM decryption transparently.\n *\n * When the resolver is null (no --decrypt flag), encrypted fields pass\n * through as Uint8Array and are replaced with EncryptedDataRef in post-processing.\n */\nasync function maybeDecryptFields<\n T extends {\n runId?: string;\n input?: any;\n output?: any;\n metadata?: any;\n eventData?: any;\n },\n>(resource: T, resolver: EncryptionKeyResolver): Promise<T> {\n if (!resolver) return resource;\n\n const runId = (resource as any).runId as string | undefined;\n if (!runId) return resource;\n\n const result = { ...resource };\n\n try {\n const rawKey = await resolver(runId);\n const { importKey } = await import('@workflow/core/encryption');\n const k = rawKey ? await importKey(rawKey) : undefined;\n\n // Decrypt input/output/error fields (WorkflowRun, Step)\n result.input = await maybeDecrypt(result.input, k);\n result.output = await maybeDecrypt(result.output, k);\n (result as any).error = await maybeDecrypt((result as any).error, k);\n\n // Decrypt metadata field (Hook)\n result.metadata = await maybeDecrypt(result.metadata, k);\n\n // Decrypt eventData fields (Event)\n if (result.eventData && typeof result.eventData === 'object') {\n const eventData = { ...result.eventData };\n for (const field of [\n 'result',\n 'input',\n 'output',\n 'metadata',\n 'payload',\n ]) {\n eventData[field] = await maybeDecrypt(eventData[field], k);\n }\n result.eventData = eventData;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // If the key fetch failed due to an HTTP error (e.g. 429 rate limit,\n // 500 server error), re-throw so the caller surfaces a clear failure\n // instead of silently showing encrypted placeholders.\n if (message.includes('HTTP ')) {\n throw err;\n }\n\n // Decryption failed (bad key, corrupted ciphertext, etc.) — fall back\n // to showing encrypted placeholders instead of crashing the CLI.\n const { logger } = await import('../config/log.js');\n logger.warn(`Decryption failed for resource ${runId}: ${message}`);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Replace a single field value with a display ref if it's encrypted or expired. */\nfunction toDisplayRef(value: unknown): unknown {\n if (isEncryptedData(value)) return ENCRYPTED_REF;\n if (isExpiredStub(value)) return EXPIRED_REF;\n return value;\n}\n\n/**\n * Replace encrypted Uint8Array values and expired stubs with styled\n * ref objects in known data fields for custom inspect rendering.\n */\nfunction replaceEncryptedAndExpiredWithRef<T>(resource: T): T {\n if (!resource || typeof resource !== 'object') return resource;\n const r = resource as Record<string, unknown>;\n const result = { ...r };\n\n for (const key of ['input', 'output', 'metadata', 'error']) {\n result[key] = toDisplayRef(result[key]);\n }\n\n if (result.eventData && typeof result.eventData === 'object') {\n const ed = { ...(result.eventData as Record<string, unknown>) };\n for (const key of ['result', 'input', 'output', 'metadata', 'payload']) {\n ed[key] = toDisplayRef(ed[key]);\n }\n result.eventData = ed;\n }\n\n return result as T;\n}\n\n/**\n * Hydrate the serialized data fields of a resource for CLI display.\n *\n * When `encryptorResolver` is null (default / no --decrypt flag), encrypted\n * fields are shown as styled \"🔒 Encrypted\" placeholders via EncryptedDataRef.\n *\n * When `encryptorResolver` is provided (--decrypt flag), encrypted fields\n * are decrypted before hydration so the actual user data is displayed.\n */\nexport async function hydrateResourceIO<T>(\n resource: T,\n keyResolver?: EncryptionKeyResolver\n): Promise<T> {\n // Pre-process: decrypt any encrypted fields when a resolver is provided\n const preprocessed = await maybeDecryptFields(\n resource as any,\n keyResolver ?? null\n );\n const hydrated = hydrateResourceIOGeneric(preprocessed, getRevivers()) as T;\n // Post-process: swap encrypted Uint8Arrays and expired stubs for CLI-styled objects\n return replaceEncryptedAndExpiredWithRef(hydrated);\n}\n"]}
1
+ {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../../src/lib/inspect/hydration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,IAAI,wBAAwB,EAC7C,eAAe,EACf,aAAa,EACb,QAAQ,EACR,qBAAqB,EAErB,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,oDAAoD;AACpD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,WAAW,EAEX,eAAe,EAEf,UAAU,GACX,MAAM,qCAAqC,CAAC;AAE7C,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,CAAC,OAAO,CAAC,MAAM,CAAC,CACd,MAAc,EACd,OAAmD;QAEnD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC;QAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,eAAe,CAAC;QACrE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO;YACpC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,EAAE,EAAE,WAAW,CAAC;YAC9C,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC;IACzD,CAAC;CACF;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,gBAAgB;IACpB,CAAC,OAAO,CAAC,MAAM,CAAC;QACd,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC;IAED,MAAM;QACJ,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,QAAQ;QACN,OAAO,qBAAqB,CAAC;IAC/B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,aAAa,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAE7C,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,gBAAgB,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,cAAc;IAClB,CAAC,OAAO,CAAC,MAAM,CAAC;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,QAAQ;QACN,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;AAEzC,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,cAAc,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,kBAAkB,GAAG;IACzB,gBAAgB;IAChB,cAAc;IACd,OAAO;IACP,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,WAAW;IACX,UAAU;CACF,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,SAAS,0BAA0B,CACjC,OAAgC;IAEhC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;YACtC,KAAK,EAAE;gBACL,MAAM,IAAI,GAA4B;oBACpC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC;gBACF,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,IAAI,CAAC,KAAK,GAAI,IAA2B,CAAC,KAAK,CAAC;gBAClD,CAAC;gBACD,sEAAsE;gBACtE,qDAAqD;gBACrD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjC,MAAM,OAAO,GAAI,YAAyB,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC,CAAC,CACH,CAAC;IACF,OAAO;QACL,GAAG,YAAY;QACf,GAAG,aAAa;QAChB,sEAAsE;QACtE,GAAG,qBAAqB;QACxB,qEAAqE;QACrE,oEAAoE;QACpE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,oFAAoF;YACpF,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,cAAa,CAAC,EAAE,CAAC,OAAQ,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,CAAC,KAAK,CAAC,gBAAgB;oBACxB,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,oFAAoF;YACpF,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,cAAa,CAAC,EAAE,CAAC,QAAS,CAAC;YACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,iEAAiE;QACjE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC9D,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,+DAA+D;YAC/D,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,mBAAmB,CAC5B,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC/B,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,IAAI,CACX,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,SAAS,WAAW;IAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,cAAc,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,KAAK,UAAU,kBAAkB,CAQ/B,QAAW,EAAE,QAA+B;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,MAAM,KAAK,GAAI,QAAgB,CAAC,KAA2B,CAAC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE5B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvD,wDAAwD;QACxD,MAAM,CAAC,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAc,CAAC,KAAK,GAAG,MAAM,YAAY,CAAE,MAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAErE,gCAAgC;QAChC,MAAM,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEzD,mCAAmC;QACnC,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI;gBAClB,QAAQ;gBACR,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,SAAS;aACV,EAAE,CAAC;gBACF,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,qEAAqE;QACrE,qEAAqE;QACrE,sDAAsD;QACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,kCAAkC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,oFAAoF;AACpF,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACjD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,iCAAiC,CAAI,QAAW;IACvD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/D,MAAM,CAAC,GAAG,QAAmC,CAAC;IAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAExB,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAI,MAAM,CAAC,SAAqC,EAAE,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;YACvE,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAW,EACX,WAAmC;IAEnC,wEAAwE;IACxE,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,QAAe,EACf,WAAW,IAAI,IAAI,CACpB,CAAC;IACF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,YAAY,EAAE,WAAW,EAAE,CAAM,CAAC;IAC5E,oFAAoF;IACpF,OAAO,iCAAiC,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/**\n * CLI-specific hydration for o11y display.\n *\n * Node.js revivers that use `Buffer.from()` for base64 decoding and add\n * `util.inspect.custom` to ClassInstanceRef for pretty CLI output.\n */\n\nimport { inspect } from 'node:util';\nimport { getCommonRevivers, maybeDecrypt } from '@workflow/core/serialization';\nimport {\n ClassInstanceRef,\n extractClassName,\n hydrateResourceIO as hydrateResourceIOGeneric,\n isEncryptedData,\n isExpiredStub,\n isRunRef,\n observabilityRevivers,\n type Revivers,\n serializedInstanceToRef,\n} from '@workflow/core/serialization-format';\nimport { parseClassName } from '@workflow/utils/parse-name';\nimport chalk from 'chalk';\n\n/**\n * A function that resolves an encryption key for a run, or null to skip\n * decryption. Accepts a runId — the resolver is responsible for looking\n * up the WorkflowRun internally (with caching) if the World needs it.\n */\nexport type EncryptionKeyResolver =\n | ((runId: string) => Promise<Uint8Array | undefined>)\n | null;\n\n// Re-export types and utilities that consumers need\nexport {\n CLASS_INSTANCE_REF_TYPE,\n ClassInstanceRef,\n ENCRYPTED_PLACEHOLDER,\n extractStreamIds,\n isClassInstanceRef,\n isEncryptedData,\n isStreamId,\n isStreamRef,\n type Revivers,\n STREAM_REF_TYPE,\n type StreamRef,\n truncateId,\n} from '@workflow/core/serialization-format';\n\n// ---------------------------------------------------------------------------\n// CLI ClassInstanceRef with inspect.custom\n// ---------------------------------------------------------------------------\n\n/**\n * Extended ClassInstanceRef with Node.js `util.inspect.custom` for\n * pretty CLI output: `ClassName@filename { ...data }`\n */\nclass CLIClassInstanceRef extends ClassInstanceRef {\n [inspect.custom](\n _depth: number,\n options: import('node:util').InspectOptionsStylized\n ): string {\n const dataStr = inspect(this.data, { ...options, depth: options.depth });\n const parsed = parseClassName(this.classId);\n const moduleSpecifier = parsed?.moduleSpecifier ?? this.classId;\n const fileName = moduleSpecifier.split('/').pop() ?? moduleSpecifier;\n const styledFileName = options.stylize\n ? options.stylize(`@${fileName}`, 'undefined')\n : `@${fileName}`;\n return `${this.className}${styledFileName} ${dataStr}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI encrypted data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for encrypted data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim yellow \"🔒 Encrypted\") instead of a plain quoted string.\n * Also provides `toJSON()` for `--json` output.\n */\nclass EncryptedDataRef {\n [inspect.custom](): string {\n return chalk.dim.yellow('\\u{1F512} Encrypted');\n }\n\n toJSON(): string {\n return '\\u{1F512} Encrypted';\n }\n\n toString(): string {\n return '\\u{1F512} Encrypted';\n }\n}\n\n/** Singleton encrypted data placeholder for CLI display */\nconst ENCRYPTED_REF = new EncryptedDataRef();\n\n/** Check if a value is an EncryptedDataRef (for custom table formatting in CLI) */\nexport function isEncryptedRef(value: unknown): value is EncryptedDataRef {\n return value instanceof EncryptedDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI expired data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for expired data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim gray \"<data expired>\") instead of a raw stub object.\n * Also provides `toJSON()` for `--json` output.\n */\nclass ExpiredDataRef {\n [inspect.custom](): string {\n return chalk.gray('<data expired>');\n }\n\n toJSON(): string {\n return '<data expired>';\n }\n\n toString(): string {\n return '<data expired>';\n }\n}\n\n/** Singleton expired data placeholder for CLI display */\nconst EXPIRED_REF = new ExpiredDataRef();\n\n/** Check if a value is an ExpiredDataRef (for custom table formatting in CLI) */\nexport function isExpiredRef(value: unknown): value is ExpiredDataRef {\n return value instanceof ExpiredDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI revivers (Node.js, uses Buffer)\n// ---------------------------------------------------------------------------\n\n/**\n * The set of reducer keys whose `getCommonRevivers()` output produces a\n * native `Error` instance. We wrap each of these with an additional\n * `toJSON` attachment in CLI mode (see `wrapErrorReviverWithToJSON`).\n */\nconst ERROR_REVIVER_KEYS = [\n 'AggregateError',\n 'DOMException',\n 'Error',\n 'EvalError',\n 'FatalError',\n 'RangeError',\n 'ReferenceError',\n 'RetryableError',\n 'SyntaxError',\n 'TypeError',\n 'URIError',\n] as const;\n\n/**\n * Wraps a runtime Error reviver so that the produced instance carries a\n * non-enumerable `toJSON` method. The runtime revivers return real `Error`\n * instances (good for `util.inspect`, `instanceof`, `toString`, etc.), but\n * `Error.prototype`'s `name` / `message` / `stack` / `cause` are\n * non-enumerable and would be dropped by `JSON.stringify` — which is how\n * the CLI emits its `--json` output. Adding `toJSON` (which `JSON.stringify`\n * calls but `util.inspect` ignores) gives us the best of both worlds:\n * round-tripped errors render cleanly in both modes without the\n * data-versus-display tradeoff that plain-object revivers would force.\n *\n * Subclass-specific enumerable fields (e.g. `RetryableError.retryAfter`,\n * `AggregateError.errors`, `FatalError.fatal`) are picked up automatically\n * via `Object.assign` after the base fields, so we don't have to enumerate\n * them per-subclass.\n */\nfunction wrapErrorReviverWithToJSON(\n reviver: (value: any) => unknown\n): (value: any) => unknown {\n return (value) => {\n const result = reviver(value);\n if (!(result instanceof Error)) return result;\n Object.defineProperty(result, 'toJSON', {\n value: function (this: Error) {\n const json: Record<string, unknown> = {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n if ('cause' in this) {\n json.cause = (this as { cause: unknown }).cause;\n }\n // Pick up subclass-specific enumerable fields (e.g. FatalError.fatal,\n // RetryableError.retryAfter, AggregateError.errors).\n Object.assign(json, this);\n return json;\n },\n enumerable: false,\n writable: true,\n configurable: true,\n });\n return result;\n };\n}\n\n/**\n * The set of revivers used by CLI inspect output.\n *\n * Built on top of `getCommonRevivers()` from `@workflow/core` so that the\n * CLI stays in sync with the runtime's reviver set automatically. Without\n * this, every new reviver added to core (e.g. `FatalError`,\n * `RetryableError`, the built-in `Error` subclasses) would silently\n * disappear from CLI output: devalue throws \"Unknown type X\" for\n * unrecognized reduced types, and `hydrateResourceIO` swallows that error\n * and surfaces the raw `Uint8Array` payload to consumers — which then\n * shows up as `step.error` / `run.error` byte dumps instead of usable\n * `{ message, stack, … }` objects.\n *\n * On top of the common set we layer:\n * - A `toJSON` shim on each Error reviver so non-enumerable\n * `Error.prototype` fields survive `JSON.stringify` for `--json` output\n * while leaving `util.inspect` rendering untouched\n * - `observabilityRevivers` for streams / step+workflow function refs\n * - CLI-specific overrides that produce display-friendly placeholders\n * for `Class` / `Instance` (the runtime versions need full class\n * identity which the CLI doesn't have access to)\n */\nexport function getCLIRevivers(): Revivers {\n const baseRevivers = getCommonRevivers(globalThis);\n const errorRevivers = Object.fromEntries(\n ERROR_REVIVER_KEYS.flatMap((key) => {\n const reviver = (baseRevivers as Revivers)[key];\n return reviver ? [[key, wrapErrorReviverWithToJSON(reviver)]] : [];\n })\n );\n return {\n ...baseRevivers,\n ...errorRevivers,\n // O11y-specific revivers (streams, step functions → display objects).\n ...observabilityRevivers,\n // Node `Request` / `Response` revivers that don't rely on running an\n // actual fetch handler — used to render request/response IO inline.\n Request: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Request: function () {} }.Request!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n method: value.method,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n duplex: value.duplex,\n ...(value.responseWritable\n ? { responseWritable: value.responseWritable }\n : {}),\n });\n return obj;\n },\n Response: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Response: function () {} }.Response!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n status: value.status,\n statusText: value.statusText,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n redirected: value.redirected,\n type: value.type,\n });\n return obj;\n },\n // CLI-specific overrides for class instances with inspect.custom\n Class: (value) => `<class:${extractClassName(value.classId)}>`,\n Instance: (value) => {\n // Run instances are rendered as RunRef for clickable rendering\n const runRef = serializedInstanceToRef(value);\n if (isRunRef(runRef)) {\n return runRef;\n }\n return new CLIClassInstanceRef(\n extractClassName(value.classId),\n value.classId,\n value.data\n );\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pre-built CLI revivers (cached)\n// ---------------------------------------------------------------------------\n\nlet cachedRevivers: Revivers | null = null;\n\nfunction getRevivers(): Revivers {\n if (!cachedRevivers) {\n cachedRevivers = getCLIRevivers();\n }\n return cachedRevivers;\n}\n\n// ---------------------------------------------------------------------------\n// Decryption helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-process a resource's data fields: if the resolver is provided and\n * the field is encrypted, decrypt it before generic hydration.\n *\n * Uses core's `maybeDecrypt()` which handles the 'encr' prefix stripping\n * and AES-GCM decryption transparently.\n *\n * When the resolver is null (no --decrypt flag), encrypted fields pass\n * through as Uint8Array and are replaced with EncryptedDataRef in post-processing.\n */\nasync function maybeDecryptFields<\n T extends {\n runId?: string;\n input?: any;\n output?: any;\n metadata?: any;\n eventData?: any;\n },\n>(resource: T, resolver: EncryptionKeyResolver): Promise<T> {\n if (!resolver) return resource;\n\n const runId = (resource as any).runId as string | undefined;\n if (!runId) return resource;\n\n const result = { ...resource };\n\n try {\n const rawKey = await resolver(runId);\n const { importKey } = await import('@workflow/core/encryption');\n const k = rawKey ? await importKey(rawKey) : undefined;\n\n // Decrypt input/output/error fields (WorkflowRun, Step)\n result.input = await maybeDecrypt(result.input, k);\n result.output = await maybeDecrypt(result.output, k);\n (result as any).error = await maybeDecrypt((result as any).error, k);\n\n // Decrypt metadata field (Hook)\n result.metadata = await maybeDecrypt(result.metadata, k);\n\n // Decrypt eventData fields (Event)\n if (result.eventData && typeof result.eventData === 'object') {\n const eventData = { ...result.eventData };\n for (const field of [\n 'result',\n 'input',\n 'output',\n 'metadata',\n 'payload',\n ]) {\n eventData[field] = await maybeDecrypt(eventData[field], k);\n }\n result.eventData = eventData;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // If the key fetch failed due to an HTTP error (e.g. 429 rate limit,\n // 500 server error), re-throw so the caller surfaces a clear failure\n // instead of silently showing encrypted placeholders.\n if (message.includes('HTTP ')) {\n throw err;\n }\n\n // Decryption failed (bad key, corrupted ciphertext, etc.) — fall back\n // to showing encrypted placeholders instead of crashing the CLI.\n const { logger } = await import('../config/log.js');\n logger.warn(`Decryption failed for resource ${runId}: ${message}`);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Replace a single field value with a display ref if it's encrypted or expired. */\nfunction toDisplayRef(value: unknown): unknown {\n if (isEncryptedData(value)) return ENCRYPTED_REF;\n if (isExpiredStub(value)) return EXPIRED_REF;\n return value;\n}\n\n/**\n * Replace encrypted Uint8Array values and expired stubs with styled\n * ref objects in known data fields for custom inspect rendering.\n */\nfunction replaceEncryptedAndExpiredWithRef<T>(resource: T): T {\n if (!resource || typeof resource !== 'object') return resource;\n const r = resource as Record<string, unknown>;\n const result = { ...r };\n\n for (const key of ['input', 'output', 'metadata', 'error']) {\n result[key] = toDisplayRef(result[key]);\n }\n\n if (result.eventData && typeof result.eventData === 'object') {\n const ed = { ...(result.eventData as Record<string, unknown>) };\n for (const key of ['result', 'input', 'output', 'metadata', 'payload']) {\n ed[key] = toDisplayRef(ed[key]);\n }\n result.eventData = ed;\n }\n\n return result as T;\n}\n\n/**\n * Hydrate the serialized data fields of a resource for CLI display.\n *\n * When `encryptorResolver` is null (default / no --decrypt flag), encrypted\n * fields are shown as styled \"🔒 Encrypted\" placeholders via EncryptedDataRef.\n *\n * When `encryptorResolver` is provided (--decrypt flag), encrypted fields\n * are decrypted before hydration so the actual user data is displayed.\n */\nexport async function hydrateResourceIO<T>(\n resource: T,\n keyResolver?: EncryptionKeyResolver\n): Promise<T> {\n // Pre-process: decrypt any encrypted fields when a resolver is provided\n const preprocessed = await maybeDecryptFields(\n resource as any,\n keyResolver ?? null\n );\n const hydrated = hydrateResourceIOGeneric(preprocessed, getRevivers()) as T;\n // Post-process: swap encrypted Uint8Arrays and expired stubs for CLI-styled objects\n return replaceEncryptedAndExpiredWithRef(hydrated);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/cli",
3
- "version": "5.0.0-beta.3",
3
+ "version": "5.0.0-beta.5",
4
4
  "description": "Command-line interface for Workflow SDK",
5
5
  "type": "module",
6
6
  "bin": {
@@ -55,15 +55,15 @@
55
55
  "tinyglobby": "0.2.15",
56
56
  "xdg-app-paths": "5.1.0",
57
57
  "zod": "4.3.6",
58
- "@workflow/builders": "5.0.0-beta.3",
59
- "@workflow/swc-plugin": "5.0.0-beta.3",
60
- "@workflow/utils": "5.0.0-beta.1",
61
- "@workflow/errors": "5.0.0-beta.1",
62
- "@workflow/core": "5.0.0-beta.3",
63
- "@workflow/web": "5.0.0-beta.3",
64
- "@workflow/world": "5.0.0-beta.1",
65
- "@workflow/world-local": "5.0.0-beta.3",
66
- "@workflow/world-vercel": "5.0.0-beta.3"
58
+ "@workflow/builders": "5.0.0-beta.5",
59
+ "@workflow/swc-plugin": "5.0.0-beta.4",
60
+ "@workflow/utils": "5.0.0-beta.2",
61
+ "@workflow/errors": "5.0.0-beta.2",
62
+ "@workflow/core": "5.0.0-beta.5",
63
+ "@workflow/world": "5.0.0-beta.2",
64
+ "@workflow/web": "5.0.0-beta.5",
65
+ "@workflow/world-local": "5.0.0-beta.4",
66
+ "@workflow/world-vercel": "5.0.0-beta.4"
67
67
  },
68
68
  "scripts": {
69
69
  "build": "tsc && chmod +x bin/run.js",