@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/agent-memory.d.ts +118 -0
- package/dist/agent-memory.d.ts.map +1 -0
- package/dist/agent-memory.js +186 -0
- package/dist/agent-memory.js.map +1 -0
- package/dist/async-local-storage.d.ts +20 -0
- package/dist/async-local-storage.d.ts.map +1 -0
- package/dist/async-local-storage.js +28 -0
- package/dist/async-local-storage.js.map +1 -0
- package/dist/blender-executor.d.ts +93 -0
- package/dist/blender-executor.d.ts.map +1 -0
- package/dist/blender-executor.js +294 -0
- package/dist/blender-executor.js.map +1 -0
- package/dist/comfy-executor.d.ts +23 -1
- package/dist/comfy-executor.d.ts.map +1 -1
- package/dist/comfy-executor.js +234 -55
- package/dist/comfy-executor.js.map +1 -1
- package/dist/context-packer.d.ts +1 -1
- package/dist/context-packer.d.ts.map +1 -1
- package/dist/context-packer.js +23 -25
- package/dist/context-packer.js.map +1 -1
- package/dist/context.d.ts +982 -127
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2649 -530
- package/dist/context.js.map +1 -1
- package/dist/cost-reconciler.d.ts +32 -0
- package/dist/cost-reconciler.d.ts.map +1 -0
- package/dist/cost-reconciler.js +21 -0
- package/dist/cost-reconciler.js.map +1 -0
- package/dist/entities.d.ts +33 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +43 -0
- package/dist/entities.js.map +1 -0
- package/dist/external-media-fetch.d.ts +29 -0
- package/dist/external-media-fetch.d.ts.map +1 -0
- package/dist/external-media-fetch.js +38 -0
- package/dist/external-media-fetch.js.map +1 -0
- package/dist/generation-receipt.d.ts +86 -0
- package/dist/generation-receipt.d.ts.map +1 -0
- package/dist/generation-receipt.js +137 -0
- package/dist/generation-receipt.js.map +1 -0
- package/dist/generation-registry.d.ts +75 -0
- package/dist/generation-registry.d.ts.map +1 -0
- package/dist/generation-registry.js +144 -0
- package/dist/generation-registry.js.map +1 -0
- package/dist/google/client.d.ts +196 -0
- package/dist/google/client.d.ts.map +1 -0
- package/dist/google/client.js +396 -0
- package/dist/google/client.js.map +1 -0
- package/dist/google/index.d.ts +3 -0
- package/dist/google/index.d.ts.map +1 -0
- package/dist/google/index.js +3 -0
- package/dist/google/index.js.map +1 -0
- package/dist/google/token.d.ts +15 -0
- package/dist/google/token.d.ts.map +1 -0
- package/dist/google/token.js +24 -0
- package/dist/google/token.js.map +1 -0
- package/dist/host-binaries.d.ts +106 -0
- package/dist/host-binaries.d.ts.map +1 -0
- package/dist/host-binaries.js +352 -0
- package/dist/host-binaries.js.map +1 -0
- package/dist/image-codec.d.ts +76 -0
- package/dist/image-codec.d.ts.map +1 -0
- package/dist/image-codec.js +293 -0
- package/dist/image-codec.js.map +1 -0
- package/dist/image-model-tasks.d.ts +15 -0
- package/dist/image-model-tasks.d.ts.map +1 -0
- package/dist/image-model-tasks.js +24 -0
- package/dist/image-model-tasks.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/invocation-account.d.ts +43 -0
- package/dist/invocation-account.d.ts.map +1 -0
- package/dist/invocation-account.js +60 -0
- package/dist/invocation-account.js.map +1 -0
- package/dist/media-ref-bytes.d.ts +35 -0
- package/dist/media-ref-bytes.d.ts.map +1 -0
- package/dist/media-ref-bytes.js +191 -0
- package/dist/media-ref-bytes.js.map +1 -0
- package/dist/node-executor.d.ts +119 -2
- package/dist/node-executor.d.ts.map +1 -1
- package/dist/permission-gate.d.ts +152 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +87 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/prefixed-storage-adapter.d.ts +33 -0
- package/dist/prefixed-storage-adapter.d.ts.map +1 -0
- package/dist/prefixed-storage-adapter.js +70 -0
- package/dist/prefixed-storage-adapter.js.map +1 -0
- package/dist/prompt-asset-refs.d.ts +222 -0
- package/dist/prompt-asset-refs.d.ts.map +1 -0
- package/dist/prompt-asset-refs.js +751 -0
- package/dist/prompt-asset-refs.js.map +1 -0
- package/dist/provider-cache.d.ts +3 -0
- package/dist/provider-cache.d.ts.map +1 -0
- package/dist/provider-cache.js +8 -0
- package/dist/provider-cache.js.map +1 -0
- package/dist/providers/aki-provider.d.ts +35 -10
- package/dist/providers/aki-provider.d.ts.map +1 -1
- package/dist/providers/aki-provider.js +90 -77
- package/dist/providers/aki-provider.js.map +1 -1
- package/dist/providers/alibaba-provider.d.ts +39 -0
- package/dist/providers/alibaba-provider.d.ts.map +1 -0
- package/dist/providers/alibaba-provider.js +86 -0
- package/dist/providers/alibaba-provider.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +52 -3
- package/dist/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/providers/anthropic-provider.js +1020 -338
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/atlascloud-provider.d.ts +103 -0
- package/dist/providers/atlascloud-provider.d.ts.map +1 -0
- package/dist/providers/atlascloud-provider.js +1031 -0
- package/dist/providers/atlascloud-provider.js.map +1 -0
- package/dist/providers/atlascloud-transport.d.ts +100 -0
- package/dist/providers/atlascloud-transport.d.ts.map +1 -0
- package/dist/providers/atlascloud-transport.js +364 -0
- package/dist/providers/atlascloud-transport.js.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.js +104 -0
- package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
- package/dist/providers/audio-mime.d.ts +11 -0
- package/dist/providers/audio-mime.d.ts.map +1 -0
- package/dist/providers/audio-mime.js +46 -0
- package/dist/providers/audio-mime.js.map +1 -0
- package/dist/providers/base-provider.d.ts +501 -32
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +1280 -87
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/cassette-provider.d.ts +217 -0
- package/dist/providers/cassette-provider.d.ts.map +1 -0
- package/dist/providers/cassette-provider.js +502 -0
- package/dist/providers/cassette-provider.js.map +1 -0
- package/dist/providers/cerebras-provider.d.ts +6 -12
- package/dist/providers/cerebras-provider.d.ts.map +1 -1
- package/dist/providers/cerebras-provider.js +8 -33
- package/dist/providers/cerebras-provider.js.map +1 -1
- package/dist/providers/claude-agent-provider.d.ts +107 -74
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +1279 -517
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +84 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +505 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/cohere-provider.d.ts +7 -3
- package/dist/providers/cohere-provider.d.ts.map +1 -1
- package/dist/providers/cohere-provider.js +14 -2
- package/dist/providers/cohere-provider.js.map +1 -1
- package/dist/providers/comfy-cloud-provider.d.ts +30 -0
- package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
- package/dist/providers/comfy-cloud-provider.js +42 -0
- package/dist/providers/comfy-cloud-provider.js.map +1 -0
- package/dist/providers/content-filter.d.ts +46 -0
- package/dist/providers/content-filter.d.ts.map +1 -0
- package/dist/providers/content-filter.js +92 -0
- package/dist/providers/content-filter.js.map +1 -0
- package/dist/providers/context-exceeded.d.ts +37 -0
- package/dist/providers/context-exceeded.d.ts.map +1 -0
- package/dist/providers/context-exceeded.js +114 -0
- package/dist/providers/context-exceeded.js.map +1 -0
- package/dist/providers/context-window.d.ts +44 -0
- package/dist/providers/context-window.d.ts.map +1 -0
- package/dist/providers/context-window.js +145 -0
- package/dist/providers/context-window.js.map +1 -0
- package/dist/providers/contract/index.d.ts +4 -0
- package/dist/providers/contract/index.d.ts.map +1 -0
- package/dist/providers/contract/index.js +4 -0
- package/dist/providers/contract/index.js.map +1 -0
- package/dist/providers/contract/probe-manifest.d.ts +75 -0
- package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
- package/dist/providers/contract/probe-manifest.js +379 -0
- package/dist/providers/contract/probe-manifest.js.map +1 -0
- package/dist/providers/contract/probe-runner.d.ts +57 -0
- package/dist/providers/contract/probe-runner.d.ts.map +1 -0
- package/dist/providers/contract/probe-runner.js +180 -0
- package/dist/providers/contract/probe-runner.js.map +1 -0
- package/dist/providers/contract/redact.d.ts +29 -0
- package/dist/providers/contract/redact.d.ts.map +1 -0
- package/dist/providers/contract/redact.js +113 -0
- package/dist/providers/contract/redact.js.map +1 -0
- package/dist/providers/core-tools.d.ts +75 -0
- package/dist/providers/core-tools.d.ts.map +1 -0
- package/dist/providers/core-tools.js +128 -0
- package/dist/providers/core-tools.js.map +1 -0
- package/dist/providers/cost-calculator.d.ts +69 -50
- package/dist/providers/cost-calculator.d.ts.map +1 -1
- package/dist/providers/cost-calculator.js +207 -397
- package/dist/providers/cost-calculator.js.map +1 -1
- package/dist/providers/credential-check.d.ts +45 -0
- package/dist/providers/credential-check.d.ts.map +1 -0
- package/dist/providers/credential-check.js +164 -0
- package/dist/providers/credential-check.js.map +1 -0
- package/dist/providers/custom-model-kinds.d.ts +33 -0
- package/dist/providers/custom-model-kinds.d.ts.map +1 -0
- package/dist/providers/custom-model-kinds.js +96 -0
- package/dist/providers/custom-model-kinds.js.map +1 -0
- package/dist/providers/custom-openai-provider.d.ts +83 -0
- package/dist/providers/custom-openai-provider.d.ts.map +1 -0
- package/dist/providers/custom-openai-provider.js +190 -0
- package/dist/providers/custom-openai-provider.js.map +1 -0
- package/dist/providers/custom-provider-registry.d.ts +19 -0
- package/dist/providers/custom-provider-registry.d.ts.map +1 -0
- package/dist/providers/custom-provider-registry.js +52 -0
- package/dist/providers/custom-provider-registry.js.map +1 -0
- package/dist/providers/deepseek-provider.d.ts +8 -14
- package/dist/providers/deepseek-provider.d.ts.map +1 -1
- package/dist/providers/deepseek-provider.js +6 -35
- package/dist/providers/deepseek-provider.js.map +1 -1
- package/dist/providers/defaults.d.ts +12 -0
- package/dist/providers/defaults.d.ts.map +1 -0
- package/dist/providers/defaults.js +12 -0
- package/dist/providers/defaults.js.map +1 -0
- package/dist/providers/dreamina-models.d.ts +5 -0
- package/dist/providers/dreamina-models.d.ts.map +1 -0
- package/dist/providers/dreamina-models.js +57 -0
- package/dist/providers/dreamina-models.js.map +1 -0
- package/dist/providers/dreamina-music.d.ts +52 -0
- package/dist/providers/dreamina-music.d.ts.map +1 -0
- package/dist/providers/dreamina-music.js +115 -0
- package/dist/providers/dreamina-music.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +62 -0
- package/dist/providers/dreamina-provider.d.ts.map +1 -0
- package/dist/providers/dreamina-provider.js +790 -0
- package/dist/providers/dreamina-provider.js.map +1 -0
- package/dist/providers/elevenlabs-provider.d.ts +50 -0
- package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
- package/dist/providers/elevenlabs-provider.js +147 -0
- package/dist/providers/elevenlabs-provider.js.map +1 -0
- package/dist/providers/entity-references.d.ts +31 -0
- package/dist/providers/entity-references.d.ts.map +1 -0
- package/dist/providers/entity-references.js +113 -0
- package/dist/providers/entity-references.js.map +1 -0
- package/dist/providers/evolink-provider.d.ts +40 -0
- package/dist/providers/evolink-provider.d.ts.map +1 -0
- package/dist/providers/evolink-provider.js +312 -0
- package/dist/providers/evolink-provider.js.map +1 -0
- package/dist/providers/fake-provider.d.ts +74 -2
- package/dist/providers/fake-provider.d.ts.map +1 -1
- package/dist/providers/fake-provider.js +213 -1
- package/dist/providers/fake-provider.js.map +1 -1
- package/dist/providers/fal-generations.d.ts +106 -0
- package/dist/providers/fal-generations.d.ts.map +1 -0
- package/dist/providers/fal-generations.js +286 -0
- package/dist/providers/fal-generations.js.map +1 -0
- package/dist/providers/fal-provider.d.ts +173 -8
- package/dist/providers/fal-provider.d.ts.map +1 -1
- package/dist/providers/fal-provider.js +1396 -64
- package/dist/providers/fal-provider.js.map +1 -1
- package/dist/providers/fal-queue.d.ts +47 -0
- package/dist/providers/fal-queue.d.ts.map +1 -0
- package/dist/providers/fal-queue.js +231 -0
- package/dist/providers/fal-queue.js.map +1 -0
- package/dist/providers/gemini-provider.d.ts +150 -9
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +1515 -316
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/gmi-provider.d.ts +21 -0
- package/dist/providers/gmi-provider.d.ts.map +1 -0
- package/dist/providers/gmi-provider.js +34 -0
- package/dist/providers/gmi-provider.js.map +1 -0
- package/dist/providers/gpt-image-size.d.ts +3 -0
- package/dist/providers/gpt-image-size.d.ts.map +1 -0
- package/dist/providers/gpt-image-size.js +37 -0
- package/dist/providers/gpt-image-size.js.map +1 -0
- package/dist/providers/groq-provider.d.ts +9 -12
- package/dist/providers/groq-provider.d.ts.map +1 -1
- package/dist/providers/groq-provider.js +19 -33
- package/dist/providers/groq-provider.js.map +1 -1
- package/dist/providers/groq-request.d.ts +38 -0
- package/dist/providers/groq-request.d.ts.map +1 -0
- package/dist/providers/groq-request.js +138 -0
- package/dist/providers/groq-request.js.map +1 -0
- package/dist/providers/higgsfield-provider.d.ts +31 -0
- package/dist/providers/higgsfield-provider.d.ts.map +1 -0
- package/dist/providers/higgsfield-provider.js +143 -0
- package/dist/providers/higgsfield-provider.js.map +1 -0
- package/dist/providers/higgsfield-transport.d.ts +106 -0
- package/dist/providers/higgsfield-transport.d.ts.map +1 -0
- package/dist/providers/higgsfield-transport.js +182 -0
- package/dist/providers/higgsfield-transport.js.map +1 -0
- package/dist/providers/http-transport.d.ts +74 -0
- package/dist/providers/http-transport.d.ts.map +1 -0
- package/dist/providers/http-transport.js +152 -0
- package/dist/providers/http-transport.js.map +1 -0
- package/dist/providers/huggingface-provider.d.ts +73 -4
- package/dist/providers/huggingface-provider.d.ts.map +1 -1
- package/dist/providers/huggingface-provider.js +240 -34
- package/dist/providers/huggingface-provider.js.map +1 -1
- package/dist/providers/image-mime.d.ts +39 -0
- package/dist/providers/image-mime.d.ts.map +1 -0
- package/dist/providers/image-mime.js +111 -0
- package/dist/providers/image-mime.js.map +1 -0
- package/dist/providers/image-ref.d.ts +21 -0
- package/dist/providers/image-ref.d.ts.map +1 -0
- package/dist/providers/image-ref.js +44 -0
- package/dist/providers/image-ref.js.map +1 -0
- package/dist/providers/index.d.ts +87 -8
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +250 -56
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jina-provider.d.ts +12 -3
- package/dist/providers/jina-provider.d.ts.map +1 -1
- package/dist/providers/jina-provider.js +21 -7
- package/dist/providers/jina-provider.js.map +1 -1
- package/dist/providers/kie-provider.d.ts +172 -10
- package/dist/providers/kie-provider.d.ts.map +1 -1
- package/dist/providers/kie-provider.js +1190 -228
- package/dist/providers/kie-provider.js.map +1 -1
- package/dist/providers/kie-webhook-registry.d.ts +28 -0
- package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
- package/dist/providers/kie-webhook-registry.js +91 -0
- package/dist/providers/kie-webhook-registry.js.map +1 -0
- package/dist/providers/llama-provider.d.ts +23 -36
- package/dist/providers/llama-provider.d.ts.map +1 -1
- package/dist/providers/llama-provider.js +50 -355
- package/dist/providers/llama-provider.js.map +1 -1
- package/dist/providers/lmstudio-provider.d.ts +4 -7
- package/dist/providers/lmstudio-provider.d.ts.map +1 -1
- package/dist/providers/lmstudio-provider.js +24 -15
- package/dist/providers/lmstudio-provider.js.map +1 -1
- package/dist/providers/loop-tracing.d.ts +17 -0
- package/dist/providers/loop-tracing.d.ts.map +1 -0
- package/dist/providers/loop-tracing.js +132 -0
- package/dist/providers/loop-tracing.js.map +1 -0
- package/dist/providers/manifest-models.d.ts +341 -1
- package/dist/providers/manifest-models.d.ts.map +1 -1
- package/dist/providers/manifest-models.js +1106 -22
- package/dist/providers/manifest-models.js.map +1 -1
- package/dist/providers/media-mime.d.ts +14 -0
- package/dist/providers/media-mime.d.ts.map +1 -0
- package/dist/providers/media-mime.js +35 -0
- package/dist/providers/media-mime.js.map +1 -0
- package/dist/providers/meshy-provider.d.ts +16 -2
- package/dist/providers/meshy-provider.d.ts.map +1 -1
- package/dist/providers/meshy-provider.js +82 -46
- package/dist/providers/meshy-provider.js.map +1 -1
- package/dist/providers/meta-provider.d.ts +22 -0
- package/dist/providers/meta-provider.d.ts.map +1 -0
- package/dist/providers/meta-provider.js +54 -0
- package/dist/providers/meta-provider.js.map +1 -0
- package/dist/providers/minimax-provider.d.ts +27 -18
- package/dist/providers/minimax-provider.d.ts.map +1 -1
- package/dist/providers/minimax-provider.js +222 -72
- package/dist/providers/minimax-provider.js.map +1 -1
- package/dist/providers/mistral-provider.d.ts +8 -12
- package/dist/providers/mistral-provider.d.ts.map +1 -1
- package/dist/providers/mistral-provider.js +15 -34
- package/dist/providers/mistral-provider.js.map +1 -1
- package/dist/providers/moonshot-provider.d.ts +11 -15
- package/dist/providers/moonshot-provider.d.ts.map +1 -1
- package/dist/providers/moonshot-provider.js +33 -23
- package/dist/providers/moonshot-provider.js.map +1 -1
- package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
- package/dist/providers/node-llama-cpp-provider.js +484 -0
- package/dist/providers/node-llama-cpp-provider.js.map +1 -0
- package/dist/providers/nodetool-provider.d.ts +49 -0
- package/dist/providers/nodetool-provider.d.ts.map +1 -0
- package/dist/providers/nodetool-provider.js +222 -0
- package/dist/providers/nodetool-provider.js.map +1 -0
- package/dist/providers/oauth/browser-launcher.d.ts +23 -0
- package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
- package/dist/providers/oauth/browser-launcher.js +45 -0
- package/dist/providers/oauth/browser-launcher.js.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.js +133 -0
- package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
- package/dist/providers/oauth/claude-code-login.d.ts +124 -0
- package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-login.js +230 -0
- package/dist/providers/oauth/claude-code-login.js.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
- package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
- package/dist/providers/oauth/errors.d.ts +54 -0
- package/dist/providers/oauth/errors.d.ts.map +1 -0
- package/dist/providers/oauth/errors.js +79 -0
- package/dist/providers/oauth/errors.js.map +1 -0
- package/dist/providers/oauth/index.d.ts +105 -0
- package/dist/providers/oauth/index.d.ts.map +1 -0
- package/dist/providers/oauth/index.js +167 -0
- package/dist/providers/oauth/index.js.map +1 -0
- package/dist/providers/oauth/jwt-claims.d.ts +23 -0
- package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
- package/dist/providers/oauth/jwt-claims.js +67 -0
- package/dist/providers/oauth/jwt-claims.js.map +1 -0
- package/dist/providers/oauth/local-callback-server.d.ts +60 -0
- package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
- package/dist/providers/oauth/local-callback-server.js +148 -0
- package/dist/providers/oauth/local-callback-server.js.map +1 -0
- package/dist/providers/oauth/oauth-client.d.ts +55 -0
- package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/oauth-client.js +161 -0
- package/dist/providers/oauth/oauth-client.js.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.js +265 -0
- package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
- package/dist/providers/oauth/pkce-helper.d.ts +43 -0
- package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
- package/dist/providers/oauth/pkce-helper.js +57 -0
- package/dist/providers/oauth/pkce-helper.js.map +1 -0
- package/dist/providers/oauth/redaction.d.ts +22 -0
- package/dist/providers/oauth/redaction.d.ts.map +1 -0
- package/dist/providers/oauth/redaction.js +59 -0
- package/dist/providers/oauth/redaction.js.map +1 -0
- package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
- package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
- package/dist/providers/oauth/secure-credential-store.js +73 -0
- package/dist/providers/oauth/secure-credential-store.js.map +1 -0
- package/dist/providers/oauth/token-store.d.ts +53 -0
- package/dist/providers/oauth/token-store.d.ts.map +1 -0
- package/dist/providers/oauth/token-store.js +78 -0
- package/dist/providers/oauth/token-store.js.map +1 -0
- package/dist/providers/oauth/types.d.ts +64 -0
- package/dist/providers/oauth/types.d.ts.map +1 -0
- package/dist/providers/oauth/types.js +12 -0
- package/dist/providers/oauth/types.js.map +1 -0
- package/dist/providers/object-tracking.d.ts +47 -0
- package/dist/providers/object-tracking.d.ts.map +1 -0
- package/dist/providers/object-tracking.js +46 -0
- package/dist/providers/object-tracking.js.map +1 -0
- package/dist/providers/offline-model-index.d.ts +20 -0
- package/dist/providers/offline-model-index.d.ts.map +1 -0
- package/dist/providers/offline-model-index.js +112 -0
- package/dist/providers/offline-model-index.js.map +1 -0
- package/dist/providers/ollama-provider.d.ts +30 -2
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +198 -43
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-compat/client.d.ts +57 -0
- package/dist/providers/openai-compat/client.d.ts.map +1 -0
- package/dist/providers/openai-compat/client.js +157 -0
- package/dist/providers/openai-compat/client.js.map +1 -0
- package/dist/providers/openai-compat/decode.d.ts +36 -0
- package/dist/providers/openai-compat/decode.d.ts.map +1 -0
- package/dist/providers/openai-compat/decode.js +55 -0
- package/dist/providers/openai-compat/decode.js.map +1 -0
- package/dist/providers/openai-compat/errors.d.ts +54 -0
- package/dist/providers/openai-compat/errors.d.ts.map +1 -0
- package/dist/providers/openai-compat/errors.js +144 -0
- package/dist/providers/openai-compat/errors.js.map +1 -0
- package/dist/providers/openai-compat/index.d.ts +8 -0
- package/dist/providers/openai-compat/index.d.ts.map +1 -0
- package/dist/providers/openai-compat/index.js +5 -0
- package/dist/providers/openai-compat/index.js.map +1 -0
- package/dist/providers/openai-compat/sse.d.ts +14 -0
- package/dist/providers/openai-compat/sse.d.ts.map +1 -0
- package/dist/providers/openai-compat/sse.js +69 -0
- package/dist/providers/openai-compat/sse.js.map +1 -0
- package/dist/providers/openai-compat/types.d.ts +75 -0
- package/dist/providers/openai-compat/types.d.ts.map +1 -0
- package/dist/providers/openai-compat/types.js +9 -0
- package/dist/providers/openai-compat/types.js.map +1 -0
- package/dist/providers/openai-compat-provider.d.ts +90 -0
- package/dist/providers/openai-compat-provider.d.ts.map +1 -0
- package/dist/providers/openai-compat-provider.js +282 -0
- package/dist/providers/openai-compat-provider.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +98 -27
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +1037 -105
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.d.ts +58 -13
- package/dist/providers/openrouter-provider.d.ts.map +1 -1
- package/dist/providers/openrouter-provider.js +383 -51
- package/dist/providers/openrouter-provider.js.map +1 -1
- package/dist/providers/provider-call-failure.d.ts +39 -0
- package/dist/providers/provider-call-failure.d.ts.map +1 -0
- package/dist/providers/provider-call-failure.js +132 -0
- package/dist/providers/provider-call-failure.js.map +1 -0
- package/dist/providers/provider-error.d.ts +59 -0
- package/dist/providers/provider-error.d.ts.map +1 -0
- package/dist/providers/provider-error.js +171 -0
- package/dist/providers/provider-error.js.map +1 -0
- package/dist/providers/provider-generations.d.ts +99 -0
- package/dist/providers/provider-generations.d.ts.map +1 -0
- package/dist/providers/provider-generations.js +71 -0
- package/dist/providers/provider-generations.js.map +1 -0
- package/dist/providers/provider-queue.d.ts +62 -0
- package/dist/providers/provider-queue.d.ts.map +1 -0
- package/dist/providers/provider-queue.js +28 -0
- package/dist/providers/provider-queue.js.map +1 -0
- package/dist/providers/provider-registry.d.ts +33 -14
- package/dist/providers/provider-registry.d.ts.map +1 -1
- package/dist/providers/provider-registry.js +85 -68
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/providers/provider-request-log.d.ts +53 -0
- package/dist/providers/provider-request-log.d.ts.map +1 -0
- package/dist/providers/provider-request-log.js +168 -0
- package/dist/providers/provider-request-log.js.map +1 -0
- package/dist/providers/provider-session.d.ts +3 -0
- package/dist/providers/provider-session.d.ts.map +1 -0
- package/dist/providers/provider-session.js +10 -0
- package/dist/providers/provider-session.js.map +1 -0
- package/dist/providers/provider-transport.d.ts +11 -0
- package/dist/providers/provider-transport.d.ts.map +1 -0
- package/dist/providers/provider-transport.js +11 -0
- package/dist/providers/provider-transport.js.map +1 -0
- package/dist/providers/python-provider.d.ts +26 -13
- package/dist/providers/python-provider.d.ts.map +1 -1
- package/dist/providers/python-provider.js +204 -25
- package/dist/providers/python-provider.js.map +1 -1
- package/dist/providers/replicate-provider.d.ts +91 -8
- package/dist/providers/replicate-provider.d.ts.map +1 -1
- package/dist/providers/replicate-provider.js +823 -65
- package/dist/providers/replicate-provider.js.map +1 -1
- package/dist/providers/replicate-retry.d.ts +30 -0
- package/dist/providers/replicate-retry.d.ts.map +1 -0
- package/dist/providers/replicate-retry.js +97 -0
- package/dist/providers/replicate-retry.js.map +1 -0
- package/dist/providers/requesty-provider.d.ts +30 -0
- package/dist/providers/requesty-provider.d.ts.map +1 -0
- package/dist/providers/requesty-provider.js +87 -0
- package/dist/providers/requesty-provider.js.map +1 -0
- package/dist/providers/responses-api.d.ts +27 -0
- package/dist/providers/responses-api.d.ts.map +1 -0
- package/dist/providers/responses-api.js +297 -0
- package/dist/providers/responses-api.js.map +1 -0
- package/dist/providers/reve-provider.d.ts +46 -0
- package/dist/providers/reve-provider.d.ts.map +1 -0
- package/dist/providers/reve-provider.js +165 -0
- package/dist/providers/reve-provider.js.map +1 -0
- package/dist/providers/rodin-provider.d.ts +25 -2
- package/dist/providers/rodin-provider.d.ts.map +1 -1
- package/dist/providers/rodin-provider.js +95 -51
- package/dist/providers/rodin-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts +70 -0
- package/dist/providers/safe-url.d.ts.map +1 -0
- package/dist/providers/safe-url.js +277 -0
- package/dist/providers/safe-url.js.map +1 -0
- package/dist/providers/scripted-provider.d.ts +9 -0
- package/dist/providers/scripted-provider.d.ts.map +1 -1
- package/dist/providers/scripted-provider.js +86 -10
- package/dist/providers/scripted-provider.js.map +1 -1
- package/dist/providers/structured-output.d.ts +42 -0
- package/dist/providers/structured-output.d.ts.map +1 -0
- package/dist/providers/structured-output.js +83 -0
- package/dist/providers/structured-output.js.map +1 -0
- package/dist/providers/together-operations.d.ts +27 -0
- package/dist/providers/together-operations.d.ts.map +1 -0
- package/dist/providers/together-operations.js +95 -0
- package/dist/providers/together-operations.js.map +1 -0
- package/dist/providers/together-provider.d.ts +18 -18
- package/dist/providers/together-provider.d.ts.map +1 -1
- package/dist/providers/together-provider.js +140 -367
- package/dist/providers/together-provider.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +45 -0
- package/dist/providers/topaz-provider.d.ts.map +1 -0
- package/dist/providers/topaz-provider.js +244 -0
- package/dist/providers/topaz-provider.js.map +1 -0
- package/dist/providers/types.d.ts +641 -4
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +81 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/useapi-provider.d.ts +28 -0
- package/dist/providers/useapi-provider.d.ts.map +1 -0
- package/dist/providers/useapi-provider.js +274 -0
- package/dist/providers/useapi-provider.js.map +1 -0
- package/dist/providers/video-duration.d.ts +6 -0
- package/dist/providers/video-duration.d.ts.map +1 -0
- package/dist/providers/video-duration.js +63 -0
- package/dist/providers/video-duration.js.map +1 -0
- package/dist/providers/video-frame-fallback.d.ts +39 -0
- package/dist/providers/video-frame-fallback.d.ts.map +1 -0
- package/dist/providers/video-frame-fallback.js +155 -0
- package/dist/providers/video-frame-fallback.js.map +1 -0
- package/dist/providers/video-frames.d.ts +61 -0
- package/dist/providers/video-frames.d.ts.map +1 -0
- package/dist/providers/video-frames.js +208 -0
- package/dist/providers/video-frames.js.map +1 -0
- package/dist/providers/video-mime.d.ts +14 -0
- package/dist/providers/video-mime.d.ts.map +1 -0
- package/dist/providers/video-mime.js +44 -0
- package/dist/providers/video-mime.js.map +1 -0
- package/dist/providers/video-to-audio.d.ts +34 -0
- package/dist/providers/video-to-audio.d.ts.map +1 -0
- package/dist/providers/video-to-audio.js +62 -0
- package/dist/providers/video-to-audio.js.map +1 -0
- package/dist/providers/vllm-provider.d.ts +20 -8
- package/dist/providers/vllm-provider.d.ts.map +1 -1
- package/dist/providers/vllm-provider.js +44 -23
- package/dist/providers/vllm-provider.js.map +1 -1
- package/dist/providers/voyage-provider.d.ts +12 -3
- package/dist/providers/voyage-provider.d.ts.map +1 -1
- package/dist/providers/voyage-provider.js +21 -7
- package/dist/providers/voyage-provider.js.map +1 -1
- package/dist/providers/xai-provider.d.ts +56 -13
- package/dist/providers/xai-provider.d.ts.map +1 -1
- package/dist/providers/xai-provider.js +307 -22
- package/dist/providers/xai-provider.js.map +1 -1
- package/dist/python-bridge-base.d.ts +358 -0
- package/dist/python-bridge-base.d.ts.map +1 -0
- package/dist/python-bridge-base.js +1557 -0
- package/dist/python-bridge-base.js.map +1 -0
- package/dist/python-bridge-codec.d.ts +28 -0
- package/dist/python-bridge-codec.d.ts.map +1 -0
- package/dist/python-bridge-codec.js +39 -0
- package/dist/python-bridge-codec.js.map +1 -0
- package/dist/python-bridge-factory.d.ts +52 -0
- package/dist/python-bridge-factory.d.ts.map +1 -0
- package/dist/python-bridge-factory.js +69 -0
- package/dist/python-bridge-factory.js.map +1 -0
- package/dist/python-bridge-framing.d.ts +68 -0
- package/dist/python-bridge-framing.d.ts.map +1 -0
- package/dist/python-bridge-framing.js +91 -0
- package/dist/python-bridge-framing.js.map +1 -0
- package/dist/python-bridge-types.d.ts +545 -2
- package/dist/python-bridge-types.d.ts.map +1 -1
- package/dist/python-bridge-types.js +49 -1
- package/dist/python-bridge-types.js.map +1 -1
- package/dist/python-graph-resolver.d.ts +57 -0
- package/dist/python-graph-resolver.d.ts.map +1 -0
- package/dist/python-graph-resolver.js +79 -0
- package/dist/python-graph-resolver.js.map +1 -0
- package/dist/python-node-executor.d.ts +36 -4
- package/dist/python-node-executor.d.ts.map +1 -1
- package/dist/python-node-executor.js +177 -86
- package/dist/python-node-executor.js.map +1 -1
- package/dist/python-stdio-bridge.d.ts +18 -37
- package/dist/python-stdio-bridge.d.ts.map +1 -1
- package/dist/python-stdio-bridge.js +148 -475
- package/dist/python-stdio-bridge.js.map +1 -1
- package/dist/python-websocket-bridge.d.ts +140 -0
- package/dist/python-websocket-bridge.d.ts.map +1 -0
- package/dist/python-websocket-bridge.js +561 -0
- package/dist/python-websocket-bridge.js.map +1 -0
- package/dist/python-worker-stderr.d.ts +4 -0
- package/dist/python-worker-stderr.d.ts.map +1 -0
- package/dist/python-worker-stderr.js +24 -0
- package/dist/python-worker-stderr.js.map +1 -0
- package/dist/recommended-models.d.ts +2 -2
- package/dist/recommended-models.d.ts.map +1 -1
- package/dist/recommended-models.js +44 -4
- package/dist/recommended-models.js.map +1 -1
- package/dist/recoverable-node-error.d.ts +31 -0
- package/dist/recoverable-node-error.d.ts.map +1 -0
- package/dist/recoverable-node-error.js +37 -0
- package/dist/recoverable-node-error.js.map +1 -0
- package/dist/redact-params.d.ts +13 -0
- package/dist/redact-params.d.ts.map +1 -0
- package/dist/redact-params.js +57 -0
- package/dist/redact-params.js.map +1 -0
- package/dist/run-context.d.ts +20 -0
- package/dist/run-context.d.ts.map +1 -0
- package/dist/run-context.js +18 -0
- package/dist/run-context.js.map +1 -0
- package/dist/run-trace-context.d.ts +30 -0
- package/dist/run-trace-context.d.ts.map +1 -0
- package/dist/run-trace-context.js +80 -0
- package/dist/run-trace-context.js.map +1 -0
- package/dist/run-trace-processor.d.ts +65 -0
- package/dist/run-trace-processor.d.ts.map +1 -0
- package/dist/run-trace-processor.js +417 -0
- package/dist/run-trace-processor.js.map +1 -0
- package/dist/run-trace-serialization.d.ts +5 -0
- package/dist/run-trace-serialization.d.ts.map +1 -0
- package/dist/run-trace-serialization.js +113 -0
- package/dist/run-trace-serialization.js.map +1 -0
- package/dist/sandbox-module-catalog.d.ts +43 -0
- package/dist/sandbox-module-catalog.d.ts.map +1 -0
- package/dist/sandbox-module-catalog.js +25 -0
- package/dist/sandbox-module-catalog.js.map +1 -0
- package/dist/storage-workspace.d.ts +62 -0
- package/dist/storage-workspace.d.ts.map +1 -0
- package/dist/storage-workspace.js +441 -0
- package/dist/storage-workspace.js.map +1 -0
- package/dist/swappable-python-bridge.d.ts +83 -0
- package/dist/swappable-python-bridge.d.ts.map +1 -0
- package/dist/swappable-python-bridge.js +246 -0
- package/dist/swappable-python-bridge.js.map +1 -0
- package/dist/telemetry.d.ts +16 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +76 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/testing.d.ts +81 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +130 -0
- package/dist/testing.js.map +1 -0
- package/dist/token-counter.d.ts +30 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +156 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/trace-exporters.d.ts +11 -28
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +69 -22
- package/dist/trace-exporters.js.map +1 -1
- package/dist/tracing-helpers.d.ts +60 -26
- package/dist/tracing-helpers.d.ts.map +1 -1
- package/dist/tracing-helpers.js +100 -25
- package/dist/tracing-helpers.js.map +1 -1
- package/dist/trim-video-window.d.ts +8 -0
- package/dist/trim-video-window.d.ts.map +1 -0
- package/dist/trim-video-window.js +50 -0
- package/dist/trim-video-window.js.map +1 -0
- package/dist/turn-budget.d.ts +278 -0
- package/dist/turn-budget.d.ts.map +1 -0
- package/dist/turn-budget.js +365 -0
- package/dist/turn-budget.js.map +1 -0
- package/dist/variable-channel.d.ts +48 -0
- package/dist/variable-channel.d.ts.map +1 -0
- package/dist/variable-channel.js +110 -0
- package/dist/variable-channel.js.map +1 -0
- package/dist/workspace.d.ts +119 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +112 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +121 -19
|
@@ -0,0 +1,751 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline asset references in prompt text.
|
|
3
|
+
*
|
|
4
|
+
* Prompt-style surfaces (the Prompt composer, chat) let users mention an asset
|
|
5
|
+
* with `@`, which encodes as an `asset://<id>.<ext>` token inside the plain
|
|
6
|
+
* prompt string. Text-generation tasks expand these tokens into multimodal
|
|
7
|
+
* image / audio message blocks before the provider call. This module is the
|
|
8
|
+
* shared, provider-agnostic parser so other task types (e.g. image-to-image)
|
|
9
|
+
* can pull the same referenced media out of a prompt and route it to a typed
|
|
10
|
+
* input instead of leaving a dangling `asset://` URI in the text.
|
|
11
|
+
*
|
|
12
|
+
* The low-level parsing is resolution-free — callers hand the verbatim
|
|
13
|
+
* `asset://` URI to {@link loadMediaRefBytes} / `resolveMessageMediaUris`,
|
|
14
|
+
* which dereference it to bytes / a data URI just before it is consumed. The
|
|
15
|
+
* higher-level {@link mapPromptAssetsToInputs} does resolve, so provider nodes
|
|
16
|
+
* (FAL / KIE / Replicate / image-to-image) can route a mentioned image / audio
|
|
17
|
+
* / video into a typed asset input with bytes already in hand.
|
|
18
|
+
*
|
|
19
|
+
* A mentioned plain-text document (`.md`, `.txt`, `.csv`, `.json`, …) has no
|
|
20
|
+
* typed input to route to — {@link inlineTextAssetRefs} substitutes its decoded
|
|
21
|
+
* contents into the prompt text in place of the token.
|
|
22
|
+
*/
|
|
23
|
+
import { encodeBase64, loadMediaRefBytes } from "./media-ref-bytes.js";
|
|
24
|
+
import { isCallable, isObjectLike, isString } from "@nodetool-ai/protocol";
|
|
25
|
+
/** Matches an inline `asset://<id>.<ext>` token (greedy over the URI charset). */
|
|
26
|
+
const ASSET_URI_RE = /asset:\/\/[A-Za-z0-9._~\-/]+/g;
|
|
27
|
+
const IMAGE_EXT_MIME = {
|
|
28
|
+
png: "image/png",
|
|
29
|
+
jpg: "image/jpeg",
|
|
30
|
+
jpeg: "image/jpeg",
|
|
31
|
+
gif: "image/gif",
|
|
32
|
+
webp: "image/webp",
|
|
33
|
+
bmp: "image/bmp",
|
|
34
|
+
svg: "image/svg+xml"
|
|
35
|
+
};
|
|
36
|
+
const AUDIO_EXT_MIME = {
|
|
37
|
+
mp3: "audio/mpeg",
|
|
38
|
+
mpeg: "audio/mpeg",
|
|
39
|
+
wav: "audio/wav",
|
|
40
|
+
ogg: "audio/ogg",
|
|
41
|
+
m4a: "audio/mp4",
|
|
42
|
+
aac: "audio/aac",
|
|
43
|
+
flac: "audio/flac",
|
|
44
|
+
opus: "audio/opus"
|
|
45
|
+
};
|
|
46
|
+
const VIDEO_EXT_MIME = {
|
|
47
|
+
mp4: "video/mp4",
|
|
48
|
+
webm: "video/webm",
|
|
49
|
+
mov: "video/quicktime",
|
|
50
|
+
mkv: "video/x-matroska",
|
|
51
|
+
avi: "video/x-msvideo"
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Plain-text document extensions. Unlike media, a text mention has no typed
|
|
55
|
+
* input to route to — its decoded content is inlined into the prompt string in
|
|
56
|
+
* place of the token (see {@link inlineTextAssetRefs}).
|
|
57
|
+
*/
|
|
58
|
+
const TEXT_EXT_MIME = {
|
|
59
|
+
txt: "text/plain",
|
|
60
|
+
text: "text/plain",
|
|
61
|
+
md: "text/markdown",
|
|
62
|
+
markdown: "text/markdown",
|
|
63
|
+
csv: "text/csv",
|
|
64
|
+
tsv: "text/tab-separated-values",
|
|
65
|
+
json: "application/json",
|
|
66
|
+
jsonl: "application/json",
|
|
67
|
+
ndjson: "application/json",
|
|
68
|
+
xml: "application/xml",
|
|
69
|
+
yaml: "application/yaml",
|
|
70
|
+
yml: "application/yaml",
|
|
71
|
+
html: "text/html",
|
|
72
|
+
htm: "text/html",
|
|
73
|
+
log: "text/plain",
|
|
74
|
+
rst: "text/x-rst",
|
|
75
|
+
ini: "text/plain",
|
|
76
|
+
toml: "text/plain",
|
|
77
|
+
srt: "text/plain",
|
|
78
|
+
vtt: "text/vtt"
|
|
79
|
+
};
|
|
80
|
+
/** Lowercased extension of an `asset://<id>.<ext>` token (without the dot). */
|
|
81
|
+
function tokenExt(token) {
|
|
82
|
+
const noScheme = token.slice("asset://".length);
|
|
83
|
+
const primary = noScheme.split(/[?#]/)[0];
|
|
84
|
+
return (primary.split(".").pop() ?? "").toLowerCase();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Classify an `asset://<id>.<ext>` token by its extension. Image, audio and
|
|
88
|
+
* video are provider-consumable media (reference-to-video / lipsync models take
|
|
89
|
+
* a video clip); everything else (text, unknown) returns null so the reference
|
|
90
|
+
* is left for the text-inlining pass or kept as literal text in the prompt.
|
|
91
|
+
*/
|
|
92
|
+
export function classifyAssetToken(token) {
|
|
93
|
+
if (!token.startsWith("asset://"))
|
|
94
|
+
return null;
|
|
95
|
+
const ext = tokenExt(token);
|
|
96
|
+
// Object.hasOwn, not `in`: `in` walks the prototype chain, so an extension of
|
|
97
|
+
// "__proto__"/"toString"/"constructor" would match an inherited key and
|
|
98
|
+
// return a non-string (object/function) mime, fabricating a bogus media ref.
|
|
99
|
+
if (Object.hasOwn(IMAGE_EXT_MIME, ext))
|
|
100
|
+
return { kind: "image", mime: IMAGE_EXT_MIME[ext] };
|
|
101
|
+
if (Object.hasOwn(AUDIO_EXT_MIME, ext))
|
|
102
|
+
return { kind: "audio", mime: AUDIO_EXT_MIME[ext] };
|
|
103
|
+
if (Object.hasOwn(VIDEO_EXT_MIME, ext))
|
|
104
|
+
return { kind: "video", mime: VIDEO_EXT_MIME[ext] };
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Classify an `asset://<id>.<ext>` token as a plain-text document. Returns null
|
|
109
|
+
* for non-text tokens (media, folders, unknown) so they are left untouched by
|
|
110
|
+
* the text-inlining pass.
|
|
111
|
+
*/
|
|
112
|
+
export function classifyTextToken(token) {
|
|
113
|
+
if (!token.startsWith("asset://"))
|
|
114
|
+
return null;
|
|
115
|
+
const ext = tokenExt(token);
|
|
116
|
+
return Object.hasOwn(TEXT_EXT_MIME, ext)
|
|
117
|
+
? { mime: TEXT_EXT_MIME[ext] }
|
|
118
|
+
: null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Pick a media extension for a content type so a stored asset can be turned
|
|
122
|
+
* back into a classifiable `asset://<id>.<ext>` token. Returns null for content
|
|
123
|
+
* types that aren't a recognized image/audio/video kind (folders, documents).
|
|
124
|
+
*/
|
|
125
|
+
function extForContentType(contentType) {
|
|
126
|
+
const ct = (contentType ?? "").toLowerCase().split(";")[0].trim();
|
|
127
|
+
const slash = ct.indexOf("/");
|
|
128
|
+
if (slash <= 0)
|
|
129
|
+
return null;
|
|
130
|
+
const top = ct.slice(0, slash);
|
|
131
|
+
let sub = ct.slice(slash + 1).split("+")[0];
|
|
132
|
+
if (ct === "audio/mpeg" || ct === "audio/mp3")
|
|
133
|
+
sub = "mp3";
|
|
134
|
+
else if (ct === "audio/mp4")
|
|
135
|
+
sub = "m4a";
|
|
136
|
+
else if (ct === "video/quicktime")
|
|
137
|
+
sub = "mov";
|
|
138
|
+
if (top === "image" && Object.hasOwn(IMAGE_EXT_MIME, sub))
|
|
139
|
+
return sub;
|
|
140
|
+
if (top === "audio" && Object.hasOwn(AUDIO_EXT_MIME, sub))
|
|
141
|
+
return sub;
|
|
142
|
+
if (top === "video" && Object.hasOwn(VIDEO_EXT_MIME, sub))
|
|
143
|
+
return sub;
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reverse of the ext→mime tables: the extension whose mime matches. Tries the
|
|
148
|
+
* media tables first (via {@link extForContentType}, which also normalizes
|
|
149
|
+
* `+suffix` and audio/video aliases), then falls back to a text-document match.
|
|
150
|
+
* Returns null for an unrecognized mime.
|
|
151
|
+
*/
|
|
152
|
+
function extForMime(mime) {
|
|
153
|
+
const viaMedia = extForContentType(mime);
|
|
154
|
+
if (viaMedia)
|
|
155
|
+
return viaMedia;
|
|
156
|
+
const ct = (mime ?? "").toLowerCase().split(";")[0].trim();
|
|
157
|
+
for (const [ext, m] of Object.entries(TEXT_EXT_MIME)) {
|
|
158
|
+
if (m === ct)
|
|
159
|
+
return ext;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/** Fallback extension per ref `type` when the mime is missing/unrecognized. */
|
|
164
|
+
const DEFAULT_EXT_BY_KIND = {
|
|
165
|
+
image: "png",
|
|
166
|
+
audio: "mp3",
|
|
167
|
+
video: "mp4",
|
|
168
|
+
document: "txt",
|
|
169
|
+
text: "txt"
|
|
170
|
+
};
|
|
171
|
+
/** Pick an extension for a ref from its mime, else its declared `type`. */
|
|
172
|
+
function extForRef(ref) {
|
|
173
|
+
const mime = isString(ref.mimeType)
|
|
174
|
+
? ref.mimeType
|
|
175
|
+
: isString(ref.content_type)
|
|
176
|
+
? ref.content_type
|
|
177
|
+
: "";
|
|
178
|
+
const byMime = mime ? extForMime(mime) : null;
|
|
179
|
+
if (byMime)
|
|
180
|
+
return byMime;
|
|
181
|
+
const kind = isString(ref.type) ? ref.type.toLowerCase() : "";
|
|
182
|
+
return Object.hasOwn(DEFAULT_EXT_BY_KIND, kind)
|
|
183
|
+
? DEFAULT_EXT_BY_KIND[kind]
|
|
184
|
+
: null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Convert a media / document ref — the `{ type, uri, asset_id, mimeType }` shape
|
|
188
|
+
* image / audio / video / document outputs carry — into the inline
|
|
189
|
+
* `asset://<id>.<ext>` token the prompt-expansion machinery understands.
|
|
190
|
+
*
|
|
191
|
+
* This lets an asset wired into a Prompt node's `{{ variable }}` flow through
|
|
192
|
+
* the same path as an inline `@`-mention: once rendered, the token is picked up
|
|
193
|
+
* by {@link expandAssetReferences} (LLM message blocks), `mapPromptAssetsToInputs`
|
|
194
|
+
* (typed provider inputs), or {@link inlineTextAssetRefs} (text documents),
|
|
195
|
+
* instead of stringifying to `"[object Object]"`.
|
|
196
|
+
*
|
|
197
|
+
* Returns null for values that aren't asset refs (strings, numbers, plain
|
|
198
|
+
* objects with no `uri`/`asset_id`) so callers fall back to normal stringify.
|
|
199
|
+
* A ref pointing only at a non-asset uri (http / data / file) yields that uri
|
|
200
|
+
* verbatim — it won't route as media, but it still beats `"[object Object]"`.
|
|
201
|
+
*/
|
|
202
|
+
export function assetRefToPromptToken(value) {
|
|
203
|
+
if (!isObjectLike(value))
|
|
204
|
+
return null;
|
|
205
|
+
const ref = value;
|
|
206
|
+
const uri = isString(ref.uri) ? ref.uri.trim() : "";
|
|
207
|
+
const assetId = isString(ref.asset_id) ? ref.asset_id.trim() : "";
|
|
208
|
+
if (uri.startsWith("asset://")) {
|
|
209
|
+
// Drop any query/hash; keep the id (and any existing extension) intact.
|
|
210
|
+
const id = uri.slice("asset://".length).split(/[?#]/)[0];
|
|
211
|
+
if (!id)
|
|
212
|
+
return null;
|
|
213
|
+
if (id.includes("."))
|
|
214
|
+
return `asset://${id}`;
|
|
215
|
+
const ext = extForRef(ref);
|
|
216
|
+
return ext ? `asset://${id}.${ext}` : `asset://${id}`;
|
|
217
|
+
}
|
|
218
|
+
if (assetId) {
|
|
219
|
+
const ext = extForRef(ref);
|
|
220
|
+
return ext ? `asset://${assetId}.${ext}` : `asset://${assetId}`;
|
|
221
|
+
}
|
|
222
|
+
// Asset-less ref that still points somewhere resolvable.
|
|
223
|
+
if (uri)
|
|
224
|
+
return uri;
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Trim trailing dots (sentence punctuation) off a token. A character loop, not
|
|
229
|
+
* `/\.+$/` — that regex backtracks polynomially on long dot runs, which CodeQL
|
|
230
|
+
* flags as a ReDoS risk on prompt-derived input.
|
|
231
|
+
*/
|
|
232
|
+
function trimTrailingDots(token) {
|
|
233
|
+
let end = token.length;
|
|
234
|
+
while (end > 0 && token[end - 1] === ".") {
|
|
235
|
+
end--;
|
|
236
|
+
}
|
|
237
|
+
return token.slice(0, end);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Collapse horizontal-whitespace gaps left behind by token substitution:
|
|
241
|
+
* runs of 2+ spaces/tabs become one space, horizontal whitespace before a
|
|
242
|
+
* newline is dropped, and the result is trimmed. A single pass instead of
|
|
243
|
+
* `/[ \t]{2,}/` + `/[ \t]+\n/` — those backtrack polynomially on long
|
|
244
|
+
* space/tab runs (a ReDoS risk on prompt-derived input).
|
|
245
|
+
*/
|
|
246
|
+
function collapseGapWhitespace(text) {
|
|
247
|
+
let out = "";
|
|
248
|
+
let run = ""; // pending run of spaces/tabs
|
|
249
|
+
for (const ch of text) {
|
|
250
|
+
if (ch === " " || ch === "\t") {
|
|
251
|
+
run += ch;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (ch === "\n") {
|
|
255
|
+
// Drop horizontal whitespace before a newline.
|
|
256
|
+
run = "";
|
|
257
|
+
out += "\n";
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (run) {
|
|
261
|
+
out += run.length > 1 ? " " : run;
|
|
262
|
+
run = "";
|
|
263
|
+
}
|
|
264
|
+
out += ch;
|
|
265
|
+
}
|
|
266
|
+
if (run) {
|
|
267
|
+
out += run.length > 1 ? " " : run;
|
|
268
|
+
}
|
|
269
|
+
return out.trim();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Scan a prompt for `asset://` tokens in source order, yielding each token with
|
|
273
|
+
* its source offset. Trailing dots are treated as sentence punctuation (not
|
|
274
|
+
* part of the extension), so `asset://a.png.` yields `asset://a.png` and leaves
|
|
275
|
+
* the period in the surrounding text. Classification is left to the caller.
|
|
276
|
+
*/
|
|
277
|
+
function scanAssetTokens(prompt) {
|
|
278
|
+
const out = [];
|
|
279
|
+
ASSET_URI_RE.lastIndex = 0;
|
|
280
|
+
let match;
|
|
281
|
+
while ((match = ASSET_URI_RE.exec(prompt)) !== null) {
|
|
282
|
+
const token = trimTrailingDots(match[0]);
|
|
283
|
+
out.push({ token, index: match.index });
|
|
284
|
+
}
|
|
285
|
+
return out;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Find every classifiable media reference in a prompt, in source order.
|
|
289
|
+
*
|
|
290
|
+
* Unclassifiable tokens (no/unknown extension, e.g. `asset://doc.txt`) are
|
|
291
|
+
* skipped and remain literal text — text documents are handled separately by
|
|
292
|
+
* {@link findTextAssetRefs} / {@link inlineTextAssetRefs}.
|
|
293
|
+
*/
|
|
294
|
+
export function findAssetRefs(prompt) {
|
|
295
|
+
const refs = [];
|
|
296
|
+
for (const { token, index } of scanAssetTokens(prompt)) {
|
|
297
|
+
const classification = classifyAssetToken(token);
|
|
298
|
+
if (!classification)
|
|
299
|
+
continue;
|
|
300
|
+
refs.push({
|
|
301
|
+
uri: token,
|
|
302
|
+
kind: classification.kind,
|
|
303
|
+
mime: classification.mime,
|
|
304
|
+
index,
|
|
305
|
+
length: token.length
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
return refs;
|
|
309
|
+
}
|
|
310
|
+
/** Find every plain-text document reference in a prompt, in source order. */
|
|
311
|
+
export function findTextAssetRefs(prompt) {
|
|
312
|
+
const refs = [];
|
|
313
|
+
for (const { token, index } of scanAssetTokens(prompt)) {
|
|
314
|
+
const classification = classifyTextToken(token);
|
|
315
|
+
if (!classification)
|
|
316
|
+
continue;
|
|
317
|
+
refs.push({ uri: token, mime: classification.mime, index, length: token.length });
|
|
318
|
+
}
|
|
319
|
+
return refs;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Replace each plain-text document mention in `prompt` with the asset's decoded
|
|
323
|
+
* UTF-8 contents, inline. A mention that can't be resolved to bytes is left as
|
|
324
|
+
* its literal token (never silently dropped). Media mentions are untouched.
|
|
325
|
+
*/
|
|
326
|
+
export async function inlineTextAssetRefs(prompt, context) {
|
|
327
|
+
if (!context || !prompt.includes("asset://"))
|
|
328
|
+
return prompt;
|
|
329
|
+
const refs = findTextAssetRefs(prompt);
|
|
330
|
+
if (refs.length === 0)
|
|
331
|
+
return prompt;
|
|
332
|
+
const decoder = new TextDecoder();
|
|
333
|
+
const contents = await Promise.all(refs.map(async (ref) => {
|
|
334
|
+
const bytes = await loadMediaRefBytes({ type: "text", uri: ref.uri }, context);
|
|
335
|
+
// A resolved-but-empty asset must inline as "" (not fall back to the
|
|
336
|
+
// literal token); only a failed resolution (null bytes) keeps the token.
|
|
337
|
+
return bytes ? decoder.decode(bytes) : null;
|
|
338
|
+
}));
|
|
339
|
+
let result = "";
|
|
340
|
+
let cursor = 0;
|
|
341
|
+
refs.forEach((ref, i) => {
|
|
342
|
+
if (ref.index < cursor)
|
|
343
|
+
return;
|
|
344
|
+
result += prompt.slice(cursor, ref.index);
|
|
345
|
+
// Inline the decoded text, or keep the literal token when resolution failed.
|
|
346
|
+
result += contents[i] ?? prompt.slice(ref.index, ref.index + ref.length);
|
|
347
|
+
cursor = ref.index + ref.length;
|
|
348
|
+
});
|
|
349
|
+
result += prompt.slice(cursor);
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
/** Convenience: only the image references in a prompt. */
|
|
353
|
+
export function findImageAssetRefs(prompt) {
|
|
354
|
+
return findAssetRefs(prompt).filter((ref) => ref.kind === "image");
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Split a prompt containing inline `asset://<id>.<ext>` references into a
|
|
358
|
+
* multimodal content array: text segments interleaved with image / audio
|
|
359
|
+
* blocks that carry the `asset://` URI verbatim. The blocks are NOT resolved
|
|
360
|
+
* here — {@link ProcessingContext.resolveMessageMediaUris} dereferences the
|
|
361
|
+
* URIs to data URIs just before the provider call. Tokens that aren't a
|
|
362
|
+
* supported chat media type (video, unknown) stay as literal text so the
|
|
363
|
+
* model still sees the mention.
|
|
364
|
+
*/
|
|
365
|
+
export function expandAssetReferences(prompt) {
|
|
366
|
+
const refs = findAssetRefs(prompt);
|
|
367
|
+
if (refs.length === 0) {
|
|
368
|
+
return [{ type: "text", text: prompt }];
|
|
369
|
+
}
|
|
370
|
+
const parts = [];
|
|
371
|
+
const pushText = (text) => {
|
|
372
|
+
if (text)
|
|
373
|
+
parts.push({ type: "text", text });
|
|
374
|
+
};
|
|
375
|
+
let cursor = 0;
|
|
376
|
+
for (const ref of refs) {
|
|
377
|
+
pushText(prompt.slice(cursor, ref.index));
|
|
378
|
+
if (ref.kind === "image") {
|
|
379
|
+
parts.push({
|
|
380
|
+
type: "image_url",
|
|
381
|
+
image: { uri: ref.uri, mimeType: ref.mime }
|
|
382
|
+
});
|
|
383
|
+
// Keep the literal token next to the block, the way the video branch
|
|
384
|
+
// below does. The block itself resolves to a data URI before the
|
|
385
|
+
// provider call, so without the token the model sees pixels it has no
|
|
386
|
+
// handle for and cannot name the image in a later `edit_image` call.
|
|
387
|
+
pushText(ref.uri);
|
|
388
|
+
}
|
|
389
|
+
else if (ref.kind === "audio") {
|
|
390
|
+
parts.push({
|
|
391
|
+
type: "audio",
|
|
392
|
+
audio: { uri: ref.uri, mimeType: ref.mime }
|
|
393
|
+
});
|
|
394
|
+
pushText(ref.uri);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
// Video (and any other non-chat media): keep the mention as literal text
|
|
398
|
+
// so the model still sees the reference rather than a mislabeled block.
|
|
399
|
+
pushText(ref.uri);
|
|
400
|
+
}
|
|
401
|
+
cursor = ref.index + ref.length;
|
|
402
|
+
}
|
|
403
|
+
pushText(prompt.slice(cursor));
|
|
404
|
+
return parts.length > 0 ? parts : [{ type: "text", text: prompt }];
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Rewrite the given references inside the prompt, substituting each with the
|
|
408
|
+
* string `replace(ref)` returns (return `""` to drop it). Refs must come from
|
|
409
|
+
* {@link findAssetRefs} on the same string (they carry the source offsets).
|
|
410
|
+
* Horizontal whitespace left behind is collapsed so the result reads cleanly;
|
|
411
|
+
* newlines are preserved.
|
|
412
|
+
*/
|
|
413
|
+
function replaceAssetRefs(prompt, refs, replace) {
|
|
414
|
+
if (refs.length === 0)
|
|
415
|
+
return prompt;
|
|
416
|
+
let result = "";
|
|
417
|
+
let cursor = 0;
|
|
418
|
+
for (const ref of refs) {
|
|
419
|
+
if (ref.index < cursor)
|
|
420
|
+
continue;
|
|
421
|
+
result += prompt.slice(cursor, ref.index);
|
|
422
|
+
result += replace(ref);
|
|
423
|
+
cursor = ref.index + ref.length;
|
|
424
|
+
}
|
|
425
|
+
result += prompt.slice(cursor);
|
|
426
|
+
return collapseGapWhitespace(result);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Remove the given references from the prompt, collapsing the horizontal
|
|
430
|
+
* whitespace left behind so the remaining text reads as a clean instruction.
|
|
431
|
+
* Refs must come from {@link findAssetRefs} on the same string. Newlines are
|
|
432
|
+
* preserved.
|
|
433
|
+
*/
|
|
434
|
+
export function stripAssetRefs(prompt, refs) {
|
|
435
|
+
return replaceAssetRefs(prompt, refs, () => "");
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Expand any folder mention in `text` into the `asset://<id>.<ext>` tokens of
|
|
439
|
+
* its members of an accepted kind, recursively. A folder mention is a bare
|
|
440
|
+
* `asset://<id>` (no extension) that {@link ProcessingContext.listFolderAssets}
|
|
441
|
+
* resolves to a folder; non-folder bare tokens and ordinary media tokens are
|
|
442
|
+
* left untouched. The expanded tokens then flow through the normal matcher, so
|
|
443
|
+
* a referenced folder fills as many of the node's media inputs as it can.
|
|
444
|
+
*/
|
|
445
|
+
async function expandFolderRefs(text, context, acceptedKinds) {
|
|
446
|
+
if (!context || !text.includes("asset://"))
|
|
447
|
+
return text;
|
|
448
|
+
// Bare `asset://<id>` tokens (no extension) are folder candidates.
|
|
449
|
+
const candidates = [];
|
|
450
|
+
ASSET_URI_RE.lastIndex = 0;
|
|
451
|
+
let match;
|
|
452
|
+
while ((match = ASSET_URI_RE.exec(text)) !== null) {
|
|
453
|
+
const token = match[0];
|
|
454
|
+
const id = token.slice("asset://".length);
|
|
455
|
+
if (id.includes("."))
|
|
456
|
+
continue; // has an extension → a media ref, not a folder
|
|
457
|
+
candidates.push({ index: match.index, length: token.length, id });
|
|
458
|
+
}
|
|
459
|
+
if (candidates.length === 0)
|
|
460
|
+
return text;
|
|
461
|
+
const replacements = new Map();
|
|
462
|
+
for (const candidate of candidates) {
|
|
463
|
+
const entries = await context.listFolderAssets(candidate.id);
|
|
464
|
+
if (!entries)
|
|
465
|
+
continue; // not a folder → leave the token alone
|
|
466
|
+
const uris = [];
|
|
467
|
+
for (const entry of entries) {
|
|
468
|
+
const ext = extForContentType(entry.content_type);
|
|
469
|
+
if (!ext)
|
|
470
|
+
continue;
|
|
471
|
+
const classification = classifyAssetToken(`asset://${entry.id}.${ext}`);
|
|
472
|
+
if (!classification || !acceptedKinds.has(classification.kind))
|
|
473
|
+
continue;
|
|
474
|
+
uris.push(`asset://${entry.id}.${ext}`);
|
|
475
|
+
}
|
|
476
|
+
replacements.set(candidate.index, uris.join(" "));
|
|
477
|
+
}
|
|
478
|
+
if (replacements.size === 0)
|
|
479
|
+
return text;
|
|
480
|
+
let result = "";
|
|
481
|
+
let cursor = 0;
|
|
482
|
+
for (const candidate of candidates) {
|
|
483
|
+
const replacement = replacements.get(candidate.index);
|
|
484
|
+
if (replacement === undefined)
|
|
485
|
+
continue;
|
|
486
|
+
result += text.slice(cursor, candidate.index);
|
|
487
|
+
result += replacement;
|
|
488
|
+
cursor = candidate.index + candidate.length;
|
|
489
|
+
}
|
|
490
|
+
result += text.slice(cursor);
|
|
491
|
+
return collapseGapWhitespace(result);
|
|
492
|
+
}
|
|
493
|
+
/** Matches an inline `entity://<id>` token (an entity mention from `@`). */
|
|
494
|
+
const ENTITY_URI_RE = /entity:\/\/[A-Za-z0-9._~-]+/g;
|
|
495
|
+
/** Read the entity marker off asset metadata, or null when absent/malformed. */
|
|
496
|
+
function readEntityMarker(metadata) {
|
|
497
|
+
const raw = metadata?.["nodetool_entity"];
|
|
498
|
+
if (!isObjectLike(raw))
|
|
499
|
+
return null;
|
|
500
|
+
const obj = raw;
|
|
501
|
+
const name = isString(obj.name) ? obj.name.trim() : "";
|
|
502
|
+
if (!name)
|
|
503
|
+
return null;
|
|
504
|
+
const descriptor = isString(obj.descriptor) ? obj.descriptor.trim() : "";
|
|
505
|
+
const referenceAssetId = isString(obj.reference_asset_id) ? obj.reference_asset_id.trim() : "";
|
|
506
|
+
return { name, descriptor, referenceAssetId };
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Expand `entity://<id>` mentions (entities are library assets tagged with a
|
|
510
|
+
* `nodetool_entity` marker; the `@`-mention pickers encode them as this token).
|
|
511
|
+
*
|
|
512
|
+
* Each token is replaced inline with the entity's **name** so the sentence
|
|
513
|
+
* still reads naturally, and every mentioned entity contributes once to a
|
|
514
|
+
* trailing `Consistency references:` block carrying its canonical descriptor —
|
|
515
|
+
* the same shape the Apply Entities node produces. With `includeImageRefs`,
|
|
516
|
+
* each entity's reference image is appended as an `asset://<id>.<ext>` token so
|
|
517
|
+
* the normal media-mention machinery routes it into a typed image input.
|
|
518
|
+
*
|
|
519
|
+
* Resolution happens here, at generation time, so later edits to an entity's
|
|
520
|
+
* descriptor or image propagate to every prompt that mentions it. A token that
|
|
521
|
+
* cannot be resolved (unknown id, no marker, no context) is dropped.
|
|
522
|
+
*/
|
|
523
|
+
export async function expandEntityRefs(text, context, includeImageRefs) {
|
|
524
|
+
if (!text.includes("entity://"))
|
|
525
|
+
return text;
|
|
526
|
+
const tokens = [];
|
|
527
|
+
ENTITY_URI_RE.lastIndex = 0;
|
|
528
|
+
let match;
|
|
529
|
+
while ((match = ENTITY_URI_RE.exec(text)) !== null) {
|
|
530
|
+
// Trailing dots are sentence punctuation, not part of the id.
|
|
531
|
+
const token = trimTrailingDots(match[0]);
|
|
532
|
+
tokens.push({
|
|
533
|
+
index: match.index,
|
|
534
|
+
length: token.length,
|
|
535
|
+
id: token.slice("entity://".length)
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
if (tokens.length === 0)
|
|
539
|
+
return text;
|
|
540
|
+
// Resolve each unique id once; a mention of the same entity twice reads as
|
|
541
|
+
// its name twice but contributes a single consistency line / image ref.
|
|
542
|
+
const resolved = new Map();
|
|
543
|
+
for (const token of tokens) {
|
|
544
|
+
if (resolved.has(token.id))
|
|
545
|
+
continue;
|
|
546
|
+
const info = isCallable(context?.getAssetInfo)
|
|
547
|
+
? await context.getAssetInfo(token.id)
|
|
548
|
+
: null;
|
|
549
|
+
const marker = info ? readEntityMarker(info.metadata) : null;
|
|
550
|
+
if (!info || !marker) {
|
|
551
|
+
resolved.set(token.id, null);
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
const image = includeImageRefs && marker.referenceAssetId && marker.referenceAssetId !== info.id
|
|
555
|
+
? await context?.getAssetInfo(marker.referenceAssetId)
|
|
556
|
+
: info;
|
|
557
|
+
const ext = image?.content_type.startsWith("image/")
|
|
558
|
+
? extForContentType(image.content_type)
|
|
559
|
+
: null;
|
|
560
|
+
resolved.set(token.id, {
|
|
561
|
+
marker,
|
|
562
|
+
imageToken: image && ext ? `asset://${image.id}.${ext}` : null
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
let result = "";
|
|
566
|
+
let cursor = 0;
|
|
567
|
+
const consistencyLines = [];
|
|
568
|
+
const imageTokens = [];
|
|
569
|
+
const contributed = new Set();
|
|
570
|
+
for (const token of tokens) {
|
|
571
|
+
result += text.slice(cursor, token.index);
|
|
572
|
+
cursor = token.index + token.length;
|
|
573
|
+
const entity = resolved.get(token.id);
|
|
574
|
+
if (!entity)
|
|
575
|
+
continue; // unresolvable mention → dropped
|
|
576
|
+
result += entity.marker.name;
|
|
577
|
+
if (contributed.has(token.id))
|
|
578
|
+
continue;
|
|
579
|
+
contributed.add(token.id);
|
|
580
|
+
if (entity.marker.descriptor) {
|
|
581
|
+
consistencyLines.push(`- ${entity.marker.name}: ${entity.marker.descriptor}`);
|
|
582
|
+
}
|
|
583
|
+
if (includeImageRefs && entity.imageToken) {
|
|
584
|
+
imageTokens.push(entity.imageToken);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
result += text.slice(cursor);
|
|
588
|
+
result = collapseGapWhitespace(result);
|
|
589
|
+
if (consistencyLines.length > 0) {
|
|
590
|
+
result += `\n\nConsistency references:\n${consistencyLines.join("\n")}`;
|
|
591
|
+
}
|
|
592
|
+
if (imageTokens.length > 0) {
|
|
593
|
+
result += `\n${imageTokens.join(" ")}`;
|
|
594
|
+
}
|
|
595
|
+
return result;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Expand the entity mentions in a generation prompt and separate what the
|
|
599
|
+
* provider call needs from it: the seasoned text (names inline + a
|
|
600
|
+
* Consistency references block) and the entities' reference images as typed
|
|
601
|
+
* refs — never left in the text as dangling tokens.
|
|
602
|
+
*
|
|
603
|
+
* This is the direct-generation counterpart of what node prompts get through
|
|
604
|
+
* {@link mapPromptAssetsToInputs}: same expansion rule, but returning the
|
|
605
|
+
* routed images instead of writing them onto node input fields. Image
|
|
606
|
+
* mentions that were already in the caller's text are left untouched — only
|
|
607
|
+
* tokens this expansion itself produced are extracted and stripped.
|
|
608
|
+
*/
|
|
609
|
+
export async function expandEntitiesForGeneration(prompt, resolver) {
|
|
610
|
+
const preExisting = new Set(findImageAssetRefs(prompt).map((r) => r.uri));
|
|
611
|
+
const expanded = await expandEntityRefs(prompt, resolver, true);
|
|
612
|
+
if (expanded === prompt) {
|
|
613
|
+
return { prompt, referenceImages: [] };
|
|
614
|
+
}
|
|
615
|
+
const referenceImages = findImageAssetRefs(expanded).filter((ref) => !preExisting.has(ref.uri));
|
|
616
|
+
return {
|
|
617
|
+
prompt: referenceImages.length > 0
|
|
618
|
+
? stripAssetRefs(expanded, referenceImages).trimEnd()
|
|
619
|
+
: expanded,
|
|
620
|
+
referenceImages
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Map media mentioned inline in a node's text inputs onto its typed media
|
|
625
|
+
* inputs. This is the generalized form of what text-generation tasks do when
|
|
626
|
+
* they expand `asset://` references into image / audio message blocks.
|
|
627
|
+
*
|
|
628
|
+
* A mention may be a single asset or a folder: folder mentions are expanded
|
|
629
|
+
* recursively to their member assets first (see {@link expandFolderRefs}), so a
|
|
630
|
+
* referenced folder fills as many inputs as it can.
|
|
631
|
+
*
|
|
632
|
+
* For every media kind the node actually accepts (derived from `assetFields`):
|
|
633
|
+
* - mentions of that kind are pulled out of the text inputs, in order;
|
|
634
|
+
* - each still-empty input of that kind is filled with the next mention,
|
|
635
|
+
* resolved to bytes (`data`) so the provider's normal `data` path uploads
|
|
636
|
+
* it — no provider needs to learn the `asset://` scheme;
|
|
637
|
+
* - `list[...]` inputs absorb all remaining mentions of their kind;
|
|
638
|
+
* - each placed mention is rewritten in the text to the input label it now
|
|
639
|
+
* lives in (`image_url`, `reference_image_urls[0]`, …) so the model can
|
|
640
|
+
* tell which slot holds which image; mentions that could not be placed
|
|
641
|
+
* (an input was already wired, or capacity ran out) are dropped rather
|
|
642
|
+
* than left as a dangling URI.
|
|
643
|
+
*
|
|
644
|
+
* Plain-text document mentions are inlined into the prompt as their decoded
|
|
645
|
+
* contents (see {@link inlineTextAssetRefs}). This applies even when the node
|
|
646
|
+
* has no media inputs at all (e.g. a text-to-image prompt referencing a brief).
|
|
647
|
+
*
|
|
648
|
+
* Inputs that already carry a source are left untouched. Returns a flat map of
|
|
649
|
+
* field name → replacement value (cleaned string for text fields, an
|
|
650
|
+
* {@link InjectedAssetRef} or array for asset fields); fields that did not
|
|
651
|
+
* change are absent, so callers do `overrides[name] ?? instance[name]`.
|
|
652
|
+
*/
|
|
653
|
+
export async function mapPromptAssetsToInputs(textFields, assetFields, context) {
|
|
654
|
+
const overrides = {};
|
|
655
|
+
const acceptedKinds = new Set(assetFields.map((f) => f.kind));
|
|
656
|
+
// Expand entity mentions first (they inject descriptor text and, when the
|
|
657
|
+
// node accepts images, an `asset://` reference-image token), then folder
|
|
658
|
+
// mentions (only meaningful when the node has media inputs to receive them),
|
|
659
|
+
// and work off the expanded text. The original value is kept to decide
|
|
660
|
+
// whether the field actually changed (a folder that expanded to nothing
|
|
661
|
+
// still rewrites text).
|
|
662
|
+
const expandedByField = new Map();
|
|
663
|
+
for (const tf of textFields) {
|
|
664
|
+
const withEntities = await expandEntityRefs(tf.value, context, acceptedKinds.has("image"));
|
|
665
|
+
expandedByField.set(tf.name, assetFields.length > 0
|
|
666
|
+
? await expandFolderRefs(withEntities, context, acceptedKinds)
|
|
667
|
+
: withEntities);
|
|
668
|
+
}
|
|
669
|
+
// A node with no typed media inputs still inlines plain-text document
|
|
670
|
+
// mentions into its prompt — that's the only transformation that applies.
|
|
671
|
+
if (assetFields.length === 0) {
|
|
672
|
+
for (const tf of textFields) {
|
|
673
|
+
const inlined = await inlineTextAssetRefs(expandedByField.get(tf.name) ?? tf.value, context);
|
|
674
|
+
if (inlined !== tf.value)
|
|
675
|
+
overrides[tf.name] = inlined;
|
|
676
|
+
}
|
|
677
|
+
return overrides;
|
|
678
|
+
}
|
|
679
|
+
// Refs of accepted kinds, queued per kind in source order across all text
|
|
680
|
+
// fields, plus the per-field ref list used for relabeling.
|
|
681
|
+
const queues = {
|
|
682
|
+
image: [],
|
|
683
|
+
audio: [],
|
|
684
|
+
video: []
|
|
685
|
+
};
|
|
686
|
+
const refsByField = new Map();
|
|
687
|
+
for (const tf of textFields) {
|
|
688
|
+
const refs = findAssetRefs(expandedByField.get(tf.name) ?? tf.value).filter((r) => acceptedKinds.has(r.kind));
|
|
689
|
+
if (refs.length === 0)
|
|
690
|
+
continue;
|
|
691
|
+
refsByField.set(tf.name, refs);
|
|
692
|
+
for (const ref of refs)
|
|
693
|
+
queues[ref.kind].push(ref);
|
|
694
|
+
}
|
|
695
|
+
const resolveRef = async (ref) => {
|
|
696
|
+
const injected = {
|
|
697
|
+
type: ref.kind,
|
|
698
|
+
uri: ref.uri,
|
|
699
|
+
mimeType: ref.mime
|
|
700
|
+
};
|
|
701
|
+
const bytes = await loadMediaRefBytes({ type: ref.kind, uri: ref.uri }, context);
|
|
702
|
+
if (bytes && bytes.length > 0) {
|
|
703
|
+
injected.data = encodeBase64(bytes);
|
|
704
|
+
}
|
|
705
|
+
return injected;
|
|
706
|
+
};
|
|
707
|
+
// Fill empty inputs in declaration order from the matching kind's queue,
|
|
708
|
+
// recording which input label each placed mention was routed into.
|
|
709
|
+
const labelByRef = new Map();
|
|
710
|
+
const cursor = { image: 0, audio: 0, video: 0 };
|
|
711
|
+
for (const field of assetFields) {
|
|
712
|
+
if (field.hasSource)
|
|
713
|
+
continue;
|
|
714
|
+
const queue = queues[field.kind];
|
|
715
|
+
if (cursor[field.kind] >= queue.length)
|
|
716
|
+
continue;
|
|
717
|
+
const label = field.label ?? field.name;
|
|
718
|
+
if (field.list) {
|
|
719
|
+
const remaining = queue.slice(cursor[field.kind]);
|
|
720
|
+
cursor[field.kind] = queue.length;
|
|
721
|
+
const resolved = [];
|
|
722
|
+
for (let i = 0; i < remaining.length; i++) {
|
|
723
|
+
labelByRef.set(remaining[i], `${label}[${i}]`);
|
|
724
|
+
resolved.push(await resolveRef(remaining[i]));
|
|
725
|
+
}
|
|
726
|
+
if (resolved.length > 0)
|
|
727
|
+
overrides[field.name] = resolved;
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
const ref = queue[cursor[field.kind]++];
|
|
731
|
+
labelByRef.set(ref, label);
|
|
732
|
+
overrides[field.name] = await resolveRef(ref);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
// Rewrite each text input off its (folder-)expanded value: a placed media
|
|
736
|
+
// mention becomes a reference to the input label it now lives in; an unplaced
|
|
737
|
+
// one is dropped. Then inline any plain-text document mentions into the
|
|
738
|
+
// result — done after the media rewrite so the document's own whitespace
|
|
739
|
+
// isn't touched by the gap-collapsing in `replaceAssetRefs`. Compared against
|
|
740
|
+
// the original so a folder that expanded to nothing still rewrites the field.
|
|
741
|
+
for (const tf of textFields) {
|
|
742
|
+
const expanded = expandedByField.get(tf.name) ?? tf.value;
|
|
743
|
+
const refs = refsByField.get(tf.name) ?? [];
|
|
744
|
+
const relabeled = replaceAssetRefs(expanded, refs, (ref) => labelByRef.get(ref) ?? "");
|
|
745
|
+
const rewritten = await inlineTextAssetRefs(relabeled, context);
|
|
746
|
+
if (rewritten !== tf.value)
|
|
747
|
+
overrides[tf.name] = rewritten;
|
|
748
|
+
}
|
|
749
|
+
return overrides;
|
|
750
|
+
}
|
|
751
|
+
//# sourceMappingURL=prompt-asset-refs.js.map
|