@workglow/util 0.2.22 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js.map +1 -1
- package/dist/bun.js.map +1 -1
- package/dist/media/cpuImage.d.ts.map +1 -1
- package/dist/media/imageRasterCodecRegistry.d.ts.map +1 -1
- package/dist/media/sharpImage.server.d.ts.map +1 -1
- package/dist/media/webGpuImage.browser.d.ts.map +1 -1
- package/dist/media-browser.d.ts +6 -5
- package/dist/media-browser.d.ts.map +1 -1
- package/dist/media-browser.js +524 -509
- package/dist/media-browser.js.map +15 -15
- package/dist/media-node.js.map +9 -9
- package/dist/node.js.map +1 -1
- package/dist/worker-browser.js.map +1 -1
- package/dist/worker-bun.js.map +1 -1
- package/dist/worker-node.js.map +1 -1
- package/package.json +1 -1
package/dist/media-node.js.map
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/media/imageCacheCodec.ts", "../src/media/imageRasterCodecRegistry.ts", "../src/media/imageValue.ts", "../src/di/Container.ts", "../src/di/ServiceRegistry.ts", "../src/di/InputResolverRegistry.ts", "../src/media/imageHydrationResolver.ts", "../src/media/color.ts", "../src/media/cpuImage.ts", "../src/media/encode.ts", "../src/media/filterRegistry.ts", "../src/media/gpuImage.ts", "../src/media/imageValueSchema.ts", "../src/media/MediaRawImage.ts", "../src/media/previewBudget.ts", "../src/media/shaderRegistry.browser.ts", "../src/media/texturePool.browser.ts", "../src/media/sharpImage.server.ts", "../src/media-node.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerPortCodec } from \"@workglow/util\";\nimport type { BrowserImageValue, ImageValue, NodeImageFormat } from \"./imageValue\";\nimport { imageValueFromBuffer, isBrowserImageValue, isNodeImageValue } from \"./imageValue\";\n\n/**\n * Cache codec for `format: \"image\"` ports.\n *\n * Produces a JSON-safe wire form so persistent caches (e.g. `TaskOutputTabularRepository`,\n * which stringifies before writing to disk) can round-trip image outputs. The wire form\n * carries encoded bytes plus dimensions and `previewScale`; the decoded shape is the\n * platform-native `ImageValue` (browser → `BrowserImageValue`, node/bun → `NodeImageValue`).\n *\n * Cross-platform read is supported: a node-written cache entry decodes to a\n * `BrowserImageValue` when read in the browser (via `createImageBitmap`), and vice versa.\n */\nexport interface ImageValueWire {\n readonly __imageValueWire: 1;\n readonly format: NodeImageFormat;\n readonly base64: string;\n readonly width: number;\n readonly height: number;\n readonly previewScale: number;\n}\n\nfunction isImageValueWire(v: unknown): v is ImageValueWire {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return (\n o.__imageValueWire === 1 &&\n typeof o.base64 === \"string\" &&\n (o.format === \"png\" || o.format === \"jpeg\" || o.format === \"raw-rgba\") &&\n typeof o.width === \"number\" &&\n typeof o.height === \"number\" &&\n typeof o.previewScale === \"number\"\n );\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"base64\");\n }\n let bin = \"\";\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i] ?? 0);\n return btoa(bin);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n const buf = Buffer.from(b64, \"base64\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nasync function browserToPngBase64(value: BrowserImageValue): Promise<string> {\n if (typeof OffscreenCanvas === \"undefined\") {\n throw new Error(\"imageCacheCodec.serialize: BrowserImageValue requires OffscreenCanvas\");\n }\n const off = new OffscreenCanvas(value.width, value.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"imageCacheCodec.serialize: could not acquire 2D context\");\n ctx.drawImage(value.bitmap, 0, 0);\n const blob = await off.convertToBlob({ type: \"image/png\" });\n const bytes = new Uint8Array(await blob.arrayBuffer());\n return bytesToBase64(bytes);\n}\n\nasync function wireToBrowserImageValue(wire: ImageValueWire): Promise<BrowserImageValue> {\n if (typeof createImageBitmap !== \"function\") {\n throw new Error(\"imageCacheCodec.deserialize: browser path requires createImageBitmap\");\n }\n const bytes = base64ToBytes(wire.base64);\n if (wire.format === \"raw-rgba\") {\n if (typeof ImageData === \"undefined\") {\n throw new Error(\"imageCacheCodec.deserialize: raw-rgba decode requires ImageData\");\n }\n // The DOM `ImageData` constructor wants `Uint8ClampedArray<ArrayBuffer>`\n // but `bytes.buffer` widens to `ArrayBufferLike`. Cast through unknown:\n // we just produced these bytes via base64 decode, so they're not a\n // SharedArrayBuffer at runtime.\n const data = new Uint8ClampedArray(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength
|
|
6
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { RawPixelBuffer } from \"./rawPixelBuffer\";\n\nexport interface ImageRasterCodec {\n decodeDataUri(dataUri: string): Promise<RawPixelBuffer>;\n encodeDataUri(image: RawPixelBuffer, mimeType: string): Promise<string>;\n}\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies\n// of this file (e.g. one inlined into the app entry, one inlined into a\n// worker entry). Without sharing through globalThis, tasks would register\n// the codec into one copy while the runner queries another and throws.\nconst GLOBAL_CODEC_KEY = Symbol.for(\"@workglow/util/media/imageRasterCodec\");\nconst _g = globalThis as Record<symbol, unknown>;\n\ninterface CodecSlot {
|
|
5
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerPortCodec } from \"@workglow/util\";\nimport type { BrowserImageValue, ImageValue, NodeImageFormat } from \"./imageValue\";\nimport { imageValueFromBuffer, isBrowserImageValue, isNodeImageValue } from \"./imageValue\";\n\n/**\n * Cache codec for `format: \"image\"` ports.\n *\n * Produces a JSON-safe wire form so persistent caches (e.g. `TaskOutputTabularRepository`,\n * which stringifies before writing to disk) can round-trip image outputs. The wire form\n * carries encoded bytes plus dimensions and `previewScale`; the decoded shape is the\n * platform-native `ImageValue` (browser → `BrowserImageValue`, node/bun → `NodeImageValue`).\n *\n * Cross-platform read is supported: a node-written cache entry decodes to a\n * `BrowserImageValue` when read in the browser (via `createImageBitmap`), and vice versa.\n */\nexport interface ImageValueWire {\n readonly __imageValueWire: 1;\n readonly format: NodeImageFormat;\n readonly base64: string;\n readonly width: number;\n readonly height: number;\n readonly previewScale: number;\n}\n\nfunction isImageValueWire(v: unknown): v is ImageValueWire {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return (\n o.__imageValueWire === 1 &&\n typeof o.base64 === \"string\" &&\n (o.format === \"png\" || o.format === \"jpeg\" || o.format === \"raw-rgba\") &&\n typeof o.width === \"number\" &&\n typeof o.height === \"number\" &&\n typeof o.previewScale === \"number\"\n );\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"base64\");\n }\n let bin = \"\";\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i] ?? 0);\n return btoa(bin);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n const buf = Buffer.from(b64, \"base64\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nasync function browserToPngBase64(value: BrowserImageValue): Promise<string> {\n if (typeof OffscreenCanvas === \"undefined\") {\n throw new Error(\"imageCacheCodec.serialize: BrowserImageValue requires OffscreenCanvas\");\n }\n const off = new OffscreenCanvas(value.width, value.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"imageCacheCodec.serialize: could not acquire 2D context\");\n ctx.drawImage(value.bitmap, 0, 0);\n const blob = await off.convertToBlob({ type: \"image/png\" });\n const bytes = new Uint8Array(await blob.arrayBuffer());\n return bytesToBase64(bytes);\n}\n\nasync function wireToBrowserImageValue(wire: ImageValueWire): Promise<BrowserImageValue> {\n if (typeof createImageBitmap !== \"function\") {\n throw new Error(\"imageCacheCodec.deserialize: browser path requires createImageBitmap\");\n }\n const bytes = base64ToBytes(wire.base64);\n if (wire.format === \"raw-rgba\") {\n if (typeof ImageData === \"undefined\") {\n throw new Error(\"imageCacheCodec.deserialize: raw-rgba decode requires ImageData\");\n }\n // The DOM `ImageData` constructor wants `Uint8ClampedArray<ArrayBuffer>`\n // but `bytes.buffer` widens to `ArrayBufferLike`. Cast through unknown:\n // we just produced these bytes via base64 decode, so they're not a\n // SharedArrayBuffer at runtime.\n const data = new Uint8ClampedArray(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength\n ) as unknown as Uint8ClampedArray<ArrayBuffer>;\n const imageData = new ImageData(data, wire.width, wire.height);\n const bitmap = await createImageBitmap(imageData);\n return { bitmap, width: wire.width, height: wire.height, previewScale: wire.previewScale };\n }\n const mime = wire.format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\n const blob = new Blob([bytes.buffer as ArrayBuffer], { type: mime });\n const bitmap = await createImageBitmap(blob);\n return { bitmap, width: wire.width, height: wire.height, previewScale: wire.previewScale };\n}\n\n/**\n * The codec is registered for the `image` format prefix, so it also receives\n * sub-formats like `image:data-uri` (used by `FileLoaderTask` to emit base64\n * data URLs). Strings are already JSON-safe, so they pass through both\n * directions unchanged. The wire form is only used for live `ImageValue`\n * inputs that need to survive `JSON.stringify`.\n */\nregisterPortCodec<ImageValue | string, ImageValueWire | string>(\"image\", {\n async serialize(value): Promise<ImageValueWire | string> {\n if (typeof value === \"string\") return value;\n if (isNodeImageValue(value)) {\n return {\n __imageValueWire: 1,\n format: value.format,\n base64: value.buffer.toString(\"base64\"),\n width: value.width,\n height: value.height,\n previewScale: value.previewScale,\n };\n }\n if (isBrowserImageValue(value)) {\n const base64 = await browserToPngBase64(value);\n return {\n __imageValueWire: 1,\n format: \"png\",\n base64,\n width: value.width,\n height: value.height,\n previewScale: value.previewScale,\n };\n }\n throw new Error(\"imageCacheCodec.serialize: value is not an ImageValue or string\");\n },\n\n async deserialize(wire): Promise<ImageValue | string> {\n if (typeof wire === \"string\") return wire;\n if (!isImageValueWire(wire)) {\n throw new Error(\"imageCacheCodec.deserialize: input is not an ImageValueWire or string\");\n }\n if (typeof Buffer !== \"undefined\") {\n return imageValueFromBuffer(\n Buffer.from(wire.base64, \"base64\"),\n wire.format,\n wire.width,\n wire.height,\n wire.previewScale\n );\n }\n return wireToBrowserImageValue(wire);\n },\n});\n",
|
|
6
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { RawPixelBuffer } from \"./rawPixelBuffer\";\n\nexport interface ImageRasterCodec {\n decodeDataUri(dataUri: string): Promise<RawPixelBuffer>;\n encodeDataUri(image: RawPixelBuffer, mimeType: string): Promise<string>;\n}\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies\n// of this file (e.g. one inlined into the app entry, one inlined into a\n// worker entry). Without sharing through globalThis, tasks would register\n// the codec into one copy while the runner queries another and throws.\nconst GLOBAL_CODEC_KEY = Symbol.for(\"@workglow/util/media/imageRasterCodec\");\nconst _g = globalThis as Record<symbol, unknown>;\n\ninterface CodecSlot {\n value: ImageRasterCodec | null;\n}\nif (!_g[GLOBAL_CODEC_KEY]) {\n _g[GLOBAL_CODEC_KEY] = { value: null } satisfies CodecSlot;\n}\nconst slot = _g[GLOBAL_CODEC_KEY] as CodecSlot;\n\nexport function registerImageRasterCodec(next: ImageRasterCodec): void {\n slot.value = next;\n}\n\nexport function getImageRasterCodec(): ImageRasterCodec {\n if (!slot.value) {\n throw new Error(\n \"Image raster codec is not registered. Ensure you import @workglow/tasks from the browser or Node entry (dist/browser.js or dist/node.js), or call registerImageRasterCodec() during startup.\"\n );\n }\n return slot.value;\n}\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\n\nexport type NodeImageFormat = \"png\" | \"jpeg\" | \"raw-rgba\";\n\nexport interface ImageValueBase {\n readonly width: number;\n readonly height: number;\n readonly previewScale: number;\n}\n\nexport interface BrowserImageValue extends ImageValueBase {\n readonly bitmap: ImageBitmap;\n}\n\nexport interface NodeImageValue extends ImageValueBase {\n readonly buffer: Buffer;\n readonly format: NodeImageFormat;\n}\n\nexport type ImageValue = BrowserImageValue | NodeImageValue;\n\nexport function imageValueFromBitmap(\n bitmap: ImageBitmap,\n width: number,\n height: number,\n previewScale: number = 1.0\n): BrowserImageValue {\n return { bitmap, width, height, previewScale };\n}\n\nexport function imageValueFromBuffer(\n buffer: Buffer,\n format: NodeImageFormat,\n width: number,\n height: number,\n previewScale: number = 1.0\n): NodeImageValue {\n return { buffer, format, width, height, previewScale };\n}\n\nexport function isImageValue(v: unknown): v is ImageValue {\n return isBrowserImageValue(v) || isNodeImageValue(v);\n}\n\nexport function isBrowserImageValue(v: unknown): v is BrowserImageValue {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return (\n typeof o.width === \"number\" &&\n typeof o.height === \"number\" &&\n typeof o.previewScale === \"number\" &&\n typeof ImageBitmap !== \"undefined\" &&\n o.bitmap instanceof ImageBitmap\n );\n}\n\nexport function isNodeImageValue(v: unknown): v is NodeImageValue {\n if (v === null || typeof v !== \"object\") return false;\n const o = v as Record<string, unknown>;\n return (\n typeof o.width === \"number\" &&\n typeof o.height === \"number\" &&\n typeof o.previewScale === \"number\" &&\n typeof Buffer !== \"undefined\" &&\n Buffer.isBuffer(o.buffer) &&\n (o.format === \"png\" || o.format === \"jpeg\" || o.format === \"raw-rgba\")\n );\n}\n\n/**\n * Best-effort normalization at boundaries (input resolver, builder hook).\n * Accepts the wire forms an `ImageValue` port may receive:\n * - an existing `ImageValue` (passthrough)\n * - a `data:` URI (browser: decoded via `createImageBitmap`; node: encoded\n * bytes wrapped in a `NodeImageValue`, with dimensions probed via the\n * registered raster codec)\n * - a `Blob` (browser only)\n * - an `ImageBitmap` (browser only)\n * Returns `undefined` for unrecognized shapes.\n *\n * Note: a raw `Buffer` is intentionally not handled here — callers with\n * encoded bytes plus a format hint should construct one via\n * `imageValueFromBuffer(...)` directly.\n *\n * String dispatch is platform-agnostic; non-string platform-specific shapes\n * are tested via `typeof` guards so the same module loads on browser and node.\n */\nexport async function normalizeToImageValue(value: unknown): Promise<ImageValue | undefined> {\n if (value === null || value === undefined) return undefined;\n if (isImageValue(value)) return value;\n\n if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n if (typeof createImageBitmap === \"function\") {\n const bitmap = await createImageBitmap(value);\n return imageValueFromBitmap(bitmap, bitmap.width, bitmap.height);\n }\n return undefined;\n }\n\n if (typeof ImageBitmap !== \"undefined\" && value instanceof ImageBitmap) {\n return imageValueFromBitmap(value, value.width, value.height);\n }\n\n if (typeof value === \"string\" && value.startsWith(\"data:\")) {\n if (typeof createImageBitmap === \"function\" && typeof fetch === \"function\") {\n const blob = await (await fetch(value)).blob();\n const bitmap = await createImageBitmap(blob);\n return imageValueFromBitmap(bitmap, bitmap.width, bitmap.height);\n }\n if (typeof Buffer !== \"undefined\") {\n return decodeDataUriToNodeImageValue(value);\n }\n return undefined;\n }\n\n return undefined;\n}\n\nasync function decodeDataUriToNodeImageValue(dataUri: string): Promise<NodeImageValue | undefined> {\n const match = /^data:([^;,]+);base64,(.+)$/.exec(dataUri);\n if (!match) return undefined;\n const mime = match[1] ?? \"image/png\";\n const base64 = match[2] ?? \"\";\n const buffer = Buffer.from(base64, \"base64\");\n const format: NodeImageFormat = /jpe?g/i.test(mime) ? \"jpeg\" : \"png\";\n // Probe dimensions through the registered raster codec. Rethrow any codec\n // failure with the original error as `cause` so the underlying problem\n // (no codec registered, malformed payload, etc.) isn't lost behind the\n // resolver's generic \"unsupported string\" message.\n try {\n const decoded = await getImageRasterCodec().decodeDataUri(dataUri);\n return imageValueFromBuffer(buffer, format, decoded.width, decoded.height);\n } catch (err) {\n throw new Error(\"normalizeToImageValue: failed to probe data URI dimensions\", {\n cause: err,\n });\n }\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Simple dependency injection container for managing service instances and dependencies\n */\nexport class Container {\n private services: Map<string, any> = new Map();\n private factories: Map<string, () => any> = new Map();\n private singletons: Set<string> = new Set();\n private resolving: string[] = [];\n\n /**\n * Register a service factory\n * @param token The identifier token for the service\n * @param factory A factory function that creates the service\n * @param singleton Whether the service should be a singleton (created once)\n */\n register<T>(token: string, factory: () => T, singleton = true): void {\n this.factories.set(token, factory);\n if (singleton) {\n this.singletons.add(token);\n }\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * This is an atomic check-and-register to avoid TOCTOU races.\n * @param token The identifier token for the service\n * @param factory A factory function that creates the service\n * @param singleton Whether the service should be a singleton (created once)\n */\n registerIfAbsent<T>(token: string, factory: () => T, singleton = true): void {\n if (this.factories.has(token) || this.services.has(token)) {\n return;\n }\n this.register(token, factory, singleton);\n }\n\n /**\n * Register an instance as a service\n * @param token The identifier token for the service\n * @param instance The instance to register\n */\n registerInstance<T>(token: string, instance: T): void {\n this.services.set(token, instance);\n this.singletons.add(token);\n }\n\n /**\n * Get a service by its token\n * @param token The identifier token for the service\n * @returns The service instance\n */\n get<T>(token: string): T {\n if (this.services.has(token)) {\n return this.services.get(token) as T;\n }\n\n const factory = this.factories.get(token);\n if (!factory) {\n throw new Error(`Service not registered: ${String(token)}`);\n }\n\n if (this.resolving.includes(token)) {\n const cycle = [...this.resolving.slice(this.resolving.indexOf(token)), token];\n throw new Error(`Circular dependency detected: ${cycle.join(\" -> \")}`);\n }\n\n this.resolving.push(token);\n try {\n const instance = factory();\n\n if (this.singletons.has(token)) {\n this.services.set(token, instance);\n }\n\n return instance as T;\n } finally {\n this.resolving.pop();\n }\n }\n\n /**\n * Check if a service is registered\n * @param token The identifier token for the service\n * @returns True if the service is registered\n */\n has(token: string): boolean {\n return this.services.has(token) || this.factories.has(token);\n }\n\n /**\n * Remove a service registration\n * @param token The identifier token for the service\n */\n remove(token: string): void {\n this.services.delete(token);\n this.factories.delete(token);\n this.singletons.delete(token);\n }\n\n /**\n * Dispose all instantiated singleton services and clear registrations.\n * Services implementing dispose(), Symbol.asyncDispose, or Symbol.dispose will be cleaned up.\n */\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n try {\n for (const service of this.services.values()) {\n if (service == null) continue;\n try {\n if (typeof service[Symbol.asyncDispose] === \"function\") {\n await service[Symbol.asyncDispose]();\n } else if (typeof service[Symbol.dispose] === \"function\") {\n service[Symbol.dispose]();\n } else if (typeof service.dispose === \"function\") {\n await service.dispose();\n }\n } catch (err) {\n errors.push(err);\n }\n }\n } finally {\n this.services.clear();\n this.factories.clear();\n this.singletons.clear();\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more services failed to dispose\");\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n }\n\n /**\n * Create a child container that inherits registrations from the parent\n * @returns A new child container\n */\n createChildContainer(): Container {\n const child = new Container();\n\n // Copy all registrations to the child\n this.factories.forEach((factory, token) => {\n child.factories.set(token, factory);\n if (this.singletons.has(token)) {\n child.singletons.add(token);\n }\n });\n\n // Copy all singleton instances to the child\n this.services.forEach((service, token) => {\n if (this.singletons.has(token)) {\n child.services.set(token, service);\n child.singletons.add(token);\n }\n });\n\n return child;\n }\n}\n\n/**\n * Global container instance — shared across all bundle copies of this module\n * via a Symbol.for key so that split entry points (e.g. @workglow/util/media)\n * resolve to the same DI registry as @workglow/util.\n */\nconst GLOBAL_CONTAINER_KEY = Symbol.for(\"@workglow/util/di/globalContainer\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CONTAINER_KEY]) {\n _g[GLOBAL_CONTAINER_KEY] = new Container();\n}\nexport const globalContainer = _g[GLOBAL_CONTAINER_KEY] as Container;\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Container, globalContainer } from \"./Container\";\n\n/**\n * Service token type for type-safe dependency injection\n */\nexport interface ServiceToken<T> {\n readonly _type: T;\n readonly id: string;\n}\n\n/**\n * Create a typed service token\n * @param id Unique identifier for the service\n * @returns A typed service token\n */\nexport function createServiceToken<T>(id: string): ServiceToken<T> {\n return { id, _type: null as any };\n}\n\n/**\n * Service registry for managing and accessing services\n */\nexport class ServiceRegistry {\n public container: Container;\n\n /**\n * Create a new service registry\n * @param container Optional container to use (defaults to global container)\n */\n constructor(container: Container = globalContainer) {\n this.container = container;\n }\n\n /**\n * Register a service factory\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n register<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.register(token.id, factory, singleton);\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n registerIfAbsent<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.registerIfAbsent(token.id, factory, singleton);\n }\n\n /**\n * Register a service instance\n * @param token Service token\n * @param instance Service instance to register\n */\n registerInstance<T>(token: ServiceToken<T>, instance: T): void {\n this.container.registerInstance(token.id, instance);\n }\n\n /**\n * Get a service by its token\n * @param token Service token\n * @returns The service instance\n */\n get<T>(token: ServiceToken<T>): T {\n return this.container.get<T>(token.id);\n }\n\n /**\n * Check if a service is registered\n * @param token Service token\n * @returns True if the service is registered\n */\n has<T>(token: ServiceToken<T>): boolean {\n return this.container.has(token.id);\n }\n\n /**\n * Dispose all instantiated services and clear registrations.\n */\n async dispose(): Promise<void> {\n await this.container.dispose();\n }\n}\n\n/**\n * Global service registry instance\n */\nexport const globalServiceRegistry = new ServiceRegistry(globalContainer);\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A resolver function that converts a string ID to an instance.\n * Returns undefined if the resolver cannot handle this format.\n * Throws an error if the ID is not found.\n *\n * @param id The string ID to resolve\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputResolverFn = (\n id: string,\n format: string,\n registry: ServiceRegistry\n) => unknown | Promise<unknown>;\n\n/**\n * Service token for the input resolver registry.\n * Maps format prefixes to resolver functions.\n */\nexport const INPUT_RESOLVERS =\n createServiceToken<Map<string, InputResolverFn>>(\"task.input.resolvers\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_RESOLVERS,\n (): Map<string, InputResolverFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input resolver registry\n * @returns Map of format prefix to resolver function\n */\nexport function getInputResolvers(): Map<string, InputResolverFn> {\n return globalServiceRegistry.get(INPUT_RESOLVERS);\n}\n\n/**\n * Registers an input resolver for a format prefix.\n * The resolver will be called for any format that starts with this prefix.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"dataset\")\n * @param resolver The resolver function\n *\n * @example\n * ```typescript\n * // Register model resolver\n * registerInputResolver(\"model\", async (id, format, registry) => {\n * const modelRepo = registry.get(MODEL_REPOSITORY);\n * const model = await modelRepo.findByName(id);\n * if (!model) throw new Error(`Model \"${id}\" not found`);\n * return model;\n * });\n *\n * // Register dataset resolver\n * registerInputResolver(\"dataset\", (id, format, registry) => {\n * const datasetType = format.split(\":\")[1]; // \"tabular\", \"vector\", etc.\n * if (datasetType === \"tabular\") {\n * const datasets = registry.get(TABULAR_DATASETS);\n * const dataset = datasets.get(id);\n * if (!dataset) throw new Error(`Dataset \"${id}\" not found`);\n * return dataset;\n * }\n * throw new Error(`Unknown dataset type: ${datasetType}`);\n * });\n * ```\n */\nexport function registerInputResolver(formatPrefix: string, resolver: InputResolverFn): void {\n const resolvers = getInputResolvers();\n resolvers.set(formatPrefix, resolver);\n}\n",
|
|
11
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerInputResolver } from \"../di/InputResolverRegistry\";\nimport { normalizeToImageValue } from \"./imageValue\";\nimport type { ServiceRegistry } from \"../di/ServiceRegistry\";\n\n/**\n * Resolver for `format: \"image\"` ports. Accepts the cross-boundary wire\n * forms and normalizes to `ImageValue`. Non-string non-recognized shapes\n * pass through (consumers normalize at their boundary).\n */\nasync function resolveImage(\n id: unknown,\n _format: string,\n _registry: ServiceRegistry
|
|
11
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport { registerInputResolver } from \"../di/InputResolverRegistry\";\nimport { normalizeToImageValue } from \"./imageValue\";\nimport type { ServiceRegistry } from \"../di/ServiceRegistry\";\n\n/**\n * Resolver for `format: \"image\"` ports. Accepts the cross-boundary wire\n * forms and normalizes to `ImageValue`. Non-string non-recognized shapes\n * pass through (consumers normalize at their boundary).\n */\nasync function resolveImage(\n id: unknown,\n _format: string,\n _registry: ServiceRegistry\n): Promise<unknown> {\n const normalized = await normalizeToImageValue(id);\n if (normalized !== undefined) return normalized;\n if (typeof id === \"string\") {\n const preview = id.length > 32 ? `${id.slice(0, 32)}...` : id;\n throw new Error(\n `format:\"image\" resolver received an unsupported string \"${preview}\". ` +\n `Only data: URIs are handled. Register a sub-resolver for other schemes.`\n );\n }\n return id;\n}\n\nregisterInputResolver(\"image\", resolveImage);\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface ColorObject {\n readonly r: number;\n readonly g: number;\n readonly b: number;\n readonly a: number;\n}\n\nconst HEX_PATTERN = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst CSS_RGB_CHANNEL = \"(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)\";\nconst CSS_RGB_ALPHA = \"(?:0(?:\\\\.\\\\d+)?|1(?:\\\\.0+)?)\";\nconst CSS_RGB_PATTERN = new RegExp(\n `^rgba?\\\\(\\\\s*(${CSS_RGB_CHANNEL})\\\\s*,\\\\s*(${CSS_RGB_CHANNEL})\\\\s*,\\\\s*(${CSS_RGB_CHANNEL})\\\\s*(?:,\\\\s*(${CSS_RGB_ALPHA}))?\\\\s*\\\\)$`\n);\n\n/**\n * Parse a `#RGB` / `#RGBA` / `#RRGGBB` / `#RRGGBBAA` hex color into a {@link ColorObject}.\n * Case-insensitive on input. No whitespace tolerance. Shorthand nibbles are doubled.\n * Throws on any malformed input.\n */\nexport function parseHexColor(hex: string): ColorObject {\n if (typeof hex !== \"string\" || !HEX_PATTERN.test(hex)) {\n throw new Error(`Invalid hex color: ${String(hex)}`);\n }\n const body = hex.slice(1);\n const double = (nibble: string): number => parseInt(nibble + nibble, 16);\n if (body.length === 3) {\n return { r: double(body[0]!), g: double(body[1]!), b: double(body[2]!), a: 255 };\n }\n if (body.length === 4) {\n return {\n r: double(body[0]!),\n g: double(body[1]!),\n b: double(body[2]!),\n a: double(body[3]!),\n };\n }\n if (body.length === 6) {\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: 255,\n };\n }\n return {\n r: parseInt(body.slice(0, 2), 16),\n g: parseInt(body.slice(2, 4), 16),\n b: parseInt(body.slice(4, 6), 16),\n a: parseInt(body.slice(6, 8), 16),\n };\n}\n\nconst CHANNEL_MIN = 0;\nconst CHANNEL_MAX = 255;\n\nfunction assertChannel(name: string, value: number): void {\n if (!Number.isInteger(value) || value < CHANNEL_MIN || value > CHANNEL_MAX) {\n throw new Error(`Color channel ${name} out of range (0-255 integer): ${value}`);\n }\n}\n\nfunction byteToHex(value: number): string {\n return value.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Emit a {@link ColorObject} as `#RRGGBB` when `a === 255`, otherwise `#RRGGBBAA`.\n * Always lowercase, never shorthand. Throws on non-integer or out-of-range channels.\n */\nexport function toHexColor(c: ColorObject): string {\n assertChannel(\"r\", c.r);\n assertChannel(\"g\", c.g);\n assertChannel(\"b\", c.b);\n assertChannel(\"a\", c.a);\n const head = `#${byteToHex(c.r)}${byteToHex(c.g)}${byteToHex(c.b)}`;\n return c.a === 255 ? head : `${head}${byteToHex(c.a)}`;\n}\n\nfunction isInRangeByte(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 255;\n}\n\n/**\n * Type guard for a {@link ColorObject}-shaped value (alpha optional).\n * Does not reject extra properties — JSON Schema validation handles that separately.\n */\nexport function isColorObject(value: unknown): value is ColorObject {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n if (!isInRangeByte(candidate.r)) return false;\n if (!isInRangeByte(candidate.g)) return false;\n if (!isInRangeByte(candidate.b)) return false;\n if (candidate.a !== undefined && !isInRangeByte(candidate.a)) return false;\n return true;\n}\n\n/** Type guard for a hex color string (same regex as `parseHexColor`). */\nexport function isHexColor(value: unknown): value is string {\n return typeof value === \"string\" && HEX_PATTERN.test(value);\n}\n\nfunction parseCssRgbColor(value: string): ColorObject {\n const match = CSS_RGB_PATTERN.exec(value);\n if (!match) {\n throw new Error(`Invalid CSS rgb color: ${String(value)}`);\n }\n\n const r = Number.parseInt(match[1] ?? \"\", 10);\n const g = Number.parseInt(match[2] ?? \"\", 10);\n const b = Number.parseInt(match[3] ?? \"\", 10);\n const alpha = match[4] === undefined ? 1 : Number.parseFloat(match[4]);\n assertChannel(\"r\", r);\n assertChannel(\"g\", g);\n assertChannel(\"b\", b);\n if (!Number.isFinite(alpha) || alpha < 0 || alpha > 1) {\n throw new Error(`Color alpha out of range (0-1 number): ${match[4]}`);\n }\n return { r, g, b, a: Math.round(alpha * 255) };\n}\n\n/**\n * Normalize any accepted wire form to a full {@link ColorObject}. Object inputs\n * default `a` to 255; CSS `rgb(...)` / `rgba(...)` strings use 0-1 alpha.\n * Throws on anything that's not an accepted color value.\n */\nexport function resolveColor(\n value: string | { r: number; g: number; b: number; a?: number }\n): ColorObject {\n if (typeof value === \"string\") {\n if (isHexColor(value)) return parseHexColor(value);\n return parseCssRgbColor(value);\n }\n if (!isColorObject(value)) {\n throw new Error(`Invalid color value: ${JSON.stringify(value)}`);\n }\n return {\n r: value.r,\n g: value.g,\n b: value.b,\n a: value.a ?? 255,\n };\n}\n",
|
|
13
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type {
|
|
14
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { RawPixelBuffer } from \"./rawPixelBuffer\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\n\nasync function rawPixelBufferToBytes(bin: RawPixelBuffer, mimeType: string): Promise<Uint8Array> {\n const dataUri = await getImageRasterCodec().encodeDataUri(bin, mimeType);\n const b64 = dataUri.slice(dataUri.indexOf(\",\") + 1);\n const decoded = atob(b64);\n const bytes = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i);\n return bytes;\n}\n\nexport async function rawPixelBufferToDataUri(\n bin: RawPixelBuffer,\n mimeType = \"image/png\"
|
|
13
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type { GpuImage as IGpuImage, GpuImageEncodeFormat } from \"./gpuImage\";\nimport type { ImageValue, NodeImageValue } from \"./imageValue\";\nimport { isBrowserImageValue, isNodeImageValue } from \"./imageValue\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\nimport type { RawPixelBuffer } from \"./rawPixelBuffer\";\n\nexport type { RawPixelBuffer } from \"./rawPixelBuffer\";\n\nconst FORMAT_TO_MIME: Record<GpuImageEncodeFormat, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n};\n\nexport class CpuImage implements IGpuImage {\n readonly backend = \"cpu\" as const;\n\n private constructor(private bin: RawPixelBuffer | null) {}\n\n get width(): number {\n if (!this.bin) throw new Error(\"CpuImage.width on a disposed image\");\n return this.bin.width;\n }\n get height(): number {\n if (!this.bin) throw new Error(\"CpuImage.height on a disposed image\");\n return this.bin.height;\n }\n get channels(): ImageChannels {\n if (!this.bin) throw new Error(\"CpuImage.channels on a disposed image\");\n return this.bin.channels;\n }\n\n /** @internal — used by CPU filter ops to read the raw pixel buffer. */\n getBinary(): RawPixelBuffer {\n if (!this.bin) throw new Error(\"CpuImage.getBinary on a disposed image\");\n return this.bin;\n }\n\n static async from(value: ImageValue): Promise<CpuImage> {\n if (isBrowserImageValue(value)) {\n if (typeof OffscreenCanvas === \"undefined\") {\n throw new Error(\"CpuImage.from(BrowserImageValue) requires OffscreenCanvas\");\n }\n const off = new OffscreenCanvas(value.width, value.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"CpuImage.from: could not acquire 2D context\");\n ctx.drawImage(value.bitmap, 0, 0);\n const id = ctx.getImageData(0, 0, value.width, value.height);\n return new CpuImage({ data: id.data, width: value.width, height: value.height, channels: 4 });\n }\n if (isNodeImageValue(value)) {\n const bin = await decodeNodeImageValue(value);\n return new CpuImage(bin);\n }\n throw new Error(\"CpuImage.from: unrecognized ImageValue shape\");\n }\n\n /** @internal — synchronous factory for backends that already have a raw buffer\n * in hand (used by the WGSL CPU fallback). */\n static fromRaw(bin: RawPixelBuffer): CpuImage {\n return new CpuImage(bin);\n }\n\n async toImageValue(previewScale: number): Promise<ImageValue> {\n if (!this.bin) throw new Error(\"CpuImage.toImageValue on a disposed image\");\n if (typeof OffscreenCanvas !== \"undefined\" && typeof createImageBitmap === \"function\") {\n const off = new OffscreenCanvas(this.bin.width, this.bin.height);\n const ctx = off.getContext(\"2d\");\n if (!ctx) throw new Error(\"CpuImage.toImageValue could not acquire a 2D context\");\n const rgba = expandToRgba(this.bin);\n ctx.putImageData(\n new ImageData(\n new Uint8ClampedArray(rgba.buffer as ArrayBuffer, rgba.byteOffset, rgba.byteLength),\n this.bin.width,\n this.bin.height\n ),\n 0,\n 0\n );\n const bitmap = await createImageBitmap(off);\n const out: ImageValue = {\n bitmap,\n width: this.bin.width,\n height: this.bin.height,\n previewScale,\n } as ImageValue;\n this.bin = null;\n return out;\n }\n // Node fallback: encode to raw-rgba Buffer.\n const rgba = expandToRgba(this.bin);\n const buffer = Buffer.from(rgba.buffer, rgba.byteOffset, rgba.byteLength);\n const out: NodeImageValue = {\n buffer,\n format: \"raw-rgba\",\n width: this.bin.width,\n height: this.bin.height,\n previewScale,\n };\n this.bin = null;\n return out;\n }\n\n async encode(format: GpuImageEncodeFormat, _quality?: number): Promise<Uint8Array> {\n if (!this.bin) throw new Error(\"CpuImage.encode on a disposed image\");\n const codec = getImageRasterCodec();\n const dataUri = await codec.encodeDataUri(this.bin, FORMAT_TO_MIME[format]);\n return dataUriToBytes(dataUri);\n }\n\n dispose(): void {\n this.bin = null;\n }\n}\n\nfunction expandToRgba(bin: RawPixelBuffer): Uint8ClampedArray {\n if (bin.channels === 4) return bin.data;\n const px = bin.width * bin.height;\n const out = new Uint8ClampedArray(px * 4);\n if (bin.channels === 3) {\n for (let i = 0; i < px; i++) {\n out[i * 4 + 0] = bin.data[i * 3 + 0] ?? 0;\n out[i * 4 + 1] = bin.data[i * 3 + 1] ?? 0;\n out[i * 4 + 2] = bin.data[i * 3 + 2] ?? 0;\n out[i * 4 + 3] = 255;\n }\n } else if (bin.channels === 1) {\n for (let i = 0; i < px; i++) {\n const g = bin.data[i] ?? 0;\n out[i * 4 + 0] = g;\n out[i * 4 + 1] = g;\n out[i * 4 + 2] = g;\n out[i * 4 + 3] = 255;\n }\n }\n return out;\n}\n\nfunction dataUriToBytes(dataUri: string): Uint8Array {\n const comma = dataUri.indexOf(\",\");\n const b64 = dataUri.slice(comma + 1);\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes;\n}\n\nasync function decodeNodeImageValue(value: NodeImageValue): Promise<RawPixelBuffer> {\n if (value.format === \"raw-rgba\") {\n const data = new Uint8ClampedArray(\n value.buffer.buffer,\n value.buffer.byteOffset,\n value.buffer.byteLength\n );\n return { data, width: value.width, height: value.height, channels: 4 };\n }\n const codec = getImageRasterCodec();\n const dataUri = `data:image/${value.format};base64,${value.buffer.toString(\"base64\")}`;\n const decoded = await codec.decodeDataUri(dataUri);\n return {\n data: decoded.data,\n width: decoded.width,\n height: decoded.height,\n channels: decoded.channels as ImageChannels,\n };\n}\n",
|
|
14
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { RawPixelBuffer } from \"./rawPixelBuffer\";\nimport { getImageRasterCodec } from \"./imageRasterCodecRegistry\";\n\nasync function rawPixelBufferToBytes(bin: RawPixelBuffer, mimeType: string): Promise<Uint8Array> {\n const dataUri = await getImageRasterCodec().encodeDataUri(bin, mimeType);\n const b64 = dataUri.slice(dataUri.indexOf(\",\") + 1);\n const decoded = atob(b64);\n const bytes = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i);\n return bytes;\n}\n\nexport async function rawPixelBufferToDataUri(\n bin: RawPixelBuffer,\n mimeType = \"image/png\"\n): Promise<string> {\n return getImageRasterCodec().encodeDataUri(bin, mimeType);\n}\n\nexport async function rawPixelBufferToBlob(\n bin: RawPixelBuffer,\n mimeType = \"image/png\"\n): Promise<Blob> {\n const bytes = await rawPixelBufferToBytes(bin, mimeType);\n return new Blob([bytes.buffer as ArrayBuffer], { type: mimeType });\n}\n",
|
|
15
15
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { GpuImage, GpuImageBackend } from \"./gpuImage\";\n\nexport type FilterOpFn<P = unknown> = (image: GpuImage, params: P) => GpuImage;\n\n// Cross-bundle singleton — same pattern as previewBudget.ts. The registry\n// must be process-wide because filter arms and applyFilter consumers can be\n// loaded through different bundle entries that resolve @workglow/util/media\n// to independent module instances. Storing the Map in a globalThis slot\n// keyed by Symbol.for(...) gives them all a single shared registry.\nconst GLOBAL_REGISTRY_KEY = Symbol.for(\"@workglow/util/media/filterRegistry\");\nconst _g = globalThis as Record<symbol, unknown>;\n\nfunction getRegistry(): Map<string, FilterOpFn<unknown>> {\n let reg = _g[GLOBAL_REGISTRY_KEY] as Map<string, FilterOpFn<unknown>> | undefined;\n if (!reg) {\n reg = new Map();\n _g[GLOBAL_REGISTRY_KEY] = reg;\n }\n return reg;\n}\n\nconst key = (backend: GpuImageBackend, filter: string): string => `${backend}:${filter}`;\n\nexport function registerFilterOp<P>(\n backend: GpuImageBackend,\n filter: string,\n fn: FilterOpFn<P>\n): void {\n getRegistry().set(key(backend, filter), fn as FilterOpFn<unknown>);\n}\n\nexport function applyFilter<P>(image: GpuImage, filter: string, params: P): GpuImage {\n const fn = getRegistry().get(key(image.backend, filter));\n if (!fn) {\n throw new Error(\n `applyFilter(\"${filter}\") on backend \"${image.backend}\": no implementation registered. ` +\n `Task-layer fallback should have routed this to \"cpu\" first; this means even the cpu arm is missing. ` +\n `Ensure @workglow/tasks has been imported so its filter-arm side effects run.`\n );\n }\n return fn(image, params);\n}\n\nexport function hasFilterOp(backend: GpuImageBackend, filter: string): boolean {\n return getRegistry().has(key(backend, filter));\n}\n\n/** @internal — test affordance only. */\nexport function _resetFilterRegistryForTests(): void {\n getRegistry().clear();\n}\n",
|
|
16
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type { ImageValue } from \"./imageValue\";\n\nexport type GpuImageBackend = \"webgpu\" | \"sharp\" | \"cpu\";\nexport type GpuImageEncodeFormat = \"png\" | \"jpeg\" | \"webp\";\n\n/**\n * `GpuImage` is a private implementation detail of image tasks: it never\n * crosses a task/engine/worker boundary. Lives only inside an\n * `ImageFilterTask.execute` method body. Cross-boundary currency is\n * `ImageValue`. Use `GpuImage.from(value)` at task entry and\n * `imageValueFromGpu(out, scale)` (or `transferToImageBitmap()` /\n * `toBuffer()` directly) at task exit.\n */\nexport interface GpuImage {\n readonly width: number;\n readonly height: number;\n readonly channels: ImageChannels;\n readonly backend: GpuImageBackend;\n /** Materialize back into a wire-form `ImageValue`. Always returns a fresh\n * ImageValue; the caller is the new owner. */\n toImageValue(previewScale: number): Promise<ImageValue>;\n /** Encode to a compressed image format (png/jpeg/webp). Implementations MAY\n * consume the underlying resource — treat as single-use. */\n encode(format: GpuImageEncodeFormat, quality?: number): Promise<Uint8Array>;\n /** Early cleanup on error paths only. Required because GPU/native resources\n * are not held by GC. The happy path uses `toImageValue()` which transfers\n * ownership; this is the abort/error case. */\n dispose(): void;\n}\n\nexport interface GpuImageStatic {\n /** Bridge from the cross-boundary `ImageValue` to a backend-private GpuImage. */\n from(value: ImageValue): Promise<GpuImage>;\n}\n\nconst GLOBAL_FACTORY_KEY = Symbol.for(\"@workglow/util/media/gpuImageFactory\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_FACTORY_KEY]) {\n _g[GLOBAL_FACTORY_KEY] = {} as Record<string, unknown>;\n}\nconst factory = _g[GLOBAL_FACTORY_KEY] as Record<string, unknown>;\n\nexport function registerGpuImageFactory<K extends keyof GpuImageStatic>(\n key: K,\n fn: GpuImageStatic[K]
|
|
16
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type { ImageValue } from \"./imageValue\";\n\nexport type GpuImageBackend = \"webgpu\" | \"sharp\" | \"cpu\";\nexport type GpuImageEncodeFormat = \"png\" | \"jpeg\" | \"webp\";\n\n/**\n * `GpuImage` is a private implementation detail of image tasks: it never\n * crosses a task/engine/worker boundary. Lives only inside an\n * `ImageFilterTask.execute` method body. Cross-boundary currency is\n * `ImageValue`. Use `GpuImage.from(value)` at task entry and\n * `imageValueFromGpu(out, scale)` (or `transferToImageBitmap()` /\n * `toBuffer()` directly) at task exit.\n */\nexport interface GpuImage {\n readonly width: number;\n readonly height: number;\n readonly channels: ImageChannels;\n readonly backend: GpuImageBackend;\n /** Materialize back into a wire-form `ImageValue`. Always returns a fresh\n * ImageValue; the caller is the new owner. */\n toImageValue(previewScale: number): Promise<ImageValue>;\n /** Encode to a compressed image format (png/jpeg/webp). Implementations MAY\n * consume the underlying resource — treat as single-use. */\n encode(format: GpuImageEncodeFormat, quality?: number): Promise<Uint8Array>;\n /** Early cleanup on error paths only. Required because GPU/native resources\n * are not held by GC. The happy path uses `toImageValue()` which transfers\n * ownership; this is the abort/error case. */\n dispose(): void;\n}\n\nexport interface GpuImageStatic {\n /** Bridge from the cross-boundary `ImageValue` to a backend-private GpuImage. */\n from(value: ImageValue): Promise<GpuImage>;\n}\n\nconst GLOBAL_FACTORY_KEY = Symbol.for(\"@workglow/util/media/gpuImageFactory\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_FACTORY_KEY]) {\n _g[GLOBAL_FACTORY_KEY] = {} as Record<string, unknown>;\n}\nconst factory = _g[GLOBAL_FACTORY_KEY] as Record<string, unknown>;\n\nexport function registerGpuImageFactory<K extends keyof GpuImageStatic>(\n key: K,\n fn: GpuImageStatic[K]\n): void {\n factory[key] = fn;\n}\n\nexport function getGpuImageFactory<K extends keyof GpuImageStatic>(\n key: K\n): GpuImageStatic[K] | undefined {\n const fn = factory[key];\n return typeof fn === \"function\" ? (fn as GpuImageStatic[K]) : undefined;\n}\n\nexport const GpuImage: GpuImageStatic = new Proxy({} as GpuImageStatic, {\n get(_t, prop) {\n if (typeof prop !== \"string\" || prop === \"then\") return undefined;\n const fn = factory[prop];\n if (typeof fn !== \"function\") {\n throw new Error(`GpuImage.${prop} is not registered. Import the platform entry point.`);\n }\n return fn;\n },\n});\n",
|
|
17
17
|
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { DataPortSchema } from \"../json-schema/DataPortSchema\";\n\n/**\n * Schema annotation for `ImageValue` ports. Multi-type form so the\n * validator accepts the wire forms an `ImageValue` port may receive\n * before hydration: `string` (data: URI), `object` (Blob, ImageBitmap, an\n * ImageValue, or a `Buffer`-like). The `format: \"image\"` annotation drives\n * the input resolver.\n */\nexport function ImageValueSchema(annotations: Record<string, unknown> = {}): DataPortSchema {\n return {\n type: [\"string\", \"object\"],\n properties: {},\n title: \"Image\",\n description: \"Image (hydrated to ImageValue at task entry)\",\n ...annotations,\n format: \"image\",\n } as unknown as DataPortSchema;\n}\n",
|
|
18
18
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Structural match for `RawImage` from `@huggingface/transformers`. The HF\n * class carries helpers (`save`, `toCanvas`, `rgb`, ...) that the provider\n * runtime does not invoke on inputs, so a minimal shim over the four data\n * fields is sufficient. If a consumer later needs HF-specific methods we can\n * widen this shim lazily — no need to pull the transformers dep into\n * `@workglow/util/media` today.\n */\nexport class MediaRawImage {\n readonly data: Uint8ClampedArray;\n readonly width: number;\n readonly height: number;\n readonly channels: number;\n\n constructor(data: Uint8ClampedArray, width: number, height: number, channels: number) {\n this.data = data;\n this.width = width;\n this.height = height;\n this.channels = channels;\n }\n}\n\nexport function isMediaRawImageShape(\n value: unknown\n): value is { data: Uint8ClampedArray; width: number; height: number; channels: number } {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n v.data instanceof Uint8ClampedArray &&\n typeof v.width === \"number\" &&\n typeof v.height === \"number\" &&\n typeof v.channels === \"number\"\n );\n}\n",
|
|
19
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageValue } from \"./imageValue\";\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies of\n// this file (one per consumer, browser/node entry, the builder web app, etc.).\n// Without sharing through `globalThis`, `setPreviewBudget` / `registerPreview-\n// ResizeFn` would silently no-op in any bundle that didn't perform the call,\n// because each bundle would hold its own module-private slot. Same pattern as\n// the codec / GpuImage factory registries (see `imageRasterCodecRegistry.ts`\n// and `gpuImage.ts`). The `Symbol.for` keys are stable across realms so every\n// bundle hits the same record.\nconst GLOBAL_RESIZE_KEY = Symbol.for(\"@workglow/util/media/previewResizeFn\");\nconst GLOBAL_BUDGET_KEY = Symbol.for(\"@workglow/util/media/previewBudget\");\nconst _g = globalThis as Record<symbol, unknown>;\n\nexport type PreviewResizeFn = (\n image: ImageValue,\n width: number,\n height: number
|
|
19
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageValue } from \"./imageValue\";\n\n// Cross-bundle singleton — Vite/Rolldown can produce multiple bundle copies of\n// this file (one per consumer, browser/node entry, the builder web app, etc.).\n// Without sharing through `globalThis`, `setPreviewBudget` / `registerPreview-\n// ResizeFn` would silently no-op in any bundle that didn't perform the call,\n// because each bundle would hold its own module-private slot. Same pattern as\n// the codec / GpuImage factory registries (see `imageRasterCodecRegistry.ts`\n// and `gpuImage.ts`). The `Symbol.for` keys are stable across realms so every\n// bundle hits the same record.\nconst GLOBAL_RESIZE_KEY = Symbol.for(\"@workglow/util/media/previewResizeFn\");\nconst GLOBAL_BUDGET_KEY = Symbol.for(\"@workglow/util/media/previewBudget\");\nconst _g = globalThis as Record<symbol, unknown>;\n\nexport type PreviewResizeFn = (\n image: ImageValue,\n width: number,\n height: number\n) => Promise<ImageValue>;\n\nconst DEFAULT_BUDGET = 512;\n\nif (typeof _g[GLOBAL_BUDGET_KEY] !== \"number\") {\n _g[GLOBAL_BUDGET_KEY] = DEFAULT_BUDGET;\n}\n\nexport function registerPreviewResizeFn(fn: PreviewResizeFn | undefined): void {\n _g[GLOBAL_RESIZE_KEY] = fn;\n}\n\nfunction getPreviewResizeFn(): PreviewResizeFn | undefined {\n return _g[GLOBAL_RESIZE_KEY] as PreviewResizeFn | undefined;\n}\n\nexport function getPreviewBudget(): number {\n return _g[GLOBAL_BUDGET_KEY] as number;\n}\n\nexport function setPreviewBudget(px: number): void {\n if (!Number.isFinite(px) || px <= 0) {\n throw new Error(`setPreviewBudget: invalid value ${px}; expected a positive finite number`);\n }\n _g[GLOBAL_BUDGET_KEY] = Math.floor(px);\n}\n\n/**\n * Engine-applied chain-head downscale for `runPreview`. Idempotent: when\n * the input is already within budget, returns the input unchanged\n * (referential equality is the no-op signal). When over budget, calls the\n * registered resize fn (typically routed through Sharp on node and an\n * OffscreenCanvas/WebGPU resize on browser) and composes `previewScale`:\n * `out.previewScale = in.previewScale × downscaleRatio`.\n */\nexport async function previewSource(image: ImageValue): Promise<ImageValue> {\n const budget = getPreviewBudget();\n const long = Math.max(image.width, image.height);\n if (long <= budget) return image;\n const ratio = budget / long;\n const resize = getPreviewResizeFn();\n if (!resize) return image;\n const targetW = Math.max(1, Math.round(image.width * ratio));\n const targetH = Math.max(1, Math.round(image.height * ratio));\n const result = await resize(image, targetW, targetH);\n const composedScale = image.previewScale * ratio;\n return {\n ...result,\n previewScale: composedScale,\n } as ImageValue;\n}\n",
|
|
20
20
|
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport const VERTEX_PRELUDE = `\n@group(0) @binding(0) var src: texture_2d<f32>;\n@group(0) @binding(1) var src_sampler: sampler;\n\nstruct VsOut {\n @builtin(position) pos: vec4f,\n @location(0) uv: vec2f,\n};\n\n@vertex\nfn vs(@builtin(vertex_index) vid: u32) -> VsOut {\n let xy = vec2f(f32((vid << 1u) & 2u), f32(vid & 2u));\n var out: VsOut;\n out.pos = vec4f(xy * 2.0 - 1.0, 0.0, 1.0);\n out.uv = vec2f(xy.x, 1.0 - xy.y);\n return out;\n}`;\n\n// Used by WebGpuImage.toCanvas to blit a texture to the swap-chain image.\nexport const PASSTHROUGH_SHADER_SRC = `${VERTEX_PRELUDE}\n@fragment\nfn fs(in: VsOut) -> @location(0) vec4f {\n return textureSample(src, src_sampler, in.uv);\n}\n`;\n\nexport interface ShaderCache {\n get(source: string): GPUShaderModule;\n}\n\nexport function createShaderCache(device: GPUDevice): ShaderCache {\n const map = new Map<string, GPUShaderModule>();\n return {\n get(source) {\n let mod = map.get(source);\n if (!mod) {\n mod = device.createShaderModule({ code: source });\n map.set(source, mod);\n }\n return mod;\n },\n };\n}\n\nlet singleton: { device: GPUDevice; cache: ShaderCache } | null = null;\n\nexport function getShaderCache(device: GPUDevice): ShaderCache {\n if (!singleton || singleton.device !== device) {\n singleton = { device, cache: createShaderCache(device) };\n }\n return singleton.cache;\n}\n",
|
|
21
21
|
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface TexturePoolOptions {\n capacityPerSize?: number;\n}\n\nexport interface TexturePool {\n acquire(width: number, height: number, format: GPUTextureFormat): GPUTexture;\n release(texture: GPUTexture): void;\n drain(): void;\n}\n\ninterface PooledTexture {\n texture: GPUTexture;\n width: number;\n height: number;\n format: GPUTextureFormat;\n inPool: boolean;\n}\n\nconst DEFAULT_CAPACITY_PER_SIZE = 8;\nconst TEXTURE_USAGE = 0x04 | 0x10 | 0x01 | 0x02; // TEXTURE_BINDING | RENDER_ATTACHMENT | COPY_SRC | COPY_DST\n\nexport function createTexturePool(device: GPUDevice, opts: TexturePoolOptions = {}): TexturePool {\n const capacity = opts.capacityPerSize ?? DEFAULT_CAPACITY_PER_SIZE;\n const buckets = new Map<string, PooledTexture[]>();\n const owners = new WeakMap<GPUTexture, PooledTexture>();\n\n const sizeClassKey = (w: number, h: number, f: GPUTextureFormat) => `${w}x${h}:${f}`;\n\n return {\n acquire(width, height, format) {\n const k = sizeClassKey(width, height, format);\n const bucket = buckets.get(k);\n if (bucket && bucket.length > 0) {\n const reused = bucket.pop()!;\n reused.inPool = false;\n return reused.texture;\n }\n const texture = device.createTexture({\n size: [width, height, 1],\n format,\n usage: TEXTURE_USAGE,\n });\n const entry: PooledTexture = { texture, width, height, format, inPool: false };\n owners.set(texture, entry);\n return texture;\n },\n\n release(texture) {\n const entry = owners.get(texture);\n if (!entry) return;\n if (entry.inPool) return;\n const k = sizeClassKey(entry.width, entry.height, entry.format);\n let bucket = buckets.get(k);\n if (!bucket) {\n bucket = [];\n buckets.set(k, bucket);\n }\n if (bucket.length >= capacity) {\n owners.delete(texture);\n texture.destroy();\n return;\n }\n entry.inPool = true;\n bucket.push(entry);\n },\n\n drain() {\n for (const bucket of buckets.values()) {\n for (const entry of bucket) {\n owners.delete(entry.texture);\n entry.texture.destroy();\n }\n }\n buckets.clear();\n },\n };\n}\n\nlet singleton: { device: GPUDevice; pool: TexturePool } | null = null;\n\nexport function getTexturePool(device: GPUDevice): TexturePool {\n if (!singleton || singleton.device !== device) {\n singleton?.pool.drain();\n singleton = { device, pool: createTexturePool(device) };\n }\n return singleton.pool;\n}\n\nexport function resetTexturePoolForTests(): void {\n singleton?.pool.drain();\n singleton = null;\n}\n",
|
|
22
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type { GpuImage as IGpuImage, GpuImageEncodeFormat } from \"./gpuImage\";\nimport { registerGpuImageFactory } from \"./gpuImage\";\nimport type { ImageValue, NodeImageValue } from \"./imageValue\";\nimport { isBrowserImageValue, isNodeImageValue } from \"./imageValue\";\n\ntype Sharp = {\n clone(): Sharp;\n flip(): Sharp;\n flop(): Sharp;\n blur(sigma: number): Sharp;\n grayscale(grayscale?: boolean): Sharp;\n negate(options?: { alpha?: boolean }): Sharp;\n recomb(matrix: number[][]): Sharp;\n linear(a: number | number[], b: number | number[]): Sharp;\n threshold(threshold: number, options?: { grayscale?: boolean }): Sharp;\n tint(rgb: { r: number; g: number; b: number }): Sharp;\n ensureAlpha(alpha?: number): Sharp;\n extend(options: {
|
|
22
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\nimport type { ImageChannels } from \"./imageTypes\";\nimport type { GpuImage as IGpuImage, GpuImageEncodeFormat } from \"./gpuImage\";\nimport { registerGpuImageFactory } from \"./gpuImage\";\nimport type { ImageValue, NodeImageValue } from \"./imageValue\";\nimport { isBrowserImageValue, isNodeImageValue } from \"./imageValue\";\n\ntype Sharp = {\n clone(): Sharp;\n flip(): Sharp;\n flop(): Sharp;\n blur(sigma: number): Sharp;\n grayscale(grayscale?: boolean): Sharp;\n negate(options?: { alpha?: boolean }): Sharp;\n recomb(matrix: number[][]): Sharp;\n linear(a: number | number[], b: number | number[]): Sharp;\n threshold(threshold: number, options?: { grayscale?: boolean }): Sharp;\n tint(rgb: { r: number; g: number; b: number }): Sharp;\n ensureAlpha(alpha?: number): Sharp;\n extend(options: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n background?: unknown;\n }): Sharp;\n extract(region: { left: number; top: number; width: number; height: number }): Sharp;\n rotate(angle?: number, options?: { background?: unknown }): Sharp;\n resize(\n width?: number | null,\n height?: number | null,\n options?: { kernel?: string; fit?: string; background?: unknown }\n ): Sharp;\n raw(): Sharp;\n png(opts?: unknown): Sharp;\n jpeg(opts?: unknown): Sharp;\n webp(opts?: unknown): Sharp;\n metadata(): Promise<{ width?: number; height?: number; channels?: number }>;\n toBuffer(\n opts?: unknown\n ): Promise<Buffer | { data: Buffer; info: { width: number; height: number; channels: number } }>;\n};\n\ntype SharpModule = (\n input?: Buffer | Uint8ClampedArray,\n opts?: {\n raw?: { width: number; height: number; channels: 1 | 2 | 3 | 4 };\n limitInputPixels?: number;\n sequentialRead?: boolean;\n }\n) => Sharp;\n\nlet cachedSharp: SharpModule | null = null;\nasync function loadSharp(): Promise<SharpModule> {\n if (cachedSharp) return cachedSharp;\n let mod: unknown;\n try {\n mod = await import(\"sharp\");\n } catch {\n throw new Error(\n \"Server-side image processing requires the optional 'sharp' package. \" +\n \"Install it with: npm install sharp (or bun add sharp)\"\n );\n }\n cachedSharp = ((mod as { default?: unknown }).default ?? mod) as SharpModule;\n return cachedSharp;\n}\n\nexport class SharpImage implements IGpuImage {\n readonly backend = \"sharp\" as const;\n\n private constructor(\n private pipeline: Sharp | null,\n readonly width: number,\n readonly height: number,\n readonly channels: ImageChannels\n ) {}\n\n static async from(value: ImageValue): Promise<SharpImage> {\n if (isBrowserImageValue(value)) {\n throw new Error(\"SharpImage.from: BrowserImageValue not supported in node runtime\");\n }\n if (!isNodeImageValue(value)) {\n throw new Error(\"SharpImage.from: unrecognized ImageValue shape\");\n }\n const sharp = await loadSharp();\n if (value.format === \"raw-rgba\") {\n const pipeline = sharp(value.buffer, {\n raw: { width: value.width, height: value.height, channels: 4 },\n });\n return new SharpImage(pipeline, value.width, value.height, 4);\n }\n const pipeline = sharp(value.buffer);\n const meta = await pipeline.clone().metadata();\n const channels = (meta.channels ?? 4) as ImageChannels;\n return new SharpImage(pipeline, value.width, value.height, channels);\n }\n\n apply(\n op: (p: Sharp) => Sharp,\n outSize?: { width: number; height: number; channels?: ImageChannels }\n ): SharpImage {\n if (!this.pipeline) throw new Error(\"SharpImage.apply on a disposed image\");\n const next = op(this.pipeline.clone());\n return new SharpImage(\n next,\n outSize?.width ?? this.width,\n outSize?.height ?? this.height,\n outSize?.channels ?? this.channels\n );\n }\n\n async toBuffer(format: \"png\" | \"jpeg\" | \"raw-rgba\"): Promise<Buffer> {\n if (!this.pipeline) throw new Error(\"SharpImage.toBuffer on a disposed image\");\n const p = this.pipeline.clone();\n if (format === \"raw-rgba\") {\n const result = await p.raw().toBuffer({ resolveWithObject: true });\n if (!isObjectResult(result))\n throw new Error(\"SharpImage.toBuffer: expected resolveWithObject result\");\n return result.data;\n }\n if (format === \"png\") return (await p.png().toBuffer()) as Buffer;\n return (await p.jpeg().toBuffer()) as Buffer;\n }\n\n async toImageValue(previewScale: number): Promise<ImageValue> {\n try {\n const buffer = await this.toBuffer(\"png\");\n const out: NodeImageValue = {\n buffer,\n format: \"png\",\n width: this.width,\n height: this.height,\n previewScale,\n };\n return out;\n } finally {\n this.dispose();\n }\n }\n\n async encode(format: GpuImageEncodeFormat, quality?: number): Promise<Uint8Array> {\n if (!this.pipeline) throw new Error(\"SharpImage.encode on a disposed image\");\n const p = this.pipeline.clone();\n let result: unknown;\n if (format === \"png\") result = await p.png({ quality }).toBuffer();\n else if (format === \"jpeg\") result = await p.jpeg({ quality }).toBuffer();\n else result = await p.webp({ quality }).toBuffer();\n const buf = result as Buffer;\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n\n dispose(): void {\n this.pipeline = null;\n }\n}\n\nfunction isObjectResult(\n r: unknown\n): r is { data: Buffer; info: { width: number; height: number; channels: number } } {\n return !!r && typeof r === \"object\" && \"data\" in r && \"info\" in r;\n}\n\nexport interface DecodeBufferToRawOptions {\n readonly limitInputPixels?: number;\n readonly sequentialRead?: boolean;\n readonly ensureAlpha?: boolean;\n}\n\nexport interface RawPixelInput {\n readonly data: Buffer | Uint8ClampedArray;\n readonly width: number;\n readonly height: number;\n readonly channels: 1 | 2 | 3 | 4;\n}\n\nexport type EncodeRawPixelsOptions =\n | { readonly format: \"png\"; readonly compressionLevel?: number }\n | { readonly format: \"jpeg\"; readonly quality?: number; readonly mozjpeg?: boolean }\n | { readonly format: \"webp\"; readonly quality?: number };\n\nexport async function probeImageDimensions(\n buffer: Buffer\n): Promise<{ width: number; height: number; channels: number | undefined }> {\n const sharp = await loadSharp();\n const meta = await sharp(buffer).metadata();\n if (typeof meta.width !== \"number\" || typeof meta.height !== \"number\") {\n throw new Error(\"probeImageDimensions: sharp could not read image dimensions\");\n }\n return { width: meta.width, height: meta.height, channels: meta.channels };\n}\n\nexport async function decodeBufferToRaw(\n buffer: Buffer,\n options?: DecodeBufferToRawOptions\n): Promise<{ data: Buffer; width: number; height: number; channels: number }> {\n const sharp = await loadSharp();\n const sharpOpts: { limitInputPixels?: number; sequentialRead?: boolean } = {};\n if (options?.limitInputPixels !== undefined)\n sharpOpts.limitInputPixels = options.limitInputPixels;\n if (options?.sequentialRead !== undefined) sharpOpts.sequentialRead = options.sequentialRead;\n let pipeline = sharp(buffer, sharpOpts);\n if (options?.ensureAlpha) pipeline = pipeline.ensureAlpha();\n const result = await pipeline.raw().toBuffer({ resolveWithObject: true });\n if (!isObjectResult(result))\n throw new Error(\"decodeBufferToRaw: expected resolveWithObject result\");\n return {\n data: result.data,\n width: result.info.width,\n height: result.info.height,\n channels: result.info.channels,\n };\n}\n\nexport async function encodeRawPixels(\n raw: RawPixelInput,\n options: EncodeRawPixelsOptions\n): Promise<Buffer> {\n const sharp = await loadSharp();\n const inputBuffer: Buffer =\n raw.data instanceof Uint8ClampedArray\n ? Buffer.from(raw.data.buffer, raw.data.byteOffset, raw.data.byteLength)\n : raw.data;\n const pipeline = sharp(inputBuffer, {\n raw: { width: raw.width, height: raw.height, channels: raw.channels },\n });\n let encoded: unknown;\n if (options.format === \"png\") {\n encoded = await pipeline.png({ compressionLevel: options.compressionLevel }).toBuffer();\n } else if (options.format === \"jpeg\") {\n encoded = await pipeline\n .jpeg({ quality: options.quality, mozjpeg: options.mozjpeg })\n .toBuffer();\n } else {\n encoded = await pipeline.webp({ quality: options.quality }).toBuffer();\n }\n return encoded as Buffer;\n}\n\nregisterGpuImageFactory(\"from\", SharpImage.from.bind(SharpImage));\n",
|
|
23
23
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport \"./media/imageCacheCodec\";\nimport \"./media/imageHydrationResolver\";\n\nexport * from \"./media/color\";\nexport { CpuImage } from \"./media/cpuImage\";\nexport { rawPixelBufferToBlob, rawPixelBufferToDataUri } from \"./media/encode\";\nexport {\n _resetFilterRegistryForTests,\n applyFilter,\n hasFilterOp,\n registerFilterOp,\n} from \"./media/filterRegistry\";\nexport type { FilterOpFn } from \"./media/filterRegistry\";\nexport {\n getGpuImageFactory,\n GpuImage as GpuImageFactory,\n registerGpuImageFactory,\n} from \"./media/gpuImage\";\nexport type {\n GpuImage,\n GpuImageBackend,\n GpuImageEncodeFormat,\n GpuImageStatic,\n} from \"./media/gpuImage\";\nexport { ImageValueSchema } from \"./media/imageValueSchema\";\nexport * from \"./media/imageRasterCodecRegistry\";\nexport type { ImageChannels } from \"./media/imageTypes\";\nexport type { RawPixelBuffer, RgbaPixelBuffer } from \"./media/rawPixelBuffer\";\nexport {\n imageValueFromBitmap,\n imageValueFromBuffer,\n isBrowserImageValue,\n isImageValue,\n isNodeImageValue,\n normalizeToImageValue,\n} from \"./media/imageValue\";\nexport type {\n BrowserImageValue,\n ImageValue,\n ImageValueBase,\n NodeImageFormat,\n NodeImageValue,\n} from \"./media/imageValue\";\nexport * from \"./media/MediaRawImage\";\nexport {\n getPreviewBudget,\n previewSource,\n registerPreviewResizeFn,\n setPreviewBudget,\n} from \"./media/previewBudget\";\nexport async function getGpuDevice(): Promise<null> {\n return null;\n}\nexport function resetGpuDeviceForTests(): void {}\nexport {\n createShaderCache,\n getShaderCache,\n PASSTHROUGH_SHADER_SRC,\n VERTEX_PRELUDE,\n} from \"./media/shaderRegistry.browser\";\nexport type { ShaderCache } from \"./media/shaderRegistry.browser\";\nexport {\n createTexturePool,\n getTexturePool,\n resetTexturePoolForTests,\n} from \"./media/texturePool.browser\";\nexport type { TexturePool, TexturePoolOptions } from \"./media/texturePool.browser\";\n// WebGpuImage is browser-only at runtime; type-only re-export lets\n// browser-targeted filter files (*.webgpu.ts) type-check under node tsc.\nexport {\n SharpImage,\n decodeBufferToRaw,\n encodeRawPixels,\n probeImageDimensions,\n} from \"./media/sharpImage.server\";\nexport type {\n DecodeBufferToRawOptions,\n EncodeRawPixelsOptions,\n RawPixelInput,\n} from \"./media/sharpImage.server\";\nexport type { ApplyParams, WebGpuImage } from \"./media/webGpuImage.browser\";\n\nimport { registerGpuImageFactory as _registerGpuImageFactory } from \"./media/gpuImage\";\nimport type { ImageValue as _ImageValue } from \"./media/imageValue\";\nimport { SharpImage as _SharpImage } from \"./media/sharpImage.server\";\n\n_registerGpuImageFactory(\"from\", (value: _ImageValue) => _SharpImage.from(value));\n"
|
|
24
24
|
],
|
|
25
|
-
"mappings": "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",
|
|
25
|
+
"mappings": "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",
|
|
26
26
|
"debugId": "49C9406160EA2AA164756E2164756E21",
|
|
27
27
|
"names": []
|
|
28
28
|
}
|
package/dist/node.js.map
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Container, globalContainer } from \"./Container\";\n\n/**\n * Service token type for type-safe dependency injection\n */\nexport interface ServiceToken<T> {\n readonly _type: T;\n readonly id: string;\n}\n\n/**\n * Create a typed service token\n * @param id Unique identifier for the service\n * @returns A typed service token\n */\nexport function createServiceToken<T>(id: string): ServiceToken<T> {\n return { id, _type: null as any };\n}\n\n/**\n * Service registry for managing and accessing services\n */\nexport class ServiceRegistry {\n public container: Container;\n\n /**\n * Create a new service registry\n * @param container Optional container to use (defaults to global container)\n */\n constructor(container: Container = globalContainer) {\n this.container = container;\n }\n\n /**\n * Register a service factory\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n register<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.register(token.id, factory, singleton);\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n registerIfAbsent<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.registerIfAbsent(token.id, factory, singleton);\n }\n\n /**\n * Register a service instance\n * @param token Service token\n * @param instance Service instance to register\n */\n registerInstance<T>(token: ServiceToken<T>, instance: T): void {\n this.container.registerInstance(token.id, instance);\n }\n\n /**\n * Get a service by its token\n * @param token Service token\n * @returns The service instance\n */\n get<T>(token: ServiceToken<T>): T {\n return this.container.get<T>(token.id);\n }\n\n /**\n * Check if a service is registered\n * @param token Service token\n * @returns True if the service is registered\n */\n has<T>(token: ServiceToken<T>): boolean {\n return this.container.has(token.id);\n }\n\n /**\n * Dispose all instantiated services and clear registrations.\n */\n async dispose(): Promise<void> {\n await this.container.dispose();\n }\n}\n\n/**\n * Global service registry instance\n */\nexport const globalServiceRegistry = new ServiceRegistry(globalContainer);\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A compactor function that converts a resolved instance back to its string ID.\n * Returns undefined if the value cannot be compacted (e.g., missing ID field).\n *\n * @param value The resolved instance to compact\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputCompactorFn = (\n value: unknown,\n format: string,\n registry: ServiceRegistry\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Service token for the input compactor registry.\n * Maps format prefixes to compactor functions.\n */\nexport const INPUT_COMPACTORS =\n createServiceToken<Map<string, InputCompactorFn>>(\"task.input.compactors\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_COMPACTORS,\n (): Map<string, InputCompactorFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input compactor registry\n * @returns Map of format prefix to compactor function\n */\nexport function getInputCompactors(): Map<string, InputCompactorFn> {\n return globalServiceRegistry.get(INPUT_COMPACTORS);\n}\n\n/**\n * Registers an input compactor for a format prefix.\n * The compactor will be called to convert resolved instances back to string IDs.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"knowledge-base\")\n * @param compactor The compactor function\n *\n * @example\n * ```typescript\n * // Register model compactor — extracts model_id from a ModelConfig\n * registerInputCompactor(\"model\", (value) => {\n * if (typeof value === \"object\" && value !== null && \"model_id\" in value) {\n * const id = (value as Record<string, unknown>).model_id;\n * return typeof id === \"string\" ? id : undefined;\n * }\n * return undefined;\n * });\n * ```\n */\nexport function registerInputCompactor(formatPrefix: string, compactor: InputCompactorFn): void {\n const compactors = getInputCompactors();\n compactors.set(formatPrefix, compactor);\n}\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A resolver function that converts a string ID to an instance.\n * Returns undefined if the resolver cannot handle this format.\n * Throws an error if the ID is not found.\n *\n * @param id The string ID to resolve\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputResolverFn = (\n id: string,\n format: string,\n registry: ServiceRegistry\n) => unknown | Promise<unknown>;\n\n/**\n * Service token for the input resolver registry.\n * Maps format prefixes to resolver functions.\n */\nexport const INPUT_RESOLVERS =\n createServiceToken<Map<string, InputResolverFn>>(\"task.input.resolvers\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_RESOLVERS,\n (): Map<string, InputResolverFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input resolver registry\n * @returns Map of format prefix to resolver function\n */\nexport function getInputResolvers(): Map<string, InputResolverFn> {\n return globalServiceRegistry.get(INPUT_RESOLVERS);\n}\n\n/**\n * Registers an input resolver for a format prefix.\n * The resolver will be called for any format that starts with this prefix.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"dataset\")\n * @param resolver The resolver function\n *\n * @example\n * ```typescript\n * // Register model resolver\n * registerInputResolver(\"model\", async (id, format, registry) => {\n * const modelRepo = registry.get(MODEL_REPOSITORY);\n * const model = await modelRepo.findByName(id);\n * if (!model) throw new Error(`Model \"${id}\" not found`);\n * return model;\n * });\n *\n * // Register dataset resolver\n * registerInputResolver(\"dataset\", (id, format, registry) => {\n * const datasetType = format.split(\":\")[1]; // \"tabular\", \"vector\", etc.\n * if (datasetType === \"tabular\") {\n * const datasets = registry.get(TABULAR_DATASETS);\n * const dataset = datasets.get(id);\n * if (!dataset) throw new Error(`Dataset \"${id}\" not found`);\n * return dataset;\n * }\n * throw new Error(`Unknown dataset type: ${datasetType}`);\n * });\n * ```\n */\nexport function registerInputResolver(formatPrefix: string, resolver: InputResolverFn): void {\n const resolvers = getInputResolvers();\n resolvers.set(formatPrefix, resolver);\n}\n",
|
|
11
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire
|
|
11
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire>\n): void {\n codecs.set(formatPrefix, codec as PortCodec);\n}\n\nexport function getPortCodec(format: string): PortCodec | undefined {\n if (codecs.has(format)) return codecs.get(format);\n const colon = format.indexOf(\":\");\n if (colon > 0) {\n const prefix = format.slice(0, colon);\n return codecs.get(prefix);\n }\n return undefined;\n}\n\n/** @internal — test affordance only. */\nexport function _resetPortCodecsForTests(): void {\n codecs.clear();\n}\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * A type that represents a listener function for an event.\n * @template Events - A record of event names and their corresponding listener functions\n * @template EventType - The name of the event\n */\ntype EventListener<Events, EventType extends keyof Events> = Events[EventType];\n\n/**\n * A type that represents a list of listener functions for an event.\n * @template Events - A record of event names and their corresponding listener functions\n * @template EventType - The name of the event\n */\ntype EventListeners<Events, EventType extends keyof Events> = Array<{\n listener: EventListener<Events, EventType>;\n once?: boolean;\n}>;\n\n/**\n * A type that represents the parameters of an event.\n * @template Events - A record of event names and their corresponding listener functions\n * @template EventType - The name of the event\n */\nexport type EventParameters<Events, EventType extends keyof Events> = {\n [Event in EventType]: EventListener<Events, EventType> extends (...args: infer P) => any\n ? P\n : never;\n}[EventType];\n\n/**\n * A type that represents the return type of the emitted method.\n * @template Events - A record of event names and their corresponding listener functions\n * @template EventType - The name of the event\n */\nexport type EmittedReturnType<Events, EventType extends keyof Events> = EventParameters<\n Events,\n EventType\n>;\n\n/**\n * A class that implements an event emitter pattern.\n * @template EventListenerTypes - A record of event names and their corresponding listener functions\n */\nexport class EventEmitter<EventListenerTypes extends Record<string, (...args: any) => any>> {\n private listeners: {\n [Event in keyof EventListenerTypes]?: EventListeners<EventListenerTypes, Event>;\n } = {};\n private maxListeners: number = 0;\n private warnedEvents = new Set<keyof EventListenerTypes>();\n\n /**\n * Set the maximum number of listeners per event before a warning is emitted.\n * 0 means unlimited (default).\n */\n setMaxListeners(n: number): this {\n if (!Number.isFinite(n) || n < 0) {\n throw new RangeError(`\"n\" must be a non-negative finite number. Got ${n}.`);\n }\n this.maxListeners = Math.trunc(n);\n this.warnedEvents.clear();\n return this;\n }\n\n /**\n * Get the number of listeners for a specific event\n */\n listenerCount<Event extends keyof EventListenerTypes>(event: Event): number {\n return this.listeners[event]?.length ?? 0;\n }\n\n /**\n * Get all event names that have registered listeners\n */\n eventNames(): Array<keyof EventListenerTypes> {\n return (Object.keys(this.listeners) as Array<keyof EventListenerTypes>).filter(\n (k) => (this.listeners[k]?.length ?? 0) > 0\n );\n }\n\n /**\n * Remove all listeners for a specific event or all events\n * @param event - Optional event name. If not provided, removes all listeners for all events\n * @returns this, so that calls can be chained\n */\n removeAllListeners<Event extends keyof EventListenerTypes>(event?: Event): this {\n if (event) {\n delete this.listeners[event];\n this.warnedEvents.delete(event);\n } else {\n this.listeners = {};\n this.warnedEvents.clear();\n }\n return this;\n }\n\n /**\n * Adds a listener function for the event\n * @param event - The event name to listen for\n * @param listener - The listener function to add\n * @returns this, so that calls can be chained\n */\n on<Event extends keyof EventListenerTypes>(\n event: Event,\n listener: EventListener<EventListenerTypes, Event>\n ): this {\n const listeners: EventListeners<EventListenerTypes, Event> =\n this.listeners[event] || (this.listeners[event] = []);\n listeners.push({ listener });\n this.checkMaxListeners(event, listeners.length);\n return this;\n }\n\n /**\n * Removes a listener function for the event\n * @param event - The event name to remove the listener from\n * @param listener - The listener function to remove\n * @returns this, so that calls can be chained\n */\n off<Event extends keyof EventListenerTypes>(\n event: Event,\n listener: EventListener<EventListenerTypes, Event>\n ): this {\n const listeners = this.listeners[event];\n if (!listeners) return this;\n\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n if (this.maxListeners > 0 && listeners.length <= this.maxListeners) {\n this.warnedEvents.delete(event);\n }\n }\n return this;\n }\n\n /**\n * Adds a listener function for the event that will be called only once\n * @param event - The event name to listen for\n * @param listener - The listener function to add\n * @returns this, so that calls can be chained\n */\n once<Event extends keyof EventListenerTypes>(\n event: Event,\n listener: EventListener<EventListenerTypes, Event>\n ): this {\n const listeners: EventListeners<EventListenerTypes, Event> =\n this.listeners[event] || (this.listeners[event] = []);\n listeners.push({ listener, once: true });\n this.checkMaxListeners(event, listeners.length);\n return this;\n }\n\n /**\n * Returns a promise that resolves when the event is emitted\n * @param event - The event name to listen for\n * @returns a promise that resolves to an array of all parameters of the event (empty array for events with no parameters)\n */\n waitOn<Event extends keyof EventListenerTypes>(\n event: Event\n ): Promise<EmittedReturnType<EventListenerTypes, Event>> {\n return new Promise((resolve) => {\n // Create an anonymous function that captures all arguments and passes them to resolve\n const listener = ((...args: any[]) => {\n // Always resolve with the array of arguments (which may be empty)\n resolve(args as any);\n }) as EventListener<EventListenerTypes, Event>;\n\n this.once(event, listener);\n });\n }\n\n /**\n * Emits an event with the specified name and arguments\n * @param event - The event name to emit\n * @param args - Arguments to pass to the event listeners\n */\n public emit<Event extends keyof EventListenerTypes>(\n this: EventEmitter<EventListenerTypes>,\n event: Event,\n ...args: EventParameters<EventListenerTypes, Event>\n ) {\n const listeners: EventListeners<EventListenerTypes, Event> | undefined = this.listeners[event];\n if (listeners) {\n // Snapshot the listener array to avoid issues with concurrent modification\n const snapshot = [...listeners];\n const errors: unknown[] = [];\n for (const { listener } of snapshot) {\n try {\n listener(...args);\n } catch (e) {\n errors.push(e);\n }\n }\n // Remove once listeners we just called\n this.listeners[event] = listeners.filter((l) => !l.once);\n if (this.maxListeners > 0 && (this.listeners[event]?.length ?? 0) <= this.maxListeners) {\n this.warnedEvents.delete(event);\n }\n // Re-throw errors after all listeners have been called\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n `${errors.length} listener(s) threw on \"${String(event)}\"`\n );\n } else if (errors.length === 1) {\n throw errors[0];\n }\n }\n }\n\n private checkMaxListeners<Event extends keyof EventListenerTypes>(\n event: Event,\n count: number\n ): void {\n if (this.maxListeners > 0 && count > this.maxListeners && !this.warnedEvents.has(event)) {\n this.warnedEvents.add(event);\n console.warn(\n `MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ` +\n `${count} listeners added for event \"${String(event)}\". ` +\n `Use setMaxListeners() to increase limit (current: ${this.maxListeners}).`\n );\n }\n }\n\n /**\n * Subscribes to an event and returns a function to unsubscribe\n * @param event - The event name to subscribe to\n * @param listener - The listener function to add\n * @returns a function to unsubscribe from the event\n */\n public subscribe<Event extends keyof EventListenerTypes>(\n event: Event,\n listener: EventListener<EventListenerTypes, Event>\n ): () => void {\n this.on(event, listener);\n return () => this.off(event, listener);\n }\n}\n",
|
|
13
13
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema } from \"../json-schema/DataPortSchema\";\nimport { createServiceToken } from \"../di/ServiceRegistry\";\n\n/**\n * The kind of interaction being requested.\n *\n * - \"notify\": One-way message, no response expected. Fire-and-forget.\n * - \"display\": Present rich content (markdown, data, visualization hints).\n * Response optional (acknowledgment).\n * - \"elicit\": Request structured input via a form schema (MCP elicitation).\n * Response expected with user-submitted data.\n */\nexport type HumanInteractionKind = \"notify\" | \"display\" | \"elicit\";\n\n/** User action in response to an interaction (MCP-aligned for \"elicit\" kind) */\nexport type HumanResponseAction = \"accept\" | \"decline\" | \"cancel\";\n\n/**\n * A unified request sent to a human via an IHumanConnector.\n *\n * The `kind` field determines the interaction pattern. The `content` schema\n * describes WHAT to render — the UI layer interprets it based on `kind`.\n */\nexport interface IHumanRequest {\n /** Unique identifier for this request (used to correlate responses) */\n readonly requestId: string;\n /** Target human identifier — \"default\" for the main user, or a specific user/role ID */\n readonly targetHumanId: string;\n /** What kind of interaction this is */\n readonly kind: HumanInteractionKind;\n /** Explanatory message shown to the human */\n readonly message: string;\n /**\n * Content schema — describes what to render.\n *\n * For \"notify\": Describes notification content (may be empty, message suffices).\n * For \"display\": Describes the data/visualization to present. Properties contain\n * the actual data to render. Use x-ui-viewer annotations for hints.\n * For \"elicit\": Describes the form fields for user input (MCP requestedSchema).\n */\n readonly contentSchema: DataPortSchema;\n /**\n * Concrete data to display (for \"notify\" and \"display\" kinds).\n * For \"elicit\", this is typically empty — the human provides the data.\n */\n readonly contentData: Record<string, unknown> | undefined;\n /** Whether a response is expected. Default: true for \"elicit\", false for \"notify\"/\"display\". */\n readonly expectsResponse: boolean;\n /** Interaction mode: single request-response or multi-turn conversation */\n readonly mode: \"single\" | \"multi-turn\";\n /** Arbitrary context data passed through to the connector */\n readonly metadata: Record<string, unknown> | undefined;\n}\n\n/**\n * A response from a human, collected by the IHumanConnector.\n * For \"notify\"/\"display\" interactions, this may just be an acknowledgment.\n */\nexport interface IHumanResponse {\n /** Correlates to the IHumanRequest.requestId */\n readonly requestId: string;\n /**\n * The human's action:\n * - \"accept\": user submitted data or acknowledged\n * - \"decline\": user explicitly refused\n * - \"cancel\": user dismissed without choosing\n */\n readonly action: HumanResponseAction;\n /** The human's response data (present when action is \"accept\" and kind is \"elicit\") */\n readonly content: Record<string, unknown> | undefined;\n /** Whether the conversation is complete. Always true for \"single\" mode. */\n readonly done: boolean;\n}\n\n/**\n * Interface for reaching a human and sending interactions.\n *\n * Unified schema-driven: the `kind` field in IHumanRequest determines the\n * interaction pattern. The connector renders accordingly — a notification\n * toast, a data visualization, or an input form.\n */\nexport interface IHumanConnector {\n /**\n * Send an interaction to a human.\n *\n * For \"notify\" and \"display\" kinds that don't expect a response, the\n * connector may resolve immediately with action \"accept\" and no content.\n *\n * For \"elicit\" kind, blocks until the human submits, declines, or cancels.\n * Must respect the AbortSignal for cancellation.\n */\n send(request: IHumanRequest, signal: AbortSignal): Promise<IHumanResponse>;\n\n /**\n * Send a follow-up in a multi-turn conversation.\n * Only called when mode is \"multi-turn\" and the previous response had done=false.\n */\n followUp?(\n request: IHumanRequest,\n previousResponse: IHumanResponse,\n signal: AbortSignal\n ): Promise<IHumanResponse>;\n}\n\n/** Service token for resolving the IHumanConnector from ServiceRegistry */\nexport const HUMAN_CONNECTOR = createServiceToken<IHumanConnector>(\"HUMAN_CONNECTOR\");\n\n/**\n * Resolves the IHumanConnector from the execution context's ServiceRegistry.\n *\n * Throws a plain `Error` (not TaskConfigurationError, to avoid a dependency on\n * @workglow/task-graph). Callers that need a typed error may catch and rewrap.\n */\nexport function resolveHumanConnector(context: {\n readonly registry: {\n has(token: typeof HUMAN_CONNECTOR): boolean;\n get(token: typeof HUMAN_CONNECTOR): IHumanConnector;\n };\n}): IHumanConnector {\n if (!context.registry.has(HUMAN_CONNECTOR)) {\n throw new Error(\n \"HUMAN_CONNECTOR not registered. Register one via \" +\n \"registry.registerInstance(HUMAN_CONNECTOR, connector) before running a human-in-the-loop task.\"\n );\n }\n return context.registry.get(HUMAN_CONNECTOR);\n}\n",
|
|
14
14
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Log-level names in ascending severity order.\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport interface ConsoleLoggerOptions {\n readonly bindings?: Record<string, unknown>;\n readonly level?: LogLevel;\n readonly timings?: boolean;\n}\n\n/**\n * Logger that delegates to the global `console` object.\n * When created via {@link child}, accumulated bindings are passed\n * as a second argument to every console call.\n *\n * Supports optional level filtering (messages below the configured\n * level are silently discarded) and an opt-in `timings` flag that\n * controls whether {@link time}/{@link timeEnd} produce output.\n */\nexport class ConsoleLogger implements ILogger {\n private readonly bindings: Record<string, unknown>;\n private readonly level: LogLevel;\n private readonly timings: boolean;\n\n constructor(options: ConsoleLoggerOptions = {}) {\n this.bindings = options.bindings ?? {};\n this.level = options.level ?? \"debug\";\n this.timings = options.timings ?? false;\n }\n\n private enabled(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[this.level];\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"info\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(message, merged);\n } else {\n console.info(message);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"warn\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.warn(message, merged);\n } else {\n console.warn(message);\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"error\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, merged);\n } else {\n console.error(message);\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"debug\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.debug(message, merged);\n } else {\n console.debug(message);\n }\n }\n\n fatal(err: Error, message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"fatal\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, { ...merged, error: err });\n } else {\n console.error(message, { error: err });\n }\n }\n\n time(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[time] ${label}`, merged);\n }\n console.time(label);\n }\n\n timeEnd(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n console.timeEnd(label);\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[timeEnd] ${label}`, merged);\n }\n }\n\n group(label: string, meta?: Record<string, unknown>): void {\n const merged = this.merge(meta);\n if (merged) {\n console.group(label, merged);\n } else {\n console.group(label);\n }\n }\n\n groupEnd(): void {\n console.groupEnd();\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n return new ConsoleLogger({\n bindings: { ...this.bindings, ...bindings },\n level: this.level,\n timings: this.timings,\n });\n }\n\n private merge(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const hasBindings = Object.keys(this.bindings).length > 0;\n if (!hasBindings && !meta) return undefined;\n if (!hasBindings) return meta;\n if (!meta) return this.bindings;\n return { ...this.bindings, ...meta };\n }\n}\n",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Container, globalContainer } from \"./Container\";\n\n/**\n * Service token type for type-safe dependency injection\n */\nexport interface ServiceToken<T> {\n readonly _type: T;\n readonly id: string;\n}\n\n/**\n * Create a typed service token\n * @param id Unique identifier for the service\n * @returns A typed service token\n */\nexport function createServiceToken<T>(id: string): ServiceToken<T> {\n return { id, _type: null as any };\n}\n\n/**\n * Service registry for managing and accessing services\n */\nexport class ServiceRegistry {\n public container: Container;\n\n /**\n * Create a new service registry\n * @param container Optional container to use (defaults to global container)\n */\n constructor(container: Container = globalContainer) {\n this.container = container;\n }\n\n /**\n * Register a service factory\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n register<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.register(token.id, factory, singleton);\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n registerIfAbsent<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.registerIfAbsent(token.id, factory, singleton);\n }\n\n /**\n * Register a service instance\n * @param token Service token\n * @param instance Service instance to register\n */\n registerInstance<T>(token: ServiceToken<T>, instance: T): void {\n this.container.registerInstance(token.id, instance);\n }\n\n /**\n * Get a service by its token\n * @param token Service token\n * @returns The service instance\n */\n get<T>(token: ServiceToken<T>): T {\n return this.container.get<T>(token.id);\n }\n\n /**\n * Check if a service is registered\n * @param token Service token\n * @returns True if the service is registered\n */\n has<T>(token: ServiceToken<T>): boolean {\n return this.container.has(token.id);\n }\n\n /**\n * Dispose all instantiated services and clear registrations.\n */\n async dispose(): Promise<void> {\n await this.container.dispose();\n }\n}\n\n/**\n * Global service registry instance\n */\nexport const globalServiceRegistry = new ServiceRegistry(globalContainer);\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A compactor function that converts a resolved instance back to its string ID.\n * Returns undefined if the value cannot be compacted (e.g., missing ID field).\n *\n * @param value The resolved instance to compact\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputCompactorFn = (\n value: unknown,\n format: string,\n registry: ServiceRegistry\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Service token for the input compactor registry.\n * Maps format prefixes to compactor functions.\n */\nexport const INPUT_COMPACTORS =\n createServiceToken<Map<string, InputCompactorFn>>(\"task.input.compactors\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_COMPACTORS,\n (): Map<string, InputCompactorFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input compactor registry\n * @returns Map of format prefix to compactor function\n */\nexport function getInputCompactors(): Map<string, InputCompactorFn> {\n return globalServiceRegistry.get(INPUT_COMPACTORS);\n}\n\n/**\n * Registers an input compactor for a format prefix.\n * The compactor will be called to convert resolved instances back to string IDs.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"knowledge-base\")\n * @param compactor The compactor function\n *\n * @example\n * ```typescript\n * // Register model compactor — extracts model_id from a ModelConfig\n * registerInputCompactor(\"model\", (value) => {\n * if (typeof value === \"object\" && value !== null && \"model_id\" in value) {\n * const id = (value as Record<string, unknown>).model_id;\n * return typeof id === \"string\" ? id : undefined;\n * }\n * return undefined;\n * });\n * ```\n */\nexport function registerInputCompactor(formatPrefix: string, compactor: InputCompactorFn): void {\n const compactors = getInputCompactors();\n compactors.set(formatPrefix, compactor);\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A resolver function that converts a string ID to an instance.\n * Returns undefined if the resolver cannot handle this format.\n * Throws an error if the ID is not found.\n *\n * @param id The string ID to resolve\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputResolverFn = (\n id: string,\n format: string,\n registry: ServiceRegistry\n) => unknown | Promise<unknown>;\n\n/**\n * Service token for the input resolver registry.\n * Maps format prefixes to resolver functions.\n */\nexport const INPUT_RESOLVERS =\n createServiceToken<Map<string, InputResolverFn>>(\"task.input.resolvers\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_RESOLVERS,\n (): Map<string, InputResolverFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input resolver registry\n * @returns Map of format prefix to resolver function\n */\nexport function getInputResolvers(): Map<string, InputResolverFn> {\n return globalServiceRegistry.get(INPUT_RESOLVERS);\n}\n\n/**\n * Registers an input resolver for a format prefix.\n * The resolver will be called for any format that starts with this prefix.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"dataset\")\n * @param resolver The resolver function\n *\n * @example\n * ```typescript\n * // Register model resolver\n * registerInputResolver(\"model\", async (id, format, registry) => {\n * const modelRepo = registry.get(MODEL_REPOSITORY);\n * const model = await modelRepo.findByName(id);\n * if (!model) throw new Error(`Model \"${id}\" not found`);\n * return model;\n * });\n *\n * // Register dataset resolver\n * registerInputResolver(\"dataset\", (id, format, registry) => {\n * const datasetType = format.split(\":\")[1]; // \"tabular\", \"vector\", etc.\n * if (datasetType === \"tabular\") {\n * const datasets = registry.get(TABULAR_DATASETS);\n * const dataset = datasets.get(id);\n * if (!dataset) throw new Error(`Dataset \"${id}\" not found`);\n * return dataset;\n * }\n * throw new Error(`Unknown dataset type: ${datasetType}`);\n * });\n * ```\n */\nexport function registerInputResolver(formatPrefix: string, resolver: InputResolverFn): void {\n const resolvers = getInputResolvers();\n resolvers.set(formatPrefix, resolver);\n}\n",
|
|
9
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire
|
|
9
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire>\n): void {\n codecs.set(formatPrefix, codec as PortCodec);\n}\n\nexport function getPortCodec(format: string): PortCodec | undefined {\n if (codecs.has(format)) return codecs.get(format);\n const colon = format.indexOf(\":\");\n if (colon > 0) {\n const prefix = format.slice(0, colon);\n return codecs.get(prefix);\n }\n return undefined;\n}\n\n/** @internal — test affordance only. */\nexport function _resetPortCodecsForTests(): void {\n codecs.clear();\n}\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Log-level names in ascending severity order.\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport interface ConsoleLoggerOptions {\n readonly bindings?: Record<string, unknown>;\n readonly level?: LogLevel;\n readonly timings?: boolean;\n}\n\n/**\n * Logger that delegates to the global `console` object.\n * When created via {@link child}, accumulated bindings are passed\n * as a second argument to every console call.\n *\n * Supports optional level filtering (messages below the configured\n * level are silently discarded) and an opt-in `timings` flag that\n * controls whether {@link time}/{@link timeEnd} produce output.\n */\nexport class ConsoleLogger implements ILogger {\n private readonly bindings: Record<string, unknown>;\n private readonly level: LogLevel;\n private readonly timings: boolean;\n\n constructor(options: ConsoleLoggerOptions = {}) {\n this.bindings = options.bindings ?? {};\n this.level = options.level ?? \"debug\";\n this.timings = options.timings ?? false;\n }\n\n private enabled(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[this.level];\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"info\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(message, merged);\n } else {\n console.info(message);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"warn\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.warn(message, merged);\n } else {\n console.warn(message);\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"error\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, merged);\n } else {\n console.error(message);\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"debug\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.debug(message, merged);\n } else {\n console.debug(message);\n }\n }\n\n fatal(err: Error, message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"fatal\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, { ...merged, error: err });\n } else {\n console.error(message, { error: err });\n }\n }\n\n time(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[time] ${label}`, merged);\n }\n console.time(label);\n }\n\n timeEnd(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n console.timeEnd(label);\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[timeEnd] ${label}`, merged);\n }\n }\n\n group(label: string, meta?: Record<string, unknown>): void {\n const merged = this.merge(meta);\n if (merged) {\n console.group(label, merged);\n } else {\n console.group(label);\n }\n }\n\n groupEnd(): void {\n console.groupEnd();\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n return new ConsoleLogger({\n bindings: { ...this.bindings, ...bindings },\n level: this.level,\n timings: this.timings,\n });\n }\n\n private merge(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const hasBindings = Object.keys(this.bindings).length > 0;\n if (!hasBindings && !meta) return undefined;\n if (!hasBindings) return meta;\n if (!meta) return this.bindings;\n return { ...this.bindings, ...meta };\n }\n}\n",
|
|
11
11
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Silent logger that discards all output.\n * Useful for suppressing log noise in tests.\n */\nexport class NullLogger implements ILogger {\n info(_message: string, _meta?: Record<string, unknown>): void {}\n error(_message: string, _meta?: Record<string, unknown>): void {}\n warn(_message: string, _meta?: Record<string, unknown>): void {}\n debug(_message: string, _meta?: Record<string, unknown>): void {}\n fatal(_err: Error, _message: string, _meta?: Record<string, unknown>): void {}\n time(_label: string, _meta?: Record<string, unknown>): void {}\n timeEnd(_label: string, _meta?: Record<string, unknown>): void {}\n group(_label: string, _meta?: Record<string, unknown>): void {}\n groupEnd(): void {}\n child(_bindings: Record<string, unknown>): ILogger {\n return this;\n }\n}\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Read an environment value from Node `process.env` when defined, otherwise from\n * Vite/browser `import.meta.env`.\n *\n * In Vite dev, `process` is often polyfilled without `DEV`, so reading only\n * `process.env` misses `import.meta.env.DEV` and disables dev-only features\n * (e.g. console telemetry).\n *\n * Boolean `import.meta.env` flags become `\"true\"` or are treated as unset when false\n * so callers using simple truthiness behave as expected.\n */\nexport function readRuntimeEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n const fromProcess = process.env[name];\n if (fromProcess !== undefined) {\n return fromProcess;\n }\n }\n\n const meta = (import.meta as ImportMeta & { env?: Record<string, string | boolean | undefined> })\n .env;\n if (!meta) {\n return undefined;\n }\n\n const value = meta[name];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : undefined;\n }\n return String(value);\n}\n",
|
package/dist/worker-bun.js.map
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Container, globalContainer } from \"./Container\";\n\n/**\n * Service token type for type-safe dependency injection\n */\nexport interface ServiceToken<T> {\n readonly _type: T;\n readonly id: string;\n}\n\n/**\n * Create a typed service token\n * @param id Unique identifier for the service\n * @returns A typed service token\n */\nexport function createServiceToken<T>(id: string): ServiceToken<T> {\n return { id, _type: null as any };\n}\n\n/**\n * Service registry for managing and accessing services\n */\nexport class ServiceRegistry {\n public container: Container;\n\n /**\n * Create a new service registry\n * @param container Optional container to use (defaults to global container)\n */\n constructor(container: Container = globalContainer) {\n this.container = container;\n }\n\n /**\n * Register a service factory\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n register<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.register(token.id, factory, singleton);\n }\n\n /**\n * Register a service factory only if the token is not already registered.\n * @param token Service token\n * @param factory Factory function to create the service\n * @param singleton Whether the service should be a singleton\n */\n registerIfAbsent<T>(token: ServiceToken<T>, factory: () => T, singleton = true): void {\n this.container.registerIfAbsent(token.id, factory, singleton);\n }\n\n /**\n * Register a service instance\n * @param token Service token\n * @param instance Service instance to register\n */\n registerInstance<T>(token: ServiceToken<T>, instance: T): void {\n this.container.registerInstance(token.id, instance);\n }\n\n /**\n * Get a service by its token\n * @param token Service token\n * @returns The service instance\n */\n get<T>(token: ServiceToken<T>): T {\n return this.container.get<T>(token.id);\n }\n\n /**\n * Check if a service is registered\n * @param token Service token\n * @returns True if the service is registered\n */\n has<T>(token: ServiceToken<T>): boolean {\n return this.container.has(token.id);\n }\n\n /**\n * Dispose all instantiated services and clear registrations.\n */\n async dispose(): Promise<void> {\n await this.container.dispose();\n }\n}\n\n/**\n * Global service registry instance\n */\nexport const globalServiceRegistry = new ServiceRegistry(globalContainer);\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A compactor function that converts a resolved instance back to its string ID.\n * Returns undefined if the value cannot be compacted (e.g., missing ID field).\n *\n * @param value The resolved instance to compact\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputCompactorFn = (\n value: unknown,\n format: string,\n registry: ServiceRegistry\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Service token for the input compactor registry.\n * Maps format prefixes to compactor functions.\n */\nexport const INPUT_COMPACTORS =\n createServiceToken<Map<string, InputCompactorFn>>(\"task.input.compactors\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_COMPACTORS,\n (): Map<string, InputCompactorFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input compactor registry\n * @returns Map of format prefix to compactor function\n */\nexport function getInputCompactors(): Map<string, InputCompactorFn> {\n return globalServiceRegistry.get(INPUT_COMPACTORS);\n}\n\n/**\n * Registers an input compactor for a format prefix.\n * The compactor will be called to convert resolved instances back to string IDs.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"knowledge-base\")\n * @param compactor The compactor function\n *\n * @example\n * ```typescript\n * // Register model compactor — extracts model_id from a ModelConfig\n * registerInputCompactor(\"model\", (value) => {\n * if (typeof value === \"object\" && value !== null && \"model_id\" in value) {\n * const id = (value as Record<string, unknown>).model_id;\n * return typeof id === \"string\" ? id : undefined;\n * }\n * return undefined;\n * });\n * ```\n */\nexport function registerInputCompactor(formatPrefix: string, compactor: InputCompactorFn): void {\n const compactors = getInputCompactors();\n compactors.set(formatPrefix, compactor);\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ServiceRegistry } from \"./ServiceRegistry\";\nimport { createServiceToken, globalServiceRegistry } from \"./ServiceRegistry\";\n\n/**\n * A resolver function that converts a string ID to an instance.\n * Returns undefined if the resolver cannot handle this format.\n * Throws an error if the ID is not found.\n *\n * @param id The string ID to resolve\n * @param format The full format string (e.g., \"model:TextEmbedding\", \"storage:tabular\")\n * @param registry The service registry to use for lookups\n */\nexport type InputResolverFn = (\n id: string,\n format: string,\n registry: ServiceRegistry\n) => unknown | Promise<unknown>;\n\n/**\n * Service token for the input resolver registry.\n * Maps format prefixes to resolver functions.\n */\nexport const INPUT_RESOLVERS =\n createServiceToken<Map<string, InputResolverFn>>(\"task.input.resolvers\");\n\n// Register default factory if not already registered\nglobalServiceRegistry.registerIfAbsent(\n INPUT_RESOLVERS,\n (): Map<string, InputResolverFn> => new Map(),\n true\n);\n\n/**\n * Gets the global input resolver registry\n * @returns Map of format prefix to resolver function\n */\nexport function getInputResolvers(): Map<string, InputResolverFn> {\n return globalServiceRegistry.get(INPUT_RESOLVERS);\n}\n\n/**\n * Registers an input resolver for a format prefix.\n * The resolver will be called for any format that starts with this prefix.\n *\n * @param formatPrefix The format prefix to match (e.g., \"model\", \"dataset\")\n * @param resolver The resolver function\n *\n * @example\n * ```typescript\n * // Register model resolver\n * registerInputResolver(\"model\", async (id, format, registry) => {\n * const modelRepo = registry.get(MODEL_REPOSITORY);\n * const model = await modelRepo.findByName(id);\n * if (!model) throw new Error(`Model \"${id}\" not found`);\n * return model;\n * });\n *\n * // Register dataset resolver\n * registerInputResolver(\"dataset\", (id, format, registry) => {\n * const datasetType = format.split(\":\")[1]; // \"tabular\", \"vector\", etc.\n * if (datasetType === \"tabular\") {\n * const datasets = registry.get(TABULAR_DATASETS);\n * const dataset = datasets.get(id);\n * if (!dataset) throw new Error(`Dataset \"${id}\" not found`);\n * return dataset;\n * }\n * throw new Error(`Unknown dataset type: ${datasetType}`);\n * });\n * ```\n */\nexport function registerInputResolver(formatPrefix: string, resolver: InputResolverFn): void {\n const resolvers = getInputResolvers();\n resolvers.set(formatPrefix, resolver);\n}\n",
|
|
9
|
-
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire
|
|
9
|
+
"/**\n * @copyright\n * Copyright 2026 Steven Roussey\n * All Rights Reserved\n */\n\nexport interface PortCodec<Live = unknown, Wire = unknown> {\n serialize(value: Live): Promise<Wire>;\n deserialize(value: Wire): Promise<Live>;\n}\n\n/**\n * Codec registry shared across bundle copies via a Symbol.for key — same pattern\n * as globalContainer. Without this, split entry points (e.g. @workglow/util,\n * @workglow/util/media, @workglow/task-graph) could each see their own Map and\n * fail to find codecs registered by sibling entries.\n */\nconst GLOBAL_CODECS_KEY = Symbol.for(\"@workglow/util/di/portCodecs\");\nconst _g = globalThis as Record<symbol, unknown>;\nif (!_g[GLOBAL_CODECS_KEY]) {\n _g[GLOBAL_CODECS_KEY] = new Map<string, PortCodec>();\n}\nconst codecs = _g[GLOBAL_CODECS_KEY] as Map<string, PortCodec>;\n\nexport function registerPortCodec<Live = unknown, Wire = unknown>(\n formatPrefix: string,\n codec: PortCodec<Live, Wire>\n): void {\n codecs.set(formatPrefix, codec as PortCodec);\n}\n\nexport function getPortCodec(format: string): PortCodec | undefined {\n if (codecs.has(format)) return codecs.get(format);\n const colon = format.indexOf(\":\");\n if (colon > 0) {\n const prefix = format.slice(0, colon);\n return codecs.get(prefix);\n }\n return undefined;\n}\n\n/** @internal — test affordance only. */\nexport function _resetPortCodecsForTests(): void {\n codecs.clear();\n}\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Log-level names in ascending severity order.\n */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport interface ConsoleLoggerOptions {\n readonly bindings?: Record<string, unknown>;\n readonly level?: LogLevel;\n readonly timings?: boolean;\n}\n\n/**\n * Logger that delegates to the global `console` object.\n * When created via {@link child}, accumulated bindings are passed\n * as a second argument to every console call.\n *\n * Supports optional level filtering (messages below the configured\n * level are silently discarded) and an opt-in `timings` flag that\n * controls whether {@link time}/{@link timeEnd} produce output.\n */\nexport class ConsoleLogger implements ILogger {\n private readonly bindings: Record<string, unknown>;\n private readonly level: LogLevel;\n private readonly timings: boolean;\n\n constructor(options: ConsoleLoggerOptions = {}) {\n this.bindings = options.bindings ?? {};\n this.level = options.level ?? \"debug\";\n this.timings = options.timings ?? false;\n }\n\n private enabled(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[this.level];\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"info\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(message, merged);\n } else {\n console.info(message);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"warn\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.warn(message, merged);\n } else {\n console.warn(message);\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"error\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, merged);\n } else {\n console.error(message);\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"debug\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.debug(message, merged);\n } else {\n console.debug(message);\n }\n }\n\n fatal(err: Error, message: string, meta?: Record<string, unknown>): void {\n if (!this.enabled(\"fatal\")) return;\n const merged = this.merge(meta);\n if (merged) {\n console.error(message, { ...merged, error: err });\n } else {\n console.error(message, { error: err });\n }\n }\n\n time(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[time] ${label}`, merged);\n }\n console.time(label);\n }\n\n timeEnd(label: string, meta?: Record<string, unknown>): void {\n if (!this.timings) return;\n console.timeEnd(label);\n const merged = this.merge(meta);\n if (merged) {\n console.info(`[timeEnd] ${label}`, merged);\n }\n }\n\n group(label: string, meta?: Record<string, unknown>): void {\n const merged = this.merge(meta);\n if (merged) {\n console.group(label, merged);\n } else {\n console.group(label);\n }\n }\n\n groupEnd(): void {\n console.groupEnd();\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n return new ConsoleLogger({\n bindings: { ...this.bindings, ...bindings },\n level: this.level,\n timings: this.timings,\n });\n }\n\n private merge(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n const hasBindings = Object.keys(this.bindings).length > 0;\n if (!hasBindings && !meta) return undefined;\n if (!hasBindings) return meta;\n if (!meta) return this.bindings;\n return { ...this.bindings, ...meta };\n }\n}\n",
|
|
11
11
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ILogger } from \"./ILogger\";\n\n/**\n * Silent logger that discards all output.\n * Useful for suppressing log noise in tests.\n */\nexport class NullLogger implements ILogger {\n info(_message: string, _meta?: Record<string, unknown>): void {}\n error(_message: string, _meta?: Record<string, unknown>): void {}\n warn(_message: string, _meta?: Record<string, unknown>): void {}\n debug(_message: string, _meta?: Record<string, unknown>): void {}\n fatal(_err: Error, _message: string, _meta?: Record<string, unknown>): void {}\n time(_label: string, _meta?: Record<string, unknown>): void {}\n timeEnd(_label: string, _meta?: Record<string, unknown>): void {}\n group(_label: string, _meta?: Record<string, unknown>): void {}\n groupEnd(): void {}\n child(_bindings: Record<string, unknown>): ILogger {\n return this;\n }\n}\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Read an environment value from Node `process.env` when defined, otherwise from\n * Vite/browser `import.meta.env`.\n *\n * In Vite dev, `process` is often polyfilled without `DEV`, so reading only\n * `process.env` misses `import.meta.env.DEV` and disables dev-only features\n * (e.g. console telemetry).\n *\n * Boolean `import.meta.env` flags become `\"true\"` or are treated as unset when false\n * so callers using simple truthiness behave as expected.\n */\nexport function readRuntimeEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n const fromProcess = process.env[name];\n if (fromProcess !== undefined) {\n return fromProcess;\n }\n }\n\n const meta = (import.meta as ImportMeta & { env?: Record<string, string | boolean | undefined> })\n .env;\n if (!meta) {\n return undefined;\n }\n\n const value = meta[name];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : undefined;\n }\n return String(value);\n}\n",
|