@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,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSRF guard for outbound fetches of caller-supplied URLs, and the one address
|
|
3
|
+
* table every screening surface in the repo reads.
|
|
4
|
+
*
|
|
5
|
+
* Image/video providers (FAL, Replicate, …) return result URLs that the server
|
|
6
|
+
* then `fetch`es to download the generated bytes. Those URLs originate from the
|
|
7
|
+
* provider's response, so without validation a compromised or misbehaving
|
|
8
|
+
* provider — or a response coerced via a crafted prompt — could point the
|
|
9
|
+
* server at internal services (`http://169.254.169.254/...`,
|
|
10
|
+
* `http://localhost:6379/...`, RFC1918 hosts, …). The same is true of a media
|
|
11
|
+
* ref a workflow carries and of a URL a model hands a tool.
|
|
12
|
+
*
|
|
13
|
+
* Two things live here, and the split matters. {@link isBlockedIpLiteral} is
|
|
14
|
+
* the **address table** — which literals are internal — shared with the sandbox
|
|
15
|
+
* fetch bridge (`packages/agents/src/network-guard.ts`), which allows plain
|
|
16
|
+
* http and an opt-in private mode that this module never does.
|
|
17
|
+
* {@link isSafePublicHttpsUrl} is NodeTool's **default policy** on top of it:
|
|
18
|
+
* https only, to an apparently-public host. A predicate is not a protected
|
|
19
|
+
* fetch, though — only {@link safeFetch} validates every redirect hop, so an
|
|
20
|
+
* operation that actually goes out calls that.
|
|
21
|
+
*
|
|
22
|
+
* The check is conservative: unparseable URLs, non-https schemes, and literal
|
|
23
|
+
* IP addresses in loopback / link-local / RFC1918 / CGNAT / benchmarking ranges
|
|
24
|
+
* (including IPv4-mapped IPv6 literals and IPv4 embedded in 6to4 / NAT64
|
|
25
|
+
* transition addresses) are refused. Alternate IPv4 spellings — decimal, hex,
|
|
26
|
+
* octal, short form — are normalized by the WHATWG URL parser before the table
|
|
27
|
+
* sees them.
|
|
28
|
+
*
|
|
29
|
+
* **DNS rebinding is out of scope here, deliberately.** A public name that
|
|
30
|
+
* resolves to a private address passes: this process does not control which
|
|
31
|
+
* address `fetch` connects to, and pinning one would break TLS and virtual
|
|
32
|
+
* hosting. Two answers exist and the inventory records which each surface uses
|
|
33
|
+
* — `assertResolvedHostAllowed` (a resolve-and-check pass, for a URL handed to
|
|
34
|
+
* a separate process that opens its own sockets), and the deployment's egress
|
|
35
|
+
* control as the security boundary for everything in-process. See
|
|
36
|
+
* `docs/url-egress-inventory.md`.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* Expand an IPv6 literal (already stripped of brackets, lower-cased) into its 8
|
|
40
|
+
* 16-bit hextets, handling `::` compression and a trailing dotted-quad. Returns
|
|
41
|
+
* `null` if `host` is not a well-formed IPv6 literal.
|
|
42
|
+
*/
|
|
43
|
+
function expandIpv6(host) {
|
|
44
|
+
if (!host.includes(":"))
|
|
45
|
+
return null;
|
|
46
|
+
// Rewrite a trailing dotted-quad (`...:a.b.c.d`) into two hex hextets so the
|
|
47
|
+
// rest of the parse only deals with `:`-separated groups.
|
|
48
|
+
const body = host.replace(/((?:\d{1,3}\.){3}\d{1,3})$/, (m) => {
|
|
49
|
+
const oct = m.split(".").map((n) => parseInt(n, 10));
|
|
50
|
+
if (oct.some((n) => n > 255))
|
|
51
|
+
return "\0"; // sentinel → fails group parse
|
|
52
|
+
const hex = (n) => n.toString(16).padStart(2, "0");
|
|
53
|
+
return `${hex(oct[0])}${hex(oct[1])}:${hex(oct[2])}${hex(oct[3])}`;
|
|
54
|
+
});
|
|
55
|
+
const halves = body.split("::");
|
|
56
|
+
if (halves.length > 2)
|
|
57
|
+
return null;
|
|
58
|
+
const parseGroup = (s) => {
|
|
59
|
+
if (s === "")
|
|
60
|
+
return [];
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const p of s.split(":")) {
|
|
63
|
+
if (!/^[0-9a-f]{1,4}$/.test(p))
|
|
64
|
+
return null;
|
|
65
|
+
out.push(parseInt(p, 16));
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
};
|
|
69
|
+
const head = parseGroup(halves[0]);
|
|
70
|
+
if (head === null)
|
|
71
|
+
return null;
|
|
72
|
+
let hextets;
|
|
73
|
+
if (halves.length === 2) {
|
|
74
|
+
const rest = parseGroup(halves[1]);
|
|
75
|
+
if (rest === null)
|
|
76
|
+
return null;
|
|
77
|
+
const middle = 8 - head.length - rest.length;
|
|
78
|
+
if (middle < 0)
|
|
79
|
+
return null;
|
|
80
|
+
hextets = [...head, ...new Array(middle).fill(0), ...rest];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
hextets = head;
|
|
84
|
+
}
|
|
85
|
+
if (hextets.length !== 8)
|
|
86
|
+
return null;
|
|
87
|
+
return hextets;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* True for IPv4 octet pairs in loopback / RFC1918 / link-local / CGNAT /
|
|
91
|
+
* benchmarking ranges.
|
|
92
|
+
*/
|
|
93
|
+
function isPrivateIpv4(a, b) {
|
|
94
|
+
// 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8
|
|
95
|
+
if (a === 0 || a === 10 || a === 127)
|
|
96
|
+
return true;
|
|
97
|
+
// 169.254.0.0/16 (link-local, incl. the 169.254.169.254 metadata service)
|
|
98
|
+
if (a === 169 && b === 254)
|
|
99
|
+
return true;
|
|
100
|
+
// 172.16.0.0/12
|
|
101
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
102
|
+
return true;
|
|
103
|
+
// 192.168.0.0/16
|
|
104
|
+
if (a === 192 && b === 168)
|
|
105
|
+
return true;
|
|
106
|
+
// 100.64.0.0/10 (CGNAT)
|
|
107
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
108
|
+
return true;
|
|
109
|
+
// 198.18.0.0/15 (benchmarking)
|
|
110
|
+
if (a === 198 && (b === 18 || b === 19))
|
|
111
|
+
return true;
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* True when `host` is a literal IPv4/IPv6 address in a loopback, link-local,
|
|
116
|
+
* private, CGNAT or benchmarking range — including the IPv6 spellings that
|
|
117
|
+
* carry an IPv4 inside them (IPv4-mapped, IPv4-compatible, 6to4, NAT64).
|
|
118
|
+
*
|
|
119
|
+
* This is the address table, not a policy: it says nothing about schemes,
|
|
120
|
+
* hostnames or redirects, and a caller that allows private networks on purpose
|
|
121
|
+
* (the sandbox fetch bridge under `allowPrivateNetwork`) skips it rather than
|
|
122
|
+
* reimplementing it. A hostname that is not a literal is not this function's
|
|
123
|
+
* question — it answers `false`, and what the name *resolves* to is decided by
|
|
124
|
+
* the surface's DNS-rebinding policy (see the module comment).
|
|
125
|
+
*/
|
|
126
|
+
export function isBlockedIpLiteral(host) {
|
|
127
|
+
// Strip IPv6 brackets and any zone id (`fe80::1%eth0`), lower-case for the
|
|
128
|
+
// hex comparisons.
|
|
129
|
+
const h = host
|
|
130
|
+
.replace(/^\[|\]$/g, "")
|
|
131
|
+
.split("%")[0]
|
|
132
|
+
.toLowerCase();
|
|
133
|
+
// IPv4 in dotted form, standalone or as an IPv6 tail (`::ffff:127.0.0.1`).
|
|
134
|
+
const dotted = h.match(/(?:^|:)((?:\d{1,3}\.){3}\d{1,3})$/);
|
|
135
|
+
if (dotted) {
|
|
136
|
+
const [a, b] = dotted[1].split(".").map((n) => parseInt(n, 10));
|
|
137
|
+
return isPrivateIpv4(a, b);
|
|
138
|
+
}
|
|
139
|
+
if (!h.includes(":"))
|
|
140
|
+
return false;
|
|
141
|
+
if (h === "::" || h === "::1")
|
|
142
|
+
return true; // unspecified / loopback
|
|
143
|
+
if (h.startsWith("fc") || h.startsWith("fd"))
|
|
144
|
+
return true; // ULA fc00::/7
|
|
145
|
+
// link-local fe80::/10 — the first hextet spans fe80–febf, so the first three
|
|
146
|
+
// hex digits are fe8/fe9/fea/feb; "fe80" alone is too narrow.
|
|
147
|
+
if (/^fe[89ab]/.test(h))
|
|
148
|
+
return true;
|
|
149
|
+
// IPv4 embedded in a hex-serialized IPv6 literal. The WHATWG parser rewrites
|
|
150
|
+
// `::ffff:127.0.0.1` to `::ffff:7f00:1`, which the dotted regex above no
|
|
151
|
+
// longer matches, and the transition prefixes hide an IPv4 in the same way:
|
|
152
|
+
// IPv4-mapped/-compatible and NAT64 (64:ff9b::/96) in the low 32 bits, 6to4
|
|
153
|
+
// (2002:WWXX:YYZZ::/16) in the second and third hextets.
|
|
154
|
+
const hextets = expandIpv6(h);
|
|
155
|
+
if (!hextets)
|
|
156
|
+
return false;
|
|
157
|
+
const isZero = (from, to) => hextets.slice(from, to).every((n) => n === 0);
|
|
158
|
+
let embedded = null;
|
|
159
|
+
if (hextets[0] === 0x2002) {
|
|
160
|
+
embedded = hextets[1];
|
|
161
|
+
}
|
|
162
|
+
else if (isZero(0, 5) && hextets[5] === 0xffff) {
|
|
163
|
+
embedded = hextets[6]; // ::ffff:a.b.c.d
|
|
164
|
+
}
|
|
165
|
+
else if (isZero(0, 6)) {
|
|
166
|
+
embedded = hextets[6]; // ::a.b.c.d (IPv4-compatible, deprecated)
|
|
167
|
+
}
|
|
168
|
+
else if (hextets[0] === 0x64 && hextets[1] === 0xff9b && isZero(2, 6)) {
|
|
169
|
+
embedded = hextets[6]; // 64:ff9b::/96
|
|
170
|
+
}
|
|
171
|
+
if (embedded === null)
|
|
172
|
+
return false;
|
|
173
|
+
return isPrivateIpv4((embedded >> 8) & 0xff, embedded & 0xff);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Return `true` when `url` is an https URL whose host is not a loopback,
|
|
177
|
+
* link-local, or RFC1918 private address. NodeTool's default egress policy.
|
|
178
|
+
*/
|
|
179
|
+
export function isSafePublicHttpsUrl(url) {
|
|
180
|
+
let parsed;
|
|
181
|
+
try {
|
|
182
|
+
parsed = new URL(url);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
if (parsed.protocol !== "https:") {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
// Normalise: strip IPv6 brackets (WHATWG URL may include them depending on
|
|
191
|
+
// the runtime) and any trailing dot (`localhost.` resolves the same as
|
|
192
|
+
// `localhost` but would dodge the exact/suffix checks below). The dots are
|
|
193
|
+
// trimmed with a loop: `/\.+$/` backtracks quadratically on a long dot run.
|
|
194
|
+
const bare = parsed.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
195
|
+
let end = bare.length;
|
|
196
|
+
while (end > 0 && bare[end - 1] === ".")
|
|
197
|
+
end -= 1;
|
|
198
|
+
const host = bare.slice(0, end);
|
|
199
|
+
if (!host)
|
|
200
|
+
return false;
|
|
201
|
+
if (host === "localhost" ||
|
|
202
|
+
host === "ip6-localhost" ||
|
|
203
|
+
host === "ip6-loopback" ||
|
|
204
|
+
host.endsWith(".localhost") ||
|
|
205
|
+
host.endsWith(".local") ||
|
|
206
|
+
host.endsWith(".internal")) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
return !isBlockedIpLiteral(host);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Throw if `url` is not a safe public https URL (see {@link isSafePublicHttpsUrl}).
|
|
213
|
+
* Use before `fetch`ing any provider-supplied download URL.
|
|
214
|
+
*/
|
|
215
|
+
export function assertSafePublicHttpsUrl(url) {
|
|
216
|
+
if (!isSafePublicHttpsUrl(url)) {
|
|
217
|
+
throw new Error(`Refusing to fetch unsafe URL (must be https to a public host): ${url}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** Request headers that must not cross an origin boundary on a redirect. */
|
|
221
|
+
const CROSS_ORIGIN_SENSITIVE_HEADERS = [
|
|
222
|
+
"authorization",
|
|
223
|
+
"cookie",
|
|
224
|
+
"proxy-authorization",
|
|
225
|
+
"x-goog-api-key"
|
|
226
|
+
];
|
|
227
|
+
/**
|
|
228
|
+
* Return a copy of `init` with credentials and body stripped, for replay
|
|
229
|
+
* against a different origin. Mirrors browser behaviour: a cross-origin
|
|
230
|
+
* redirect must not forward `Authorization`/`Cookie` headers or the request
|
|
231
|
+
* body, both of which may carry secrets meant only for the original host.
|
|
232
|
+
*/
|
|
233
|
+
function stripCrossOriginCredentials(init) {
|
|
234
|
+
const headers = new Headers(init.headers ?? undefined);
|
|
235
|
+
for (const name of CROSS_ORIGIN_SENSITIVE_HEADERS)
|
|
236
|
+
headers.delete(name);
|
|
237
|
+
const next = { ...init, headers };
|
|
238
|
+
delete next.body;
|
|
239
|
+
return next;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* `fetch` a provider-supplied URL with SSRF protection. The initial URL and
|
|
243
|
+
* every redirect hop are validated with {@link assertSafePublicHttpsUrl}, so a
|
|
244
|
+
* public host cannot redirect into an internal/loopback target or downgrade to
|
|
245
|
+
* http. Redirects are followed manually up to `maxRedirects`. When a redirect
|
|
246
|
+
* crosses to a different origin, auth headers and the request body are stripped
|
|
247
|
+
* so they are never leaked to the redirect target.
|
|
248
|
+
*/
|
|
249
|
+
export async function safeFetch(url, init, maxRedirects = 5,
|
|
250
|
+
// The underlying fetch implementation. Defaults to the global fetch; callers
|
|
251
|
+
// that inject a fetch (e.g. providers with a testable `fetchFn`) can pass it
|
|
252
|
+
// here so the SSRF URL validation still runs on every hop while the actual
|
|
253
|
+
// request goes through their implementation.
|
|
254
|
+
fetchImpl = fetch) {
|
|
255
|
+
let current = url;
|
|
256
|
+
let currentInit = { ...init };
|
|
257
|
+
let currentOrigin = new URL(url).origin;
|
|
258
|
+
for (let hop = 0; hop <= maxRedirects; hop++) {
|
|
259
|
+
assertSafePublicHttpsUrl(current);
|
|
260
|
+
const res = await fetchImpl(current, { ...currentInit, redirect: "manual" });
|
|
261
|
+
// A real Response always has headers; tolerate minimal fetch mocks/polyfills
|
|
262
|
+
// that omit them (treated as no redirect).
|
|
263
|
+
const location = res.headers?.get?.("location") ?? null;
|
|
264
|
+
if (res.status >= 300 && res.status < 400 && location) {
|
|
265
|
+
const next = new URL(location, current);
|
|
266
|
+
if (next.origin !== currentOrigin) {
|
|
267
|
+
currentInit = stripCrossOriginCredentials(currentInit);
|
|
268
|
+
}
|
|
269
|
+
current = next.toString();
|
|
270
|
+
currentOrigin = next.origin;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
return res;
|
|
274
|
+
}
|
|
275
|
+
throw new Error(`Too many redirects while fetching: ${url}`);
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=safe-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-url.js","sourceRoot":"","sources":["../../src/providers/safe-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,6 +97,13 @@ export declare function multiTaskPlanScript(planSpec: MultiTaskPlanSpec): Script
|
|
|
97
97
|
* Use this for step execution phases.
|
|
98
98
|
*/
|
|
99
99
|
export declare function stepScript(result: unknown): ScriptFn;
|
|
100
|
+
/**
|
|
101
|
+
* Script that completes a CodeAct step with one code action calling
|
|
102
|
+
* `finish(result)` — the CodeAct equivalent of {@link stepScript}. The tool
|
|
103
|
+
* name is hardcoded rather than imported: `@nodetool-ai/agents` depends on
|
|
104
|
+
* this package, not the other way round.
|
|
105
|
+
*/
|
|
106
|
+
export declare function codeStepScript(result: unknown): ScriptFn;
|
|
100
107
|
/**
|
|
101
108
|
* Script that emits a plain text chunk (no tool call).
|
|
102
109
|
* Useful for unstructured steps or testing fallback behavior.
|
|
@@ -111,6 +118,8 @@ export declare function toolCallScript(name: string, args: Record<string, unknow
|
|
|
111
118
|
* - If `create_plan` is available → call it with `opts.multiTaskPlan` or auto-wrap `opts.plan`
|
|
112
119
|
* - If `create_task` is available → call it with `opts.plan`
|
|
113
120
|
* - If `finish_step` is available → call it with `opts.result`
|
|
121
|
+
* - If `execute_code` is available and a result was scripted → one code
|
|
122
|
+
* action finishing with it
|
|
114
123
|
* - Otherwise → emit `opts.text` as a chunk
|
|
115
124
|
*
|
|
116
125
|
* This mimics a "smart" LLM that knows what tools are available.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripted-provider.d.ts","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"scripted-provider.d.ts","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,20 @@
|
|
|
13
13
|
* stepScript({ summary: "done" }), // call 2: step 2
|
|
14
14
|
* ]);
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { getNodeBuiltinSync } from "@nodetool-ai/config";
|
|
17
17
|
import { BaseProvider } from "./base-provider.js";
|
|
18
|
+
const _nodeCrypto = getNodeBuiltinSync("node:crypto");
|
|
19
|
+
const randomUUID = () => {
|
|
20
|
+
if (_nodeCrypto?.randomUUID)
|
|
21
|
+
return _nodeCrypto.randomUUID();
|
|
22
|
+
const g = globalThis;
|
|
23
|
+
if (g.crypto?.randomUUID)
|
|
24
|
+
return g.crypto.randomUUID();
|
|
25
|
+
return `id_${Date.now().toString(36)}_${Math.random()
|
|
26
|
+
.toString(36)
|
|
27
|
+
.slice(2, 10)}`;
|
|
28
|
+
};
|
|
29
|
+
import { isString } from "@nodetool-ai/protocol";
|
|
18
30
|
// ---------------------------------------------------------------------------
|
|
19
31
|
// ScriptedProvider
|
|
20
32
|
// ---------------------------------------------------------------------------
|
|
@@ -36,12 +48,20 @@ export class ScriptedProvider extends BaseProvider {
|
|
|
36
48
|
}
|
|
37
49
|
async generateMessage(args) {
|
|
38
50
|
let content = "";
|
|
51
|
+
const toolCalls = [];
|
|
39
52
|
for await (const item of this.generateMessages(args)) {
|
|
40
53
|
if ("type" in item && item.type === "chunk") {
|
|
41
54
|
content += item.content ?? "";
|
|
42
55
|
}
|
|
56
|
+
else if ("id" in item && "name" in item && "args" in item) {
|
|
57
|
+
toolCalls.push(item);
|
|
58
|
+
}
|
|
43
59
|
}
|
|
44
|
-
return {
|
|
60
|
+
return {
|
|
61
|
+
role: "assistant",
|
|
62
|
+
content: content || (toolCalls.length === 0 ? "Done." : null),
|
|
63
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined
|
|
64
|
+
};
|
|
45
65
|
}
|
|
46
66
|
async *generateMessages(args) {
|
|
47
67
|
const tools = args.tools ?? [];
|
|
@@ -51,12 +71,12 @@ export class ScriptedProvider extends BaseProvider {
|
|
|
51
71
|
this.callIdx++;
|
|
52
72
|
const script = this.scripts[idx];
|
|
53
73
|
const items = script(args.messages, tools);
|
|
54
|
-
for (const item of items) {
|
|
74
|
+
for (const [index, item] of items.entries()) {
|
|
55
75
|
if (item.type === "chunk") {
|
|
56
76
|
yield {
|
|
57
77
|
type: "chunk",
|
|
58
78
|
content: item.content,
|
|
59
|
-
done: item.done ??
|
|
79
|
+
done: item.done ?? index === items.length - 1,
|
|
60
80
|
content_type: "text"
|
|
61
81
|
};
|
|
62
82
|
}
|
|
@@ -80,7 +100,7 @@ export function planScript(taskSpec) {
|
|
|
80
100
|
{
|
|
81
101
|
type: "tool_call",
|
|
82
102
|
name: "create_task",
|
|
83
|
-
args: taskSpec
|
|
103
|
+
args: { ...taskSpec }
|
|
84
104
|
}
|
|
85
105
|
];
|
|
86
106
|
}
|
|
@@ -93,7 +113,7 @@ export function multiTaskPlanScript(planSpec) {
|
|
|
93
113
|
{
|
|
94
114
|
type: "tool_call",
|
|
95
115
|
name: "create_plan",
|
|
96
|
-
args: planSpec
|
|
116
|
+
args: { ...planSpec }
|
|
97
117
|
}
|
|
98
118
|
];
|
|
99
119
|
}
|
|
@@ -106,6 +126,24 @@ export function stepScript(result) {
|
|
|
106
126
|
{ type: "tool_call", name: "finish_step", args: { result } }
|
|
107
127
|
];
|
|
108
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Script that completes a CodeAct step with one code action calling
|
|
131
|
+
* `finish(result)` — the CodeAct equivalent of {@link stepScript}. The tool
|
|
132
|
+
* name is hardcoded rather than imported: `@nodetool-ai/agents` depends on
|
|
133
|
+
* this package, not the other way round.
|
|
134
|
+
*/
|
|
135
|
+
export function codeStepScript(result) {
|
|
136
|
+
return (_messages, _tools) => [
|
|
137
|
+
{
|
|
138
|
+
type: "tool_call",
|
|
139
|
+
name: "execute_code",
|
|
140
|
+
args: {
|
|
141
|
+
title: "Finishing the step",
|
|
142
|
+
code: `await finish(${JSON.stringify(result)});`
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
];
|
|
146
|
+
}
|
|
109
147
|
/**
|
|
110
148
|
* Script that emits a plain text chunk (no tool call).
|
|
111
149
|
* Useful for unstructured steps or testing fallback behavior.
|
|
@@ -124,6 +162,8 @@ export function toolCallScript(name, args) {
|
|
|
124
162
|
* - If `create_plan` is available → call it with `opts.multiTaskPlan` or auto-wrap `opts.plan`
|
|
125
163
|
* - If `create_task` is available → call it with `opts.plan`
|
|
126
164
|
* - If `finish_step` is available → call it with `opts.result`
|
|
165
|
+
* - If `execute_code` is available and a result was scripted → one code
|
|
166
|
+
* action finishing with it
|
|
127
167
|
* - Otherwise → emit `opts.text` as a chunk
|
|
128
168
|
*
|
|
129
169
|
* This mimics a "smart" LLM that knows what tools are available.
|
|
@@ -131,6 +171,27 @@ export function toolCallScript(name, args) {
|
|
|
131
171
|
export function autoScript(opts) {
|
|
132
172
|
return (messages, tools) => {
|
|
133
173
|
const toolNames = new Set(tools.map((t) => t.name));
|
|
174
|
+
// Generator tool loops (ListGenerator's `add_item`, DataGenerator's
|
|
175
|
+
// `add_row`): the node calls the provider repeatedly, feeding tool results
|
|
176
|
+
// back, and gives up if the first call emits no tool calls. Emit a burst of
|
|
177
|
+
// generator calls on the first invocation, then stop once our own tool
|
|
178
|
+
// results appear in history so the node's loop terminates.
|
|
179
|
+
for (const genTool of ["add_item", "add_row"]) {
|
|
180
|
+
if (!toolNames.has(genTool))
|
|
181
|
+
continue;
|
|
182
|
+
const alreadyEmitted = messages.some((m) => m.role === "assistant" &&
|
|
183
|
+
(m.toolCalls ?? []).some((tc) => tc.name === genTool));
|
|
184
|
+
if (alreadyEmitted) {
|
|
185
|
+
return [{ type: "chunk", content: "Done.", done: true }];
|
|
186
|
+
}
|
|
187
|
+
return Array.from({ length: 3 }, (_unused, i) => ({
|
|
188
|
+
type: "tool_call",
|
|
189
|
+
name: genTool,
|
|
190
|
+
args: genTool === "add_item"
|
|
191
|
+
? { item: `fake item ${i + 1}` }
|
|
192
|
+
: { row: { id: i + 1, value: `fake row ${i + 1}` } }
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
134
195
|
// Incremental planner: add_task + finish_plan
|
|
135
196
|
if (toolNames.has("add_task") &&
|
|
136
197
|
toolNames.has("finish_plan") &&
|
|
@@ -151,7 +212,7 @@ export function autoScript(opts) {
|
|
|
151
212
|
for (const m of messages) {
|
|
152
213
|
if (m.role !== "tool")
|
|
153
214
|
continue;
|
|
154
|
-
const content =
|
|
215
|
+
const content = isString(m.content) ? m.content : "";
|
|
155
216
|
if (content.includes('"status":"task_added"'))
|
|
156
217
|
addedCount++;
|
|
157
218
|
}
|
|
@@ -161,7 +222,7 @@ export function autoScript(opts) {
|
|
|
161
222
|
{
|
|
162
223
|
type: "tool_call",
|
|
163
224
|
name: "add_task",
|
|
164
|
-
args: task
|
|
225
|
+
args: { ...task }
|
|
165
226
|
}
|
|
166
227
|
];
|
|
167
228
|
}
|
|
@@ -190,7 +251,7 @@ export function autoScript(opts) {
|
|
|
190
251
|
{
|
|
191
252
|
type: "tool_call",
|
|
192
253
|
name: "create_plan",
|
|
193
|
-
args: planArgs
|
|
254
|
+
args: { ...planArgs }
|
|
194
255
|
}
|
|
195
256
|
];
|
|
196
257
|
}
|
|
@@ -199,7 +260,7 @@ export function autoScript(opts) {
|
|
|
199
260
|
{
|
|
200
261
|
type: "tool_call",
|
|
201
262
|
name: "create_task",
|
|
202
|
-
args: opts.plan
|
|
263
|
+
args: { ...opts.plan }
|
|
203
264
|
}
|
|
204
265
|
];
|
|
205
266
|
}
|
|
@@ -212,6 +273,21 @@ export function autoScript(opts) {
|
|
|
212
273
|
}
|
|
213
274
|
];
|
|
214
275
|
}
|
|
276
|
+
// CodeAct step: one action that finishes with the scripted result. Only
|
|
277
|
+
// when a result was scripted — a chat turn also carries `execute_code`
|
|
278
|
+
// and should answer with text.
|
|
279
|
+
if (toolNames.has("execute_code") && opts.result !== undefined) {
|
|
280
|
+
return [
|
|
281
|
+
{
|
|
282
|
+
type: "tool_call",
|
|
283
|
+
name: "execute_code",
|
|
284
|
+
args: {
|
|
285
|
+
title: "Finishing the step",
|
|
286
|
+
code: `await finish(${JSON.stringify(opts.result)});`
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
];
|
|
290
|
+
}
|
|
215
291
|
return [
|
|
216
292
|
{ type: "chunk", content: opts.text ?? "Task completed.", done: true }
|
|
217
293
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripted-provider.js","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"scripted-provider.js","sourceRoot":"","sources":["../../src/providers/scripted-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured output over any provider.
|
|
3
|
+
*
|
|
4
|
+
* A model returns a typed object by being forced to call one tool whose input
|
|
5
|
+
* schema *is* the shape wanted. Every provider in the registry supports
|
|
6
|
+
* `toolChoice`, so this is the one mechanism that works across all of them,
|
|
7
|
+
* and it is what the Director node, the agent nodes, and the `generate_text`
|
|
8
|
+
* RPC all call.
|
|
9
|
+
*
|
|
10
|
+
* A model that answers with prose instead of a tool call (a provider with no
|
|
11
|
+
* tool support, the fake e2e provider) falls back to JSON parsed out of that
|
|
12
|
+
* prose. Only a call that produces neither returns null — a provider error
|
|
13
|
+
* still throws.
|
|
14
|
+
*/
|
|
15
|
+
import type { BaseProvider } from "./base-provider.js";
|
|
16
|
+
import type { Message } from "./types.js";
|
|
17
|
+
/** Flatten a message's content to the text a JSON fallback can be read from. */
|
|
18
|
+
export declare function messageText(content: Message["content"] | unknown): string;
|
|
19
|
+
/**
|
|
20
|
+
* Parse a JSON object out of model prose — the whole string first, then the
|
|
21
|
+
* widest `{…}` span in it, which is what survives a fenced block or a
|
|
22
|
+
* sentence wrapped around the answer.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractJson(text: string): Record<string, unknown> | null;
|
|
25
|
+
export interface StructuredCallArgs {
|
|
26
|
+
messages: Message[];
|
|
27
|
+
model: string;
|
|
28
|
+
maxTokens?: number;
|
|
29
|
+
/** The tool the model is forced into; its name reaches the model. */
|
|
30
|
+
toolName: string;
|
|
31
|
+
toolDescription: string;
|
|
32
|
+
/** JSON Schema for the tool's input — the shape being asked for. */
|
|
33
|
+
schema: Record<string, unknown>;
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Call a provider with a result tool to get structured output. Returns the
|
|
38
|
+
* tool call's arguments, or JSON recovered from the text answer, or null when
|
|
39
|
+
* the model produced neither.
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateStructured(provider: BaseProvider, args: StructuredCallArgs): Promise<Record<string, unknown> | null>;
|
|
42
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../src/providers/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,GAAG,MAAM,CAWzE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAmBxE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAwBzC"}
|