@workglow/ai-provider 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/ToolCallParsers.d.ts +253 -0
- package/dist/common/ToolCallParsers.d.ts.map +1 -0
- package/dist/provider-anthropic/AnthropicProvider.d.ts +3 -2
- package/dist/provider-anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts +3 -2
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_Client.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts +10 -0
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts.map +1 -0
- package/dist/provider-anthropic/index.js +3 -4
- package/dist/provider-anthropic/index.js.map +3 -3
- package/dist/provider-anthropic/runtime.js +225 -8
- package/dist/provider-anthropic/runtime.js.map +9 -8
- package/dist/provider-chrome/WebBrowserProvider.d.ts +2 -1
- package/dist/provider-chrome/WebBrowserProvider.d.ts.map +1 -1
- package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts +2 -1
- package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts.map +1 -1
- package/dist/provider-chrome/index.js +2 -4
- package/dist/provider-chrome/index.js.map +3 -3
- package/dist/provider-chrome/runtime.js +3 -7
- package/dist/provider-chrome/runtime.js.map +4 -4
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts +3 -2
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts.map +1 -1
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts +3 -2
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts +10 -0
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts.map +1 -0
- package/dist/provider-gemini/index.js +3 -4
- package/dist/provider-gemini/index.js.map +3 -3
- package/dist/provider-gemini/runtime.js +188 -8
- package/dist/provider-gemini/runtime.js.map +7 -6
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts +3 -2
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts +3 -2
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts +10 -0
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts.map +1 -0
- package/dist/provider-hf-inference/index.js +3 -4
- package/dist/provider-hf-inference/index.js.map +3 -3
- package/dist/provider-hf-inference/runtime.js +157 -8
- package/dist/provider-hf-inference/runtime.js.map +7 -6
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts +3 -2
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts +3 -3
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts +52 -0
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts +1 -1
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_StructuredGeneration.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextClassification.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextQuestionAnswer.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextSummary.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextTranslation.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts +10 -0
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts.map +1 -0
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts +20 -0
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts.map +1 -0
- package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts +67 -0
- package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts.map +1 -0
- package/dist/provider-hf-transformers/index.d.ts +1 -0
- package/dist/provider-hf-transformers/index.d.ts.map +1 -1
- package/dist/provider-hf-transformers/index.js +71 -7
- package/dist/provider-hf-transformers/index.js.map +7 -6
- package/dist/provider-hf-transformers/runtime.d.ts +1 -0
- package/dist/provider-hf-transformers/runtime.d.ts.map +1 -1
- package/dist/provider-hf-transformers/runtime.js +1244 -13
- package/dist/provider-hf-transformers/runtime.js.map +18 -15
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts +3 -2
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts +3 -2
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts +10 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts.map +1 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts +35 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts.map +1 -0
- package/dist/provider-llamacpp/index.js +3 -4
- package/dist/provider-llamacpp/index.js.map +3 -3
- package/dist/provider-llamacpp/runtime.js +1394 -9
- package/dist/provider-llamacpp/runtime.js.map +11 -8
- package/dist/provider-ollama/OllamaProvider.d.ts +3 -2
- package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts +3 -2
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +47 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +46 -0
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts +16 -0
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts.map +1 -0
- package/dist/provider-ollama/index.browser.js +3 -4
- package/dist/provider-ollama/index.browser.js.map +3 -3
- package/dist/provider-ollama/index.js +3 -4
- package/dist/provider-ollama/index.js.map +3 -3
- package/dist/provider-ollama/runtime.browser.js +130 -8
- package/dist/provider-ollama/runtime.browser.js.map +8 -7
- package/dist/provider-ollama/runtime.js +125 -8
- package/dist/provider-ollama/runtime.js.map +8 -7
- package/dist/provider-openai/OpenAiProvider.d.ts +3 -2
- package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts +3 -2
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_Client.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts +10 -0
- package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts.map +1 -0
- package/dist/provider-openai/index.browser.js +3 -4
- package/dist/provider-openai/index.browser.js.map +3 -3
- package/dist/provider-openai/index.js +3 -4
- package/dist/provider-openai/index.js.map +3 -3
- package/dist/provider-openai/runtime.browser.js +138 -8
- package/dist/provider-openai/runtime.browser.js.map +8 -7
- package/dist/provider-openai/runtime.js +138 -8
- package/dist/provider-openai/runtime.js.map +8 -7
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts +2 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts +2 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Download.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_ImageClassification.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/index.js.map +2 -2
- package/dist/provider-tf-mediapipe/runtime.js +2 -4
- package/dist/provider-tf-mediapipe/runtime.js.map +13 -13
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +913 -0
- package/dist/test.js.map +10 -0
- package/package.json +24 -17
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/provider-hf-transformers/common/HFT_Pipeline.ts", "../src/provider-hf-transformers/common/HFT_Constants.ts", "../src/provider-hf-transformers/common/HFT_ModelSchema.ts", "../src/provider-hf-transformers/common/HFT_OnnxDtypes.ts", "../src/provider-hf-transformers/common/HFT_InlineLifecycle.ts", "../src/common/PipelineTaskMapping.ts", "../src/common/HfModelSearch.ts", "../src/provider-hf-transformers/common/HFT_ModelSearch.ts", "../src/provider-hf-transformers/common/HFT_ImageHelpers.ts", "../src/provider-hf-transformers/common/HFT_BackgroundRemoval.ts", "../src/provider-hf-transformers/common/HFT_CountTokens.ts", "../src/provider-hf-transformers/common/HFT_Download.ts", "../src/provider-hf-transformers/common/HFT_ImageClassification.ts", "../src/provider-hf-transformers/common/HFT_ImageEmbedding.ts", "../src/provider-hf-transformers/common/HFT_ImageSegmentation.ts", "../src/provider-hf-transformers/common/HFT_ImageToText.ts", "../src/provider-hf-transformers/common/HFT_ModelInfo.ts", "../src/provider-hf-transformers/common/HFT_ObjectDetection.ts", "../src/provider-hf-transformers/common/HFT_StructuredGeneration.ts", "../src/provider-hf-transformers/common/HFT_Streaming.ts", "../src/provider-hf-transformers/common/HFT_TextOutput.ts", "../src/provider-hf-transformers/common/HFT_TextClassification.ts", "../src/provider-hf-transformers/common/HFT_TextEmbedding.ts", "../src/provider-hf-transformers/common/HFT_TextFillMask.ts", "../src/provider-hf-transformers/common/HFT_TextGeneration.ts", "../src/provider-hf-transformers/common/HFT_TextLanguageDetection.ts", "../src/provider-hf-transformers/common/HFT_TextNamedEntityRecognition.ts", "../src/provider-hf-transformers/common/HFT_TextQuestionAnswer.ts", "../src/provider-hf-transformers/common/HFT_TextRewriter.ts", "../src/provider-hf-transformers/common/HFT_TextSummary.ts", "../src/provider-hf-transformers/common/HFT_TextTranslation.ts", "../src/provider-hf-transformers/common/HFT_Unload.ts", "../src/provider-hf-transformers/common/HFT_JobRunFns.ts", "../src/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.ts", "../src/provider-hf-transformers/registerHuggingFaceTransformersInline.ts", "../src/provider-hf-transformers/registerHuggingFaceTransformersWorker.ts", "../src/provider-hf-transformers/HuggingFaceTransformersProvider.ts", "../src/provider-hf-transformers/runtime.ts"],
|
|
3
|
+
"sources": ["../src/provider-hf-transformers/common/HFT_Pipeline.ts", "../src/provider-hf-transformers/common/HFT_Constants.ts", "../src/provider-hf-transformers/common/HFT_ModelSchema.ts", "../src/provider-hf-transformers/common/HFT_OnnxDtypes.ts", "../src/provider-hf-transformers/common/HFT_ToolMarkup.ts", "../src/provider-hf-transformers/common/HFT_InlineLifecycle.ts", "../src/common/PipelineTaskMapping.ts", "../src/common/HfModelSearch.ts", "../src/provider-hf-transformers/common/HFT_ModelSearch.ts", "../src/provider-hf-transformers/common/HFT_ImageHelpers.ts", "../src/provider-hf-transformers/common/HFT_BackgroundRemoval.ts", "../src/provider-hf-transformers/common/HFT_CountTokens.ts", "../src/provider-hf-transformers/common/HFT_Download.ts", "../src/provider-hf-transformers/common/HFT_ImageClassification.ts", "../src/provider-hf-transformers/common/HFT_ImageEmbedding.ts", "../src/provider-hf-transformers/common/HFT_ImageSegmentation.ts", "../src/provider-hf-transformers/common/HFT_ImageToText.ts", "../src/provider-hf-transformers/common/HFT_ModelInfo.ts", "../src/provider-hf-transformers/common/HFT_ObjectDetection.ts", "../src/provider-hf-transformers/common/HFT_StructuredGeneration.ts", "../src/provider-hf-transformers/common/HFT_Streaming.ts", "../src/provider-hf-transformers/common/HFT_TextOutput.ts", "../src/provider-hf-transformers/common/HFT_TextClassification.ts", "../src/provider-hf-transformers/common/HFT_TextEmbedding.ts", "../src/provider-hf-transformers/common/HFT_TextFillMask.ts", "../src/provider-hf-transformers/common/HFT_TextGeneration.ts", "../src/provider-hf-transformers/common/HFT_TextLanguageDetection.ts", "../src/provider-hf-transformers/common/HFT_TextNamedEntityRecognition.ts", "../src/provider-hf-transformers/common/HFT_TextQuestionAnswer.ts", "../src/provider-hf-transformers/common/HFT_TextRewriter.ts", "../src/provider-hf-transformers/common/HFT_TextSummary.ts", "../src/provider-hf-transformers/common/HFT_TextTranslation.ts", "../src/provider-hf-transformers/common/HFT_ToolCalling.ts", "../src/common/ToolCallParsers.ts", "../src/provider-hf-transformers/common/HFT_Unload.ts", "../src/provider-hf-transformers/common/HFT_JobRunFns.ts", "../src/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.ts", "../src/provider-hf-transformers/registerHuggingFaceTransformersInline.ts", "../src/provider-hf-transformers/registerHuggingFaceTransformersWorker.ts", "../src/provider-hf-transformers/HuggingFaceTransformersProvider.ts", "../src/provider-hf-transformers/runtime.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { type PretrainedModelOptions, type ProgressInfo } from \"@huggingface/transformers\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\n\nlet _transformersSdk: typeof import(\"@huggingface/transformers\") | undefined;\nlet _cacheDir: string | undefined;\n\n/**\n * Set the filesystem cache directory for downloaded transformers.js models.\n * Must be called before any model is loaded.\n */\nexport function setHftCacheDir(dir: string): void {\n _cacheDir = dir;\n if (_transformersSdk) {\n _transformersSdk.env.cacheDir = dir;\n }\n}\n\nexport async function loadTransformersSDK() {\n if (!_transformersSdk) {\n try {\n _transformersSdk = await import(\"@huggingface/transformers\");\n _transformersSdk.env.fetch = abortableFetch as typeof fetch;\n if (_cacheDir) {\n _transformersSdk.env.cacheDir = _cacheDir;\n }\n } catch {\n throw new Error(\n \"@huggingface/transformers is required for HuggingFace Transformers tasks. Install it with: bun add @huggingface/transformers\"\n );\n }\n }\n return _transformersSdk;\n}\n\n/** Per-model AbortControllers used by abortableFetch; keyed by model_path. */\nconst modelAbortControllers = new Map<string, AbortController>();\n\nfunction combineAbortSignals(\n existingSignal: AbortSignal | null | undefined,\n modelSignal: AbortSignal | undefined\n): AbortSignal | undefined {\n if (!existingSignal) {\n return modelSignal;\n }\n if (!modelSignal) {\n return existingSignal;\n }\n if (existingSignal.aborted || modelSignal.aborted) {\n return AbortSignal.abort(existingSignal.reason ?? modelSignal.reason);\n }\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([existingSignal, modelSignal]);\n }\n\n const controller = new AbortController();\n const abort = (event: Event) => {\n const signal = event.target as AbortSignal;\n controller.abort(signal.reason);\n };\n existingSignal.addEventListener(\"abort\", abort, { once: true });\n modelSignal.addEventListener(\"abort\", abort, { once: true });\n return controller.signal;\n}\n\nfunction createAbortError(signal: AbortSignal): Error {\n const reason = signal.reason;\n if (reason instanceof Error) {\n return reason;\n }\n return new Error(String(reason ?? \"Fetch aborted\"));\n}\n\nfunction wrapAbortableResponse(response: Response, signal: AbortSignal | undefined): Response {\n if (!signal || !response.body) {\n return response;\n }\n\n const contentLengthHeader = response.headers.get(\"content-length\");\n const expectedSize =\n contentLengthHeader && /^\\d+$/.test(contentLengthHeader)\n ? Number.parseInt(contentLengthHeader, 10)\n : undefined;\n const sourceBody = response.body;\n\n // Use pull-based reading to maintain backpressure. The previous start()-based\n // loop eagerly drained the source into the internal queue without waiting for\n // the consumer, which could buffer the entire response body in memory — a\n // problem for large model files (hundreds of MB to several GB).\n let reader: ReadableStreamDefaultReader<Uint8Array>;\n let abortHandler: (() => void) | undefined;\n let loaded = 0;\n\n const cleanup = () => {\n if (abortHandler) {\n signal.removeEventListener(\"abort\", abortHandler);\n abortHandler = undefined;\n }\n reader?.releaseLock();\n };\n\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n reader = sourceBody.getReader();\n if (signal.aborted) {\n controller.error(createAbortError(signal));\n return;\n }\n abortHandler = () => controller.error(createAbortError(signal));\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n },\n async pull(controller) {\n try {\n if (signal.aborted) {\n throw createAbortError(signal);\n }\n\n const { done, value } = await reader.read();\n if (done) {\n if (signal.aborted) {\n throw createAbortError(signal);\n }\n if (expectedSize !== undefined && loaded < expectedSize) {\n throw new Error(\n `Fetch ended before reading the full response body (${loaded}/${expectedSize} bytes)`\n );\n }\n cleanup();\n controller.close();\n return;\n }\n\n loaded += value.length;\n controller.enqueue(value);\n } catch (error) {\n cleanup();\n controller.error(error);\n }\n },\n cancel(reason) {\n cleanup();\n return sourceBody.cancel(reason);\n },\n });\n\n return new Response(body, {\n headers: new Headers(response.headers),\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nfunction abortableFetch(url: string, options?: RequestInit): Promise<Response> {\n let modelSignal: AbortSignal | undefined;\n try {\n const pathname = new URL(url).pathname;\n for (const [modelPath, controller] of modelAbortControllers) {\n if (pathname.includes(`/${modelPath}/`)) {\n modelSignal = controller.signal;\n break;\n }\n }\n } catch {\n /* not a parseable URL, proceed without abort */\n }\n const combinedSignal = options?.signal\n ? combineAbortSignals(options.signal, modelSignal)\n : modelSignal;\n return fetch(url, { ...options, ...(combinedSignal ? { signal: combinedSignal } : {}) }).then(\n (response) => wrapAbortableResponse(response, combinedSignal)\n );\n}\n\nconst pipelines = new Map<string, any>();\n\n/** In-flight pipeline loads by cache key. Ensures only one load per model at a time to avoid corrupt ONNX files (Protobuf parsing failed). */\nconst pipelineLoadPromises = new Map<string, Promise<any>>();\n\n/**\n * Vision/image pipeline types that require an image processor to be loaded.\n * If the processor is null after pipeline creation the model cache is incomplete\n * (e.g. `preprocessor_config.json` was not downloaded) and the load should be\n * treated as a retriable failure so the missing files are re-fetched.\n */\nconst IMAGE_PIPELINE_TYPES = new Set([\n \"image-classification\",\n \"image-segmentation\",\n \"object-detection\",\n \"image-to-text\",\n \"image-feature-extraction\",\n \"zero-shot-image-classification\",\n \"depth-estimation\",\n \"mask-generation\",\n]);\n\n/**\n * Error message prefix used when an image pipeline's processor failed to\n * initialize (null processor after load). The prefix is checked in\n * `AiJob.classifyProviderError()` to produce a `RetryableJobError` so the\n * queue re-downloads missing processor config files.\n */\nexport const HFT_NULL_PROCESSOR_PREFIX = \"HFT_NULL_PROCESSOR:\";\n\n/**\n * Clear all cached pipelines\n */\nexport function clearPipelineCache(): void {\n pipelines.clear();\n}\n\nexport function hasCachedPipeline(cacheKey: string): boolean {\n return pipelines.has(cacheKey);\n}\n\nexport function removeCachedPipeline(cacheKey: string): boolean {\n return pipelines.delete(cacheKey);\n}\n\n/** True when running in a browser or Web Worker. Transformers.js only accepts device \"wasm\" or \"webgpu\" in the browser build. */\nfunction isBrowserEnv(): boolean {\n if (typeof globalThis === \"undefined\") return false;\n // Main thread\n if (typeof (globalThis as any).window !== \"undefined\") return true;\n // Web Worker (has self but no window)\n if (typeof (globalThis as any).WorkerGlobalScope !== \"undefined\") return true;\n return false;\n}\n\n/**\n * Generate a cache key for a pipeline that includes all configuration options\n * that affect pipeline creation (model_path, pipeline, dtype, device)\n */\nexport function getPipelineCacheKey(model: HfTransformersOnnxModelConfig): string {\n const dtype = model.provider_config.dtype || \"\";\n const device = model.provider_config.device || \"\";\n const revision = model.provider_config.revision || \"main\";\n return `${model.provider_config.model_path}:${model.provider_config.pipeline}:${dtype}:${device}:${revision}`;\n}\n\n/**\n * Helper function to get a pipeline for a model\n * @param progressScaleMax - Maximum progress value for download phase (100 for download-only, 10 for download+run)\n *\n * Explicit `Promise<any>` return avoids TS2883 (inferred type not portable across package boundaries).\n */\nexport async function getPipeline(\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions = {},\n signal?: AbortSignal,\n progressScaleMax: number = 10\n): Promise<any> {\n const cacheKey = getPipelineCacheKey(model);\n if (pipelines.has(cacheKey)) {\n getLogger().debug(\"HFT pipeline cache hit\", { cacheKey });\n return pipelines.get(cacheKey);\n }\n\n // In-flight: only one load per model at a time to avoid concurrent writes to the same\n // ONNX cache path (which can yield \"Protobuf parsing failed\" when one process reads while another writes).\n const inFlight = pipelineLoadPromises.get(cacheKey);\n if (inFlight) {\n try {\n await inFlight;\n } catch {\n // First load failed (e.g. aborted) — fall through to retry below.\n }\n const cached = pipelines.get(cacheKey);\n if (cached) return cached;\n // Load failed for the other caller; fall through to retry (we remove from map in finally).\n }\n\n const loadPromise = doGetPipeline(\n model,\n onProgress,\n options,\n progressScaleMax,\n cacheKey,\n signal\n ).finally(() => {\n pipelineLoadPromises.delete(cacheKey);\n });\n pipelineLoadPromises.set(cacheKey, loadPromise);\n return loadPromise;\n}\n\nconst doGetPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions,\n progressScaleMax: number,\n cacheKey: string,\n signal?: AbortSignal\n) => {\n // Throttle state for progress events\n let lastProgressTime = 0;\n type FilesByteMap = Record<string, { loaded: number; total: number }>;\n let pendingProgress: {\n progress: number;\n file: string;\n fileProgress: number;\n filesMap?: FilesByteMap;\n } | null = null;\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n const THROTTLE_MS = 160;\n\n const buildProgressDetails = (\n file: string,\n fileProgress: number,\n filesMap?: FilesByteMap\n ): { file: string; progress: number; files?: FilesByteMap } => {\n const details: { file: string; progress: number; files?: FilesByteMap } = {\n file,\n progress: fileProgress,\n };\n if (filesMap && Object.keys(filesMap).length > 0) {\n details.files = filesMap;\n }\n return details;\n };\n\n /**\n * Sends a progress event, throttled to avoid flooding the worker channel.\n * Always sends first event and final (>=progressScaleMax) immediately.\n */\n const sendProgress = (\n progress: number,\n file: string,\n fileProgress: number,\n filesMap?: FilesByteMap\n ): void => {\n const now = Date.now();\n const timeSinceLastEvent = now - lastProgressTime;\n const isFirst = lastProgressTime === 0;\n const isFinal = progress >= progressScaleMax;\n\n if (isFirst || isFinal) {\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n pendingProgress = null;\n onProgress(\n Math.round(progress),\n \"Downloading model\",\n buildProgressDetails(file, fileProgress, filesMap)\n );\n lastProgressTime = now;\n return;\n }\n\n if (timeSinceLastEvent < THROTTLE_MS) {\n pendingProgress = { progress, file, fileProgress, filesMap };\n if (!throttleTimer) {\n const timeRemaining = Math.max(1, THROTTLE_MS - timeSinceLastEvent);\n throttleTimer = setTimeout(() => {\n throttleTimer = null;\n if (pendingProgress) {\n const p = pendingProgress;\n onProgress(\n Math.round(p.progress),\n \"Downloading model\",\n buildProgressDetails(p.file, p.fileProgress, p.filesMap)\n );\n lastProgressTime = Date.now();\n pendingProgress = null;\n }\n }, timeRemaining);\n }\n return;\n }\n\n onProgress(\n Math.round(progress),\n \"Downloading model\",\n buildProgressDetails(file, fileProgress, filesMap)\n );\n lastProgressTime = now;\n pendingProgress = null;\n };\n\n // Get the abort signal from the signal parameter\n const abortSignal = signal;\n\n // Register a per-model AbortController so abortableFetch can cancel in-flight fetches\n const modelPath = model.provider_config.model_path;\n const modelController = new AbortController();\n modelAbortControllers.set(modelPath, modelController);\n if (abortSignal) {\n if (abortSignal.aborted) {\n modelController.abort();\n } else {\n abortSignal.addEventListener(\"abort\", () => modelController.abort(), { once: true });\n }\n }\n\n // Use aggregate progress_total event from @huggingface/transformers v4 pipeline()\n const progressCallback = (status: ProgressInfo) => {\n if (abortSignal?.aborted) return;\n\n if ((status as any).status === \"progress_total\") {\n const totalStatus = status as any;\n const scaledProgress = (totalStatus.progress * progressScaleMax) / 100;\n\n // Find the currently active file (one still downloading)\n let activeFile = \"\";\n let activeFileProgress = 0;\n const files: Record<string, { loaded: number; total: number }> | undefined =\n totalStatus.files;\n if (files) {\n for (const [file, info] of Object.entries(files)) {\n if (info.loaded < info.total) {\n activeFile = file;\n activeFileProgress = info.total > 0 ? (info.loaded / info.total) * 100 : 0;\n break;\n }\n }\n if (!activeFile) {\n const fileNames = Object.keys(files);\n if (fileNames.length > 0) {\n activeFile = fileNames[fileNames.length - 1];\n activeFileProgress = 100;\n }\n }\n }\n\n sendProgress(scaledProgress, activeFile, activeFileProgress, files);\n }\n };\n\n let device = model.provider_config.device as string | undefined;\n if (isBrowserEnv()) {\n // we must make a choice for the device in the browser\n if (device === \"gpu\") {\n device = \"webgpu\";\n }\n if (device === \"cpu\") {\n device = \"wasm\";\n }\n if (device !== \"wasm\" && device !== \"webgpu\") {\n device = \"wasm\";\n }\n } else {\n // we can trust the lib to make a choice for the device on the server\n if (device === \"wasm\" || device === \"webgpu\") {\n device = undefined;\n }\n }\n\n const dtype = model.provider_config.dtype || \"\";\n const pipelineOptions: PretrainedModelOptions = {\n revision: model.provider_config.revision || \"main\",\n ...(model.provider_config.use_external_data_format\n ? { useExternalDataFormat: model.provider_config.use_external_data_format }\n : {}),\n ...(dtype ? { dtype: dtype as any } : {}),\n ...(device ? { device: device as any } : {}),\n ...options,\n progress_callback: progressCallback,\n };\n\n // Check if already aborted before starting\n if (abortSignal?.aborted) {\n modelAbortControllers.delete(modelPath);\n throw new Error(\"Operation aborted before pipeline creation\");\n }\n\n const pipelineType = model.provider_config.pipeline;\n\n const { pipeline } = await loadTransformersSDK();\n\n const logger = getLogger();\n const pipelineTimerLabel = `hft:pipeline:${cacheKey}`;\n logger.time(pipelineTimerLabel, { pipelineType, modelPath });\n\n try {\n const result = await pipeline(pipelineType, model.provider_config.model_path, pipelineOptions);\n\n // Flush pending throttled progress and clean up timer\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n // pendingProgress may have been set by progressCallback during the pipeline() await\n const finalPending = pendingProgress as {\n progress: number;\n file: string;\n fileProgress: number;\n filesMap?: FilesByteMap;\n } | null;\n if (finalPending) {\n onProgress(\n Math.round(finalPending.progress),\n \"Downloading model\",\n buildProgressDetails(finalPending.file, finalPending.fileProgress, finalPending.filesMap)\n );\n pendingProgress = null;\n }\n\n // Check if aborted after pipeline creation\n if (abortSignal?.aborted) {\n logger.timeEnd(pipelineTimerLabel, { status: \"aborted\" });\n throw new Error(\"Operation aborted after pipeline creation\");\n }\n\n // For image/vision pipelines the processor must be initialized. A null processor\n // means the model cache is incomplete (e.g. preprocessor_config.json was not\n // downloaded, likely because a previous download was aborted). Throw a specific\n // error so the job queue can retry and re-fetch the missing files.\n if (IMAGE_PIPELINE_TYPES.has(pipelineType) && (result as any).processor == null) {\n throw new Error(\n `${HFT_NULL_PROCESSOR_PREFIX} Image processor not initialized for ` +\n `${pipelineType}/${modelPath}. Model cache may be incomplete.`\n );\n }\n\n logger.timeEnd(pipelineTimerLabel, { status: \"loaded\" });\n pipelines.set(cacheKey, result);\n return result;\n } catch (error: any) {\n logger.timeEnd(pipelineTimerLabel, { status: \"error\", error: String(error) });\n // If aborted, throw a clean abort error rather than internal stream errors.\n // Preserve processor-initialization errors so they propagate with their original message.\n if (\n !error?.message?.startsWith(HFT_NULL_PROCESSOR_PREFIX) &&\n (abortSignal?.aborted || modelController.signal.aborted)\n ) {\n throw new Error(\"Pipeline download aborted\");\n }\n throw error;\n } finally {\n modelAbortControllers.delete(modelPath);\n const { random } = await loadTransformersSDK();\n random.seed(model.provider_config.seed ?? undefined);\n }\n};\n",
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { PretrainedModelOptions, ProgressInfo } from \"@huggingface/transformers\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\n\nlet _transformersSdk: typeof import(\"@huggingface/transformers\") | undefined;\nlet _cacheDir: string | undefined;\n\n/**\n * Set the filesystem cache directory for downloaded transformers.js models.\n * Must be called before any model is loaded.\n */\nexport function setHftCacheDir(dir: string): void {\n _cacheDir = dir;\n if (_transformersSdk) {\n _transformersSdk.env.cacheDir = dir;\n }\n}\n\nexport async function loadTransformersSDK() {\n if (!_transformersSdk) {\n try {\n _transformersSdk = await import(\"@huggingface/transformers\");\n _transformersSdk.env.fetch = abortableFetch as typeof fetch;\n if (_cacheDir) {\n _transformersSdk.env.cacheDir = _cacheDir;\n }\n } catch {\n throw new Error(\n \"@huggingface/transformers is required for HuggingFace Transformers tasks. Install it with: bun add @huggingface/transformers\"\n );\n }\n }\n return _transformersSdk;\n}\n\n/** Per-model AbortControllers used by abortableFetch; keyed by model_path. */\nconst modelAbortControllers = new Map<string, AbortController>();\n\nfunction combineAbortSignals(\n existingSignal: AbortSignal | null | undefined,\n modelSignal: AbortSignal | undefined\n): AbortSignal | undefined {\n if (!existingSignal) {\n return modelSignal;\n }\n if (!modelSignal) {\n return existingSignal;\n }\n if (existingSignal.aborted || modelSignal.aborted) {\n return AbortSignal.abort(existingSignal.reason ?? modelSignal.reason);\n }\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([existingSignal, modelSignal]);\n }\n\n const controller = new AbortController();\n const abort = (event: Event) => {\n const signal = event.target as AbortSignal;\n controller.abort(signal.reason);\n };\n existingSignal.addEventListener(\"abort\", abort, { once: true });\n modelSignal.addEventListener(\"abort\", abort, { once: true });\n return controller.signal;\n}\n\nfunction createAbortError(signal: AbortSignal): Error {\n const reason = signal.reason;\n if (reason instanceof Error) {\n return reason;\n }\n return new Error(String(reason ?? \"Fetch aborted\"));\n}\n\nfunction wrapAbortableResponse(response: Response, signal: AbortSignal | undefined): Response {\n if (!signal || !response.body) {\n return response;\n }\n\n const contentLengthHeader = response.headers.get(\"content-length\");\n const expectedSize =\n contentLengthHeader && /^\\d+$/.test(contentLengthHeader)\n ? Number.parseInt(contentLengthHeader, 10)\n : undefined;\n const sourceBody = response.body;\n\n // Use pull-based reading to maintain backpressure. The previous start()-based\n // loop eagerly drained the source into the internal queue without waiting for\n // the consumer, which could buffer the entire response body in memory — a\n // problem for large model files (hundreds of MB to several GB).\n let reader: ReadableStreamDefaultReader<Uint8Array>;\n let abortHandler: (() => void) | undefined;\n let loaded = 0;\n\n const cleanup = () => {\n if (abortHandler) {\n signal.removeEventListener(\"abort\", abortHandler);\n abortHandler = undefined;\n }\n reader?.releaseLock();\n };\n\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n reader = sourceBody.getReader();\n if (signal.aborted) {\n controller.error(createAbortError(signal));\n return;\n }\n abortHandler = () => controller.error(createAbortError(signal));\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n },\n async pull(controller) {\n try {\n if (signal.aborted) {\n throw createAbortError(signal);\n }\n\n const { done, value } = await reader.read();\n if (done) {\n if (signal.aborted) {\n throw createAbortError(signal);\n }\n if (expectedSize !== undefined && loaded < expectedSize) {\n throw new Error(\n `Fetch ended before reading the full response body (${loaded}/${expectedSize} bytes)`\n );\n }\n cleanup();\n controller.close();\n return;\n }\n\n loaded += value.length;\n controller.enqueue(value);\n } catch (error) {\n cleanup();\n controller.error(error);\n }\n },\n cancel(reason) {\n cleanup();\n return sourceBody.cancel(reason);\n },\n });\n\n return new Response(body, {\n headers: new Headers(response.headers),\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nfunction abortableFetch(url: string, options?: RequestInit): Promise<Response> {\n let modelSignal: AbortSignal | undefined;\n try {\n const pathname = new URL(url).pathname;\n for (const [modelPath, controller] of modelAbortControllers) {\n if (pathname.includes(`/${modelPath}/`)) {\n modelSignal = controller.signal;\n break;\n }\n }\n } catch {\n /* not a parseable URL, proceed without abort */\n }\n const combinedSignal = options?.signal\n ? combineAbortSignals(options.signal, modelSignal)\n : modelSignal;\n return fetch(url, { ...options, ...(combinedSignal ? { signal: combinedSignal } : {}) }).then(\n (response) => wrapAbortableResponse(response, combinedSignal)\n );\n}\n\nconst pipelines = new Map<string, any>();\n\n/** In-flight pipeline loads by cache key. Ensures only one load per model at a time to avoid corrupt ONNX files (Protobuf parsing failed). */\nconst pipelineLoadPromises = new Map<string, Promise<any>>();\n\n/**\n * Vision/image pipeline types that require an image processor to be loaded.\n * If the processor is null after pipeline creation the model cache is incomplete\n * (e.g. `preprocessor_config.json` was not downloaded) and the load should be\n * treated as a retriable failure so the missing files are re-fetched.\n */\nconst IMAGE_PIPELINE_TYPES = new Set([\n \"image-classification\",\n \"image-segmentation\",\n \"object-detection\",\n \"image-to-text\",\n \"image-feature-extraction\",\n \"zero-shot-image-classification\",\n \"depth-estimation\",\n \"mask-generation\",\n]);\n\n/**\n * Error message prefix used when an image pipeline's processor failed to\n * initialize (null processor after load). The prefix is checked in\n * `AiJob.classifyProviderError()` to produce a `RetryableJobError` so the\n * queue re-downloads missing processor config files.\n */\nexport const HFT_NULL_PROCESSOR_PREFIX = \"HFT_NULL_PROCESSOR:\";\n\n/**\n * Clear all cached pipelines\n */\nexport function clearPipelineCache(): void {\n pipelines.clear();\n}\n\nexport function hasCachedPipeline(cacheKey: string): boolean {\n return pipelines.has(cacheKey);\n}\n\nexport function removeCachedPipeline(cacheKey: string): boolean {\n return pipelines.delete(cacheKey);\n}\n\n/** True when running in a browser or Web Worker. Transformers.js only accepts device \"wasm\" or \"webgpu\" in the browser build. */\nfunction isBrowserEnv(): boolean {\n if (typeof globalThis === \"undefined\") return false;\n // Main thread\n if (typeof (globalThis as any).window !== \"undefined\") return true;\n // Web Worker (has self but no window)\n if (typeof (globalThis as any).WorkerGlobalScope !== \"undefined\") return true;\n return false;\n}\n\n/**\n * Generate a cache key for a pipeline that includes all configuration options\n * that affect pipeline creation (model_path, pipeline, dtype, device)\n */\nexport function getPipelineCacheKey(model: HfTransformersOnnxModelConfig): string {\n const dtype = model.provider_config.dtype || \"\";\n const device = model.provider_config.device || \"\";\n const revision = model.provider_config.revision || \"main\";\n return `${model.provider_config.model_path}:${model.provider_config.pipeline}:${dtype}:${device}:${revision}`;\n}\n\n/**\n * Helper function to get a pipeline for a model\n * @param progressScaleMax - Maximum progress value for download phase (100 for download-only, 10 for download+run)\n *\n * Explicit `Promise<any>` return avoids TS2883 (inferred type not portable across package boundaries).\n */\nexport async function getPipeline(\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions = {},\n signal?: AbortSignal,\n progressScaleMax: number = 10\n): Promise<any> {\n const cacheKey = getPipelineCacheKey(model);\n if (pipelines.has(cacheKey)) {\n getLogger().debug(\"HFT pipeline cache hit\", { cacheKey });\n return pipelines.get(cacheKey);\n }\n\n // In-flight: only one load per model at a time to avoid concurrent writes to the same\n // ONNX cache path (which can yield \"Protobuf parsing failed\" when one process reads while another writes).\n const inFlight = pipelineLoadPromises.get(cacheKey);\n if (inFlight) {\n try {\n await inFlight;\n } catch {\n // First load failed (e.g. aborted) — fall through to retry below.\n }\n const cached = pipelines.get(cacheKey);\n if (cached) return cached;\n // Load failed for the other caller; fall through to retry (we remove from map in finally).\n }\n\n const loadPromise = doGetPipeline(\n model,\n onProgress,\n options,\n progressScaleMax,\n cacheKey,\n signal\n ).finally(() => {\n pipelineLoadPromises.delete(cacheKey);\n });\n pipelineLoadPromises.set(cacheKey, loadPromise);\n return loadPromise;\n}\n\nconst doGetPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions,\n progressScaleMax: number,\n cacheKey: string,\n signal?: AbortSignal\n) => {\n // Throttle state for progress events\n let lastProgressTime = 0;\n type FilesByteMap = Record<string, { loaded: number; total: number }>;\n let pendingProgress: {\n progress: number;\n file: string;\n fileProgress: number;\n filesMap?: FilesByteMap;\n } | null = null;\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n const THROTTLE_MS = 160;\n\n const buildProgressDetails = (\n file: string,\n fileProgress: number,\n filesMap?: FilesByteMap\n ): { file: string; progress: number; files?: FilesByteMap } => {\n const details: { file: string; progress: number; files?: FilesByteMap } = {\n file,\n progress: fileProgress,\n };\n if (filesMap && Object.keys(filesMap).length > 0) {\n details.files = filesMap;\n }\n return details;\n };\n\n /**\n * Sends a progress event, throttled to avoid flooding the worker channel.\n * Always sends first event and final (>=progressScaleMax) immediately.\n */\n const sendProgress = (\n progress: number,\n file: string,\n fileProgress: number,\n filesMap?: FilesByteMap\n ): void => {\n const now = Date.now();\n const timeSinceLastEvent = now - lastProgressTime;\n const isFirst = lastProgressTime === 0;\n const isFinal = progress >= progressScaleMax;\n\n if (isFirst || isFinal) {\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n pendingProgress = null;\n onProgress(\n Math.round(progress),\n \"Downloading model\",\n buildProgressDetails(file, fileProgress, filesMap)\n );\n lastProgressTime = now;\n return;\n }\n\n if (timeSinceLastEvent < THROTTLE_MS) {\n pendingProgress = { progress, file, fileProgress, filesMap };\n if (!throttleTimer) {\n const timeRemaining = Math.max(1, THROTTLE_MS - timeSinceLastEvent);\n throttleTimer = setTimeout(() => {\n throttleTimer = null;\n if (pendingProgress) {\n const p = pendingProgress;\n onProgress(\n Math.round(p.progress),\n \"Downloading model\",\n buildProgressDetails(p.file, p.fileProgress, p.filesMap)\n );\n lastProgressTime = Date.now();\n pendingProgress = null;\n }\n }, timeRemaining);\n }\n return;\n }\n\n onProgress(\n Math.round(progress),\n \"Downloading model\",\n buildProgressDetails(file, fileProgress, filesMap)\n );\n lastProgressTime = now;\n pendingProgress = null;\n };\n\n // Get the abort signal from the signal parameter\n const abortSignal = signal;\n\n // Register a per-model AbortController so abortableFetch can cancel in-flight fetches\n const modelPath = model.provider_config.model_path;\n const modelController = new AbortController();\n modelAbortControllers.set(modelPath, modelController);\n if (abortSignal) {\n if (abortSignal.aborted) {\n modelController.abort();\n } else {\n abortSignal.addEventListener(\"abort\", () => modelController.abort(), { once: true });\n }\n }\n\n // Use aggregate progress_total event from @huggingface/transformers v4 pipeline()\n const progressCallback = (status: ProgressInfo) => {\n if (abortSignal?.aborted) return;\n\n if (status.status === \"progress_total\") {\n const totalStatus = status;\n const scaledProgress = (totalStatus.progress * progressScaleMax) / 100;\n\n // Find the currently active file (one still downloading)\n let activeFile = \"\";\n let activeFileProgress = 0;\n const files: Record<string, { loaded: number; total: number }> | undefined =\n totalStatus.files;\n if (files) {\n for (const [file, info] of Object.entries(files)) {\n if (info.loaded < info.total) {\n activeFile = file;\n activeFileProgress = info.total > 0 ? (info.loaded / info.total) * 100 : 0;\n break;\n }\n }\n if (!activeFile) {\n const fileNames = Object.keys(files);\n if (fileNames.length > 0) {\n activeFile = fileNames[fileNames.length - 1];\n activeFileProgress = 100;\n }\n }\n }\n\n sendProgress(scaledProgress, activeFile, activeFileProgress, files);\n }\n };\n\n let device = model.provider_config.device as string | undefined;\n if (isBrowserEnv()) {\n // we must make a choice for the device in the browser\n if (device === \"gpu\") {\n device = \"webgpu\";\n }\n if (device === \"cpu\") {\n device = \"wasm\";\n }\n if (device !== \"wasm\" && device !== \"webgpu\") {\n device = \"wasm\";\n }\n } else {\n // we can trust the lib to make a choice for the device on the server\n if (device === \"wasm\" || device === \"webgpu\") {\n device = undefined;\n }\n }\n\n const dtype = model.provider_config.dtype || \"\";\n const pipelineOptions: PretrainedModelOptions = {\n revision: model.provider_config.revision || \"main\",\n ...(model.provider_config.use_external_data_format\n ? { useExternalDataFormat: model.provider_config.use_external_data_format }\n : {}),\n ...(dtype ? { dtype: dtype as any } : {}),\n ...(device ? { device: device as any } : {}),\n ...options,\n progress_callback: progressCallback,\n };\n\n // Check if already aborted before starting\n if (abortSignal?.aborted) {\n modelAbortControllers.delete(modelPath);\n throw new Error(\"Operation aborted before pipeline creation\");\n }\n\n const pipelineType = model.provider_config.pipeline;\n\n const { pipeline } = await loadTransformersSDK();\n\n const logger = getLogger();\n const pipelineTimerLabel = `hft:pipeline:${cacheKey}`;\n logger.time(pipelineTimerLabel, { pipelineType, modelPath });\n\n try {\n const result = await pipeline(pipelineType, model.provider_config.model_path, pipelineOptions);\n\n // Flush pending throttled progress and clean up timer\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n // pendingProgress may have been set by progressCallback during the pipeline() await\n const finalPending = pendingProgress as {\n progress: number;\n file: string;\n fileProgress: number;\n filesMap?: FilesByteMap;\n } | null;\n if (finalPending) {\n onProgress(\n Math.round(finalPending.progress),\n \"Downloading model\",\n buildProgressDetails(finalPending.file, finalPending.fileProgress, finalPending.filesMap)\n );\n pendingProgress = null;\n }\n\n // Check if aborted after pipeline creation\n if (abortSignal?.aborted) {\n logger.timeEnd(pipelineTimerLabel, { status: \"aborted\" });\n throw new Error(\"Operation aborted after pipeline creation\");\n }\n\n // For image/vision pipelines the processor must be initialized. A null processor\n // means the model cache is incomplete (e.g. preprocessor_config.json was not\n // downloaded, likely because a previous download was aborted). Throw a specific\n // error so the job queue can retry and re-fetch the missing files.\n if (IMAGE_PIPELINE_TYPES.has(pipelineType) && (result as any).processor == null) {\n throw new Error(\n `${HFT_NULL_PROCESSOR_PREFIX} Image processor not initialized for ` +\n `${pipelineType}/${modelPath}. Model cache may be incomplete.`\n );\n }\n\n logger.timeEnd(pipelineTimerLabel, { status: \"loaded\" });\n pipelines.set(cacheKey, result);\n return result;\n } catch (error: any) {\n logger.timeEnd(pipelineTimerLabel, { status: \"error\", error: String(error) });\n // If aborted, throw a clean abort error rather than internal stream errors.\n // Preserve processor-initialization errors so they propagate with their original message.\n if (\n !error?.message?.startsWith(HFT_NULL_PROCESSOR_PREFIX) &&\n (abortSignal?.aborted || modelController.signal.aborted)\n ) {\n throw new Error(\"Pipeline download aborted\");\n }\n throw error;\n } finally {\n modelAbortControllers.delete(modelPath);\n const { random } = await loadTransformersSDK();\n random.seed(model.provider_config.seed ?? undefined);\n }\n};\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const HF_TRANSFORMERS_ONNX = \"HF_TRANSFORMERS_ONNX\";\n/** Job queue for WebGPU/GPU/Metal HFT models (serialized, concurrency 1). */\nexport const HF_TRANSFORMERS_ONNX_GPU = `${HF_TRANSFORMERS_ONNX}_gpu`;\n/** Job queue for WASM/CPU HFT models. */\nexport const HF_TRANSFORMERS_ONNX_CPU = `${HF_TRANSFORMERS_ONNX}_cpu`;\nexport const HTF_CACHE_NAME = \"transformers-cache\";\n\nexport type QuantizationDataType =\n | \"auto\" // Auto-detect based on environment\n | \"fp32\"\n | \"fp16\"\n | \"q8\"\n | \"int8\"\n | \"uint8\"\n | \"q4\"\n | \"bnb4\"\n | \"q4f16\"; // fp16 model with int4 block weight quantization\n\nexport const QuantizationDataType = {\n auto: \"auto\",\n fp32: \"fp32\",\n fp16: \"fp16\",\n q8: \"q8\",\n int8: \"int8\",\n uint8: \"uint8\",\n q4: \"q4\",\n bnb4: \"bnb4\",\n q4f16: \"q4f16\",\n} as const satisfies Record<QuantizationDataType, QuantizationDataType>;\n\ntype TextPipelineUseCase =\n | \"fill-mask\" // https://huggingface.co/tasks/fill-mask\n | \"token-classification\" // https://huggingface.co/tasks/token-classification\n | \"text-generation\" // https://huggingface.co/tasks/text-generation#completion-generation-models\n | \"text2text-generation\" // https://huggingface.co/tasks/text-generation#text-to-text-generation-models\n | \"text-classification\" // https://huggingface.co/tasks/text-classification\n | \"summarization\" // https://huggingface.co/tasks/sentence-similarity\n | \"translation\" // https://huggingface.co/tasks/translation\n | \"feature-extraction\" // https://huggingface.co/tasks/feature-extraction\n | \"zero-shot-classification\" // https://huggingface.co/tasks/zero-shot-classification\n | \"question-answering\"; // https://huggingface.co/tasks/question-answering\n\nconst TextPipelineUseCase = {\n \"fill-mask\": \"fill-mask\",\n \"token-classification\": \"token-classification\",\n \"text-generation\": \"text-generation\",\n \"text2text-generation\": \"text2text-generation\",\n \"text-classification\": \"text-classification\",\n summarization: \"summarization\",\n translation: \"translation\",\n \"feature-extraction\": \"feature-extraction\",\n \"zero-shot-classification\": \"zero-shot-classification\",\n \"question-answering\": \"question-answering\",\n} as const satisfies Record<TextPipelineUseCase, TextPipelineUseCase>;\n\ntype VisionPipelineUseCase =\n | \"background-removal\" // https://huggingface.co/tasks/image-segmentation#background-removal\n | \"image-segmentation\" // https://huggingface.co/tasks/image-segmentation\n | \"depth-estimation\" // https://huggingface.co/tasks/depth-estimation\n | \"image-classification\" // https://huggingface.co/tasks/image-classification\n | \"image-to-image\" // https://huggingface.co/tasks/image-to-image\n // | \"text-to-image\" // https://huggingface.co/tasks/text-to-image\n | \"image-to-text\" // https://huggingface.co/tasks/image-to-text\n // | \"image-text-to-text\" // https://huggingface.co/tasks/image-text-to-text\n | \"object-detection\" // https://huggingface.co/tasks/object-detection\n | \"image-feature-extraction\"; // https://huggingface.co/tasks/image-feature-extraction\n\nconst VisionPipelineUseCase = {\n \"background-removal\": \"background-removal\",\n \"image-segmentation\": \"image-segmentation\",\n \"depth-estimation\": \"depth-estimation\",\n \"image-classification\": \"image-classification\",\n \"image-to-image\": \"image-to-image\",\n // \"text-to-image\": \"text-to-image\",\n \"image-to-text\": \"image-to-text\",\n // \"image-text-to-text\": \"image-text-to-text\",\n \"object-detection\": \"object-detection\",\n \"image-feature-extraction\": \"image-feature-extraction\",\n} as const satisfies Record<VisionPipelineUseCase, VisionPipelineUseCase>;\n\ntype AudioPipelineUseCase =\n | \"audio-classification\" // https://huggingface.co/tasks/audio-classification\n | \"automatic-speech-recognition\" // https://huggingface.co/tasks/automatic-speech-recognition\n | \"text-to-speech\"; // https://huggingface.co/tasks/text-to-speech\n\nconst AudioPipelineUseCase = {\n \"audio-classification\": \"audio-classification\",\n \"automatic-speech-recognition\": \"automatic-speech-recognition\",\n \"text-to-speech\": \"text-to-speech\",\n} as const satisfies Record<AudioPipelineUseCase, AudioPipelineUseCase>;\n\ntype MultimodalPipelineUseCase =\n | \"document-question-answering\" // https://huggingface.co/tasks/document-question-answering\n | \"image-to-text\" // https://huggingface.co/tasks/image-to-text\n | \"zero-shot-audio-classification\" // https://huggingface.co/tasks/zero-shot-audio-classification\n | \"zero-shot-image-classification\" // https://huggingface.co/tasks/zero-shot-image-classification\n | \"zero-shot-object-detection\"; // https://huggingface.co/tasks/zero-shot-object-detection\n\nconst MultimodalPipelineUseCase = {\n \"document-question-answering\": \"document-question-answering\",\n \"image-to-text\": \"image-to-text\",\n \"zero-shot-audio-classification\": \"zero-shot-audio-classification\",\n \"zero-shot-image-classification\": \"zero-shot-image-classification\",\n \"zero-shot-object-detection\": \"zero-shot-object-detection\",\n} as const satisfies Record<MultimodalPipelineUseCase, MultimodalPipelineUseCase>;\n\nexport type PipelineUseCase =\n | TextPipelineUseCase\n | VisionPipelineUseCase\n | AudioPipelineUseCase\n | MultimodalPipelineUseCase;\n\nexport const PipelineUseCase = {\n ...TextPipelineUseCase,\n ...VisionPipelineUseCase,\n ...AudioPipelineUseCase,\n ...MultimodalPipelineUseCase,\n} as const satisfies Record<PipelineUseCase, PipelineUseCase>;\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai/worker\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util/worker\";\nimport { HF_TRANSFORMERS_ONNX, PipelineUseCase, QuantizationDataType } from \"./HFT_Constants\";\n\nexport const HfTransformersOnnxModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: HF_TRANSFORMERS_ONNX,\n description: \"Discriminator: ONNX runtime backend.\",\n },\n provider_config: {\n type: \"object\",\n description: \"ONNX runtime-specific options.\",\n properties: {\n pipeline: {\n type: \"string\",\n enum: Object.values(PipelineUseCase),\n description: \"Pipeline type for the ONNX model.\",\n default: \"text-generation\",\n },\n model_path: {\n type: \"string\",\n description: \"Filesystem path or URI for the ONNX model.\",\n },\n revision: {\n type: \"string\",\n description: \"Git revision (branch, tag, or commit hash) of the model repository.\",\n default: \"main\",\n },\n dtype: {\n type: \"string\",\n enum: Object.values(QuantizationDataType),\n description: \"Data type for the ONNX model.\",\n default: \"auto\",\n },\n device: {\n type: \"string\",\n enum: [\"cpu\", \"gpu\", \"webgpu\", \"wasm\", \"metal\"],\n description: \"High-level device selection.\",\n default: \"webgpu\",\n },\n execution_providers: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Raw ONNX Runtime execution provider identifiers.\",\n \"x-ui-hidden\": true,\n },\n intra_op_num_threads: {\n type: \"integer\",\n minimum: 1,\n },\n inter_op_num_threads: {\n type: \"integer\",\n minimum: 1,\n },\n use_external_data_format: {\n type: \"boolean\",\n description: \"Whether the model uses external data format.\",\n },\n native_dimensions: {\n type: \"integer\",\n description: \"The native dimensions of the model.\",\n },\n pooling: {\n type: \"string\",\n enum: [\"mean\", \"last_token\", \"cls\"],\n description: \"The pooling strategy to use for the model.\",\n default: \"mean\",\n },\n normalize: {\n type: \"boolean\",\n description: \"Whether the model uses normalization.\",\n default: true,\n },\n language_style: {\n type: \"string\",\n description: \"The language style of the model.\",\n },\n seed: {\n type: \"integer\",\n description:\n \"RNG seed passed to transformers.js sampling. Omit for time-based seeding; set for reproducible generation.\",\n minimum: 0,\n },\n mrl: {\n type: \"boolean\",\n description: \"Whether the model uses matryoshka.\",\n default: false,\n },\n },\n required: [\"model_path\", \"pipeline\"],\n additionalProperties: false,\n if: {\n properties: {\n pipeline: {\n const: \"feature-extraction\",\n },\n },\n },\n then: {\n required: [\"native_dimensions\"],\n },\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const HfTransformersOnnxModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelRecord = FromSchema<typeof HfTransformersOnnxModelRecordSchema>;\n\nexport const HfTransformersOnnxModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelConfig = FromSchema<typeof HfTransformersOnnxModelConfigSchema>;\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const ONNX_QUANTIZATION_SUFFIX_MAPPING = {\n fp32: \"\",\n fp16: \"_fp16\",\n int8: \"_int8\",\n uint8: \"_uint8\",\n q8: \"_quantized\",\n q4: \"_q4\",\n q4f16: \"_q4f16\",\n bnb4: \"_bnb4\",\n} as const;\n\nexport type OnnxQuantization = keyof typeof ONNX_QUANTIZATION_SUFFIX_MAPPING;\n\nconst SUFFIXES_LONGEST_FIRST = (\n Object.entries(ONNX_QUANTIZATION_SUFFIX_MAPPING) as [OnnxQuantization, string][]\n)\n .filter(([, suffix]) => suffix !== \"\")\n .sort((a, b) => b[1].length - a[1].length);\n\nexport function parseOnnxQuantizations(params: {\n /** File paths, e.g. from listModels/modelInfo with additionalFields: [\"filePaths\"] */\n filePaths: string[];\n /** Subdirectory containing ONNX files. @default \"onnx\" */\n subfolder?: string;\n}): OnnxQuantization[] {\n const subfolder = params.subfolder ?? \"onnx\";\n const prefix = subfolder + \"/\";\n\n const stems: string[] = [];\n for (const fp of params.filePaths) {\n if (!fp.startsWith(prefix)) continue;\n if (!fp.endsWith(\".onnx\")) continue;\n if (fp.endsWith(\".onnx_data\")) continue;\n stems.push(fp.slice(prefix.length, -\".onnx\".length));\n }\n\n if (stems.length === 0) return [];\n\n const parsed: Array<{ baseName: string; dtype: OnnxQuantization }> = [];\n for (const stem of stems) {\n let matched = false;\n for (const [dtype, suffix] of SUFFIXES_LONGEST_FIRST) {\n if (stem.endsWith(suffix)) {\n parsed.push({ baseName: stem.slice(0, -suffix.length), dtype });\n matched = true;\n break;\n }\n }\n if (!matched) {\n parsed.push({ baseName: stem, dtype: \"fp32\" });\n }\n }\n\n const allBaseNames = new Set(parsed.map((p) => p.baseName));\n const byDtype = new Map<OnnxQuantization, Set<string>>();\n for (const { baseName, dtype } of parsed) {\n let set = byDtype.get(dtype);\n if (!set) {\n set = new Set();\n byDtype.set(dtype, set);\n }\n set.add(baseName);\n }\n\n const allDtypes = Object.keys(ONNX_QUANTIZATION_SUFFIX_MAPPING) as OnnxQuantization[];\n return allDtypes.filter((dtype) => {\n const set = byDtype.get(dtype);\n return set !== undefined && set.size === allBaseNames.size;\n });\n}\n",
|
|
9
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * State machine that filters `<tool_call>…</tool_call>` markup out of a\n * stream of text-delta tokens. Tokens that are clearly outside markup are\n * flushed immediately; tokens that *might* be the start of a tag are held\n * in a lookahead buffer until they can be disambiguated.\n *\n * This only handles the XML-tag pattern. Bare-JSON tool calls cannot be\n * reliably detected token-by-token and are still cleaned up via the\n * post-hoc `parseToolCallsFromText` pass on the finish event.\n */\nexport function createToolCallMarkupFilter(emit: (text: string) => void) {\n const OPEN_TAG = \"<tool_call>\";\n const CLOSE_TAG = \"</tool_call>\";\n\n /** \"text\" = normal output, \"tag\" = inside a tool_call block */\n let state: \"text\" | \"tag\" = \"text\";\n /** Buffered text that might be a partial tag prefix */\n let pending = \"\";\n\n function feed(token: string) {\n if (state === \"tag\") {\n // Inside a tool_call block — suppress everything until we see the close tag\n pending += token;\n const closeIdx = pending.indexOf(CLOSE_TAG);\n if (closeIdx !== -1) {\n // End of the tool_call block; resume normal output after the close tag\n const afterClose = pending.slice(closeIdx + CLOSE_TAG.length);\n pending = \"\";\n state = \"text\";\n if (afterClose.length > 0) {\n feed(afterClose);\n }\n }\n // else: still inside the tag block, keep suppressing\n return;\n }\n\n // state === \"text\"\n const combined = pending + token;\n\n // Check for a complete open tag\n const openIdx = combined.indexOf(OPEN_TAG);\n if (openIdx !== -1) {\n // Emit everything before the tag\n const before = combined.slice(0, openIdx);\n if (before.length > 0) {\n emit(before);\n }\n // Switch to tag state; feed the remainder (after the open tag) back through\n pending = \"\";\n state = \"tag\";\n const afterOpen = combined.slice(openIdx + OPEN_TAG.length);\n if (afterOpen.length > 0) {\n feed(afterOpen);\n }\n return;\n }\n\n // Check if the tail of `combined` could be the start of \"<tool_call>\"\n // e.g. combined ends with \"<\", \"<t\", \"<to\", ..., \"<tool_call\"\n let prefixLen = 0;\n for (let len = Math.min(combined.length, OPEN_TAG.length - 1); len >= 1; len--) {\n if (combined.endsWith(OPEN_TAG.slice(0, len))) {\n prefixLen = len;\n break;\n }\n }\n\n if (prefixLen > 0) {\n // The tail is ambiguous — hold it back, flush the rest\n const safe = combined.slice(0, combined.length - prefixLen);\n if (safe.length > 0) {\n emit(safe);\n }\n pending = combined.slice(combined.length - prefixLen);\n } else {\n // No ambiguity — flush everything\n if (combined.length > 0) {\n emit(combined);\n }\n pending = \"\";\n }\n }\n\n /** Flush any remaining buffered text (called when the stream ends). */\n function flush() {\n if (pending.length > 0 && state === \"text\") {\n emit(pending);\n pending = \"\";\n }\n // If state === \"tag\", the pending content is suppressed tool-call markup\n pending = \"\";\n state = \"text\";\n }\n\n return { feed, flush };\n}\n",
|
|
9
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport async function clearHftInlinePipelineCache(): Promise<void> {\n const { clearPipelineCache } = await import(\"./HFT_Pipeline\");\n clearPipelineCache();\n}\n",
|
|
10
11
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Mapping from app task types to HuggingFace pipeline names.\n * Each task type maps to one or more pipelines (first is primary).\n */\nconst TASK_TO_PIPELINES: Record<string, string[]> = {\n TextEmbeddingTask: [\"feature-extraction\"],\n TextGenerationTask: [\"text-generation\"],\n TextSummaryTask: [\"sentence-similarity\", \"summarization\"],\n TextTranslationTask: [\"translation\"],\n TextClassificationTask: [\"text-classification\", \"zero-shot-classification\"],\n TextQuestionAnswerTask: [\"question-answering\"],\n TextFillMaskTask: [\"fill-mask\"],\n TextLanguageDetectionTask: [\"text-classification\"],\n TextNamedEntityRecognitionTask: [\"token-classification\"],\n TokenClassificationTask: [\"token-classification\"],\n ImageClassificationTask: [\"image-classification\", \"zero-shot-image-classification\"],\n ImageEmbeddingTask: [\"image-feature-extraction\"],\n ImageSegmentationTask: [\"image-segmentation\"],\n ImageToImageTask: [\"image-to-image\"],\n ImageToTextTask: [\"image-to-text\"],\n ObjectDetectionTask: [\"object-detection\", \"zero-shot-object-detection\"],\n DepthEstimationTask: [\"depth-estimation\"],\n AudioClassificationTask: [\"audio-classification\"],\n SpeechRecognitionTask: [\"automatic-speech-recognition\"],\n};\n\n/** Convert an app task type to its primary HuggingFace pipeline name. */\nexport function taskTypeToPipeline(taskType: string): string | undefined {\n return TASK_TO_PIPELINES[taskType]?.[0];\n}\n\n/** Convert an app task type to all matching HuggingFace pipeline names. */\nexport function taskTypeToPipelines(taskType: string): string[] {\n return TASK_TO_PIPELINES[taskType] ?? [];\n}\n\n/** Reverse lookup: given a HuggingFace pipeline name, return all matching app task types. */\nexport function pipelineToTaskTypes(pipeline: string): string[] {\n return Object.entries(TASK_TO_PIPELINES)\n .filter(([, pipelines]) => pipelines.includes(pipeline))\n .map(([task]) => task);\n}\n",
|
|
11
12
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ModelSearchResultItem } from \"@workglow/ai\";\nimport { pipelineToTaskTypes } from \"./PipelineTaskMapping\";\n\nexport interface HfModelEntry {\n id: string;\n modelId: string;\n pipeline_tag?: string;\n library_name?: string;\n likes: number;\n downloads: number;\n tags?: string[];\n siblings?: Array<{ rfilename: string }>;\n}\n\nconst HF_API_BASE = \"https://huggingface.co/api\";\n\nexport function formatDownloads(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\n/**\n * Map an HF model entry to a provider-specific config object.\n */\nexport function mapHfProviderConfig(\n entry: HfModelEntry,\n provider: string\n): Record<string, unknown> {\n switch (provider) {\n case \"HF_TRANSFORMERS_ONNX\":\n return {\n model_path: entry.id,\n ...(entry.pipeline_tag ? { pipeline: entry.pipeline_tag } : {}),\n };\n case \"LOCAL_LLAMACPP\":\n return { model_path: entry.id };\n default:\n return { model_name: entry.id };\n }\n}\n\n/**\n * Map an HF model entry to a ModelSearchResultItem.\n */\nexport function mapHfModelResult(entry: HfModelEntry, provider: string): ModelSearchResultItem {\n const badges = [entry.pipeline_tag, entry.library_name].filter(Boolean).join(\" | \");\n return {\n id: entry.id,\n label: `${entry.id}${badges ? ` ${badges}` : \"\"}`,\n description: `${formatDownloads(entry.downloads)} downloads`,\n record: {\n model_id: entry.id,\n provider,\n title: entry.id.split(\"/\").pop() ?? entry.id,\n description: [entry.pipeline_tag, `${formatDownloads(entry.downloads)} downloads`]\n .filter(Boolean)\n .join(\" \\u2014 \"),\n tasks: entry.pipeline_tag ? pipelineToTaskTypes(entry.pipeline_tag) : [],\n provider_config: mapHfProviderConfig(entry, provider),\n metadata: {},\n },\n raw: entry,\n };\n}\n\n/**\n * Search HuggingFace models API. Returns all results (limit=500, no pagination).\n * An empty `query` lists top models by sort order (no text filter).\n */\nexport async function searchHfModels(\n query: string,\n extraParams?: Record<string, string>,\n expandFields?: string[],\n signal?: AbortSignal\n): Promise<HfModelEntry[]> {\n const params = new URLSearchParams({\n search: query,\n limit: \"500\",\n sort: \"downloads\",\n direction: \"-1\",\n ...extraParams,\n });\n params.append(\"expand[]\", \"pipeline_tag\");\n if (expandFields) {\n for (const field of expandFields) {\n params.append(\"expand[]\", field);\n }\n }\n const res = await fetch(`${HF_API_BASE}/models?${params}`, { signal });\n if (!res.ok) throw new Error(`HuggingFace API returned ${res.status}`);\n return res.json();\n}\n",
|
|
@@ -14,34 +15,36 @@
|
|
|
14
15
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { BackgroundRemovalPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n BackgroundRemovalTaskInput,\n BackgroundRemovalTaskOutput,\n} from \"@workglow/ai\";\nimport { imageToBase64 } from \"./HFT_ImageHelpers\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for background removal using Hugging Face Transformers.\n */\nexport const HFT_BackgroundRemoval: AiProviderRunFn<\n BackgroundRemovalTaskInput,\n BackgroundRemovalTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const remover: BackgroundRemovalPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result = await remover(input.image as string);\n\n const resultImage = Array.isArray(result) ? result[0] : result;\n\n return {\n image: imageToBase64(resultImage),\n };\n};\n",
|
|
15
16
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { loadTransformersSDK } from \"./HFT_Pipeline\";\n\nexport const HFT_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, _signal) => {\n const { AutoTokenizer } = await loadTransformersSDK();\n const tokenizer = await AutoTokenizer.from_pretrained(model!.provider_config.model_path, {\n progress_callback: (progress: any) => onProgress(progress?.progress ?? 0),\n });\n\n // encode() returns number[] of token IDs for a single input string\n const tokenIds = tokenizer.encode(input.text);\n return { count: tokenIds.length };\n};\n\nexport const HFT_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, _output, model) => {\n return HFT_CountTokens(input, model, () => {}, new AbortController().signal);\n};\n",
|
|
16
17
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for downloading and caching a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Download: AiProviderRunFn<\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:Download:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n // Download the model by creating a pipeline\n // Use 100 as progressScaleMax since this is download-only (0-100%)\n await getPipeline(model!, onProgress, {}, signal, 100);\n\n logger.timeEnd(timerLabel, { model: model?.provider_config.model_path });\n return {\n model: input.model!,\n };\n};\n",
|
|
17
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ImageClassificationPipeline,\n ZeroShotImageClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for image classification using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot classification.\n */\nexport const HFT_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-image-classification\") {\n if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {\n console.warn(\"Zero-shot image classification requires categories\", input);\n throw new Error(\"Zero-shot image classification requires categories\");\n }\n const zeroShotClassifier: ZeroShotImageClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(\n input.image as string,\n input.categories! as string[],\n {}\n );\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n }\n\n const classifier: ImageClassificationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const result: any = await classifier(input.image as string, {\n top_k:
|
|
18
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ImageClassificationPipeline,\n ZeroShotImageClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for image classification using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot classification.\n */\nexport const HFT_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-image-classification\") {\n if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {\n console.warn(\"Zero-shot image classification requires categories\", input);\n throw new Error(\"Zero-shot image classification requires categories\");\n }\n const zeroShotClassifier: ZeroShotImageClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(\n input.image as string,\n input.categories! as string[],\n {}\n );\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n }\n\n const classifier: ImageClassificationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const result: any = await classifier(input.image as string, {\n top_k: input.maxCategories,\n });\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n};\n",
|
|
18
19
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageFeatureExtractionPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ImageEmbeddingTaskInput,\n ImageEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport { getLogger, TypedArray } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for image embedding using Hugging Face Transformers.\n */\nexport const HFT_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskInput,\n ImageEmbeddingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:ImageEmbedding:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const embedder: ImageFeatureExtractionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n logger.debug(\"HFT ImageEmbedding: pipeline ready, generating embedding\", {\n model: model?.provider_config.model_path,\n });\n\n if (Array.isArray(input.image)) {\n const vectors: TypedArray[] = [];\n for (const image of input.image) {\n const result: any = await embedder(image as string);\n vectors.push(result.data as TypedArray);\n }\n logger.timeEnd(timerLabel, { count: vectors.length });\n return { vector: vectors } as ImageEmbeddingTaskOutput;\n }\n\n const result: any = await embedder(input.image as string);\n\n logger.timeEnd(timerLabel, { dimensions: result?.data?.length });\n return {\n vector: result.data as TypedArray,\n } as ImageEmbeddingTaskOutput;\n};\n",
|
|
19
20
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageSegmentationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ImageSegmentationTaskInput,\n ImageSegmentationTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for image segmentation using Hugging Face Transformers.\n */\nexport const HFT_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskInput,\n ImageSegmentationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const segmenter: ImageSegmentationPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result = await segmenter(input.image as any, {\n threshold: input.threshold,\n mask_threshold: input.maskThreshold,\n });\n\n const masks = Array.isArray(result) ? result : [result];\n\n const processedMasks = await Promise.all(\n masks.map(async (mask) => ({\n label: mask.label || \"\",\n score: mask.score || 0,\n mask: {} as { [x: string]: unknown },\n }))\n );\n\n return {\n masks: processedMasks,\n };\n};\n",
|
|
20
21
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ImageToTextPipeline } from \"@huggingface/transformers\";\nimport type { AiProviderRunFn, ImageToTextTaskInput, ImageToTextTaskOutput } from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for image to text using Hugging Face Transformers.\n */\nexport const HFT_ImageToText: AiProviderRunFn<\n ImageToTextTaskInput,\n ImageToTextTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const captioner: ImageToTextPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result: any = await captioner(input.image as string, {\n max_new_tokens: input.maxTokens,\n });\n\n const text = Array.isArray(result) ? result[0]?.generated_text : result?.generated_text;\n\n return {\n text: text || \"\",\n };\n};\n",
|
|
21
22
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DeviceType } from \"@huggingface/transformers\";\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { parseOnnxQuantizations } from \"./HFT_OnnxDtypes\";\nimport { getPipelineCacheKey, hasCachedPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\n\nexport const HFT_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model) => {\n const logger = getLogger();\n const { ModelRegistry } = await loadTransformersSDK();\n const timerLabel = `hft:ModelInfo:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const detail = input.detail;\n const is_loaded = hasCachedPipeline(getPipelineCacheKey(model!));\n\n const { pipeline: pipelineType, model_path, dtype, device } = model!.provider_config;\n\n const cacheOptions = {\n ...(dtype ? { dtype } : {}),\n ...(device ? { device: device as DeviceType } : {}),\n };\n const cacheStatus = await ModelRegistry.is_pipeline_cached_files(\n pipelineType,\n model_path,\n cacheOptions\n );\n logger.debug(\"is_pipeline_cached\", {\n input: [pipelineType, model_path, cacheOptions],\n result: cacheStatus,\n });\n const is_cached = is_loaded || cacheStatus.allCached;\n\n // Build file_sizes based on requested detail level\n let file_sizes: Record<string, number> | null = null;\n if (detail === \"files\" && cacheStatus.files.length > 0) {\n // Return file names with zero sizes (no network calls)\n const sizes: Record<string, number> = {};\n for (const { file } of cacheStatus.files) {\n sizes[file] = 0;\n }\n file_sizes = sizes;\n } else if (detail === \"files_with_metadata\" && cacheStatus.files.length > 0) {\n // Full metadata fetch per file (N network calls)\n const sizes: Record<string, number> = {};\n await Promise.all(\n cacheStatus.files.map(async ({ file }) => {\n const metadata = await ModelRegistry.get_file_metadata(model_path, file);\n if (metadata.exists && metadata.size !== undefined) {\n sizes[file] = metadata.size;\n }\n })\n );\n if (Object.keys(sizes).length > 0) {\n file_sizes = sizes;\n }\n }\n\n // Parse ONNX quantizations from file list\n let quantizations: string[] | undefined;\n if (cacheStatus.files.length > 0) {\n const filePaths = cacheStatus.files.map((f) => f.file);\n const quantizations_parsed = parseOnnxQuantizations({ filePaths });\n if (quantizations_parsed.length > 0) {\n quantizations = quantizations_parsed;\n }\n }\n\n logger.timeEnd(timerLabel, { model: model?.provider_config.model_path });\n\n return {\n model: input.model,\n is_local: true,\n is_remote: false,\n supports_browser: true,\n supports_node: true,\n is_cached,\n is_loaded,\n file_sizes,\n ...(quantizations ? { quantizations } : {}),\n };\n};\n",
|
|
22
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ObjectDetectionPipeline,\n ZeroShotObjectDetectionPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for object detection using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot detection.\n */\nexport const HFT_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-object-detection\") {\n if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {\n throw new Error(\"Zero-shot object detection requires labels\");\n }\n const zeroShotDetector: ZeroShotObjectDetectionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotDetector(input.image as string, Array.from(input.labels!), {\n threshold:
|
|
23
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Message,\n TextGenerationOutput,\n TextGenerationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\nimport { extractGeneratedText } from \"./HFT_TextOutput\";\n\nfunction buildStructuredGenerationPrompt(input: StructuredGenerationTaskInput): string {\n const schemaStr = JSON.stringify(input.outputSchema, null, 2);\n return (\n `${input.prompt}\\n\\n` +\n `You MUST respond with ONLY a valid JSON object conforming to this JSON schema:\\n${schemaStr}\\n\\n` +\n `Output ONLY the JSON object, no other text.`\n );\n}\n\nfunction extractJsonFromText(text: string): Record<string, unknown> {\n // Try parsing directly
|
|
23
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ObjectDetectionPipeline,\n ZeroShotObjectDetectionPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for object detection using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot detection.\n */\nexport const HFT_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-object-detection\") {\n if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {\n throw new Error(\"Zero-shot object detection requires labels\");\n }\n const zeroShotDetector: ZeroShotObjectDetectionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotDetector(input.image as string, Array.from(input.labels!), {\n threshold: input.threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n }\n\n const detector: ObjectDetectionPipeline = await getPipeline(model!, onProgress, {}, signal);\n const result: any = await detector(input.image as string, {\n threshold: input.threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n};\n",
|
|
24
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Message,\n TextGenerationOutput,\n TextGenerationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\nimport { extractGeneratedText } from \"./HFT_TextOutput\";\n\nfunction buildStructuredGenerationPrompt(input: StructuredGenerationTaskInput): string {\n const schemaStr = JSON.stringify(input.outputSchema, null, 2);\n return (\n `${input.prompt}\\n\\n` +\n `You MUST respond with ONLY a valid JSON object conforming to this JSON schema:\\n${schemaStr}\\n\\n` +\n `Output ONLY the JSON object, no other text.`\n );\n}\n\n/**\n * Strip thinking blocks (`<think>...</think>`) and HFT special tokens\n * (`<|im_end|>`, `<|end_of_turn|>`, etc.) that thinking models prepend\n * to their actual output.\n */\nfunction stripThinkingAndSpecialTokens(text: string): string {\n return text\n .replace(/<think>[\\s\\S]*?<\\/think>/g, \"\")\n .replace(/<\\|[a-z_]+\\|>/g, \"\")\n .trim();\n}\n\nfunction extractJsonFromText(text: string): Record<string, unknown> {\n // Strip thinking blocks and special tokens first so they don't\n // interfere with JSON extraction (greedy regex would match braces\n // inside thinking content).\n const cleaned = stripThinkingAndSpecialTokens(text);\n\n // Try parsing the cleaned text directly\n try {\n return JSON.parse(cleaned);\n } catch {\n // Try to extract JSON object from the text\n const match = cleaned.match(/\\{[\\s\\S]*\\}/);\n if (match) {\n try {\n return JSON.parse(match[0]);\n } catch {\n return (parsePartialJson(match[0]) as Record<string, unknown>) ?? {};\n }\n }\n return {};\n }\n}\n\nexport const HFT_StructuredGeneration: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const prompt = buildStructuredGenerationPrompt(input);\n\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n\n const formattedPrompt = generateText.tokenizer.apply_chat_template(messages, {\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n\n const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);\n\n let results = await generateText(formattedPrompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n streamer,\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n const responseText = extractGeneratedText(\n (results[0] as TextGenerationOutput[number])?.generated_text\n ).trim();\n\n const object = extractJsonFromText(responseText);\n return { object };\n};\n\nexport const HFT_StructuredGeneration_Stream: AiProviderStreamFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (\n input,\n model,\n signal\n): AsyncIterable<StreamEvent<StructuredGenerationTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const prompt = buildStructuredGenerationPrompt(input);\n\n const messages: Message[] = [{ role: \"user\", content: prompt }];\n\n const formattedPrompt = generateText.tokenizer.apply_chat_template(messages, {\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n\n const queue = createStreamEventQueue<StreamEvent<StructuredGenerationTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);\n\n let fullText = \"\";\n // Incrementally maintain cleaned text to avoid O(n²) full-string regex on every token.\n // Use a simple state machine to skip <think>...</think> blocks and strip special\n // tokens only from the delta received, not from the entire accumulated string.\n let cleanedText = \"\";\n let inThinkBlock = false;\n let jsonStart = -1; // index into cleanedText where the first '{' was found\n\n const originalPush = queue.push;\n queue.push = (event: StreamEvent<StructuredGenerationTaskOutput>) => {\n if (event.type === \"text-delta\" && \"textDelta\" in event) {\n const delta = event.textDelta as string;\n fullText += delta;\n\n // Process the delta through the state machine to update cleanedText\n let remaining = delta;\n while (remaining.length > 0) {\n if (inThinkBlock) {\n const closeIdx = remaining.indexOf(\"</think>\");\n if (closeIdx !== -1) {\n inThinkBlock = false;\n remaining = remaining.slice(closeIdx + \"</think>\".length);\n } else {\n remaining = \"\"; // still inside think block; discard rest of delta\n }\n } else {\n const openIdx = remaining.indexOf(\"<think>\");\n if (openIdx !== -1) {\n cleanedText += remaining.slice(0, openIdx).replace(/<\\|[a-z_]+\\|>/g, \"\");\n inThinkBlock = true;\n remaining = remaining.slice(openIdx + \"<think>\".length);\n } else {\n cleanedText += remaining.replace(/<\\|[a-z_]+\\|>/g, \"\");\n remaining = \"\";\n }\n }\n }\n\n // Locate the start of the JSON object once and reuse that index\n if (jsonStart === -1) {\n jsonStart = cleanedText.indexOf(\"{\");\n }\n if (jsonStart !== -1) {\n const partial = parsePartialJson(cleanedText.slice(jsonStart));\n if (partial !== undefined) {\n originalPush({\n type: \"object-delta\",\n port: \"object\",\n objectDelta: partial,\n } as StreamEvent<StructuredGenerationTaskOutput>);\n return;\n }\n }\n }\n originalPush(event);\n };\n\n const pipelinePromise = generateText(formattedPrompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n streamer,\n }).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n\n const object = extractJsonFromText(fullText);\n yield { type: \"finish\", data: { object } as StructuredGenerationTaskOutput };\n};\n",
|
|
24
25
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { TextStreamer } from \"@huggingface/transformers\";\nimport { TaskAbortedError } from \"@workglow/task-graph\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\n\nexport type StreamEventQueue<T> = {\n push: (event: T) => void;\n done: () => void;\n error: (err: Error) => void;\n iterable: AsyncIterable<T>;\n};\n\nexport function createStreamEventQueue<T>(): StreamEventQueue<T> {\n const buffer: T[] = [];\n let resolve: ((value: IteratorResult<T>) => void) | null = null;\n let finished = false;\n let err: Error | null = null;\n\n const push = (event: T) => {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: event, done: false });\n } else {\n buffer.push(event);\n }\n };\n\n const done = () => {\n finished = true;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as any, done: true });\n }\n };\n\n const error = (e: Error) => {\n err = e;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as any, done: true });\n }\n };\n\n const iterable: AsyncIterable<T> = {\n [Symbol.asyncIterator]() {\n return {\n next(): Promise<IteratorResult<T>> {\n if (err) return Promise.reject(err);\n if (buffer.length > 0) {\n return Promise.resolve({ value: buffer.shift()!, done: false });\n }\n if (finished) {\n return Promise.resolve({ value: undefined as any, done: true });\n }\n return new Promise<IteratorResult<T>>((r) => {\n resolve = r;\n });\n },\n };\n },\n };\n\n return { push, done, error, iterable };\n}\n\n/**\n * Creates a TextStreamer that pushes StreamEvents into an async queue.\n * The pipeline runs to completion and updates the queue; the caller\n * consumes the queue as an AsyncIterable<StreamEvent>.\n */\nexport function createStreamingTextStreamer(\n tokenizer: any,\n queue: StreamEventQueue<StreamEvent<any>>,\n textStreamer: typeof TextStreamer,\n signal?: AbortSignal\n) {\n return new textStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n if (signal?.aborted) {\n throw signal.reason ?? new TaskAbortedError(\"Generation aborted\");\n }\n queue.push({ type: \"text-delta\", port: \"text\", textDelta: text });\n },\n });\n}\n\n/**\n * Create a text streamer for a given tokenizer and update progress function\n */\nexport function createTextStreamer(\n tokenizer: any,\n updateProgress: (progress: number, message?: string, details?: any) => void,\n textStreamer: typeof TextStreamer,\n signal?: AbortSignal\n) {\n let count = 0;\n return new textStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n if (signal?.aborted) {\n throw signal.reason ?? new TaskAbortedError(\"Generation aborted\");\n }\n count++;\n const result = 100 * (1 - Math.exp(-0.05 * count));\n const progress = Math.round(Math.min(result, 100));\n updateProgress(progress, \"Generating\", { text, progress });\n },\n });\n}\n",
|
|
25
26
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Message } from \"@huggingface/transformers\";\n\nexport function extractGeneratedText(generatedText: string | Message[] | undefined): string {\n if (generatedText == null) return \"\";\n if (typeof generatedText === \"string\") return generatedText;\n const lastMessage = generatedText[generatedText.length - 1];\n if (!lastMessage) return \"\";\n const content = lastMessage.content;\n if (typeof content === \"string\") return content;\n for (const part of content) {\n if (part.type === \"text\" && \"text\" in part) {\n return (part as { type: \"text\"; text: string }).text;\n }\n }\n return \"\";\n}\n",
|
|
26
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n TextClassificationOutput,\n TextClassificationPipeline,\n ZeroShotClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\nexport const HFT_TextClassification: AiProviderRunFn<\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-classification\") {\n if (\n !input.candidateLabels ||\n !Array.isArray(input.candidateLabels) ||\n input.candidateLabels.length === 0\n ) {\n throw new Error(\"Zero-shot text classification requires candidate labels\");\n }\n\n const zeroShotClassifier: ZeroShotClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(
|
|
27
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n TextClassificationOutput,\n TextClassificationPipeline,\n ZeroShotClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\nexport const HFT_TextClassification: AiProviderRunFn<\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-classification\") {\n if (\n !input.candidateLabels ||\n !Array.isArray(input.candidateLabels) ||\n input.candidateLabels.length === 0\n ) {\n throw new Error(\"Zero-shot text classification requires candidate labels\");\n }\n\n const zeroShotClassifier: ZeroShotClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(input.text, input.candidateLabels as string[], {});\n\n return {\n categories: result.labels.map((label: string, idx: number) => ({\n label,\n score: result.scores[idx],\n })),\n };\n }\n\n const TextClassification: TextClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result = await TextClassification(input.text, {\n top_k: input.maxCategories || undefined,\n });\n\n const items = Array.isArray(result[0]) ? result[0] : (result as TextClassificationOutput);\n return {\n categories: items.map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n};\n",
|
|
27
28
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { FeatureExtractionPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport { getLogger, TypedArray } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\n/**\n * Core implementation for text embedding using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const uuid = crypto.randomUUID();\n const timerLabel = `hft:TextEmbedding:${model?.provider_config.model_path}:${uuid}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const generateEmbedding: FeatureExtractionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n logger.debug(\"HFT TextEmbedding: pipeline ready, generating embedding\", {\n model: model?.provider_config.model_path,\n inputLength: Array.isArray(input.text) ? input.text.length : input.text?.length,\n });\n\n // Generate the embedding\n const hfVector = await generateEmbedding(input.text, {\n pooling: model?.provider_config.pooling || \"mean\",\n normalize: model?.provider_config.normalize,\n });\n\n const isArrayInput = Array.isArray(input.text);\n const embeddingDim = model?.provider_config.native_dimensions;\n\n // If the input is an array, the tensor will have multiple dimensions (e.g., [10, 384])\n // We need to split it into separate vectors for each input text\n if (isArrayInput && hfVector.dims.length > 1) {\n const [numTexts, vectorDim] = hfVector.dims;\n\n // Validate that the number of texts matches\n if (numTexts !== input.text.length) {\n throw new Error(\n `HuggingFace Embedding tensor batch size does not match input array length: ${numTexts} != ${input.text.length}`\n );\n }\n\n // Validate dimensions\n if (vectorDim !== embeddingDim) {\n throw new Error(\n `HuggingFace Embedding vector dimension does not match model dimensions: ${vectorDim} != ${embeddingDim}`\n );\n }\n\n // Extract each embedding vector using tensor indexing\n // hfVector[i] returns a sub-tensor for the i-th text\n // .slice() is required to create independent TypedArrays with their own ArrayBuffers,\n // because sub-tensor views all share the same backing buffer, which causes DataCloneError\n // when postMessage tries to transfer the same ArrayBuffer multiple times.\n const vectors: TypedArray[] = Array.from({ length: numTexts }, (_, i) =>\n ((hfVector as any)[i].data as TypedArray).slice()\n );\n\n logger.timeEnd(timerLabel, { batchSize: numTexts, dimensions: vectorDim });\n return { vector: vectors };\n }\n\n // Output[number] text input - validate dimensions\n if (hfVector.size !== embeddingDim) {\n logger.timeEnd(timerLabel, { status: \"error\", reason: \"dimension mismatch\" });\n console.warn(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${embeddingDim}`,\n input,\n hfVector\n );\n throw new Error(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${embeddingDim}`\n );\n }\n\n logger.timeEnd(timerLabel, { dimensions: hfVector.size });\n return { vector: hfVector.data as TypedArray };\n};\n",
|
|
28
29
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { FillMaskOutput, FillMaskPipeline } from \"@huggingface/transformers\";\nimport type { AiProviderRunFn, TextFillMaskTaskInput, TextFillMaskTaskOutput } from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\nexport const HFT_TextFillMask: AiProviderRunFn<\n TextFillMaskTaskInput,\n TextFillMaskTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const unmasker: FillMaskPipeline = await getPipeline(model!, onProgress, {}, signal);\n const results = await unmasker(input.text);\n\n let predictions: FillMaskOutput = [];\n if (!Array.isArray(results)) {\n predictions = [results];\n } else {\n predictions = results as FillMaskOutput;\n }\n return {\n predictions: predictions.map((prediction) => ({\n entity: prediction.token_str,\n score: prediction.score,\n sequence: prediction.sequence,\n })),\n };\n};\n",
|
|
29
30
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Message,\n TextGenerationOutput,\n TextGenerationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\nimport { extractGeneratedText } from \"./HFT_TextOutput\";\n\n/**\n * Core implementation for text generation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:TextGeneration:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n logger.debug(\"HFT TextGeneration: pipeline ready, generating text\", {\n model: model?.provider_config.model_path,\n promptLength: input.prompt?.length,\n });\n\n const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);\n\n const messages: Message[] = [{ role: \"user\", content: input.prompt }];\n\n let results = await generateText(messages, {\n streamer,\n do_sample: false,\n max_new_tokens: input.maxTokens ?? 4 * 1024,\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n const text = extractGeneratedText((results[0] as TextGenerationOutput[number])?.generated_text);\n logger.timeEnd(timerLabel, { outputLength: text?.length });\n return {\n text,\n };\n};\n\nexport const HFT_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const queue = createStreamEventQueue<StreamEvent<TextGenerationTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);\n\n const pipelinePromise = generateText(input.prompt, {\n streamer,\n }).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n",
|
|
30
31
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n TextClassificationOutput,\n TextClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n TextLanguageDetectionTaskInput,\n TextLanguageDetectionTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\nexport const HFT_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskInput,\n TextLanguageDetectionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const TextClassification: TextClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result = await TextClassification(input.text, {\n top_k: input.maxLanguages || undefined,\n });\n\n if (Array.isArray(result[0])) {\n return {\n languages: result[0].map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n languages: (result as TextClassificationOutput).map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n};\n",
|
|
31
32
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n TokenClassificationOutput,\n TokenClassificationPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n TextNamedEntityRecognitionTaskInput,\n TextNamedEntityRecognitionTaskOutput,\n} from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline } from \"./HFT_Pipeline\";\n\nexport const HFT_TextNamedEntityRecognition: AiProviderRunFn<\n TextNamedEntityRecognitionTaskInput,\n TextNamedEntityRecognitionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const textNamedEntityRecognition: TokenClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const results = await textNamedEntityRecognition(input.text, {\n ignore_labels: input.blockList as string[] | undefined,\n });\n\n let entities: TokenClassificationOutput = [];\n if (!Array.isArray(results)) {\n entities = [results];\n } else {\n entities = results as TokenClassificationOutput;\n }\n return {\n entities: entities.map((entity) => ({\n entity: entity.entity,\n score: entity.score,\n word: entity.word,\n })),\n };\n};\n",
|
|
32
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n DocumentQuestionAnsweringOutput,\n QuestionAnsweringPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for question answering using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextQuestionAnswer: AiProviderRunFn<\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Get the question answering pipeline\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await generateAnswer(
|
|
33
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n DocumentQuestionAnsweringOutput,\n QuestionAnsweringPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for question answering using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextQuestionAnswer: AiProviderRunFn<\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Get the question answering pipeline\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await generateAnswer(input.question, input.context, {\n streamer,\n } as any);\n\n let answerText = \"\";\n if (Array.isArray(result)) {\n answerText = (result[0] as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n } else {\n answerText = (result as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n }\n\n return {\n text: answerText,\n };\n};\n\nexport const HFT_TextQuestionAnswer_Stream: AiProviderStreamFn<\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (\n input,\n model,\n signal\n): AsyncIterable<StreamEvent<TextQuestionAnswerTaskOutput>> {\n const noopProgress = () => {};\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(\n model!,\n noopProgress,\n {},\n signal\n );\n const { TextStreamer } = await loadTransformersSDK();\n\n const queue = createStreamEventQueue<StreamEvent<TextQuestionAnswerTaskOutput>>();\n const streamer = createStreamingTextStreamer(\n generateAnswer.tokenizer,\n queue,\n TextStreamer,\n signal\n );\n\n let pipelineResult:\n | DocumentQuestionAnsweringOutput[number]\n | DocumentQuestionAnsweringOutput\n | undefined;\n const pipelinePromise = generateAnswer(input.question, input.context, {\n streamer,\n } as any).then(\n (result) => {\n pipelineResult = result;\n queue.done();\n },\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n\n let answerText = \"\";\n if (pipelineResult !== undefined) {\n if (Array.isArray(pipelineResult)) {\n answerText = (pipelineResult[0] as DocumentQuestionAnsweringOutput[number])?.answer ?? \"\";\n } else {\n answerText = (pipelineResult as DocumentQuestionAnsweringOutput[number])?.answer ?? \"\";\n }\n }\n yield { type: \"finish\", data: { text: answerText } as TextQuestionAnswerTaskOutput };\n};\n",
|
|
33
34
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { TextGenerationOutput, TextGenerationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\nimport { extractGeneratedText } from \"./HFT_TextOutput\";\n\n/**\n * Core implementation for text rewriting using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);\n\n // This lib doesn't support this kind of rewriting with a separate prompt vs text\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + input.text;\n\n let results = await generateText(promptedText, {\n streamer,\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n const text = extractGeneratedText((results[0] as TextGenerationOutput[number])?.generated_text);\n\n if (text === promptedText) {\n throw new Error(\"Rewriter failed to generate new text\");\n }\n\n return {\n text,\n };\n};\n\nexport const HFT_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const queue = createStreamEventQueue<StreamEvent<TextRewriterTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);\n\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + input.text;\n\n const pipelinePromise = generateText(promptedText, {\n streamer,\n }).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n",
|
|
34
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { SummarizationOutput, SummarizationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for text summarization using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateSummary: SummarizationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(generateSummary.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await generateSummary(
|
|
35
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { TranslationOutput, TranslationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for text translation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextTranslation: AiProviderRunFn<\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const translate: TranslationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(translate.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await translate(
|
|
35
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { SummarizationOutput, SummarizationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for text summarization using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateSummary: SummarizationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(generateSummary.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await generateSummary(input.text, {\n streamer,\n } as any);\n\n let summaryText = \"\";\n if (Array.isArray(result)) {\n summaryText = (result[0] as SummarizationOutput[number])?.summary_text || \"\";\n } else {\n summaryText = (result as SummarizationOutput[number])?.summary_text || \"\";\n }\n\n return {\n text: summaryText,\n };\n};\n\nexport const HFT_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const noopProgress = () => {};\n const generateSummary: SummarizationPipeline = await getPipeline(\n model!,\n noopProgress,\n {},\n signal\n );\n const { TextStreamer } = await loadTransformersSDK();\n\n const queue = createStreamEventQueue<StreamEvent<TextSummaryTaskOutput>>();\n const streamer = createStreamingTextStreamer(\n generateSummary.tokenizer,\n queue,\n TextStreamer,\n signal\n );\n\n const pipelinePromise = generateSummary(input.text, {\n streamer,\n } as any).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n",
|
|
36
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { TranslationOutput, TranslationPipeline } from \"@huggingface/transformers\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\n\n/**\n * Core implementation for text translation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextTranslation: AiProviderRunFn<\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const translate: TranslationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const streamer = createTextStreamer(translate.tokenizer, onProgress, TextStreamer, signal);\n\n const result = await translate(input.text, {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n streamer,\n } as any);\n\n const translatedText = Array.isArray(result)\n ? (result[0] as TranslationOutput[number])?.translation_text || \"\"\n : (result as TranslationOutput[number])?.translation_text || \"\";\n\n return {\n text: translatedText,\n target_lang: input.target_lang,\n };\n};\n\nexport const HFT_TextTranslation_Stream: AiProviderStreamFn<\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextTranslationTaskOutput>> {\n const noopProgress = () => {};\n const translate: TranslationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const queue = createStreamEventQueue<StreamEvent<TextTranslationTaskOutput>>();\n const streamer = createStreamingTextStreamer(translate.tokenizer, queue, TextStreamer, signal);\n\n const pipelinePromise = translate(input.text, {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n streamer,\n } as any).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: { target_lang: input.target_lang } as TextTranslationTaskOutput };\n};\n",
|
|
37
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Tensor, TextGenerationPipeline } from \"@huggingface/transformers\";\nimport {\n buildToolDescription,\n filterValidToolCalls,\n toTextFlatMessages,\n} from \"@workglow/ai/worker\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipeline, loadTransformersSDK } from \"./HFT_Pipeline\";\nimport {\n createStreamEventQueue,\n createStreamingTextStreamer,\n createTextStreamer,\n} from \"./HFT_Streaming\";\nimport { createToolCallMarkupFilter } from \"./HFT_ToolMarkup\";\nimport {\n getAvailableParsers,\n getGenerationPrefix,\n parseToolCalls,\n stripModelArtifacts,\n} from \"../../common/ToolCallParsers\";\n\n// ============================================================================\n// Model detection\n// ============================================================================\n\nfunction getModelTextCandidates(model: HfTransformersOnnxModelConfig): string[] {\n return [model.model_id, model.title, model.description, model.provider_config.model_path]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .map((value) => value.toLowerCase());\n}\n\n/**\n * Detect the parser model family from the HFT model config by checking all\n * text candidates against the known parser families.\n */\nfunction detectModelFamilyFromConfig(model: HfTransformersOnnxModelConfig): string | null {\n const candidates = getModelTextCandidates(model);\n const families = getAvailableParsers();\n for (const candidate of candidates) {\n for (const family of families) {\n if (candidate.includes(family)) {\n return family;\n }\n }\n }\n return null;\n}\n\n// ============================================================================\n// Tool call result adaptation\n// ============================================================================\n\n/**\n * Convert a parser result (using `arguments` field) to the workglow `ToolCalls`\n * type (using `input` field).\n */\nfunction adaptParserResult(result: ReturnType<typeof parseToolCalls>): {\n text: string;\n toolCalls: ToolCalls;\n} {\n return {\n text: stripModelArtifacts(result.content),\n toolCalls: result.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: call.name,\n input: call.arguments as Record<string, unknown>,\n })),\n };\n}\n\nfunction forcedToolSelection(input: ToolCallingTaskInput): string | undefined {\n if (\n typeof input.toolChoice === \"string\" &&\n input.toolChoice !== \"auto\" &&\n input.toolChoice !== \"none\"\n ) {\n if (input.toolChoice !== \"required\") {\n return input.toolChoice;\n }\n }\n if (input.toolChoice === \"required\" && input.tools.length === 1) {\n return input.tools[0]?.name;\n }\n return undefined;\n}\n\nfunction normalizeParsedToolCalls(\n input: ToolCallingTaskInput,\n toolCalls: ToolCallingTaskOutput[\"toolCalls\"]\n) {\n const forcedToolName = forcedToolSelection(input);\n return toolCalls.map((toolCall) =>\n toolCall.name\n ? toolCall\n : {\n ...toolCall,\n name: forcedToolName ?? toolCall.name,\n }\n );\n}\n\n// ============================================================================\n// HFT tool mapping\n// ============================================================================\n\nfunction mapHFTTools(tools: ReadonlyArray<ToolDefinition>) {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n}\n\n/**\n * Resolve the tools list and optionally mutate the messages array based on the toolChoice option.\n */\nfunction resolveHFTToolsAndMessages(\n input: ToolCallingTaskInput,\n messages: Array<{ role: string; content: string }>\n): ReturnType<typeof mapHFTTools> | undefined {\n if (input.toolChoice === \"none\") {\n return undefined;\n }\n\n if (input.toolChoice === \"required\") {\n const requiredInstruction =\n \"You must call at least one tool from the provided tool list when answering.\";\n if (messages.length > 0 && messages[0].role === \"system\") {\n messages[0] = { ...messages[0], content: `${messages[0].content}\\n\\n${requiredInstruction}` };\n } else {\n messages.unshift({ role: \"system\", content: requiredInstruction });\n }\n return mapHFTTools(input.tools);\n }\n\n if (typeof input.toolChoice === \"string\" && input.toolChoice !== \"auto\") {\n const selectedTools = input.tools?.filter(\n (tool: ToolDefinition) => tool.name === input.toolChoice\n );\n const toolsToMap = selectedTools && selectedTools.length > 0 ? selectedTools : input.tools;\n return mapHFTTools(toolsToMap);\n }\n\n return mapHFTTools(input.tools);\n}\n\n// ============================================================================\n// HFT message building\n// ============================================================================\n\n/**\n * Extract text from a content block that may be a string, array of content\n * blocks, or other structure.\n */\nfunction extractMessageText(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (!Array.isArray(content)) {\n return String(content ?? \"\");\n }\n return content\n .filter(\n (block) => block && typeof block === \"object\" && (block as { type?: unknown }).type === \"text\"\n )\n .map((block) => String((block as { text?: unknown }).text ?? \"\"))\n .join(\"\");\n}\n\n/**\n * Try to parse a string as JSON; return the raw string if it's not valid JSON.\n * Used for tool result content which may be a JSON-encoded value.\n */\nfunction parsePossibleToolResponse(content: string): unknown {\n const trimmed = content.trim();\n if (!trimmed) return \"\";\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Fall back to the raw string.\n }\n }\n return content;\n}\n\n/**\n * Build structured messages for HFT's `apply_chat_template`.\n *\n * Unlike `toTextFlatMessages` (which flattens everything to `{role, content}`\n * strings), this preserves tool_calls on assistant messages and the tool name\n * on tool-result messages — both required by HFT chat templates that support\n * tool calling.\n */\nfunction buildHFTMessages(input: ToolCallingTaskInput): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n\n if (input.toolChoice === \"required\") {\n const instruction =\n \"You must call at least one tool from the provided tool list when answering.\";\n if (messages.length > 0 && messages[0].role === \"system\") {\n messages[0] = {\n ...messages[0],\n content: `${messages[0].content as string}\\n\\n${instruction}`,\n };\n } else {\n messages.unshift({ role: \"system\", content: instruction });\n }\n }\n\n const sourceMessages =\n input.messages && input.messages.length > 0\n ? input.messages\n : [{ role: \"user\" as const, content: input.prompt }];\n const toolNamesById = new Map<string, string>();\n\n for (const message of sourceMessages) {\n if (message.role === \"user\") {\n messages.push({ role: \"user\", content: extractMessageText(message.content) });\n continue;\n }\n\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n const text = message.content\n .filter((block): block is { type: \"text\"; text: string } => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n const toolCalls = message.content\n .filter(\n (\n block\n ): block is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n } => block.type === \"tool_use\"\n )\n .map((block) => {\n toolNamesById.set(block.id, block.name);\n return { function: { name: block.name, arguments: block.input } };\n });\n\n if (text || toolCalls.length > 0) {\n const assistantMsg: Record<string, unknown> = { role: \"assistant\" };\n if (text) assistantMsg.content = text;\n if (toolCalls.length > 0) assistantMsg.tool_calls = toolCalls;\n messages.push(assistantMsg);\n }\n continue;\n }\n\n if (message.role === \"tool\" && Array.isArray(message.content)) {\n for (const block of message.content) {\n const toolName = toolNamesById.get(block.tool_use_id);\n if (!toolName) continue;\n messages.push({\n role: \"tool\",\n name: toolName,\n content: parsePossibleToolResponse(extractMessageText(block.content)),\n });\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Select the appropriate tool list based on toolChoice, without mutating messages.\n */\nfunction selectHFTTools(input: ToolCallingTaskInput): ReturnType<typeof mapHFTTools> | undefined {\n if (input.toolChoice === \"none\") return undefined;\n\n if (\n typeof input.toolChoice === \"string\" &&\n input.toolChoice !== \"auto\" &&\n input.toolChoice !== \"required\"\n ) {\n const selected = input.tools.filter((t: ToolDefinition) => t.name === input.toolChoice);\n return mapHFTTools(selected.length > 0 ? selected : input.tools);\n }\n\n return mapHFTTools(input.tools);\n}\n\n// ============================================================================\n// Prompt building\n// ============================================================================\n\n/**\n * Check whether the input has multi-turn tool messages that need structured\n * message format (tool_calls on assistant, name on tool messages).\n */\nfunction hasToolMessages(input: ToolCallingTaskInput): boolean {\n return input.messages?.some((m) => m.role === \"tool\") ?? false;\n}\n\nfunction buildPromptAndPrefix(\n tokenizer: TextGenerationPipeline[\"tokenizer\"],\n input: ToolCallingTaskInput,\n modelFamily: string | null\n): { prompt: string; responsePrefix: string | undefined } {\n let basePrompt: string;\n\n if (hasToolMessages(input)) {\n // Multi-turn with tool results: use structured messages so the tokenizer\n // can format tool_calls and tool responses correctly.\n const messages = buildHFTMessages(input);\n const tools = selectHFTTools(input);\n basePrompt = tokenizer.apply_chat_template(messages as any, {\n tools,\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n } else {\n // Single-turn or no tool results: flat messages work fine.\n const messages = toTextFlatMessages(input);\n const tools = resolveHFTToolsAndMessages(input, messages);\n basePrompt = tokenizer.apply_chat_template(messages, {\n tools,\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n }\n\n const responsePrefix =\n input.toolChoice === \"none\" || hasToolMessages(input)\n ? undefined\n : getGenerationPrefix(modelFamily, forcedToolSelection(input));\n\n return {\n prompt: responsePrefix ? `${basePrompt}${responsePrefix}` : basePrompt,\n responsePrefix,\n };\n}\n\n// ============================================================================\n// Provider run functions\n// ============================================================================\n\nexport const HFT_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n\n const hfTokenizer = generateText.tokenizer;\n const hfModel = generateText.model;\n\n const streamer = createTextStreamer(hfTokenizer, onProgress, TextStreamer, signal);\n const modelFamily = detectModelFamilyFromConfig(model!);\n const { prompt, responsePrefix } = buildPromptAndPrefix(hfTokenizer, input, modelFamily);\n\n const inputs = hfTokenizer(prompt, { return_tensors: \"pt\" }) as { input_ids: Tensor };\n\n const output = (await hfModel.generate({\n ...inputs,\n max_new_tokens: input.maxTokens ?? 1024,\n streamer,\n })) as Tensor;\n const promptLen = inputs.input_ids.dims[1];\n const seqLen = output.dims[1];\n\n const newTokens = output.slice(0, [promptLen, seqLen], null);\n const decoded = hfTokenizer.decode(newTokens, {\n skip_special_tokens: false,\n });\n const parseableText = responsePrefix ? `${responsePrefix}${decoded}` : decoded;\n const { text, toolCalls } = adaptParserResult(\n parseToolCalls(parseableText, { parser: modelFamily })\n );\n return {\n text,\n toolCalls: filterValidToolCalls(normalizeParsedToolCalls(input, toolCalls), input.tools),\n };\n};\n\nexport const HFT_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n const { TextStreamer } = await loadTransformersSDK();\n const modelFamily = detectModelFamilyFromConfig(model!);\n const { prompt, responsePrefix } = buildPromptAndPrefix(\n generateText.tokenizer,\n input,\n modelFamily\n );\n\n // Two queues: the inner queue receives raw tokens from the TextStreamer,\n // the outer queue receives filtered text-delta events (markup stripped).\n const innerQueue = createStreamEventQueue<StreamEvent<ToolCallingTaskOutput>>();\n const outerQueue = createStreamEventQueue<StreamEvent<ToolCallingTaskOutput>>();\n const streamer = createStreamingTextStreamer(\n generateText.tokenizer,\n innerQueue,\n TextStreamer,\n signal\n );\n\n let fullText = \"\";\n const filter = createToolCallMarkupFilter((text) => {\n outerQueue.push({ type: \"text-delta\", port: \"text\", textDelta: text });\n });\n\n // Intercept raw text-delta events: accumulate the full text for post-hoc\n // parsing and feed tokens through the markup filter before forwarding.\n const originalPush = innerQueue.push;\n innerQueue.push = (event: StreamEvent<ToolCallingTaskOutput>) => {\n if (event.type === \"text-delta\" && \"textDelta\" in event) {\n fullText += event.textDelta;\n filter.feed(event.textDelta);\n } else {\n outerQueue.push(event);\n }\n originalPush(event);\n };\n\n const originalDone = innerQueue.done;\n innerQueue.done = () => {\n filter.flush();\n outerQueue.done();\n originalDone();\n };\n\n const originalError = innerQueue.error;\n innerQueue.error = (e: Error) => {\n filter.flush();\n outerQueue.error(e);\n originalError(e);\n };\n\n const pipelinePromise = generateText(prompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n streamer,\n }).then(\n () => innerQueue.done(),\n (err: Error) => innerQueue.error(err)\n );\n\n yield* outerQueue.iterable;\n await pipelinePromise;\n\n // Parse the accumulated text for tool calls using the model-family-aware parser.\n // For models that use a generation prefix, prepend it so the parser sees the\n // full markup pattern.\n const parseableFullText = responsePrefix ? `${responsePrefix}${fullText}` : fullText;\n const { text: cleanedText, toolCalls } = adaptParserResult(\n parseToolCalls(parseableFullText, { parser: modelFamily })\n );\n const validToolCalls = filterValidToolCalls(\n normalizeParsedToolCalls(input, toolCalls),\n input.tools\n );\n\n if (validToolCalls.length > 0) {\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: [...validToolCalls] };\n }\n\n yield {\n type: \"finish\",\n data: { text: cleanedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n",
|
|
38
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ToolCalls } from \"@workglow/ai\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ToolCall {\n readonly name: string;\n readonly arguments: Record<string, unknown>;\n readonly id: string | null;\n}\n\nexport interface ToolCallParserResult {\n readonly tool_calls: ReadonlyArray<ToolCall>;\n readonly content: string;\n readonly parser: string;\n}\n\nexport interface ParseToolCallsOptions {\n readonly tokenizer?: TokenizerLike | null;\n readonly model?: string | null;\n readonly parser?: string | null;\n}\n\n/**\n * Minimal tokenizer shape used for model-family detection.\n * Compatible with `PreTrainedTokenizer` from `@huggingface/transformers`.\n */\nexport interface TokenizerLike {\n readonly config?: {\n readonly name_or_path?: string;\n readonly _name_or_path?: string;\n readonly model_type?: string;\n };\n readonly name_or_path?: string;\n}\n\nexport type ParserFn = (text: string) => ToolCallParserResult | null;\n\n// ============================================================================\n// Text cleanup\n// ============================================================================\n\n/**\n * Strip thinking blocks (`<think>...</think>`) and HFT special tokens\n * (`<|im_end|>`, `<|end_of_turn|>`, etc.) from model output.\n * Used to clean up content text returned alongside tool calls.\n */\nexport function stripModelArtifacts(text: string): string {\n return text\n .replace(/<think>(?:[^<]|<(?!\\/think>))*<\\/think>/g, \"\")\n .replace(/<\\|[a-z_]+\\|>/g, \"\")\n .trim();\n}\n\n// ============================================================================\n// Shared helpers\n// ============================================================================\n\nexport function makeToolCall(\n name: string,\n args: Record<string, unknown>,\n id: string | null = null\n): ToolCall {\n return { name, arguments: args, id };\n}\n\nexport function tryParseJson(text: string): unknown | undefined {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Scan `source` for balanced blocks delimited by `openChar`/`closeChar`\n * (e.g. `{`/`}` or `[`/`]`). Correctly handles JSON string literals so\n * that braces inside strings are not counted.\n *\n * This is a ReDoS-safe alternative to regex patterns like `\\{[\\s\\S]*?\\}`.\n */\nfunction findBalancedBlocks(\n source: string,\n openChar: string,\n closeChar: string,\n startFrom: number = 0\n): Array<{ text: string; start: number; end: number }> {\n const results: Array<{ text: string; start: number; end: number }> = [];\n const length = source.length;\n let i = startFrom;\n while (i < length) {\n if (source[i] !== openChar) {\n i++;\n continue;\n }\n let depth = 1;\n let j = i + 1;\n let inString = false;\n let escape = false;\n while (j < length && depth > 0) {\n const ch = source[j];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === \"\\\\\") {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n } else {\n if (ch === '\"') {\n inString = true;\n } else if (ch === openChar) {\n depth++;\n } else if (ch === closeChar) {\n depth--;\n }\n }\n j++;\n }\n if (depth === 0) {\n results.push({ text: source.slice(i, j), start: i, end: j });\n i = j;\n } else {\n break;\n }\n }\n return results;\n}\n\nexport function parseJsonToolCallArray(\n jsonStr: string,\n nameKey: string = \"name\",\n argsKeys: ReadonlyArray<string> = [\"arguments\", \"parameters\"]\n): ReadonlyArray<ToolCall> | undefined {\n const parsed = tryParseJson(jsonStr.trim());\n if (!parsed) return undefined;\n\n const arr = Array.isArray(parsed) ? parsed : [parsed];\n const calls = arr\n .filter(\n (c): c is Record<string, unknown> =>\n !!c && typeof c === \"object\" && !!(c as Record<string, unknown>)[nameKey]\n )\n .map((c) => {\n const args = argsKeys.reduce<Record<string, unknown> | undefined>(\n (found, key) => found ?? (c[key] as Record<string, unknown> | undefined),\n undefined\n );\n return makeToolCall(c[nameKey] as string, args ?? {}, (c.id as string | null) ?? null);\n });\n\n return calls.length > 0 ? calls : undefined;\n}\n\n/**\n * Parse key=value argument syntax used by Gorilla, NexusRaven, and Gemma.\n * Handles quoted strings (`\"val\"`, `'val'`) and bare values.\n */\nexport function parseKeyValueArgs(argsStr: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n if (!argsStr) return args;\n\n const argRegex = /(?<!\\w)(\\w+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s,]+))/g;\n let match: RegExpExecArray | null;\n while ((match = argRegex.exec(argsStr)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? match[4];\n args[key] = coerceArgValue(value);\n }\n return args;\n}\n\nexport function coerceArgValue(value: string): unknown {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value !== \"\" && !isNaN(Number(value))) return Number(value);\n return value;\n}\n\n/**\n * Richer value coercion for FunctionGemma-style arguments.\n * Superset of {@link coerceArgValue}: also handles JSON-quoted strings,\n * objects, and arrays.\n */\nexport function parseFunctionGemmaArgumentValue(rawValue: string): unknown {\n const trimmed = rawValue.trim();\n if (trimmed.length === 0) return \"\";\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n\n const numeric = Number(trimmed);\n if (!Number.isNaN(numeric) && /^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n return numeric;\n }\n\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Fall through to raw string.\n }\n }\n\n return trimmed;\n}\n\n/**\n * Parse a loose `{key: value, ...}` object that may not be valid JSON.\n * Used as a FunctionGemma fallback when models emit partial syntax.\n */\nexport function parseFunctionGemmaLooseObject(text: string): Record<string, unknown> | undefined {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) {\n return undefined;\n }\n\n const inner = trimmed.slice(1, -1).trim();\n if (inner.length === 0) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n const pairs = inner.matchAll(/([A-Za-z0-9_]+)\\s*:\\s*('[^']*'|\"[^\"]*\"|[^,}]+)/g);\n\n for (const [_, rawKey, rawValue] of pairs) {\n const key = rawKey.trim();\n const valueText = rawValue.trim().replace(/^'([^']*)'$/, '\"$1\"');\n result[key] = parseFunctionGemmaArgumentValue(valueText);\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ============================================================================\n// Individual parsers for each model family\n// ============================================================================\n\n/**\n * Llama 3.1/3.2/3.3 (Meta)\n *\n * Formats:\n * - `<|python_tag|>{\"name\": \"func\", \"parameters\": {\"arg\": \"val\"}}`\n * - `<function=func>{\"arg\": \"val\"}</function>` (3.2 lightweight 1B/3B)\n * - `{\"name\": \"func\", \"parameters\": {...}}` (bare JSON)\n */\nexport const parseLlama: ParserFn = (text) => {\n const calls: ToolCall[] = [];\n let content = text;\n\n // Try <|python_tag|> format first\n const pythonTagMatch = text.match(\n /<\\|python_tag\\|>((?:[^<]|<(?!\\|eot_id\\|>|\\|eom_id\\|>))*)(?:<\\|eot_id\\|>|<\\|eom_id\\|>|$)/\n );\n if (pythonTagMatch) {\n content = text.slice(0, text.indexOf(\"<|python_tag|>\")).trim();\n const jsonSection = pythonTagMatch[1].trim();\n for (const line of jsonSection.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const parsed = tryParseJson(trimmed) as Record<string, unknown> | undefined;\n if (parsed?.name) {\n calls.push(\n makeToolCall(\n parsed.name as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n }\n\n // Try <function=name>{args}</function> format (Llama 3.2 lightweight 1B/3B)\n if (calls.length === 0) {\n const funcTagRegex = /<function=(\\w+)>((?:[^<]|<(?!\\/function>))*)<\\/function>/g;\n let funcMatch: RegExpExecArray | null;\n while ((funcMatch = funcTagRegex.exec(text)) !== null) {\n const args = tryParseJson(funcMatch[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(funcMatch[1], args));\n }\n }\n if (calls.length > 0) {\n content = text.replace(/<function=\\w+>(?:[^<]|<(?!\\/function>))*<\\/function>/g, \"\").trim();\n }\n }\n\n // Check for {\"name\":...} pattern at end of output (no python_tag)\n // Uses balanced-brace scanning instead of regex to avoid ReDoS\n if (calls.length === 0) {\n const blocks = findBalancedBlocks(text, \"{\", \"}\");\n for (const block of blocks) {\n const parsed = tryParseJson(block.text) as Record<string, unknown> | undefined;\n if (parsed?.name && (parsed.parameters !== undefined || parsed.arguments !== undefined)) {\n calls.push(\n makeToolCall(\n parsed.name as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n if (calls.length > 0) {\n content = text.slice(0, text.indexOf(calls[0].name) - '{\"name\": \"'.length).trim();\n }\n }\n\n return calls.length > 0 ? { tool_calls: calls, content, parser: \"llama\" } : null;\n};\n\n/**\n * Mistral / Mixtral (Mistral AI)\n *\n * Format: `[TOOL_CALLS] [{\"name\": \"func\", \"arguments\": {...}, \"id\": \"9charID\"}]`\n */\nexport const parseMistral: ParserFn = (text) => {\n const marker = \"[TOOL_CALLS]\";\n const idx = text.indexOf(marker);\n if (idx === -1) return null;\n\n const content = text.slice(0, idx).trim();\n const jsonStr = text.slice(idx + marker.length).trim();\n const calls = parseJsonToolCallArray(jsonStr);\n\n return calls ? { tool_calls: calls, content, parser: \"mistral\" } : null;\n};\n\n/**\n * Hermes (NousResearch) — also used by Qwen 2.5, Qwen 3, SOLAR, and others\n *\n * Format: `<tool_call>\\n{\"name\": \"func\", \"arguments\": {...}}\\n</tool_call>`\n */\nexport const parseHermes: ParserFn = (text) => {\n const regex = /<tool_call>((?:[^<]|<(?!\\/tool_call>))*)<\\/tool_call>/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<tool_call>(?:[^<]|<(?!\\/tool_call>))*<\\/tool_call>/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"hermes\" };\n};\n\n/**\n * Cohere Command-R / Command-R+\n *\n * Formats:\n * - `Action: ```json\\n[{\"tool_name\": \"func\", \"parameters\": {...}}]\\n````\n * - `Action: [{\"tool_name\": ..., \"parameters\": ...}]`\n */\nexport const parseCohere: ParserFn = (text) => {\n const blockMatch = text.match(/Action:\\s*```(?:json)?\\n?((?:[^`]|`(?!``))*)\\n?```/);\n // Use balanced-bracket scanning for inline format to avoid ReDoS\n let inlineJsonStr: string | undefined;\n if (!blockMatch) {\n const actionIdx = text.indexOf(\"Action:\");\n if (actionIdx !== -1) {\n const afterAction = text.slice(actionIdx + \"Action:\".length).trimStart();\n if (afterAction.startsWith(\"[\")) {\n const blocks = findBalancedBlocks(afterAction, \"[\", \"]\");\n if (blocks.length > 0) {\n inlineJsonStr = blocks[0].text;\n }\n }\n }\n }\n\n const jsonStr = blockMatch?.[1] ?? inlineJsonStr;\n if (!jsonStr) return null;\n\n const calls = parseJsonToolCallArray(jsonStr, \"tool_name\", [\"parameters\", \"arguments\"]);\n if (!calls) {\n // Retry with \"name\" key\n const fallbackCalls = parseJsonToolCallArray(jsonStr);\n if (!fallbackCalls) return null;\n\n const actionIdx = text.indexOf(\"Action:\");\n const content = text.slice(0, actionIdx).trim();\n return { tool_calls: fallbackCalls, content, parser: \"cohere\" };\n }\n\n const actionIdx = text.indexOf(\"Action:\");\n const content = text.slice(0, actionIdx).trim();\n return { tool_calls: calls, content, parser: \"cohere\" };\n};\n\n/**\n * DeepSeek V2/V3/V3.1\n *\n * V2 format: `<|tool▁call▁begin|>function_name\\n```json\\n{...}\\n```<|tool▁call▁end|>`\n * V3.1 format: `<|tool▁calls▁begin|><|tool▁call▁begin|>name<|tool▁sep|>{args}<|tool▁call▁end|><|tool▁calls▁end|>`\n */\nexport const parseDeepSeek: ParserFn = (text) => {\n const calls: ToolCall[] = [];\n\n // Helper to match both fullwidth | and ASCII | bar variants, and ▁ or space\n const bar = \"(?:||\\\\|)\";\n const sep = \"[\\\\s\\u2581]\";\n\n // Try V3.1 format first: name<|tool▁sep|>{args}\n const v31Regex = new RegExp(\n `<${bar}tool${sep}call${sep}begin${bar}>\\\\s*(\\\\w+)\\\\s*<${bar}tool${sep}sep${bar}>\\\\s*([^<]*(?:<(?!${bar}tool${sep}call${sep}end${bar}>)[^<]*)*)\\\\s*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n );\n let match: RegExpExecArray | null;\n while ((match = v31Regex.exec(text)) !== null) {\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(match[1], args));\n }\n }\n\n // Try V2 format: name\\n```json\\n{args}\\n```\n if (calls.length === 0) {\n const v2Regex = new RegExp(\n `<${bar}tool${sep}call${sep}begin${bar}>\\\\s*(\\\\w+)\\\\s*\\\\n\\`\\`\\`(?:json)?\\\\n([^\\`]*(?:\\`(?!\\`\\`)[^\\`]*)*)\\\\n\\`\\`\\`\\\\s*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n );\n while ((match = v2Regex.exec(text)) !== null) {\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(match[1], args));\n }\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(new RegExp(`<${bar}tool${sep}calls?${sep}(?:begin|end)${bar}>`, \"g\"), \"\")\n .replace(\n new RegExp(\n `<${bar}tool${sep}call${sep}(?:begin|end)${bar}>[^<]*(?:<(?!${bar}tool${sep}call${sep}end${bar}>)[^<]*)*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n ),\n \"\"\n )\n .replace(new RegExp(`<${bar}tool${sep}sep${bar}>`, \"g\"), \"\")\n .trim();\n return { tool_calls: calls, content, parser: \"deepseek\" };\n};\n\n/**\n * Phi-4 / Phi-4-mini (Microsoft)\n *\n * Format: `<|tool_calls|>[{\"name\": \"func\", \"arguments\": {...}}]<|/tool_calls|>`\n */\nexport const parsePhi: ParserFn = (text) => {\n const match = text.match(/<\\|tool_calls\\|>((?:[^<]|<(?!\\|\\/tool_calls\\|>))*)<\\|\\/tool_calls\\|>/);\n if (!match) return null;\n\n const calls = parseJsonToolCallArray(match[1]);\n if (!calls) return null;\n\n const content = text.slice(0, text.indexOf(\"<|tool_calls|>\")).trim();\n return { tool_calls: calls, content, parser: \"phi\" };\n};\n\n/**\n * Phi-3 functools format (legacy)\n *\n * Format: `functools[{\"name\": \"func\", \"arguments\": {...}}]`\n */\nexport const parsePhiFunctools: ParserFn = (text) => {\n const idx = text.indexOf(\"functools\");\n if (idx === -1) return null;\n\n // Scan forward past optional whitespace to find the opening [\n let start = idx + \"functools\".length;\n while (start < text.length && /\\s/.test(text[start])) start++;\n if (start >= text.length || text[start] !== \"[\") return null;\n\n const blocks = findBalancedBlocks(text, \"[\", \"]\", start);\n if (blocks.length === 0) return null;\n\n const calls = parseJsonToolCallArray(blocks[0].text);\n if (!calls) return null;\n\n const content = text.slice(0, idx).trim();\n return { tool_calls: calls, content, parser: \"phi_functools\" };\n};\n\n/**\n * InternLM 2 / 2.5 (Shanghai AI Lab)\n *\n * Format: `<|action_start|><|plugin|>\\n{\"name\": \"func\", \"parameters\": {...}}<|action_end|>`\n */\nexport const parseInternLM: ParserFn = (text) => {\n const regex =\n /<\\|action_start\\|>\\s*<\\|plugin\\|>((?:[^<]|<(?!\\|action_end\\|>))*)<\\|action_end\\|>/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(/<\\|action_start\\|>\\s*<\\|plugin\\|>(?:[^<]|<(?!\\|action_end\\|>))*<\\|action_end\\|>/g, \"\")\n .trim();\n return { tool_calls: calls, content, parser: \"internlm\" };\n};\n\n/**\n * ChatGLM / GLM-4 (Zhipu AI)\n *\n * Format: function name followed by newline and JSON arguments.\n * `func_name\\n{\"arg\": \"val\"}`\n */\nexport const parseChatGLM: ParserFn = (text) => {\n const match = text.match(/^(\\w+)\\n(\\{[\\s\\S]*\\})\\s*$/m);\n if (!match) return null;\n\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (!args) return null;\n\n return {\n tool_calls: [makeToolCall(match[1], args)],\n content: \"\",\n parser: \"chatglm\",\n };\n};\n\n/**\n * Functionary (MeetKai)\n *\n * Format: `>>>func_name\\n{\"arg\": \"val\"}`\n * Uses `all` as a special function name for regular text.\n */\nexport const parseFunctionary: ParserFn = (text) => {\n const regex = />>>\\s*(\\w+)\\s*\\n((?:(?!>>>)[\\s\\S])*)/g;\n const calls: ToolCall[] = [];\n let content = \"\";\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const funcName = match[1].trim();\n const body = match[2].trim();\n\n if (funcName === \"all\") {\n content += body;\n continue;\n }\n\n const args = tryParseJson(body) as Record<string, unknown> | undefined;\n calls.push(makeToolCall(funcName, args ?? { content: body }));\n }\n\n if (calls.length === 0) return null;\n return { tool_calls: calls, content: content.trim(), parser: \"functionary\" };\n};\n\n/**\n * Gorilla (Berkeley)\n *\n * Format: `<<function>>func_name(arg1=\"val1\", arg2=val2)`\n */\nexport const parseGorilla: ParserFn = (text) => {\n const regex = /<<function>>\\s{0,20}(\\w+)\\(([^)]*)\\)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1], parseKeyValueArgs(match[2].trim())));\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<<function>>\\s{0,20}\\w+\\([^)]*\\)/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"gorilla\" };\n};\n\n/**\n * NexusRaven (Nexusflow)\n *\n * Format: `Call: func_name(arg1=\"val1\", arg2=val2)\\nThought: reasoning...`\n */\nexport const parseNexusRaven: ParserFn = (text) => {\n const regex = /Call:\\s{0,20}(\\w+)\\(([^)]*)\\)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1], parseKeyValueArgs(match[2].trim())));\n }\n\n if (calls.length === 0) return null;\n\n const thoughtMatch = text.match(/Thought:\\s*((?:(?!Call:)[\\s\\S])*)/);\n const content =\n thoughtMatch?.[1]?.trim() ?? text.replace(/Call:\\s{0,20}\\w+\\([^)]*\\)/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"nexusraven\" };\n};\n\n/**\n * xLAM (Salesforce)\n *\n * Format: Raw JSON array of tool calls: `[{\"name\": \"func\", \"arguments\": {...}}]`\n * May be wrapped in ```json code blocks.\n */\nexport const parseXLAM: ParserFn = (text) => {\n // Try code block format first using ReDoS-safe backtick matching\n const codeBlockMatch = text.match(/```(?:json)?\\n?((?:[^`]|`(?!``))*)\\n?```/);\n let jsonStr: string | undefined;\n let isCodeBlock = false;\n\n if (codeBlockMatch) {\n const inner = codeBlockMatch[1].trim();\n if (inner.startsWith(\"[\")) {\n jsonStr = inner;\n isCodeBlock = true;\n }\n }\n\n if (!jsonStr) {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"[\")) return null;\n jsonStr = trimmed;\n }\n\n const calls = parseJsonToolCallArray(jsonStr);\n if (!calls) return null;\n\n const content = isCodeBlock ? text.slice(0, text.indexOf(\"```\")).trim() : \"\";\n return { tool_calls: calls, content, parser: \"xlam\" };\n};\n\n/**\n * FireFunction (Fireworks AI)\n *\n * Format: `{\"tool_calls\": [{\"function\": {\"name\": \"...\", \"arguments\": \"...\"}}]}`\n */\nexport const parseFireFunction: ParserFn = (text) => {\n // Use balanced-bracket scanning to avoid ReDoS\n const toolCallsIdx = text.indexOf('\"tool_calls\"');\n if (toolCallsIdx === -1) return null;\n\n // Find the opening [ after \"tool_calls\":\n let bracketStart = text.indexOf(\"[\", toolCallsIdx);\n if (bracketStart === -1) return null;\n\n const blocks = findBalancedBlocks(text, \"[\", \"]\", bracketStart);\n if (blocks.length === 0) return null;\n\n const parsed = tryParseJson(blocks[0].text) as Array<Record<string, unknown>> | undefined;\n if (!parsed || !Array.isArray(parsed)) return null;\n\n const calls: ToolCall[] = [];\n for (const c of parsed) {\n const fn = c.function as Record<string, unknown> | undefined;\n if (!fn?.name) continue;\n\n let args = fn.arguments ?? {};\n if (typeof args === \"string\") {\n args = tryParseJson(args) ?? {};\n }\n calls.push(\n makeToolCall(\n fn.name as string,\n args as Record<string, unknown>,\n (c.id as string | null) ?? null\n )\n );\n }\n\n return calls.length > 0 ? { tool_calls: calls, content: \"\", parser: \"firefunction\" } : null;\n};\n\n/**\n * Granite (IBM)\n *\n * Format: `<|tool_call|>{\"name\": \"func\", \"arguments\": {...}}<|/tool_call|>` or `<|end_of_text|>`\n */\nexport const parseGranite: ParserFn = (text) => {\n const regex =\n /<\\|tool_call\\|>((?:[^<]|<(?!\\|\\/tool_call\\|>|\\|end_of_text\\|>))*?)(?:<\\|\\/tool_call\\|>|<\\|end_of_text\\|>|$)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(\n /<\\|tool_call\\|>(?:[^<]|<(?!\\|\\/tool_call\\|>|\\|end_of_text\\|>))*(?:<\\|\\/tool_call\\|>|$)/g,\n \"\"\n )\n .trim();\n return { tool_calls: calls, content, parser: \"granite\" };\n};\n\n/**\n * Gemma 2/3 (Google) — prompt-based, no dedicated tokens\n *\n * Formats:\n * - ```tool_code\\nfunc(arg=val)\\n```\n * - `{\"name\": \"func\", \"parameters\": {...}}`\n */\nexport const parseGemma: ParserFn = (text) => {\n // Manual extraction to avoid ReDoS with backtick-matching regexes\n const openMarker = \"```tool_code\";\n const openIdx = text.indexOf(openMarker);\n if (openIdx === -1) return null;\n const lineStart = text.indexOf(\"\\n\", openIdx + openMarker.length);\n if (lineStart === -1) return null;\n // Find closing ``` on its own line after the content\n let closeIdx = -1;\n let searchFrom = lineStart + 1;\n while (searchFrom < text.length) {\n const candidate = text.indexOf(\"```\", searchFrom);\n if (candidate === -1) break;\n // Ensure the ``` is preceded by a newline (possibly with whitespace)\n const lineBegin = text.lastIndexOf(\"\\n\", candidate - 1);\n if (lineBegin >= lineStart && text.slice(lineBegin + 1, candidate).trim() === \"\") {\n closeIdx = candidate;\n break;\n }\n searchFrom = candidate + 3;\n }\n if (closeIdx === -1) return null;\n\n const rawCode = text.slice(lineStart + 1, closeIdx).replace(/\\n[ \\t]*$/, \"\");\n const code = rawCode.trim();\n const funcMatch = code.match(/^(\\w+)\\(([\\s\\S]*)\\)$/);\n if (!funcMatch) return null;\n\n // Remove the entire fenced block from content\n const blockEnd = closeIdx + 3;\n const content = (text.slice(0, openIdx) + text.slice(blockEnd)).trim();\n return {\n tool_calls: [makeToolCall(funcMatch[1], parseKeyValueArgs(funcMatch[2].trim()))],\n content,\n parser: \"gemma\",\n };\n};\n\n/**\n * Parse FunctionGemma-style arguments from the captured string between braces.\n * Handles both `<escape>` delimited and plain `key:value` formats, with a\n * JSON fallback for more complex values.\n */\nfunction parseFunctionGemmaArgs(argsStr: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n if (!argsStr.trim()) return args;\n\n // Try <escape>-delimited format first: key:<escape>value<escape>\n const escapeRegex =\n /(?<![A-Za-z0-9_])([A-Za-z0-9_]+)\\s*:\\s*<escape>((?:[^<]|<(?!escape>))*)<escape>/g;\n let escapeMatch: RegExpExecArray | null;\n while ((escapeMatch = escapeRegex.exec(argsStr)) !== null) {\n args[escapeMatch[1]] = coerceArgValue(escapeMatch[2]);\n }\n if (Object.keys(args).length > 0) return args;\n\n // Try plain key:value format (no escape tags): key:value separated by commas\n // Also handles cases where the model generates only a single <escape> tag\n const plainRegex =\n /(?<![A-Za-z0-9_])(?=([A-Za-z0-9_]+))\\1\\s*:\\s*(?:'([^']*)'|\"([^\"]*)\"|([^,}]+))/g;\n let plainMatch: RegExpExecArray | null;\n while ((plainMatch = plainRegex.exec(argsStr)) !== null) {\n const key = plainMatch[1].trim();\n const value = (plainMatch[2] ?? plainMatch[3] ?? plainMatch[4] ?? \"\")\n .replace(/<escape>/g, \"\")\n .trim();\n args[key] = parseFunctionGemmaArgumentValue(value);\n }\n if (Object.keys(args).length > 0) return args;\n\n // Fallback: try JSON.parse on {argsStr}\n const jsonResult = tryParseJson(`{${argsStr}}`) as Record<string, unknown> | undefined;\n if (jsonResult && typeof jsonResult === \"object\") return jsonResult;\n\n return args;\n}\n\n/**\n * FunctionGemma (Google, specialized 270M model)\n *\n * Format: `<start_function_call>call:func_name{key:<escape>value<escape>}<end_function_call>`\n * Also handles variants without `<end_function_call>` (e.g., `<end_of_turn>`).\n */\nexport const parseFunctionGemma: ParserFn = (text) => {\n // Match with explicit end tag. Allow:\n // - Optional <start_function_call> wrapper\n // - `call:name{args}` or just `:name{args}` (model may omit `call` prefix)\n // - Optional whitespace/newlines between name and `{`\n const regex =\n /(?:<start_function_call>\\s*)?call:(?=([\\w.]+))\\1\\s*\\{([^}]*)\\}(?:\\s*<end_function_call>)?/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1].trim(), parseFunctionGemmaArgs(match[2])));\n }\n\n // Fallback: handle missing `call` prefix (`:name{args}` at start of text)\n if (calls.length === 0) {\n const fallbackRegex = /^:([A-Za-z_]\\w*)\\s*\\{([^}]*)\\}$/;\n const fallbackMatch = text.trim().match(fallbackRegex);\n if (fallbackMatch) {\n calls.push(makeToolCall(fallbackMatch[1].trim(), parseFunctionGemmaArgs(fallbackMatch[2])));\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(\n /(?:<start_function_call>\\s*)?(?:call)?:(?=([\\w.]+))\\1\\s*\\{[^}]*\\}(?:\\s*<end_function_call>)?/g,\n \"\"\n )\n .trim();\n return { tool_calls: calls, content, parser: \"functiongemma\" };\n};\n\n/**\n * Parse Liquid/LFM-style Pythonic function call arguments.\n * Handles both `key=val, key2=val2` and `params=JSON` patterns.\n * When a single `params` argument contains a JSON object, spreads it.\n */\nfunction parseLiquidArgs(argsStr: string): Record<string, unknown> {\n const trimmed = argsStr.trim();\n\n // Try params=JSON pattern: params={\"key\": \"val\", ...} or params={'key': 'val', ...}\n const paramsMatch = trimmed.match(/^params\\s*=\\s*(\\{[\\s\\S]*\\})$/);\n if (paramsMatch) {\n const jsonStr = paramsMatch[1].replace(/'/g, '\"');\n const parsed = tryParseJson(jsonStr) as Record<string, unknown> | undefined;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n }\n\n // Try bare JSON object: { key: \"val\", ... } (JS-style, keys may be unquoted)\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n // Add quotes around unquoted keys for JSON.parse\n const jsonified = trimmed.replace(/([{,]\\s*)(\\w+)\\s*:/g, '$1\"$2\":');\n const parsed = tryParseJson(jsonified) as Record<string, unknown> | undefined;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n }\n\n // Fall back to key=value parsing\n return parseKeyValueArgs(argsStr);\n}\n\n/**\n * Extract Pythonic function calls from text: `func_name(args)` or `[func(args)]`.\n * Handles balanced parentheses so JSON in args doesn't break matching.\n */\nfunction extractPythonicCalls(text: string): ToolCall[] {\n const calls: ToolCall[] = [];\n const startRegex = /(?<!\\w)(\\w+)\\(/g;\n let startMatch: RegExpExecArray | null;\n while ((startMatch = startRegex.exec(text)) !== null) {\n const funcName = startMatch[1];\n const argsStart = startMatch.index + startMatch[0].length;\n // Balance parentheses to find the closing )\n let depth = 1;\n let i = argsStart;\n while (i < text.length && depth > 0) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\") depth--;\n i++;\n }\n if (depth === 0) {\n const argsStr = text.slice(argsStart, i - 1);\n calls.push(makeToolCall(funcName, parseLiquidArgs(argsStr)));\n // Advance regex scanning position past this complete call to avoid matching inside args\n startRegex.lastIndex = i;\n }\n }\n return calls;\n}\n\n/**\n * LiquidAI LFM / LFM2 / LFM2.5\n *\n * Formats:\n * - `<|tool_call_start|>[func_name(key=\"value\", key2=123)]<|tool_call_end|>`\n * - `[func_name(params={\"key\": \"val\"})]` (bracket-only, no special tokens)\n * Parallel calls: `<|tool_call_start|>[func1(a=\"b\"), func2(c=\"d\")]<|tool_call_end|>`\n * Uses Pythonic function call syntax.\n */\nexport const parseLiquid: ParserFn = (text) => {\n // Try special token format first\n const specialMatch = text.match(\n /<\\|tool_call_start\\|>((?:[^<]|<(?!\\|tool_call_end\\|>))*)<\\|tool_call_end\\|>/\n );\n if (specialMatch) {\n const inner = specialMatch[1].trim();\n const unwrapped = inner.startsWith(\"[\") && inner.endsWith(\"]\") ? inner.slice(1, -1) : inner;\n const calls = extractPythonicCalls(unwrapped);\n if (calls.length > 0) {\n const content = stripModelArtifacts(\n text.replace(\n /<\\|tool_call_start\\|>(?:[^<]|<(?!\\|tool_call_end\\|>))*<\\|tool_call_end\\|>/g,\n \"\"\n )\n );\n return { tool_calls: calls, content, parser: \"liquid\" };\n }\n }\n\n // Try bracket-only format: [func(args)] without special tokens\n // Use manual balanced-paren extraction to avoid ReDoS\n const bracketCalls: ToolCall[] = [];\n const bracketSpans: Array<[number, number]> = [];\n {\n const bracketOpenRegex = /\\[(?=\\w+\\()/g;\n let bm: RegExpExecArray | null;\n while ((bm = bracketOpenRegex.exec(text)) !== null) {\n const innerStart = bm.index + 1;\n // Find balanced closing ] by tracking parens\n let depth = 0;\n let i = innerStart;\n let foundClose = false;\n while (i < text.length) {\n const ch = text[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0 && i + 1 < text.length && text[i + 1] === \"]\") {\n const inner = text.slice(innerStart, i + 1);\n const calls = extractPythonicCalls(inner);\n bracketCalls.push(...calls);\n bracketSpans.push([bm.index, i + 2]);\n bracketOpenRegex.lastIndex = i + 2;\n foundClose = true;\n break;\n }\n }\n i++;\n }\n if (!foundClose) break;\n }\n }\n\n if (bracketCalls.length > 0) {\n let content = text;\n for (let k = bracketSpans.length - 1; k >= 0; k--) {\n content = content.slice(0, bracketSpans[k][0]) + content.slice(bracketSpans[k][1]);\n }\n return { tool_calls: bracketCalls, content: stripModelArtifacts(content), parser: \"liquid\" };\n }\n\n // Try ||Call: format (LFM2 text-based variant): ||Call: func_name(args)\n const callPrefixRegex = /\\|?\\|?Call:\\s*/g;\n let callPrefixMatch: RegExpExecArray | null;\n const callCalls: ToolCall[] = [];\n while ((callPrefixMatch = callPrefixRegex.exec(text)) !== null) {\n const afterPrefix = text.slice(callPrefixMatch.index + callPrefixMatch[0].length);\n const calls = extractPythonicCalls(afterPrefix);\n if (calls.length > 0) {\n callCalls.push(calls[0]);\n }\n }\n\n if (callCalls.length > 0) {\n const content = stripModelArtifacts(text.replace(/\\|?\\|?Call:\\s{0,20}\\w+\\([^)]*\\)/g, \"\"));\n return { tool_calls: callCalls, content, parser: \"liquid\" };\n }\n\n return null;\n};\n\n/**\n * Jamba (AI21)\n *\n * Format: `<tool_calls>[{\"name\": \"func\", \"arguments\": {...}}]</tool_calls>`\n * Also supports OpenAI-compatible format via FireFunction fallback.\n */\nexport const parseJamba: ParserFn = (text) => {\n const tagMatch = text.match(/<tool_calls>((?:[^<]|<(?!\\/tool_calls>))*)<\\/tool_calls>/);\n if (tagMatch) {\n const parsed = tryParseJson(tagMatch[1].trim());\n if (parsed) {\n const arr = Array.isArray(parsed) ? parsed : [parsed];\n const calls: ToolCall[] = [];\n for (const c of arr as Array<Record<string, unknown>>) {\n if (!c.name) continue;\n let args = c.arguments ?? c.parameters ?? {};\n if (typeof args === \"string\") {\n args = tryParseJson(args) ?? {};\n }\n calls.push(\n makeToolCall(\n c.name as string,\n args as Record<string, unknown>,\n (c.id as string | null) ?? null\n )\n );\n }\n if (calls.length > 0) {\n const content = text.slice(0, text.indexOf(\"<tool_calls>\")).trim();\n return { tool_calls: calls, content, parser: \"jamba\" };\n }\n }\n }\n\n return parseFireFunction(text);\n};\n\n/**\n * Qwen 3.5 XML format\n *\n * Format:\n * ```\n * <tool_call>\n * <function=function_name>\n * <parameter=param_name>value</parameter>\n * ...\n * </function>\n * </tool_call>\n * ```\n *\n * The special `params` parameter may contain a JSON object to be spread\n * into the arguments.\n */\nexport const parseQwen35Xml: ParserFn = (text) => {\n const toolCallMatches = text.matchAll(/<tool_call>((?:[^<]|<(?!\\/tool_call>))*)<\\/tool_call>/g);\n const calls: ToolCall[] = [];\n for (const [_, toolCallBody] of toolCallMatches) {\n const functionMatch = toolCallBody\n .trim()\n .match(/<function=([^>\\n<]+)>((?:[^<]|<(?!\\/function>))*)<\\/function>/);\n if (!functionMatch) {\n continue;\n }\n const [, rawName, functionBody] = functionMatch;\n const parsedInput: Record<string, unknown> = {};\n const parameterMatches = functionBody.matchAll(\n /<parameter=([^>\\n<]+)>((?:[^<]|<(?!\\/parameter>))*)<\\/parameter>/g\n );\n for (const [__, rawParamName, rawValue] of parameterMatches) {\n const paramName = rawParamName.trim();\n const valueText = rawValue.trim();\n if (paramName === \"params\") {\n try {\n const parsedValue = JSON.parse(valueText);\n if (parsedValue && typeof parsedValue === \"object\" && !Array.isArray(parsedValue)) {\n Object.assign(parsedInput, parsedValue);\n continue;\n }\n } catch {\n // Fall back to keeping the raw string.\n }\n }\n parsedInput[paramName] = valueText;\n }\n calls.push(makeToolCall(rawName.trim(), parsedInput));\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<tool_call>(?:[^<]|<(?!\\/tool_call>))*<\\/tool_call>/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"qwen35xml\" };\n};\n\n// ============================================================================\n// Model family detection\n// ============================================================================\n\nconst MODEL_PARSERS: Record<string, ReadonlyArray<ParserFn>> = {\n llama: [parseLlama, parseHermes],\n mistral: [parseMistral, parseHermes],\n mixtral: [parseMistral, parseHermes],\n qwen: [parseHermes, parseLlama],\n qwen2: [parseHermes, parseLlama],\n qwen3: [parseHermes, parseQwen35Xml, parseLlama],\n qwen35: [parseQwen35Xml, parseHermes, parseLlama],\n cohere: [parseCohere, parseHermes],\n command: [parseCohere, parseHermes],\n deepseek: [parseDeepSeek, parseHermes],\n hermes: [parseHermes],\n phi: [parsePhi, parsePhiFunctools, parseHermes],\n internlm: [parseInternLM, parseHermes],\n chatglm: [parseChatGLM],\n glm: [parseChatGLM],\n functiongemma: [parseFunctionGemma, parseGemma, parseHermes],\n gemma: [parseFunctionGemma, parseGemma, parseHermes],\n functionary: [parseFunctionary],\n gorilla: [parseGorilla],\n nexusraven: [parseNexusRaven],\n xlam: [parseXLAM],\n firefunction: [parseFireFunction, parsePhiFunctools],\n granite: [parseGranite, parseHermes],\n solar: [parseHermes],\n jamba: [parseJamba, parseHermes],\n liquid: [parseLiquid, parseHermes],\n lfm: [parseLiquid, parseHermes],\n yi: [parseHermes, parseLlama],\n falcon: [parseHermes, parseLlama],\n};\n\n/**\n * Default parser chain used when the model family cannot be determined.\n * Ordered by specificity (most distinctive markers first).\n */\nconst DEFAULT_PARSER_CHAIN: ReadonlyArray<ParserFn> = [\n parsePhi,\n parseMistral,\n parseDeepSeek,\n parseInternLM,\n parseGranite,\n parseFunctionGemma,\n parseQwen35Xml,\n parseHermes,\n parseCohere,\n parseFunctionary,\n parseGorilla,\n parseNexusRaven,\n parseFireFunction,\n parsePhiFunctools,\n parseLiquid,\n parseLlama,\n parseGemma,\n parseXLAM,\n];\n\n/**\n * Detect the model family from a tokenizer instance or model name string.\n */\nfunction detectModelFamily(tokenizerOrName: TokenizerLike | string | null): string | null {\n let name = \"\";\n\n if (typeof tokenizerOrName === \"string\") {\n name = tokenizerOrName.toLowerCase();\n } else if (tokenizerOrName) {\n const config = tokenizerOrName.config ?? {};\n name = (\n config.name_or_path ??\n config._name_or_path ??\n config.model_type ??\n tokenizerOrName.name_or_path ??\n \"\"\n ).toLowerCase();\n }\n\n if (!name) return null;\n\n for (const family of Object.keys(MODEL_PARSERS)) {\n if (name.includes(family)) {\n return family;\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Parse tool calls from LLM output text.\n *\n * Automatically detects the model family from the tokenizer and applies the\n * appropriate parser(s). Falls back to trying all known formats if the model\n * family cannot be determined.\n */\nexport function parseToolCalls(\n text: string,\n { tokenizer = null, model = null, parser = null }: ParseToolCallsOptions = {}\n): ToolCallParserResult {\n if (!text || typeof text !== \"string\") {\n return { tool_calls: [], content: text ?? \"\", parser: \"none\" };\n }\n\n let parsersToTry: ReadonlyArray<ParserFn>;\n\n if (parser) {\n const key = parser.toLowerCase();\n const found = MODEL_PARSERS[key];\n if (!found) {\n throw new Error(\n `Unknown parser \"${parser}\". Available parsers: ${Object.keys(MODEL_PARSERS).join(\", \")}`\n );\n }\n parsersToTry = found;\n } else {\n const family = detectModelFamily(tokenizer ?? model ?? null);\n parsersToTry = family ? MODEL_PARSERS[family]! : DEFAULT_PARSER_CHAIN;\n }\n\n for (const parserFn of parsersToTry) {\n const result = parserFn(text);\n if (result) return result;\n }\n\n return { tool_calls: [], content: text, parser: \"none\" };\n}\n\n/**\n * Check if text likely contains tool calls without fully parsing them.\n * Faster than `parseToolCalls` when you only need presence detection.\n */\nexport function hasToolCalls(text: string): boolean {\n if (!text) return false;\n return (\n text.includes(\"<tool_call>\") ||\n text.includes(\"[TOOL_CALLS]\") ||\n text.includes(\"<|python_tag|>\") ||\n text.includes(\"<function=\") ||\n text.includes(\"<|tool_calls|>\") ||\n text.includes(\"<tool_calls>\") ||\n text.includes(\"<|action_start|>\") ||\n text.includes(\"<<function>>\") ||\n text.includes(\">>>\") ||\n text.includes(\"Call:\") ||\n text.includes(\"Action:\") ||\n text.includes(\"functools\") ||\n text.includes(\"<start_function_call>\") ||\n text.includes(\"<|tool_call|>\") ||\n text.includes(\"<|tool_call_start|>\") ||\n /tool[\\s\\u2581]call[\\s\\u2581]begin/.test(text)\n );\n}\n\n/**\n * Get the list of available parser names.\n */\nexport function getAvailableParsers(): ReadonlyArray<string> {\n return Object.keys(MODEL_PARSERS);\n}\n\n/**\n * Get a model-family-specific generation prefix that guides the model to\n * produce tool calls. Appended to the prompt before generation and prepended\n * to the decoded output before parsing.\n *\n * @param family - The detected model family (from `getAvailableParsers` / `detectModelFamily`).\n * @param forcedToolName - When a specific tool is forced, include its name in the prefix.\n * @returns The prefix string, or `undefined` if no prefix is needed.\n */\nexport function getGenerationPrefix(\n family: string | null,\n forcedToolName: string | undefined\n): string | undefined {\n if (!family) return undefined;\n\n switch (family) {\n case \"functiongemma\":\n return forcedToolName\n ? `<start_function_call>call:${forcedToolName}{`\n : \"<start_function_call>call:\";\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// High-level parsing returning workglow ToolCalls type\n// ============================================================================\n\n/**\n * Parse tool calls from model-generated text, returning the workglow `ToolCalls`\n * type directly (with `input` field instead of `arguments`).\n *\n * Tries, in order:\n * 1. FunctionGemma `call:func{...}` syntax\n * 2. `<tool_call>JSON</tool_call>` tags (Qwen/Hermes)\n * 3. Bare JSON objects with `name` + `arguments`/`parameters` keys\n * 4. `{\"function\": {\"name\": ..., \"arguments\": ...}}` format\n *\n * Returns both the cleaned text (with tool-call markup removed) and the parsed\n * ToolCall array.\n */\nexport function parseToolCallsFromText(responseText: string): {\n text: string;\n toolCalls: ToolCalls;\n} {\n // Try FunctionGemma first\n const functionGemmaResult = parseFunctionGemma(responseText);\n if (functionGemmaResult && functionGemmaResult.tool_calls.length > 0) {\n return {\n text: functionGemmaResult.content,\n toolCalls: functionGemmaResult.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: call.name,\n input: call.arguments,\n })),\n };\n }\n\n // FunctionGemma loose-object fallback (no tool name context available)\n const looseObject = parseFunctionGemmaLooseObject(responseText);\n if (looseObject) {\n return {\n text: \"\",\n toolCalls: [{ id: \"call_0\", name: \"\", input: looseObject }],\n };\n }\n\n // Try Hermes/Qwen tag-based format\n const hermesResult = parseHermes(responseText);\n if (hermesResult && hermesResult.tool_calls.length > 0) {\n return {\n text: hermesResult.content,\n toolCalls: hermesResult.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: call.name,\n input: call.arguments,\n })),\n };\n }\n\n // Fallback: brace-balanced scanner for bare JSON objects\n const toolCalls: ToolCalls = [];\n let callIndex = 0;\n\n const jsonCandidates = findBalancedBlocks(responseText, \"{\", \"}\");\n\n const matchedRanges: Array<{ start: number; end: number }> = [];\n for (const candidate of jsonCandidates) {\n try {\n const parsed = JSON.parse(candidate.text);\n if (parsed.name && (parsed.arguments !== undefined || parsed.parameters !== undefined)) {\n const id = `call_${callIndex++}`;\n toolCalls.push({\n id,\n name: parsed.name as string,\n input: (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n });\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n } else if (parsed.function?.name) {\n let functionArgs: unknown = parsed.function.arguments ?? {};\n if (typeof functionArgs === \"string\") {\n try {\n functionArgs = JSON.parse(functionArgs);\n } catch {\n functionArgs = {};\n }\n }\n const id = `call_${callIndex++}`;\n toolCalls.push({\n id,\n name: parsed.function.name as string,\n input: (functionArgs ?? {}) as Record<string, unknown>,\n });\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n }\n } catch {\n // Not valid JSON, skip\n }\n }\n\n let cleanedText = responseText;\n if (toolCalls.length > 0) {\n let result = \"\";\n let lastIndex = 0;\n for (const range of matchedRanges) {\n result += responseText.slice(lastIndex, range.start);\n lastIndex = range.end;\n }\n result += responseText.slice(lastIndex);\n cleanedText = result.trim();\n }\n\n return { text: cleanedText, toolCalls };\n}\n",
|
|
36
39
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { HTF_CACHE_NAME } from \"./HFT_Constants\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { getPipelineCacheKey, loadTransformersSDK, removeCachedPipeline } from \"./HFT_Pipeline\";\n\nfunction hasBrowserCacheStorage(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n typeof (globalThis as unknown as { caches?: CacheStorage }).caches?.open === \"function\"\n );\n}\n\n/**\n * Deletes all Cache Storage entries for a given model path (browser / Service Worker).\n */\nasync function deleteModelCacheFromBrowser(model_path: string): Promise<void> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(HTF_CACHE_NAME);\n const keys = await cache.keys();\n const prefix = `/${model_path}/`;\n\n const requestsToDelete: Request[] = [];\n for (const request of keys) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(prefix)) {\n requestsToDelete.push(request);\n }\n }\n\n for (const request of requestsToDelete) {\n try {\n const deleted = await cache.delete(request);\n if (!deleted) {\n const deletedByUrl = await cache.delete(request.url);\n if (!deletedByUrl) {\n /* ignore */\n }\n }\n } catch (error) {\n console.error(`Failed to delete cache entry: ${request.url}`, error);\n }\n }\n}\n\n/**\n * Removes cached ONNX/tokenizer files from the filesystem (Node/Bun / worker).\n */\nasync function deleteModelCacheFromFilesystem(model: HfTransformersOnnxModelConfig): Promise<void> {\n const { ModelRegistry } = await loadTransformersSDK();\n const { pipeline: pipelineType, model_path, dtype } = model.provider_config;\n await ModelRegistry.clear_pipeline_cache(pipelineType, model_path, {\n ...(dtype ? { dtype } : {}),\n });\n}\n\n/**\n * Core implementation for unloading a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Unload: AiProviderRunFn<\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, _signal) => {\n // Delete the pipeline from the in-memory map\n const cacheKey = getPipelineCacheKey(model!);\n if (removeCachedPipeline(cacheKey)) {\n onProgress(50, \"Pipeline removed from memory\");\n }\n\n const model_path = model!.provider_config.model_path;\n if (hasBrowserCacheStorage()) {\n await deleteModelCacheFromBrowser(model_path);\n } else {\n await deleteModelCacheFromFilesystem(model!);\n }\n onProgress(100, \"Model cache deleted\");\n\n return {\n model: input.model!,\n };\n};\n",
|
|
37
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderReactiveRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { HFT_ModelSearch } from \"./HFT_ModelSearch\";\n\nimport { HFT_BackgroundRemoval } from \"./HFT_BackgroundRemoval\";\nimport { HFT_CountTokens, HFT_CountTokens_Reactive } from \"./HFT_CountTokens\";\nimport { HFT_Download } from \"./HFT_Download\";\nimport { HFT_ImageClassification } from \"./HFT_ImageClassification\";\nimport { HFT_ImageEmbedding } from \"./HFT_ImageEmbedding\";\nimport { HFT_ImageSegmentation } from \"./HFT_ImageSegmentation\";\nimport { HFT_ImageToText } from \"./HFT_ImageToText\";\nimport { HFT_ModelInfo } from \"./HFT_ModelInfo\";\nimport { HFT_ObjectDetection } from \"./HFT_ObjectDetection\";\nimport {\n HFT_StructuredGeneration,\n HFT_StructuredGeneration_Stream,\n} from \"./HFT_StructuredGeneration\";\nimport { HFT_TextClassification } from \"./HFT_TextClassification\";\nimport { HFT_TextEmbedding } from \"./HFT_TextEmbedding\";\nimport { HFT_TextFillMask } from \"./HFT_TextFillMask\";\nimport { HFT_TextGeneration, HFT_TextGeneration_Stream } from \"./HFT_TextGeneration\";\nimport { HFT_TextLanguageDetection } from \"./HFT_TextLanguageDetection\";\nimport { HFT_TextNamedEntityRecognition } from \"./HFT_TextNamedEntityRecognition\";\nimport { HFT_TextQuestionAnswer, HFT_TextQuestionAnswer_Stream } from \"./HFT_TextQuestionAnswer\";\nimport { HFT_TextRewriter, HFT_TextRewriter_Stream } from \"./HFT_TextRewriter\";\nimport { HFT_TextSummary, HFT_TextSummary_Stream } from \"./HFT_TextSummary\";\nimport { HFT_TextTranslation, HFT_TextTranslation_Stream } from \"./HFT_TextTranslation\";\nimport { HFT_Unload } from \"./HFT_Unload\";\n\n/**\n * All HuggingFace Transformers task run functions, keyed by task type name.\n * Used by `@workglow/ai-provider/hf-transformers/runtime` (inline + worker registration) and custom worker scripts when the\n * actual run function implementations are needed (inline mode, worker server).\n */\nexport const HFT_TASKS = {\n DownloadModelTask: HFT_Download,\n UnloadModelTask: HFT_Unload,\n ModelInfoTask: HFT_ModelInfo,\n CountTokensTask: HFT_CountTokens,\n TextEmbeddingTask: HFT_TextEmbedding,\n TextGenerationTask: HFT_TextGeneration,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer,\n TextLanguageDetectionTask: HFT_TextLanguageDetection,\n TextClassificationTask: HFT_TextClassification,\n TextFillMaskTask: HFT_TextFillMask,\n TextNamedEntityRecognitionTask: HFT_TextNamedEntityRecognition,\n TextRewriterTask: HFT_TextRewriter,\n TextSummaryTask: HFT_TextSummary,\n TextTranslationTask: HFT_TextTranslation,\n ImageSegmentationTask: HFT_ImageSegmentation,\n ImageToTextTask: HFT_ImageToText,\n BackgroundRemovalTask: HFT_BackgroundRemoval,\n ImageEmbeddingTask: HFT_ImageEmbedding,\n ImageClassificationTask: HFT_ImageClassification,\n ObjectDetectionTask: HFT_ObjectDetection,\n StructuredGenerationTask: HFT_StructuredGeneration,\n ModelSearchTask: HFT_ModelSearch,\n} as const;\n\n/**\n * Streaming variants of HuggingFace Transformers task run functions.\n */\nexport const HFT_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n TextGenerationTask: HFT_TextGeneration_Stream,\n TextRewriterTask: HFT_TextRewriter_Stream,\n TextSummaryTask: HFT_TextSummary_Stream,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer_Stream,\n TextTranslationTask: HFT_TextTranslation_Stream,\n StructuredGenerationTask: HFT_StructuredGeneration_Stream,\n};\n\nexport const HFT_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n CountTokensTask: HFT_CountTokens_Reactive,\n};\n",
|
|
38
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n
|
|
40
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderReactiveRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\nimport { HFT_ModelSearch } from \"./HFT_ModelSearch\";\n\nimport { HFT_BackgroundRemoval } from \"./HFT_BackgroundRemoval\";\nimport { HFT_CountTokens, HFT_CountTokens_Reactive } from \"./HFT_CountTokens\";\nimport { HFT_Download } from \"./HFT_Download\";\nimport { HFT_ImageClassification } from \"./HFT_ImageClassification\";\nimport { HFT_ImageEmbedding } from \"./HFT_ImageEmbedding\";\nimport { HFT_ImageSegmentation } from \"./HFT_ImageSegmentation\";\nimport { HFT_ImageToText } from \"./HFT_ImageToText\";\nimport { HFT_ModelInfo } from \"./HFT_ModelInfo\";\nimport { HFT_ObjectDetection } from \"./HFT_ObjectDetection\";\nimport {\n HFT_StructuredGeneration,\n HFT_StructuredGeneration_Stream,\n} from \"./HFT_StructuredGeneration\";\nimport { HFT_TextClassification } from \"./HFT_TextClassification\";\nimport { HFT_TextEmbedding } from \"./HFT_TextEmbedding\";\nimport { HFT_TextFillMask } from \"./HFT_TextFillMask\";\nimport { HFT_TextGeneration, HFT_TextGeneration_Stream } from \"./HFT_TextGeneration\";\nimport { HFT_TextLanguageDetection } from \"./HFT_TextLanguageDetection\";\nimport { HFT_TextNamedEntityRecognition } from \"./HFT_TextNamedEntityRecognition\";\nimport { HFT_TextQuestionAnswer, HFT_TextQuestionAnswer_Stream } from \"./HFT_TextQuestionAnswer\";\nimport { HFT_TextRewriter, HFT_TextRewriter_Stream } from \"./HFT_TextRewriter\";\nimport { HFT_TextSummary, HFT_TextSummary_Stream } from \"./HFT_TextSummary\";\nimport { HFT_TextTranslation, HFT_TextTranslation_Stream } from \"./HFT_TextTranslation\";\nimport { HFT_ToolCalling, HFT_ToolCalling_Stream } from \"./HFT_ToolCalling\";\nimport { HFT_Unload } from \"./HFT_Unload\";\n\n/**\n * All HuggingFace Transformers task run functions, keyed by task type name.\n * Used by `@workglow/ai-provider/hf-transformers/runtime` (inline + worker registration) and custom worker scripts when the\n * actual run function implementations are needed (inline mode, worker server).\n */\nexport const HFT_TASKS = {\n DownloadModelTask: HFT_Download,\n UnloadModelTask: HFT_Unload,\n ModelInfoTask: HFT_ModelInfo,\n CountTokensTask: HFT_CountTokens,\n TextEmbeddingTask: HFT_TextEmbedding,\n TextGenerationTask: HFT_TextGeneration,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer,\n TextLanguageDetectionTask: HFT_TextLanguageDetection,\n TextClassificationTask: HFT_TextClassification,\n TextFillMaskTask: HFT_TextFillMask,\n TextNamedEntityRecognitionTask: HFT_TextNamedEntityRecognition,\n TextRewriterTask: HFT_TextRewriter,\n TextSummaryTask: HFT_TextSummary,\n TextTranslationTask: HFT_TextTranslation,\n ImageSegmentationTask: HFT_ImageSegmentation,\n ImageToTextTask: HFT_ImageToText,\n BackgroundRemovalTask: HFT_BackgroundRemoval,\n ImageEmbeddingTask: HFT_ImageEmbedding,\n ImageClassificationTask: HFT_ImageClassification,\n ObjectDetectionTask: HFT_ObjectDetection,\n ToolCallingTask: HFT_ToolCalling,\n StructuredGenerationTask: HFT_StructuredGeneration,\n ModelSearchTask: HFT_ModelSearch,\n} as const;\n\n/**\n * Streaming variants of HuggingFace Transformers task run functions.\n */\nexport const HFT_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n TextGenerationTask: HFT_TextGeneration_Stream,\n TextRewriterTask: HFT_TextRewriter_Stream,\n TextSummaryTask: HFT_TextSummary_Stream,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer_Stream,\n TextTranslationTask: HFT_TextTranslation_Stream,\n ToolCallingTask: HFT_ToolCalling_Stream,\n StructuredGenerationTask: HFT_StructuredGeneration_Stream,\n};\n\nexport const HFT_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n CountTokensTask: HFT_CountTokens_Reactive,\n};\n",
|
|
41
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { QueuedAiProvider } from \"@workglow/ai\";\nimport type {\n IAiExecutionStrategy,\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n AiProviderRegisterOptions,\n AiProviderQueueConcurrency,\n ModelConfig,\n} from \"@workglow/ai\";\nimport { HF_TRANSFORMERS_ONNX, HF_TRANSFORMERS_ONNX_CPU } from \"./common/HFT_Constants\";\nimport type { HfTransformersOnnxModelConfig } from \"./common/HFT_ModelSchema\";\n\nconst GPU_DEVICES = new Set([\"webgpu\", \"gpu\", \"metal\"]);\n\n/** Default concurrent WASM/CPU ONNX jobs in production (ONNX Runtime / wasm backend). */\nconst HFT_CPU_QUEUE_CONCURRENCY_PRODUCTION = 4;\n\n/**\n * When true, use a single worker for the CPU/WASM queue so tests do not contend on the\n * shared HF cache and ONNX wasm (Vitest, Jest, NODE_ENV=test, Bun test).\n */\nfunction hftIsAutomatedTestEnvironment(): boolean {\n if (typeof process === \"undefined\") {\n return false;\n }\n const e = process.env;\n return (\n e.VITEST === \"true\" ||\n e.NODE_ENV === \"test\" ||\n e.BUN_TEST === \"1\" ||\n e.JEST_WORKER_ID !== undefined\n );\n}\n\nfunction hftDefaultCpuQueueConcurrency(): number {\n return hftIsAutomatedTestEnvironment() ? 1 : HFT_CPU_QUEUE_CONCURRENCY_PRODUCTION;\n}\n\nfunction resolveHftCpuQueueConcurrency(\n concurrency: AiProviderQueueConcurrency | undefined,\n defaultCpu: () => number\n): number {\n if (concurrency === undefined) {\n return defaultCpu();\n }\n if (typeof concurrency === \"number\") {\n return defaultCpu();\n }\n return concurrency.cpu ?? defaultCpu();\n}\n\n/**\n * Main-thread registration (inline or worker-backed).\n * WebGPU/GPU/Metal models use the `gpu` slot (or a numeric `queue.concurrency`, default 1).\n * WASM/CPU models use a separate {@link HF_TRANSFORMERS_ONNX_CPU} queue with higher\n * concurrency (4 in production, 1 under automated tests) to limit ONNX worker contention.\n * Set `cpu` in `queue.concurrency` to override the default.\n */\nexport class HuggingFaceTransformersQueuedProvider extends QueuedAiProvider<HfTransformersOnnxModelConfig> {\n readonly name = HF_TRANSFORMERS_ONNX;\n readonly displayName = \"Hugging Face Transformers (ONNX)\";\n readonly isLocal = true;\n readonly supportsBrowser = true;\n\n private cpuStrategy: IAiExecutionStrategy | undefined;\n\n readonly taskTypes = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"ModelInfoTask\",\n \"CountTokensTask\",\n \"TextEmbeddingTask\",\n \"TextGenerationTask\",\n \"TextQuestionAnswerTask\",\n \"TextLanguageDetectionTask\",\n \"TextClassificationTask\",\n \"TextFillMaskTask\",\n \"TextNamedEntityRecognitionTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"TextTranslationTask\",\n \"ImageSegmentationTask\",\n \"ImageToTextTask\",\n \"BackgroundRemovalTask\",\n \"ImageEmbeddingTask\",\n \"ImageClassificationTask\",\n \"ObjectDetectionTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, HfTransformersOnnxModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, HfTransformersOnnxModelConfig>>,\n reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, HfTransformersOnnxModelConfig>>\n ) {\n super(tasks, streamTasks, reactiveTasks);\n }\n\n protected override async afterRegister(options: AiProviderRegisterOptions): Promise<void> {\n await super.afterRegister(options);\n this.cpuStrategy = this.createQueuedStrategy(\n HF_TRANSFORMERS_ONNX_CPU,\n resolveHftCpuQueueConcurrency(options.queue?.concurrency, hftDefaultCpuQueueConcurrency),\n options\n );\n }\n\n protected override getStrategyForModel(model: ModelConfig): IAiExecutionStrategy {\n const device = (model as HfTransformersOnnxModelConfig).provider_config?.device;\n if (device && GPU_DEVICES.has(device)) {\n return this.queuedStrategy!;\n }\n return this.cpuStrategy!;\n }\n}\n",
|
|
39
42
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { clearHftInlinePipelineCache } from \"./common/HFT_InlineLifecycle\";\nimport { HFT_REACTIVE_TASKS, HFT_STREAM_TASKS, HFT_TASKS } from \"./common/HFT_JobRunFns\";\nimport { HuggingFaceTransformersQueuedProvider } from \"./HuggingFaceTransformersQueuedProvider\";\nimport { loadTransformersSDK } from \"./common/HFT_Pipeline\";\n\n/**\n * Register HuggingFace Transformers ONNX on the **main thread** with inline execution\n * (full `@huggingface/transformers` and all task run functions in this bundle).\n *\n * **Re-exported from `@workglow/ai-provider/hf-transformers/runtime`** — not from\n * `@workglow/ai-provider/hf-transformers` — so worker-only apps do not pull this graph.\n */\nexport async function registerHuggingFaceTransformersInline(\n options?: AiProviderRegisterOptions\n): Promise<void> {\n const { env } = await loadTransformersSDK();\n env.backends!.onnx!.wasm!.proxy = true;\n const provider = new HuggingFaceTransformersQueuedProvider(\n HFT_TASKS,\n HFT_STREAM_TASKS,\n HFT_REACTIVE_TASKS\n );\n const baseDispose = provider.dispose.bind(provider);\n provider.dispose = async () => {\n await clearHftInlinePipelineCache();\n await baseDispose();\n };\n await provider.register(options ?? {});\n}\n",
|
|
40
43
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Worker-only entry: registers HuggingFace Transformers task run functions on the worker server.\n * Re-exported from `@workglow/ai-provider/hf-transformers/runtime` so the main bundle does not resolve\n * `HFT_JobRunFns` / full task implementations.\n */\n\nimport { getLogger, globalServiceRegistry, WORKER_SERVER } from \"@workglow/util/worker\";\nimport { HFT_REACTIVE_TASKS, HFT_STREAM_TASKS, HFT_TASKS } from \"./common/HFT_JobRunFns\";\nimport { HuggingFaceTransformersProvider } from \"./HuggingFaceTransformersProvider\";\nimport { loadTransformersSDK } from \"./common/HFT_Pipeline\";\n\nexport async function registerHuggingFaceTransformersWorker(): Promise<void> {\n const sdk = await loadTransformersSDK();\n\n (globalThis as any).__HFT__ = sdk;\n\n const { env } = sdk;\n env.backends!.onnx!.wasm!.proxy = true;\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new HuggingFaceTransformersProvider(\n HFT_TASKS,\n HFT_STREAM_TASKS,\n HFT_REACTIVE_TASKS\n ).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n getLogger().info(\"HuggingFaceTransformers worker job run functions registered\");\n}\n",
|
|
41
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n
|
|
42
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Heavyweight HuggingFace Transformers registration: worker server (`registerHuggingFaceTransformersWorker`)\n * and main-thread inline (`registerHuggingFaceTransformersInline`). Import from\n * `@workglow/ai-provider/hf-transformers/runtime` only — not from the main `hf-transformers` barrel.\n *\n * Use `export *` (not `export { … } from \"…\"`) so the Bun bundler keeps the module graph; the latter\n * was emitted as bare re-exports with no bindings.\n */\n\nexport * from \"./common/HFT_Constants\";\nexport * from \"./common/HFT_ModelSchema\";\nexport * from \"./common/HFT_OnnxDtypes\";\nexport * from \"./registerHuggingFaceTransformersInline\";\nexport * from \"./registerHuggingFaceTransformersWorker\";\nexport * from \"./common/HFT_Pipeline\";\n"
|
|
44
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n} from \"@workglow/ai/worker\";\nimport { HF_TRANSFORMERS_ONNX } from \"./common/HFT_Constants\";\nimport type { HfTransformersOnnxModelConfig } from \"./common/HFT_ModelSchema\";\n\n/**\n * AI provider for HuggingFace Transformers ONNX models.\n *\n * Supports text, vision, and multimodal tasks via the @huggingface/transformers library.\n *\n * Task run functions are injected via the constructor so that the heavy\n * `@huggingface/transformers` library is only imported where actually needed\n * (inline mode, worker server), not on the main thread in worker mode.\n */\nexport class HuggingFaceTransformersProvider extends AiProvider<HfTransformersOnnxModelConfig> {\n readonly name = HF_TRANSFORMERS_ONNX;\n readonly displayName = \"Hugging Face Transformers (ONNX)\";\n readonly isLocal = true;\n readonly supportsBrowser = true;\n\n readonly taskTypes = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"ModelInfoTask\",\n \"CountTokensTask\",\n \"TextEmbeddingTask\",\n \"TextGenerationTask\",\n \"TextQuestionAnswerTask\",\n \"TextLanguageDetectionTask\",\n \"TextClassificationTask\",\n \"TextFillMaskTask\",\n \"TextNamedEntityRecognitionTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"TextTranslationTask\",\n \"ImageSegmentationTask\",\n \"ImageToTextTask\",\n \"BackgroundRemovalTask\",\n \"ImageEmbeddingTask\",\n \"ImageClassificationTask\",\n \"ObjectDetectionTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, HfTransformersOnnxModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, HfTransformersOnnxModelConfig>>,\n reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, HfTransformersOnnxModelConfig>>\n ) {\n super(tasks, streamTasks, reactiveTasks);\n }\n}\n",
|
|
45
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Heavyweight HuggingFace Transformers registration: worker server (`registerHuggingFaceTransformersWorker`)\n * and main-thread inline (`registerHuggingFaceTransformersInline`). Import from\n * `@workglow/ai-provider/hf-transformers/runtime` only — not from the main `hf-transformers` barrel.\n *\n * Use `export *` (not `export { … } from \"…\"`) so the Bun bundler keeps the module graph; the latter\n * was emitted as bare re-exports with no bindings.\n */\n\nexport * from \"./common/HFT_Constants\";\nexport * from \"./common/HFT_ModelSchema\";\nexport * from \"./common/HFT_OnnxDtypes\";\nexport * from \"./common/HFT_ToolMarkup\";\nexport * from \"./registerHuggingFaceTransformersInline\";\nexport * from \"./registerHuggingFaceTransformersWorker\";\nexport * from \"./common/HFT_Pipeline\";\n"
|
|
43
46
|
],
|
|
44
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;AAUO,SAAS,cAAc,CAAC,KAAmB;AAAA,EAChD,YAAY;AAAA,EACZ,IAAI,kBAAkB;AAAA,IACpB,iBAAiB,IAAI,WAAW;AAAA,EAClC;AAAA;AAGF,eAAsB,mBAAmB,GAAG;AAAA,EAC1C,IAAI,CAAC,kBAAkB;AAAA,IACrB,IAAI;AAAA,MACF,mBAAmB,MAAa;AAAA,MAChC,iBAAiB,IAAI,QAAQ;AAAA,MAC7B,IAAI,WAAW;AAAA,QACb,iBAAiB,IAAI,WAAW;AAAA,MAClC;AAAA,MACA,MAAM;AAAA,MACN,MAAM,IAAI,MACR,8HACF;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA;AAMT,SAAS,mBAAmB,CAC1B,gBACA,aACyB;AAAA,EACzB,IAAI,CAAC,gBAAgB;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,aAAa;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,WAAW,YAAY,SAAS;AAAA,IACjD,OAAO,YAAY,MAAM,eAAe,UAAU,YAAY,MAAM;AAAA,EACtE;AAAA,EACA,IAAI,OAAO,YAAY,QAAQ,YAAY;AAAA,IACzC,OAAO,YAAY,IAAI,CAAC,gBAAgB,WAAW,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,aAAa,IAAI;AAAA,EACvB,MAAM,QAAQ,CAAC,UAAiB;AAAA,IAC9B,MAAM,SAAS,MAAM;AAAA,IACrB,WAAW,MAAM,OAAO,MAAM;AAAA;AAAA,EAEhC,eAAe,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EAC9D,YAAY,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EAC3D,OAAO,WAAW;AAAA;AAGpB,SAAS,gBAAgB,CAAC,QAA4B;AAAA,EACpD,MAAM,SAAS,OAAO;AAAA,EACtB,IAAI,kBAAkB,OAAO;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,OAAO,IAAI,MAAM,OAAO,UAAU,eAAe,CAAC;AAAA;AAGpD,SAAS,qBAAqB,CAAC,UAAoB,QAA2C;AAAA,EAC5F,IAAI,CAAC,UAAU,CAAC,SAAS,MAAM;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBAAsB,SAAS,QAAQ,IAAI,gBAAgB;AAAA,EACjE,MAAM,eACJ,uBAAuB,QAAQ,KAAK,mBAAmB,IACnD,OAAO,SAAS,qBAAqB,EAAE,IACvC;AAAA,EACN,MAAM,aAAa,SAAS;AAAA,EAM5B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,SAAS;AAAA,EAEb,MAAM,UAAU,MAAM;AAAA,IACpB,IAAI,cAAc;AAAA,MAChB,OAAO,oBAAoB,SAAS,YAAY;AAAA,MAChD,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ,YAAY;AAAA;AAAA,EAGtB,MAAM,OAAO,IAAI,eAA2B;AAAA,IAC1C,KAAK,CAAC,YAAY;AAAA,MAChB,SAAS,WAAW,UAAU;AAAA,MAC9B,IAAI,OAAO,SAAS;AAAA,QAClB,WAAW,MAAM,iBAAiB,MAAM,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,MACA,eAAe,MAAM,WAAW,MAAM,iBAAiB,MAAM,CAAC;AAAA,MAC9D,OAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,SAEzD,KAAI,CAAC,YAAY;AAAA,MACrB,IAAI;AAAA,QACF,IAAI,OAAO,SAAS;AAAA,UAClB,MAAM,iBAAiB,MAAM;AAAA,QAC/B;AAAA,QAEA,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,QAC1C,IAAI,MAAM;AAAA,UACR,IAAI,OAAO,SAAS;AAAA,YAClB,MAAM,iBAAiB,MAAM;AAAA,UAC/B;AAAA,UACA,IAAI,iBAAiB,aAAa,SAAS,cAAc;AAAA,YACvD,MAAM,IAAI,MACR,sDAAsD,UAAU,qBAClE;AAAA,UACF;AAAA,UACA,QAAQ;AAAA,UACR,WAAW,MAAM;AAAA,UACjB;AAAA,QACF;AAAA,QAEA,UAAU,MAAM;AAAA,QAChB,WAAW,QAAQ,KAAK;AAAA,QACxB,OAAO,OAAO;AAAA,QACd,QAAQ;AAAA,QACR,WAAW,MAAM,KAAK;AAAA;AAAA;AAAA,IAG1B,MAAM,CAAC,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,OAAO,WAAW,OAAO,MAAM;AAAA;AAAA,EAEnC,CAAC;AAAA,EAED,OAAO,IAAI,SAAS,MAAM;AAAA,IACxB,SAAS,IAAI,QAAQ,SAAS,OAAO;AAAA,IACrC,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,EACvB,CAAC;AAAA;AAGH,SAAS,cAAc,CAAC,KAAa,SAA0C;AAAA,EAC7E,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,WAAW,IAAI,IAAI,GAAG,EAAE;AAAA,IAC9B,YAAY,WAAW,eAAe,uBAAuB;AAAA,MAC3D,IAAI,SAAS,SAAS,IAAI,YAAY,GAAG;AAAA,QACvC,cAAc,WAAW;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM;AAAA,EAGR,MAAM,iBAAiB,SAAS,SAC5B,oBAAoB,QAAQ,QAAQ,WAAW,IAC/C;AAAA,EACJ,OAAO,MAAM,KAAK,KAAK,YAAa,iBAAiB,EAAE,QAAQ,eAAe,IAAI,CAAC,EAAG,CAAC,EAAE,KACvF,CAAC,aAAa,sBAAsB,UAAU,cAAc,CAC9D;AAAA;AAoCK,SAAS,kBAAkB,GAAS;AAAA,EACzC,UAAU,MAAM;AAAA;AAGX,SAAS,iBAAiB,CAAC,UAA2B;AAAA,EAC3D,OAAO,UAAU,IAAI,QAAQ;AAAA;AAGxB,SAAS,oBAAoB,CAAC,UAA2B;AAAA,EAC9D,OAAO,UAAU,OAAO,QAAQ;AAAA;AAIlC,SAAS,YAAY,GAAY;AAAA,EAC/B,IAAI,OAAO,eAAe;AAAA,IAAa,OAAO;AAAA,EAE9C,IAAI,OAAQ,WAAmB,WAAW;AAAA,IAAa,OAAO;AAAA,EAE9D,IAAI,OAAQ,WAAmB,sBAAsB;AAAA,IAAa,OAAO;AAAA,EACzE,OAAO;AAAA;AAOF,SAAS,mBAAmB,CAAC,OAA8C;AAAA,EAChF,MAAM,QAAQ,MAAM,gBAAgB,SAAS;AAAA,EAC7C,MAAM,SAAS,MAAM,gBAAgB,UAAU;AAAA,EAC/C,MAAM,WAAW,MAAM,gBAAgB,YAAY;AAAA,EACnD,OAAO,GAAG,MAAM,gBAAgB,cAAc,MAAM,gBAAgB,YAAY,SAAS,UAAU;AAAA;AASrG,eAAsB,WAAW,CAC/B,OACA,YACA,UAAkC,CAAC,GACnC,QACA,mBAA2B,IACb;AAAA,EACd,MAAM,WAAW,oBAAoB,KAAK;AAAA,EAC1C,IAAI,UAAU,IAAI,QAAQ,GAAG;AAAA,IAC3B,UAAU,EAAE,MAAM,0BAA0B,EAAE,SAAS,CAAC;AAAA,IACxD,OAAO,UAAU,IAAI,QAAQ;AAAA,EAC/B;AAAA,EAIA,MAAM,WAAW,qBAAqB,IAAI,QAAQ;AAAA,EAClD,IAAI,UAAU;AAAA,IACZ,IAAI;AAAA,MACF,MAAM;AAAA,MACN,MAAM;AAAA,IAGR,MAAM,SAAS,UAAU,IAAI,QAAQ;AAAA,IACrC,IAAI;AAAA,MAAQ,OAAO;AAAA,EAErB;AAAA,EAEA,MAAM,cAAc,cAClB,OACA,YACA,SACA,kBACA,UACA,MACF,EAAE,QAAQ,MAAM;AAAA,IACd,qBAAqB,OAAO,QAAQ;AAAA,GACrC;AAAA,EACD,qBAAqB,IAAI,UAAU,WAAW;AAAA,EAC9C,OAAO;AAAA;AAAA,IAvRL,kBACA,WA+BE,uBAyIA,WAGA,sBAQA,sBAiBO,4BAA4B,uBAqFnC,gBAAgB,OACpB,OACA,YACA,SACA,kBACA,UACA,WACG;AAAA,EAEH,IAAI,mBAAmB;AAAA,EAEvB,IAAI,kBAKO;AAAA,EACX,IAAI,gBAAsD;AAAA,EAC1D,MAAM,cAAc;AAAA,EAEpB,MAAM,uBAAuB,CAC3B,MACA,cACA,aAC6D;AAAA,IAC7D,MAAM,UAAoE;AAAA,MACxE;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,IAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAAA,MAChD,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,OAAO;AAAA;AAAA,EAOT,MAAM,eAAe,CACnB,UACA,MACA,cACA,aACS;AAAA,IACT,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,MAAM,qBAAqB,MAAM;AAAA,IACjC,MAAM,UAAU,qBAAqB;AAAA,IACrC,MAAM,UAAU,YAAY;AAAA,IAE5B,IAAI,WAAW,SAAS;AAAA,MACtB,IAAI,eAAe;AAAA,QACjB,aAAa,aAAa;AAAA,QAC1B,gBAAgB;AAAA,MAClB;AAAA,MACA,kBAAkB;AAAA,MAClB,WACE,KAAK,MAAM,QAAQ,GACnB,qBACA,qBAAqB,MAAM,cAAc,QAAQ,CACnD;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,IAAI,qBAAqB,aAAa;AAAA,MACpC,kBAAkB,EAAE,UAAU,MAAM,cAAc,SAAS;AAAA,MAC3D,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,gBAAgB,KAAK,IAAI,GAAG,cAAc,kBAAkB;AAAA,QAClE,gBAAgB,WAAW,MAAM;AAAA,UAC/B,gBAAgB;AAAA,UAChB,IAAI,iBAAiB;AAAA,YACnB,MAAM,IAAI;AAAA,YACV,WACE,KAAK,MAAM,EAAE,QAAQ,GACrB,qBACA,qBAAqB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,CACzD;AAAA,YACA,mBAAmB,KAAK,IAAI;AAAA,YAC5B,kBAAkB;AAAA,UACpB;AAAA,WACC,aAAa;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,IAEA,WACE,KAAK,MAAM,QAAQ,GACnB,qBACA,qBAAqB,MAAM,cAAc,QAAQ,CACnD;AAAA,IACA,mBAAmB;AAAA,IACnB,kBAAkB;AAAA;AAAA,EAIpB,MAAM,cAAc;AAAA,EAGpB,MAAM,YAAY,MAAM,gBAAgB;AAAA,EACxC,MAAM,kBAAkB,IAAI;AAAA,EAC5B,sBAAsB,IAAI,WAAW,eAAe;AAAA,EACpD,IAAI,aAAa;AAAA,IACf,IAAI,YAAY,SAAS;AAAA,MACvB,gBAAgB,MAAM;AAAA,IACxB,EAAO;AAAA,MACL,YAAY,iBAAiB,SAAS,MAAM,gBAAgB,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,EAEvF;AAAA,EAGA,MAAM,mBAAmB,CAAC,WAAyB;AAAA,IACjD,IAAI,aAAa;AAAA,MAAS;AAAA,IAE1B,IAAK,OAAe,WAAW,kBAAkB;AAAA,MAC/C,MAAM,cAAc;AAAA,MACpB,MAAM,iBAAkB,YAAY,WAAW,mBAAoB;AAAA,MAGnE,IAAI,aAAa;AAAA,MACjB,IAAI,qBAAqB;AAAA,MACzB,MAAM,QACJ,YAAY;AAAA,MACd,IAAI,OAAO;AAAA,QACT,YAAY,MAAM,SAAS,OAAO,QAAQ,KAAK,GAAG;AAAA,UAChD,IAAI,KAAK,SAAS,KAAK,OAAO;AAAA,YAC5B,aAAa;AAAA,YACb,qBAAqB,KAAK,QAAQ,IAAK,KAAK,SAAS,KAAK,QAAS,MAAM;AAAA,YACzE;AAAA,UACF;AAAA,QACF;AAAA,QACA,IAAI,CAAC,YAAY;AAAA,UACf,MAAM,YAAY,OAAO,KAAK,KAAK;AAAA,UACnC,IAAI,UAAU,SAAS,GAAG;AAAA,YACxB,aAAa,UAAU,UAAU,SAAS;AAAA,YAC1C,qBAAqB;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,aAAa,gBAAgB,YAAY,oBAAoB,KAAK;AAAA,IACpE;AAAA;AAAA,EAGF,IAAI,SAAS,MAAM,gBAAgB;AAAA,EACnC,IAAI,aAAa,GAAG;AAAA,IAElB,IAAI,WAAW,OAAO;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,IACA,IAAI,WAAW,OAAO;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,IACA,IAAI,WAAW,UAAU,WAAW,UAAU;AAAA,MAC5C,SAAS;AAAA,IACX;AAAA,EACF,EAAO;AAAA,IAEL,IAAI,WAAW,UAAU,WAAW,UAAU;AAAA,MAC5C,SAAS;AAAA,IACX;AAAA;AAAA,EAGF,MAAM,QAAQ,MAAM,gBAAgB,SAAS;AAAA,EAC7C,MAAM,kBAA0C;AAAA,IAC9C,UAAU,MAAM,gBAAgB,YAAY;AAAA,OACxC,MAAM,gBAAgB,2BACtB,EAAE,uBAAuB,MAAM,gBAAgB,yBAAyB,IACxE,CAAC;AAAA,OACD,QAAQ,EAAE,MAAoB,IAAI,CAAC;AAAA,OACnC,SAAS,EAAE,OAAsB,IAAI,CAAC;AAAA,OACvC;AAAA,IACH,mBAAmB;AAAA,EACrB;AAAA,EAGA,IAAI,aAAa,SAAS;AAAA,IACxB,sBAAsB,OAAO,SAAS;AAAA,IACtC,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EAEA,MAAM,eAAe,MAAM,gBAAgB;AAAA,EAE3C,QAAQ,aAAa,MAAM,oBAAoB;AAAA,EAE/C,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,qBAAqB,gBAAgB;AAAA,EAC3C,OAAO,KAAK,oBAAoB,EAAE,cAAc,UAAU,CAAC;AAAA,EAE3D,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,SAAS,cAAc,MAAM,gBAAgB,YAAY,eAAe;AAAA,IAG7F,IAAI,eAAe;AAAA,MACjB,aAAa,aAAa;AAAA,MAC1B,gBAAgB;AAAA,IAClB;AAAA,IAEA,MAAM,eAAe;AAAA,IAMrB,IAAI,cAAc;AAAA,MAChB,WACE,KAAK,MAAM,aAAa,QAAQ,GAChC,qBACA,qBAAqB,aAAa,MAAM,aAAa,cAAc,aAAa,QAAQ,CAC1F;AAAA,MACA,kBAAkB;AAAA,IACpB;AAAA,IAGA,IAAI,aAAa,SAAS;AAAA,MACxB,OAAO,QAAQ,oBAAoB,EAAE,QAAQ,UAAU,CAAC;AAAA,MACxD,MAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,IAMA,IAAI,qBAAqB,IAAI,YAAY,KAAM,OAAe,aAAa,MAAM;AAAA,MAC/E,MAAM,IAAI,MACR,GAAG,iEACE,gBAAgB,2CACvB;AAAA,IACF;AAAA,IAEA,OAAO,QAAQ,oBAAoB,EAAE,QAAQ,SAAS,CAAC;AAAA,IACvD,UAAU,IAAI,UAAU,MAAM;AAAA,IAC9B,OAAO;AAAA,IACP,OAAO,OAAY;AAAA,IACnB,OAAO,QAAQ,oBAAoB,EAAE,QAAQ,SAAS,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,IAG5E,IACE,CAAC,OAAO,SAAS,WAAW,yBAAyB,MACpD,aAAa,WAAW,gBAAgB,OAAO,UAChD;AAAA,MACA,MAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,YACN;AAAA,IACA,sBAAsB,OAAO,SAAS;AAAA,IACtC,QAAQ,WAAW,MAAM,oBAAoB;AAAA,IAC7C,OAAO,KAAK,MAAM,gBAAgB,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,EAjfjD,wBAAwB,IAAI;AAAA,EAyI5B,YAAY,IAAI;AAAA,EAGhB,uBAAuB,IAAI;AAAA,EAQ3B,uBAAuB,IAAI,IAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA;;;ACjMM,IAAM,uBAAuB;AAE7B,IAAM,2BAA2B,GAAG;AAEpC,IAAM,2BAA2B,GAAG;AACpC,IAAM,iBAAiB;AAavB,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AACT;AAcA,IAAM,sBAAsB;AAAA,EAC1B,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,4BAA4B;AAAA,EAC5B,sBAAsB;AACxB;AAcA,IAAM,wBAAwB;AAAA,EAC5B,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAElB,iBAAiB;AAAA,EAEjB,oBAAoB;AAAA,EACpB,4BAA4B;AAC9B;AAOA,IAAM,uBAAuB;AAAA,EAC3B,wBAAwB;AAAA,EACxB,gCAAgC;AAAA,EAChC,kBAAkB;AACpB;AASA,IAAM,4BAA4B;AAAA,EAChC,+BAA+B;AAAA,EAC/B,iBAAiB;AAAA,EACjB,kCAAkC;AAAA,EAClC,kCAAkC;AAAA,EAClC,8BAA8B;AAChC;AAQO,IAAM,kBAAkB;AAAA,KAC1B;AAAA,KACA;AAAA,KACA;AAAA,KACA;AACL;;ACrHA;AAIO,IAAM,gCAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,YAAY;AAAA,IACV,UAAU;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,UAAU;AAAA,UACR,MAAM;AAAA,UACN,MAAM,OAAO,OAAO,eAAe;AAAA,UACnC,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,OAAO,OAAO,oBAAoB;AAAA,UACxC,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,CAAC,OAAO,OAAO,UAAU,QAAQ,OAAO;AAAA,UAC9C,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,qBAAqB;AAAA,UACnB,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,QACA,sBAAsB;AAAA,UACpB,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA,sBAAsB;AAAA,UACpB,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA,0BAA0B;AAAA,UACxB,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM,CAAC,QAAQ,cAAc,KAAK;AAAA,UAClC,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aACE;AAAA,UACF,SAAS;AAAA,QACX;AAAA,QACA,KAAK;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAU,CAAC,cAAc,UAAU;AAAA,MACnC,sBAAsB;AAAA,MACtB,IAAI;AAAA,QACF,YAAY;AAAA,UACV,UAAU;AAAA,YACR,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,UAAU,CAAC,mBAAmB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU,CAAC,YAAY,iBAAiB;AAAA,EACxC,sBAAsB;AACxB;AAEO,IAAM,sCAAsC;AAAA,EACjD,MAAM;AAAA,EACN,YAAY;AAAA,OACP,kBAAkB;AAAA,OAClB,8BAA8B;AAAA,EACnC;AAAA,EACA,UAAU,CAAC,GAAG,kBAAkB,UAAU,GAAG,8BAA8B,QAAQ;AAAA,EACnF,sBAAsB;AACxB;AAIO,IAAM,sCAAsC;AAAA,EACjD,MAAM;AAAA,EACN,YAAY;AAAA,OACP,kBAAkB;AAAA,OAClB,8BAA8B;AAAA,EACnC;AAAA,EACA,UAAU,CAAC,GAAG,kBAAkB,UAAU,GAAG,8BAA8B,QAAQ;AAAA,EACnF,sBAAsB;AACxB;;ACjIO,IAAM,mCAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR;AAIA,IAAM,yBACJ,OAAO,QAAQ,gCAAgC,EAE9C,OAAO,IAAI,YAAY,WAAW,EAAE,EACpC,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM;AAEpC,SAAS,sBAAsB,CAAC,QAKhB;AAAA,EACrB,MAAM,YAAY,OAAO,aAAa;AAAA,EACtC,MAAM,SAAS,YAAY;AAAA,EAE3B,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,MAAM,OAAO,WAAW;AAAA,IACjC,IAAI,CAAC,GAAG,WAAW,MAAM;AAAA,MAAG;AAAA,IAC5B,IAAI,CAAC,GAAG,SAAS,OAAO;AAAA,MAAG;AAAA,IAC3B,IAAI,GAAG,SAAS,YAAY;AAAA,MAAG;AAAA,IAC/B,MAAM,KAAK,GAAG,MAAM,OAAO,QAAQ,CAAC,QAAQ,MAAM,CAAC;AAAA,EACrD;AAAA,EAEA,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAEhC,MAAM,SAA+D,CAAC;AAAA,EACtE,WAAW,QAAQ,OAAO;AAAA,IACxB,IAAI,UAAU;AAAA,IACd,YAAY,OAAO,WAAW,wBAAwB;AAAA,MACpD,IAAI,KAAK,SAAS,MAAM,GAAG;AAAA,QACzB,OAAO,KAAK,EAAE,UAAU,KAAK,MAAM,GAAG,CAAC,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,QAC9D,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,KAAK,EAAE,UAAU,MAAM,OAAO,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,EAC1D,MAAM,UAAU,IAAI;AAAA,EACpB,aAAa,UAAU,WAAW,QAAQ;AAAA,IACxC,IAAI,MAAM,QAAQ,IAAI,KAAK;AAAA,IAC3B,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI;AAAA,MACV,QAAQ,IAAI,OAAO,GAAG;AAAA,IACxB;AAAA,IACA,IAAI,IAAI,QAAQ;AAAA,EAClB;AAAA,EAEA,MAAM,YAAY,OAAO,KAAK,gCAAgC;AAAA,EAC9D,OAAO,UAAU,OAAO,CAAC,UAAU;AAAA,IACjC,MAAM,MAAM,QAAQ,IAAI,KAAK;AAAA,IAC7B,OAAO,QAAQ,aAAa,IAAI,SAAS,aAAa;AAAA,GACvD;AAAA;;ACpEH,eAAsB,2BAA2B,GAAkB;AAAA,EACjE,QAAQ,4CAAuB;AAAA,EAC/B,oBAAmB;AAAA;;;ACErB,IAAM,oBAA8C;AAAA,EAClD,mBAAmB,CAAC,oBAAoB;AAAA,EACxC,oBAAoB,CAAC,iBAAiB;AAAA,EACtC,iBAAiB,CAAC,uBAAuB,eAAe;AAAA,EACxD,qBAAqB,CAAC,aAAa;AAAA,EACnC,wBAAwB,CAAC,uBAAuB,0BAA0B;AAAA,EAC1E,wBAAwB,CAAC,oBAAoB;AAAA,EAC7C,kBAAkB,CAAC,WAAW;AAAA,EAC9B,2BAA2B,CAAC,qBAAqB;AAAA,EACjD,gCAAgC,CAAC,sBAAsB;AAAA,EACvD,yBAAyB,CAAC,sBAAsB;AAAA,EAChD,yBAAyB,CAAC,wBAAwB,gCAAgC;AAAA,EAClF,oBAAoB,CAAC,0BAA0B;AAAA,EAC/C,uBAAuB,CAAC,oBAAoB;AAAA,EAC5C,kBAAkB,CAAC,gBAAgB;AAAA,EACnC,iBAAiB,CAAC,eAAe;AAAA,EACjC,qBAAqB,CAAC,oBAAoB,4BAA4B;AAAA,EACtE,qBAAqB,CAAC,kBAAkB;AAAA,EACxC,yBAAyB,CAAC,sBAAsB;AAAA,EAChD,uBAAuB,CAAC,8BAA8B;AACxD;AAaO,SAAS,mBAAmB,CAAC,UAA4B;AAAA,EAC9D,OAAO,OAAO,QAAQ,iBAAiB,EACpC,OAAO,IAAI,gBAAe,WAAU,SAAS,QAAQ,CAAC,EACtD,IAAI,EAAE,UAAU,IAAI;AAAA;;;AC1BzB,IAAM,cAAc;AAEb,SAAS,eAAe,CAAC,GAAmB;AAAA,EACjD,IAAI,KAAK;AAAA,IAAW,OAAO,IAAI,IAAI,KAAW,QAAQ,CAAC;AAAA,EACvD,IAAI,KAAK;AAAA,IAAO,OAAO,IAAI,IAAI,MAAO,QAAQ,CAAC;AAAA,EAC/C,OAAO,OAAO,CAAC;AAAA;AAMV,SAAS,mBAAmB,CACjC,OACA,UACyB;AAAA,EACzB,QAAQ;AAAA,SACD;AAAA,MACH,OAAO;AAAA,QACL,YAAY,MAAM;AAAA,WACd,MAAM,eAAe,EAAE,UAAU,MAAM,aAAa,IAAI,CAAC;AAAA,MAC/D;AAAA,SACG;AAAA,MACH,OAAO,EAAE,YAAY,MAAM,GAAG;AAAA;AAAA,MAE9B,OAAO,EAAE,YAAY,MAAM,GAAG;AAAA;AAAA;AAO7B,SAAS,gBAAgB,CAAC,OAAqB,UAAyC;AAAA,EAC7F,MAAM,SAAS,CAAC,MAAM,cAAc,MAAM,YAAY,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAClF,OAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,OAAO,GAAG,MAAM,KAAK,SAAS,KAAK,WAAW;AAAA,IAC9C,aAAa,GAAG,gBAAgB,MAAM,SAAS;AAAA,IAC/C,QAAQ;AAAA,MACN,UAAU,MAAM;AAAA,MAChB;AAAA,MACA,OAAO,MAAM,GAAG,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AAAA,MAC1C,aAAa,CAAC,MAAM,cAAc,GAAG,gBAAgB,MAAM,SAAS,aAAa,EAC9E,OAAO,OAAO,EACd,KAAK,KAAU;AAAA,MAClB,OAAO,MAAM,eAAe,oBAAoB,MAAM,YAAY,IAAI,CAAC;AAAA,MACvE,iBAAiB,oBAAoB,OAAO,QAAQ;AAAA,MACpD,UAAU,CAAC;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AAAA;AAOF,eAAsB,cAAc,CAClC,OACA,aACA,cACA,QACyB;AAAA,EACzB,MAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,OACR;AAAA,EACL,CAAC;AAAA,EACD,OAAO,OAAO,YAAY,cAAc;AAAA,EACxC,IAAI,cAAc;AAAA,IAChB,WAAW,SAAS,cAAc;AAAA,MAChC,OAAO,OAAO,YAAY,KAAK;AAAA,IACjC;AAAA,EACF;AAAA,EACA,MAAM,MAAM,MAAM,MAAM,GAAG,sBAAsB,UAAU,EAAE,OAAO,CAAC;AAAA,EACrE,IAAI,CAAC,IAAI;AAAA,IAAI,MAAM,IAAI,MAAM,4BAA4B,IAAI,QAAQ;AAAA,EACrE,OAAO,IAAI,KAAK;AAAA;;;ACtFX,IAAM,kBAAgF,OAC3F,OACA,QACA,aACA,WACG;AAAA,EACH,MAAM,UAAU,MAAM,eACpB,MAAM,OAAO,KAAK,KAAK,IACvB,EAAE,QAAQ,OAAO,GACjB,CAAC,UAAU,GACX,MACF;AAAA,EACA,MAAM,UAAU,QAAQ,IAAI,CAAC,UAAU;AAAA,IACrC,MAAM,OAAO,iBAAiB,OAAO,oBAAoB;AAAA,IAGzD,IAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAAA,MAC/C,MAAM,YAAY,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,MACvD,MAAM,gBAAgB,uBAAuB,EAAE,UAAU,CAAC;AAAA,MAC1D,IAAI,cAAc,SAAS,GAAG;AAAA,QAC5B,MAAM,SAAS,KAAK;AAAA,QACpB,MAAM,iBAAkB,OAAO,mBAAmB,CAAC;AAAA,QACnD,eAAe,gBAAgB;AAAA,QAC/B,OAAO,kBAAkB;AAAA,MAC3B;AAAA,IACF;AAAA,IAGA,MAAM,MAAM,KAAK;AAAA,IACjB,OAAO,IAAI;AAAA,IAEX,OAAO;AAAA,GACR;AAAA,EACD,OAAO,EAAE,QAAQ;AAAA;;;ACjCZ,SAAS,aAAa,CAAC,OAAyB;AAAA,EACrD,OAAQ,MAAc,WAAW,KAAK;AAAA;;;ACExC;AAKO,IAAM,wBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,UAAqC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAE3F,MAAM,SAAS,MAAM,QAAQ,MAAM,KAAe;AAAA,EAElD,MAAM,cAAc,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK;AAAA,EAExD,OAAO;AAAA,IACL,OAAO,cAAc,WAAW;AAAA,EAClC;AAAA;;;ACnBF;AAEO,IAAM,kBAIT,OAAO,OAAO,OAAO,YAAY,YAAY;AAAA,EAC/C,QAAQ,kBAAkB,MAAM,oBAAoB;AAAA,EACpD,MAAM,YAAY,MAAM,cAAc,gBAAgB,MAAO,gBAAgB,YAAY;AAAA,IACvF,mBAAmB,CAAC,aAAkB,WAAW,UAAU,YAAY,CAAC;AAAA,EAC1E,CAAC;AAAA,EAGD,MAAM,WAAW,UAAU,OAAO,MAAM,IAAI;AAAA,EAC5C,OAAO,EAAE,OAAO,SAAS,OAAO;AAAA;AAG3B,IAAM,2BAIT,OAAO,OAAO,SAAS,UAAU;AAAA,EACnC,OAAO,gBAAgB,OAAO,OAAO,MAAM,IAAI,IAAI,gBAAgB,EAAE,MAAM;AAAA;;;ACtB7E;AAFA,sBAAS;AAQF,IAAM,eAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,SAAS,WAAU;AAAA,EACzB,MAAM,aAAa,gBAAgB,OAAO,gBAAgB;AAAA,EAC1D,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAIpE,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,QAAQ,GAAG;AAAA,EAErD,OAAO,QAAQ,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EACvE,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,EACf;AAAA;;;ACnBF;AAMO,IAAM,0BAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,IAAI,OAAO,iBAAiB,aAAa,kCAAkC;AAAA,IACzE,IAAI,CAAC,MAAM,cAAc,CAAC,MAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,WAAW,WAAW,GAAG;AAAA,MAC1F,QAAQ,KAAK,sDAAsD,KAAK;AAAA,MACxE,MAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAAA,IACA,MAAM,qBAA0D,MAAM,YACpE,OACA,YACA,CAAC,GACD,MACF;AAAA,IACA,MAAM,UAAc,MAAM,mBACxB,MAAM,OACN,MAAM,YACN,CAAC,CACH;AAAA,IAEA,MAAM,WAAU,MAAM,QAAQ,OAAM,IAAI,UAAS,CAAC,OAAM;AAAA,IAExD,OAAO;AAAA,MACL,YAAY,SAAQ,IAAI,CAAC,OAAY;AAAA,QACnC,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,aAA0C,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAChG,MAAM,SAAc,MAAM,WAAW,MAAM,OAAiB;AAAA,IAC1D,OAAQ,MAAc;AAAA,EACxB,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,EAExD,OAAO;AAAA,IACL,YAAY,QAAQ,IAAI,CAAC,OAAY;AAAA,MACnC,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,IACX,EAAE;AAAA,EACJ;AAAA;;;ACpDF;AAFA,sBAAS;AAOF,IAAM,qBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,SAAS,WAAU;AAAA,EACzB,MAAM,aAAa,sBAAsB,OAAO,gBAAgB;AAAA,EAChE,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAEpE,MAAM,WAA2C,MAAM,YACrD,OACA,YACA,CAAC,GACD,MACF;AAAA,EAEA,OAAO,MAAM,4DAA4D;AAAA,IACvE,OAAO,OAAO,gBAAgB;AAAA,EAChC,CAAC;AAAA,EAED,IAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAAA,IAC9B,MAAM,UAAwB,CAAC;AAAA,IAC/B,WAAW,SAAS,MAAM,OAAO;AAAA,MAC/B,MAAM,UAAc,MAAM,SAAS,KAAe;AAAA,MAClD,QAAQ,KAAK,QAAO,IAAkB;AAAA,IACxC;AAAA,IACA,OAAO,QAAQ,YAAY,EAAE,OAAO,QAAQ,OAAO,CAAC;AAAA,IACpD,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,SAAc,MAAM,SAAS,MAAM,KAAe;AAAA,EAExD,OAAO,QAAQ,YAAY,EAAE,YAAY,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC/D,OAAO;AAAA,IACL,QAAQ,OAAO;AAAA,EACjB;AAAA;;;ACzCF;AAKO,IAAM,wBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,YAAuC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAE7F,MAAM,SAAS,MAAM,UAAU,MAAM,OAAc;AAAA,IACjD,WAAW,MAAM;AAAA,IACjB,gBAAgB,MAAM;AAAA,EACxB,CAAC;AAAA,EAED,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,EAEtD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,MAAM,IAAI,OAAO,UAAU;AAAA,IACzB,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO,KAAK,SAAS;AAAA,IACrB,MAAM,CAAC;AAAA,EACT,EAAE,CACJ;AAAA,EAEA,OAAO;AAAA,IACL,OAAO;AAAA,EACT;AAAA;;;ACjCF;AAKO,IAAM,kBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,YAAiC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAEvF,MAAM,SAAc,MAAM,UAAU,MAAM,OAAiB;AAAA,IACzD,gBAAgB,MAAM;AAAA,EACxB,CAAC;AAAA,EAED,MAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,OAAO,IAAI,iBAAiB,QAAQ;AAAA,EAEzE,OAAO;AAAA,IACL,MAAM,QAAQ;AAAA,EAChB;AAAA;;;ACrBF,sBAAS;AAGT;AAEO,IAAM,gBAIT,OAAO,OAAO,UAAU;AAAA,EAC1B,MAAM,SAAS,WAAU;AAAA,EACzB,QAAQ,kBAAkB,MAAM,oBAAoB;AAAA,EACpD,MAAM,aAAa,iBAAiB,OAAO,gBAAgB;AAAA,EAC3D,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAEpE,MAAM,SAAS,MAAM;AAAA,EACrB,MAAM,YAAY,kBAAkB,oBAAoB,KAAM,CAAC;AAAA,EAE/D,QAAQ,UAAU,cAAc,YAAY,OAAO,WAAW,MAAO;AAAA,EAErE,MAAM,eAAe;AAAA,OACf,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,OACrB,SAAS,EAAE,OAA6B,IAAI,CAAC;AAAA,EACnD;AAAA,EACA,MAAM,cAAc,MAAM,cAAc,yBACtC,cACA,YACA,YACF;AAAA,EACA,OAAO,MAAM,sBAAsB;AAAA,IACjC,OAAO,CAAC,cAAc,YAAY,YAAY;AAAA,IAC9C,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,MAAM,YAAY,aAAa,YAAY;AAAA,EAG3C,IAAI,aAA4C;AAAA,EAChD,IAAI,WAAW,WAAW,YAAY,MAAM,SAAS,GAAG;AAAA,IAEtD,MAAM,QAAgC,CAAC;AAAA,IACvC,aAAa,UAAU,YAAY,OAAO;AAAA,MACxC,MAAM,QAAQ;AAAA,IAChB;AAAA,IACA,aAAa;AAAA,EACf,EAAO,SAAI,WAAW,yBAAyB,YAAY,MAAM,SAAS,GAAG;AAAA,IAE3E,MAAM,QAAgC,CAAC;AAAA,IACvC,MAAM,QAAQ,IACZ,YAAY,MAAM,IAAI,SAAS,WAAW;AAAA,MACxC,MAAM,WAAW,MAAM,cAAc,kBAAkB,YAAY,IAAI;AAAA,MACvE,IAAI,SAAS,UAAU,SAAS,SAAS,WAAW;AAAA,QAClD,MAAM,QAAQ,SAAS;AAAA,MACzB;AAAA,KACD,CACH;AAAA,IACA,IAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAAA,MACjC,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAGA,IAAI;AAAA,EACJ,IAAI,YAAY,MAAM,SAAS,GAAG;AAAA,IAChC,MAAM,YAAY,YAAY,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACrD,MAAM,uBAAuB,uBAAuB,EAAE,UAAU,CAAC;AAAA,IACjE,IAAI,qBAAqB,SAAS,GAAG;AAAA,MACnC,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAEvE,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,OACI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,EAC3C;AAAA;;;AC1EF;AAMO,IAAM,sBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,IAAI,OAAO,iBAAiB,aAAa,8BAA8B;AAAA,IACrE,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,WAAW,GAAG;AAAA,MAC9E,MAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAAA,IACA,MAAM,mBAAoD,MAAM,YAC9D,OACA,YACA,CAAC,GACD,MACF;AAAA,IACA,MAAM,UAAc,MAAM,iBAAiB,MAAM,OAAiB,MAAM,KAAK,MAAM,MAAO,GAAG;AAAA,MAC3F,WAAY,MAAc;AAAA,IAC5B,CAAC;AAAA,IAED,MAAM,cAAa,MAAM,QAAQ,OAAM,IAAI,UAAS,CAAC,OAAM;AAAA,IAE3D,OAAO;AAAA,MACL,YAAY,YAAW,IAAI,CAAC,OAAY;AAAA,QACtC,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,QACT,KAAK,EAAE;AAAA,MACT,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,WAAoC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAC1F,MAAM,SAAc,MAAM,SAAS,MAAM,OAAiB;AAAA,IACxD,WAAY,MAAc;AAAA,EAC5B,CAAC;AAAA,EAED,MAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,EAE3D,OAAO;AAAA,IACL,YAAY,WAAW,IAAI,CAAC,OAAY;AAAA,MACtC,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,KAAK,EAAE;AAAA,IACT,EAAE;AAAA,EACJ;AAAA;;;AC7CF;AAFA;;;ACXA;AAUO,SAAS,sBAAyB,GAAwB;AAAA,EAC/D,MAAM,SAAc,CAAC;AAAA,EACrB,IAAI,UAAuD;AAAA,EAC3D,IAAI,WAAW;AAAA,EACf,IAAI,MAAoB;AAAA,EAExB,MAAM,OAAO,CAAC,UAAa;AAAA,IACzB,IAAI,SAAS;AAAA,MACX,MAAM,IAAI;AAAA,MACV,UAAU;AAAA,MACV,EAAE,EAAE,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,IACjC,EAAO;AAAA,MACL,OAAO,KAAK,KAAK;AAAA;AAAA;AAAA,EAIrB,MAAM,OAAO,MAAM;AAAA,IACjB,WAAW;AAAA,IACX,IAAI,SAAS;AAAA,MACX,MAAM,IAAI;AAAA,MACV,UAAU;AAAA,MACV,EAAE,EAAE,OAAO,WAAkB,MAAM,KAAK,CAAC;AAAA,IAC3C;AAAA;AAAA,EAGF,MAAM,QAAQ,CAAC,MAAa;AAAA,IAC1B,MAAM;AAAA,IACN,IAAI,SAAS;AAAA,MACX,MAAM,IAAI;AAAA,MACV,UAAU;AAAA,MACV,EAAE,EAAE,OAAO,WAAkB,MAAM,KAAK,CAAC;AAAA,IAC3C;AAAA;AAAA,EAGF,MAAM,WAA6B;AAAA,KAChC,OAAO,cAAc,GAAG;AAAA,MACvB,OAAO;AAAA,QACL,IAAI,GAA+B;AAAA,UACjC,IAAI;AAAA,YAAK,OAAO,QAAQ,OAAO,GAAG;AAAA,UAClC,IAAI,OAAO,SAAS,GAAG;AAAA,YACrB,OAAO,QAAQ,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAI,MAAM,MAAM,CAAC;AAAA,UAChE;AAAA,UACA,IAAI,UAAU;AAAA,YACZ,OAAO,QAAQ,QAAQ,EAAE,OAAO,WAAkB,MAAM,KAAK,CAAC;AAAA,UAChE;AAAA,UACA,OAAO,IAAI,QAA2B,CAAC,MAAM;AAAA,YAC3C,UAAU;AAAA,WACX;AAAA;AAAA,MAEL;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,EAAE,MAAM,MAAM,OAAO,SAAS;AAAA;AAQhC,SAAS,2BAA2B,CACzC,WACA,OACA,cACA,QACA;AAAA,EACA,OAAO,IAAI,aAAa,WAAW;AAAA,IACjC,aAAa;AAAA,IACb,eAAe,EAAE,qBAAqB,KAAK;AAAA,IAC3C,mBAAmB,CAAC,SAAiB;AAAA,MACnC,IAAI,QAAQ,SAAS;AAAA,QACnB,MAAM,OAAO,UAAU,IAAI,iBAAiB,oBAAoB;AAAA,MAClE;AAAA,MACA,MAAM,KAAK,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,KAAK,CAAC;AAAA;AAAA,EAEpE,CAAC;AAAA;AAMI,SAAS,kBAAkB,CAChC,WACA,gBACA,cACA,QACA;AAAA,EACA,IAAI,QAAQ;AAAA,EACZ,OAAO,IAAI,aAAa,WAAW;AAAA,IACjC,aAAa;AAAA,IACb,eAAe,EAAE,qBAAqB,KAAK;AAAA,IAC3C,mBAAmB,CAAC,SAAiB;AAAA,MACnC,IAAI,QAAQ,SAAS;AAAA,QACnB,MAAM,OAAO,UAAU,IAAI,iBAAiB,oBAAoB;AAAA,MAClE;AAAA,MACA;AAAA,MACA,MAAM,SAAS,OAAO,IAAI,KAAK,IAAI,QAAQ,KAAK;AAAA,MAChD,MAAM,WAAW,KAAK,MAAM,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,MACjD,eAAe,UAAU,cAAc,EAAE,MAAM,SAAS,CAAC;AAAA;AAAA,EAE7D,CAAC;AAAA;;;AC9GI,SAAS,oBAAoB,CAAC,eAAuD;AAAA,EAC1F,IAAI,iBAAiB;AAAA,IAAM,OAAO;AAAA,EAClC,IAAI,OAAO,kBAAkB;AAAA,IAAU,OAAO;AAAA,EAC9C,MAAM,cAAc,cAAc,cAAc,SAAS;AAAA,EACzD,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EACzB,MAAM,UAAU,YAAY;AAAA,EAC5B,IAAI,OAAO,YAAY;AAAA,IAAU,OAAO;AAAA,EACxC,WAAW,QAAQ,SAAS;AAAA,IAC1B,IAAI,KAAK,SAAS,UAAU,UAAU,MAAM;AAAA,MAC1C,OAAQ,KAAwC;AAAA,IAClD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AFQT,SAAS,+BAA+B,CAAC,OAA8C;AAAA,EACrF,MAAM,YAAY,KAAK,UAAU,MAAM,cAAc,MAAM,CAAC;AAAA,EAC5D,OACE,GAAG,MAAM;AAAA;AAAA,IACT;AAAA,EAAmF;AAAA;AAAA,IACnF;AAAA;AAIJ,SAAS,mBAAmB,CAAC,MAAuC;AAAA,EAElE,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,IAAI;AAAA,IACtB,MAAM;AAAA,IAEN,MAAM,QAAQ,KAAK,MAAM,aAAa;AAAA,IACtC,IAAI,OAAO;AAAA,MACT,IAAI;AAAA,QACF,OAAO,KAAK,MAAM,MAAM,EAAE;AAAA,QAC1B,MAAM;AAAA,QACN,OAAQ,iBAAiB,MAAM,EAAE,KAAiC,CAAC;AAAA;AAAA,IAEvE;AAAA,IACA,OAAO,CAAC;AAAA;AAAA;AAIL,IAAM,2BAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,eAAuC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAC7F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,SAAS,gCAAgC,KAAK;AAAA,EAEpD,MAAM,WAAsB,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EAE9D,MAAM,kBAAmB,aAAa,UAAkB,oBAAoB,UAAU;AAAA,IACpF,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC;AAAA,EAED,MAAM,WAAW,mBAAmB,aAAa,WAAW,YAAY,cAAc,MAAM;AAAA,EAE5F,IAAI,UAAU,MAAM,aAAa,iBAAiB;AAAA,IAChD,gBAAgB,MAAM,aAAa;AAAA,IACnC,aAAa,MAAM,eAAe;AAAA,IAClC,kBAAkB;AAAA,IAClB;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,UAAU,CAAC,OAAO;AAAA,EACpB;AAAA,EAEA,MAAM,eAAe,qBAClB,QAAQ,IAAqC,cAChD,EAAE,KAAK;AAAA,EAEP,MAAM,SAAS,oBAAoB,YAAY;AAAA,EAC/C,OAAO,EAAE,OAAO;AAAA;AAGX,IAAM,kCAIT,gBAAgB,CAClB,OACA,OACA,QAC4D;AAAA,EAC5D,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,eAAuC,MAAM,YAAY,OAAQ,cAAc,CAAC,GAAG,MAAM;AAAA,EAC/F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,SAAS,gCAAgC,KAAK;AAAA,EAEpD,MAAM,WAAsB,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EAE9D,MAAM,kBAAmB,aAAa,UAAkB,oBAAoB,UAAU;AAAA,IACpF,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC;AAAA,EAED,MAAM,QAAQ,uBAAoE;AAAA,EAClF,MAAM,WAAW,4BAA4B,aAAa,WAAW,OAAO,cAAc,MAAM;AAAA,EAEhG,IAAI,WAAW;AAAA,EAEf,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,OAAO,CAAC,UAAuD;AAAA,IACnE,IAAI,MAAM,SAAS,gBAAgB,eAAe,OAAO;AAAA,MACvD,YAAa,MAAc;AAAA,MAE3B,MAAM,QAAQ,SAAS,MAAM,WAAW;AAAA,MACxC,IAAI,OAAO;AAAA,QACT,MAAM,UAAU,iBAAiB,MAAM,EAAE;AAAA,QACzC,IAAI,YAAY,WAAW;AAAA,UACzB,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf,CAAgD;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,aAAa,KAAK;AAAA;AAAA,EAGpB,MAAM,kBAAkB,aAAa,iBAAiB;AAAA,IACpD,gBAAgB,MAAM,aAAa;AAAA,IACnC,aAAa,MAAM,eAAe;AAAA,IAClC,kBAAkB;AAAA,IAClB;AAAA,EACF,CAAC,EAAE,KACD,MAAM,MAAM,KAAK,GACjB,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EAEN,MAAM,SAAS,oBAAoB,QAAQ;AAAA,EAC3C,MAAM,EAAE,MAAM,UAAU,MAAM,EAAE,OAAO,EAAoC;AAAA;;;AG1I7E;AAEO,IAAM,yBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,IAAI,OAAO,iBAAiB,aAAa,4BAA4B;AAAA,IACnE,IACE,CAAC,MAAM,mBACP,CAAC,MAAM,QAAQ,MAAM,eAAe,KACpC,MAAM,gBAAgB,WAAW,GACjC;AAAA,MACA,MAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAAA,IAEA,MAAM,qBAAqD,MAAM,YAC/D,OACA,YACA,CAAC,GACD,MACF;AAAA,IACA,MAAM,UAAc,MAAM,mBACxB,MAAM,MACN,MAAM,iBACN,CAAC,CACH;AAAA,IAEA,OAAO;AAAA,MACL,YAAY,QAAO,OAAO,IAAI,CAAC,OAAe,SAAiB;AAAA,QAC7D;AAAA,QACA,OAAO,QAAO,OAAO;AAAA,MACvB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,qBAAiD,MAAM,YAC3D,OACA,YACA,CAAC,GACD,MACF;AAAA,EACA,MAAM,SAAS,MAAM,mBAAmB,MAAM,MAAM;AAAA,IAClD,OAAO,MAAM,iBAAiB;AAAA,EAChC,CAAC;AAAA,EAED,MAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAM;AAAA,EACtD,OAAO;AAAA,IACL,YAAY,MAAM,IAAI,CAAC,cAAc;AAAA,MACnC,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,IAClB,EAAE;AAAA,EACJ;AAAA;;;ACvDF;AAFA,sBAAS;AAQF,IAAM,oBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,SAAS,WAAU;AAAA,EACzB,MAAM,OAAO,OAAO,WAAW;AAAA,EAC/B,MAAM,aAAa,qBAAqB,OAAO,gBAAgB,cAAc;AAAA,EAC7E,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAEpE,MAAM,oBAA+C,MAAM,YACzD,OACA,YACA,CAAC,GACD,MACF;AAAA,EAEA,OAAO,MAAM,2DAA2D;AAAA,IACtE,OAAO,OAAO,gBAAgB;AAAA,IAC9B,aAAa,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,KAAK,SAAS,MAAM,MAAM;AAAA,EAC3E,CAAC;AAAA,EAGD,MAAM,WAAW,MAAM,kBAAkB,MAAM,MAAM;AAAA,IACnD,SAAS,OAAO,gBAAgB,WAAW;AAAA,IAC3C,WAAW,OAAO,gBAAgB;AAAA,EACpC,CAAC;AAAA,EAED,MAAM,eAAe,MAAM,QAAQ,MAAM,IAAI;AAAA,EAC7C,MAAM,eAAe,OAAO,gBAAgB;AAAA,EAI5C,IAAI,gBAAgB,SAAS,KAAK,SAAS,GAAG;AAAA,IAC5C,OAAO,UAAU,aAAa,SAAS;AAAA,IAGvC,IAAI,aAAa,MAAM,KAAK,QAAQ;AAAA,MAClC,MAAM,IAAI,MACR,8EAA8E,eAAe,MAAM,KAAK,QAC1G;AAAA,IACF;AAAA,IAGA,IAAI,cAAc,cAAc;AAAA,MAC9B,MAAM,IAAI,MACR,2EAA2E,gBAAgB,cAC7F;AAAA,IACF;AAAA,IAOA,MAAM,UAAwB,MAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC,GAAG,MAC/D,SAAiB,GAAG,KAAoB,MAAM,CAClD;AAAA,IAEA,OAAO,QAAQ,YAAY,EAAE,WAAW,UAAU,YAAY,UAAU,CAAC;AAAA,IACzE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAGA,IAAI,SAAS,SAAS,cAAc;AAAA,IAClC,OAAO,QAAQ,YAAY,EAAE,QAAQ,SAAS,QAAQ,qBAAqB,CAAC;AAAA,IAC5E,QAAQ,KACN,wEAAwE,SAAS,YAAY,gBAC7F,OACA,QACF;AAAA,IACA,MAAM,IAAI,MACR,wEAAwE,SAAS,YAAY,cAC/F;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,YAAY,EAAE,YAAY,SAAS,KAAK,CAAC;AAAA,EACxD,OAAO,EAAE,QAAQ,SAAS,KAAmB;AAAA;;;ACxF/C;AAEO,IAAM,mBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,WAA6B,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EACnF,MAAM,UAAU,MAAM,SAAS,MAAM,IAAI;AAAA,EAEzC,IAAI,cAA8B,CAAC;AAAA,EACnC,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,cAAc,CAAC,OAAO;AAAA,EACxB,EAAO;AAAA,IACL,cAAc;AAAA;AAAA,EAEhB,OAAO;AAAA,IACL,aAAa,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC5C,QAAQ,WAAW;AAAA,MACnB,OAAO,WAAW;AAAA,MAClB,UAAU,WAAW;AAAA,IACvB,EAAE;AAAA,EACJ;AAAA;;;ACXF;AAFA,sBAAS;AAcF,IAAM,qBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,SAAS,WAAU;AAAA,EACzB,MAAM,aAAa,sBAAsB,OAAO,gBAAgB;AAAA,EAChE,OAAO,KAAK,YAAY,EAAE,OAAO,OAAO,gBAAgB,WAAW,CAAC;AAAA,EAEpE,MAAM,eAAuC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAC7F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,OAAO,MAAM,uDAAuD;AAAA,IAClE,OAAO,OAAO,gBAAgB;AAAA,IAC9B,cAAc,MAAM,QAAQ;AAAA,EAC9B,CAAC;AAAA,EAED,MAAM,WAAW,mBAAmB,aAAa,WAAW,YAAY,cAAc,MAAM;AAAA,EAE5F,MAAM,WAAsB,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AAAA,EAEpE,IAAI,UAAU,MAAM,aAAa,UAAU;AAAA,IACzC;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB,MAAM,aAAa,IAAI;AAAA,EACzC,CAAC;AAAA,EAED,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,UAAU,CAAC,OAAO;AAAA,EACpB;AAAA,EACA,MAAM,OAAO,qBAAsB,QAAQ,IAAqC,cAAc;AAAA,EAC9F,OAAO,QAAQ,YAAY,EAAE,cAAc,MAAM,OAAO,CAAC;AAAA,EACzD,OAAO;AAAA,IACL;AAAA,EACF;AAAA;AAGK,IAAM,4BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA8D;AAAA,EAC/F,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,eAAuC,MAAM,YAAY,OAAQ,cAAc,CAAC,GAAG,MAAM;AAAA,EAC/F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,QAAQ,uBAA8D;AAAA,EAC5E,MAAM,WAAW,4BAA4B,aAAa,WAAW,OAAO,cAAc,MAAM;AAAA,EAEhG,MAAM,kBAAkB,aAAa,MAAM,QAAQ;AAAA,IACjD;AAAA,EACF,CAAC,EAAE,KACD,MAAM,MAAM,KAAK,GACjB,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EACN,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA8B;AAAA;;;AC1E/D;AAEO,IAAM,4BAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,qBAAiD,MAAM,YAC3D,OACA,YACA,CAAC,GACD,MACF;AAAA,EACA,MAAM,SAAS,MAAM,mBAAmB,MAAM,MAAM;AAAA,IAClD,OAAO,MAAM,gBAAgB;AAAA,EAC/B,CAAC;AAAA,EAED,IAAI,MAAM,QAAQ,OAAO,EAAE,GAAG;AAAA,IAC5B,OAAO;AAAA,MACL,WAAW,OAAO,GAAG,IAAI,CAAC,cAAc;AAAA,QACtC,UAAU,SAAS;AAAA,QACnB,OAAO,SAAS;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,WAAY,OAAoC,IAAI,CAAC,cAAc;AAAA,MACjE,UAAU,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,IAClB,EAAE;AAAA,EACJ;AAAA;;;AC/BF;AAEO,IAAM,iCAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,6BAA0D,MAAM,YACpE,OACA,YACA,CAAC,GACD,MACF;AAAA,EACA,MAAM,UAAU,MAAM,2BAA2B,MAAM,MAAM;AAAA,IAC3D,eAAe,MAAM;AAAA,EACvB,CAAC;AAAA,EAED,IAAI,WAAsC,CAAC;AAAA,EAC3C,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,WAAW,CAAC,OAAO;AAAA,EACrB,EAAO;AAAA,IACL,WAAW;AAAA;AAAA,EAEb,OAAO;AAAA,IACL,UAAU,SAAS,IAAI,CAAC,YAAY;AAAA,MAClC,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,IACf,EAAE;AAAA,EACJ;AAAA;;;AC3BF;AAWO,IAAM,yBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAE9C,MAAM,iBAA4C,MAAM,YACtD,OACA,YACA,CAAC,GACD,MACF;AAAA,EAEA,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EACnD,MAAM,WAAW,mBAAmB,eAAe,WAAW,YAAY,cAAc,MAAM;AAAA,EAE9F,MAAM,SAAS,MAAM,eACnB,MAAM,UACN,MAAM,SACN;AAAA,IACE;AAAA,EACF,CACF;AAAA,EAEA,IAAI,aAAa;AAAA,EACjB,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,aAAc,OAAO,IAAgD,UAAU;AAAA,EACjF,EAAO;AAAA,IACL,aAAc,QAAoD,UAAU;AAAA;AAAA,EAG9E,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA;AAGK,IAAM,gCAIT,gBAAgB,CAClB,OACA,OACA,QAC0D;AAAA,EAC1D,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,iBAA4C,MAAM,YACtD,OACA,cACA,CAAC,GACD,MACF;AAAA,EACA,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,QAAQ,uBAAkE;AAAA,EAChF,MAAM,WAAW,4BAA4B,eAAe,WAAW,OAAO,cAAc,MAAM;AAAA,EAElG,IAAI;AAAA,EAIJ,MAAM,kBAAkB,eACtB,MAAM,UACN,MAAM,SACN;AAAA,IACE;AAAA,EACF,CACF,EAAE,KACA,CAAC,WAAW;AAAA,IACV,iBAAiB;AAAA,IACjB,MAAM,KAAK;AAAA,KAEb,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EAEN,IAAI,aAAa;AAAA,EACjB,IAAI,mBAAmB,WAAW;AAAA,IAChC,IAAI,MAAM,QAAQ,cAAc,GAAG;AAAA,MACjC,aAAc,eAAe,IAAgD,UAAU;AAAA,IACzF,EAAO;AAAA,MACL,aAAc,gBAA4D,UAAU;AAAA;AAAA,EAExF;AAAA,EACA,MAAM,EAAE,MAAM,UAAU,MAAM,EAAE,MAAM,WAAW,EAAkC;AAAA;;;ACpGrF;AAYO,IAAM,mBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,eAAuC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAC7F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EACnD,MAAM,WAAW,mBAAmB,aAAa,WAAW,YAAY,cAAc,MAAM;AAAA,EAG5F,MAAM,gBAAgB,MAAM,SAAS,MAAM,SAAS;AAAA,IAAO,MAAM,MAAM;AAAA,EAEvE,IAAI,UAAU,MAAM,aAAa,cAAc;AAAA,IAC7C;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,UAAU,CAAC,OAAO;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,qBAAsB,QAAQ,IAAqC,cAAc;AAAA,EAE9F,IAAI,SAAS,cAAc;AAAA,IACzB,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,EACF;AAAA;AAGK,IAAM,0BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA4D;AAAA,EAC7F,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,eAAuC,MAAM,YAAY,OAAQ,cAAc,CAAC,GAAG,MAAM;AAAA,EAC/F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,QAAQ,uBAA4D;AAAA,EAC1E,MAAM,WAAW,4BAA4B,aAAa,WAAW,OAAO,cAAc,MAAM;AAAA,EAEhG,MAAM,gBAAgB,MAAM,SAAS,MAAM,SAAS;AAAA,IAAO,MAAM,MAAM;AAAA,EAEvE,MAAM,kBAAkB,aAAa,cAAc;AAAA,IACjD;AAAA,EACF,CAAC,EAAE,KACD,MAAM,MAAM,KAAK,GACjB,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EACN,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA4B;AAAA;;;AClE7D;AAWO,IAAM,kBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,kBAAyC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EAC/F,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EACnD,MAAM,WAAW,mBAAmB,gBAAgB,WAAW,YAAY,cAAc,MAAM;AAAA,EAE/F,MAAM,SAAS,MAAM,gBACnB,MAAM,MACN;AAAA,IACE;AAAA,EACF,CACF;AAAA,EAEA,IAAI,cAAc;AAAA,EAClB,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,cAAe,OAAO,IAAoC,gBAAgB;AAAA,EAC5E,EAAO;AAAA,IACL,cAAe,QAAwC,gBAAgB;AAAA;AAAA,EAGzE,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA;AAGK,IAAM,yBAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,kBAAyC,MAAM,YACnD,OACA,cACA,CAAC,GACD,MACF;AAAA,EACA,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,QAAQ,uBAA2D;AAAA,EACzE,MAAM,WAAW,4BAA4B,gBAAgB,WAAW,OAAO,cAAc,MAAM;AAAA,EAEnG,MAAM,kBAAkB,gBACtB,MAAM,MACN;AAAA,IACE;AAAA,EACF,CACF,EAAE,KACA,MAAM,MAAM,KAAK,GACjB,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EACN,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAA2B;AAAA;;;ACpE5D;AAWO,IAAM,sBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,YAAiC,MAAM,YAAY,OAAQ,YAAY,CAAC,GAAG,MAAM;AAAA,EACvF,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EACnD,MAAM,WAAW,mBAAmB,UAAU,WAAW,YAAY,cAAc,MAAM;AAAA,EAEzF,MAAM,SAAS,MAAM,UACnB,MAAM,MACN;AAAA,IACE,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB;AAAA,EACF,CACF;AAAA,EAEA,MAAM,iBAAiB,MAAM,QAAQ,MAAM,IACtC,OAAO,IAAkC,oBAAoB,KAC7D,QAAsC,oBAAoB;AAAA,EAE/D,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,EACrB;AAAA;AAGK,IAAM,6BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA+D;AAAA,EAChG,MAAM,eAAe,MAAM;AAAA,EAC3B,MAAM,YAAiC,MAAM,YAAY,OAAQ,cAAc,CAAC,GAAG,MAAM;AAAA,EACzF,QAAQ,iBAAiB,MAAM,oBAAoB;AAAA,EAEnD,MAAM,QAAQ,uBAA+D;AAAA,EAC7E,MAAM,WAAW,4BAA4B,UAAU,WAAW,OAAO,cAAc,MAAM;AAAA,EAE7F,MAAM,kBAAkB,UACtB,MAAM,MACN;AAAA,IACE,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB;AAAA,EACF,CACF,EAAE,KACA,MAAM,MAAM,KAAK,GACjB,CAAC,QAAe,MAAM,MAAM,GAAG,CACjC;AAAA,EAEA,OAAO,MAAM;AAAA,EACb,MAAM;AAAA,EACN,MAAM,EAAE,MAAM,UAAU,MAAM,EAAE,aAAa,MAAM,YAAY,EAA+B;AAAA;;;ACnEhG;AAEA,SAAS,sBAAsB,GAAY;AAAA,EACzC,OACE,OAAO,eAAe,eACtB,YAAY,cACZ,OAAQ,WAAoD,QAAQ,SAAS;AAAA;AAOjF,eAAe,2BAA2B,CAAC,YAAmC;AAAA,EAC5E,MAAM,YAAa,WAAmD;AAAA,EACtE,MAAM,QAAQ,MAAM,UAAU,KAAK,cAAc;AAAA,EACjD,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,EAC9B,MAAM,SAAS,IAAI;AAAA,EAEnB,MAAM,mBAA8B,CAAC;AAAA,EACrC,WAAW,WAAW,MAAM;AAAA,IAC1B,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC/B,IAAI,IAAI,SAAS,WAAW,MAAM,GAAG;AAAA,MACnC,iBAAiB,KAAK,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,WAAW,WAAW,kBAAkB;AAAA,IACtC,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,MAAM,OAAO,OAAO;AAAA,MAC1C,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe,MAAM,MAAM,OAAO,QAAQ,GAAG;AAAA,QACnD,IAAI,CAAC,cAAc,CAEnB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,iCAAiC,QAAQ,OAAO,KAAK;AAAA;AAAA,EAEvE;AAAA;AAMF,eAAe,8BAA8B,CAAC,OAAqD;AAAA,EACjG,QAAQ,kBAAkB,MAAM,oBAAoB;AAAA,EACpD,QAAQ,UAAU,cAAc,YAAY,UAAU,MAAM;AAAA,EAC5D,MAAM,cAAc,qBAAqB,cAAc,YAAY;AAAA,OAC7D,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B,CAAC;AAAA;AAOI,IAAM,aAIT,OAAO,OAAO,OAAO,YAAY,YAAY;AAAA,EAE/C,MAAM,WAAW,oBAAoB,KAAM;AAAA,EAC3C,IAAI,qBAAqB,QAAQ,GAAG;AAAA,IAClC,WAAW,IAAI,8BAA8B;AAAA,EAC/C;AAAA,EAEA,MAAM,aAAa,MAAO,gBAAgB;AAAA,EAC1C,IAAI,uBAAuB,GAAG;AAAA,IAC5B,MAAM,4BAA4B,UAAU;AAAA,EAC9C,EAAO;AAAA,IACL,MAAM,+BAA+B,KAAM;AAAA;AAAA,EAE7C,WAAW,KAAK,qBAAqB;AAAA,EAErC,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,EACf;AAAA;;;ACnDK,IAAM,YAAY;AAAA,EACvB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gCAAgC;AAAA,EAChC,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,iBAAiB;AACnB;AAKO,IAAM,mBAGT;AAAA,EACF,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,0BAA0B;AAC5B;AAEO,IAAM,qBAGT;AAAA,EACF,iBAAiB;AACnB;;;AC/EA;AAAA;AAAA;AAaA,IAAM,cAAc,IAAI,IAAI,CAAC,UAAU,OAAO,OAAO,CAAC;AAGtD,IAAM,uCAAuC;AAM7C,SAAS,6BAA6B,GAAY;AAAA,EAChD,IAAI,OAAO,YAAY,aAAa;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,QAAQ;AAAA,EAClB,OACE,EAAE,WAAW,UACb,EAAE,aAAa,UACf,EAAE,aAAa,OACf,EAAE,mBAAmB;AAAA;AAIzB,SAAS,6BAA6B,GAAW;AAAA,EAC/C,OAAO,8BAA8B,IAAI,IAAI;AAAA;AAG/C,SAAS,6BAA6B,CACpC,aACA,YACQ;AAAA,EACR,IAAI,gBAAgB,WAAW;AAAA,IAC7B,OAAO,WAAW;AAAA,EACpB;AAAA,EACA,IAAI,OAAO,gBAAgB,UAAU;AAAA,IACnC,OAAO,WAAW;AAAA,EACpB;AAAA,EACA,OAAO,YAAY,OAAO,WAAW;AAAA;AAAA;AAUhC,MAAM,8CAA8C,iBAAgD;AAAA,EAChG,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EACV,kBAAkB;AAAA,EAEnB;AAAA,EAEC,YAAY;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,WAAW,CACT,OACA,aACA,eACA;AAAA,IACA,MAAM,OAAO,aAAa,aAAa;AAAA;AAAA,OAGhB,cAAa,CAAC,SAAmD;AAAA,IACxF,MAAM,MAAM,cAAc,OAAO;AAAA,IACjC,KAAK,cAAc,KAAK,qBACtB,0BACA,8BAA8B,QAAQ,OAAO,aAAa,6BAA6B,GACvF,OACF;AAAA;AAAA,EAGiB,mBAAmB,CAAC,OAA0C;AAAA,IAC/E,MAAM,SAAU,MAAwC,iBAAiB;AAAA,IACzE,IAAI,UAAU,YAAY,IAAI,MAAM,GAAG;AAAA,MACrC,OAAO,KAAK;AAAA,IACd;AAAA,IACA,OAAO,KAAK;AAAA;AAEhB;;;AC/GA;AASA,eAAsB,qCAAqC,CACzD,SACe;AAAA,EACf,QAAQ,QAAQ,MAAM,oBAAoB;AAAA,EAC1C,IAAI,SAAU,KAAM,KAAM,QAAQ;AAAA,EAClC,MAAM,WAAW,IAAI,sCACnB,WACA,kBACA,kBACF;AAAA,EACA,MAAM,cAAc,SAAS,QAAQ,KAAK,QAAQ;AAAA,EAClD,SAAS,UAAU,YAAY;AAAA,IAC7B,MAAM,4BAA4B;AAAA,IAClC,MAAM,YAAY;AAAA;AAAA,EAEpB,MAAM,SAAS,SAAS,WAAW,CAAC,CAAC;AAAA;;ACtBvC,sBAAS;;;ACNT;AAAA;AAAA;AAkBO,MAAM,wCAAwC,WAA0C;AAAA,EACpF,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EACV,kBAAkB;AAAA,EAElB,YAAY;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,WAAW,CACT,OACA,aACA,eACA;AAAA,IACA,MAAM,OAAO,aAAa,aAAa;AAAA;AAE3C;;;AD9CA;AAEA,eAAsB,qCAAqC,GAAkB;AAAA,EAC3E,MAAM,MAAM,MAAM,oBAAoB;AAAA,EAErC,WAAmB,UAAU;AAAA,EAE9B,QAAQ,QAAQ;AAAA,EAChB,IAAI,SAAU,KAAM,KAAM,QAAQ;AAAA,EAClC,MAAM,eAAe,sBAAsB,IAAI,aAAa;AAAA,EAC5D,IAAI,gCACF,WACA,kBACA,kBACF,EAAE,uBAAuB,YAAY;AAAA,EACrC,aAAa,UAAU;AAAA,EACvB,WAAU,EAAE,KAAK,6DAA6D;AAAA;;;AEXhF;",
|
|
45
|
-
"debugId": "
|
|
47
|
+
"mappings": "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",
|
|
48
|
+
"debugId": "7D0C58F098156BAF64756E2164756E21",
|
|
46
49
|
"names": []
|
|
47
50
|
}
|