@copilotkit/aimock 1.45.1 → 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +13 -0
- package/README.md +7 -1
- package/dist/agui-mock.cjs +25 -25
- package/dist/agui-mock.cjs.map +1 -1
- package/dist/agui-mock.d.cts.map +1 -1
- package/dist/agui-mock.d.ts.map +1 -1
- package/dist/agui-mock.js +25 -25
- package/dist/agui-mock.js.map +1 -1
- package/dist/agui-types.d.cts.map +1 -1
- package/dist/aimock-cli.cjs +15 -1
- package/dist/aimock-cli.cjs.map +1 -1
- package/dist/aimock-cli.d.cts.map +1 -1
- package/dist/aimock-cli.d.ts.map +1 -1
- package/dist/aimock-cli.js +16 -2
- package/dist/aimock-cli.js.map +1 -1
- package/dist/api-key-auth.cjs +10 -9
- package/dist/api-key-auth.cjs.map +1 -1
- package/dist/api-key-auth.d.cts.map +1 -1
- package/dist/api-key-auth.d.ts.map +1 -1
- package/dist/api-key-auth.js +11 -10
- package/dist/api-key-auth.js.map +1 -1
- package/dist/batches.cjs +2 -4
- package/dist/batches.cjs.map +1 -1
- package/dist/batches.d.cts.map +1 -1
- package/dist/batches.d.ts.map +1 -1
- package/dist/batches.js +2 -4
- package/dist/batches.js.map +1 -1
- package/dist/bedrock-converse.cjs +61 -80
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +58 -77
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +65 -97
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +62 -94
- package/dist/bedrock.js.map +1 -1
- package/dist/byteplus-video.cjs +11 -10
- package/dist/byteplus-video.cjs.map +1 -1
- package/dist/byteplus-video.d.cts.map +1 -1
- package/dist/byteplus-video.d.ts.map +1 -1
- package/dist/byteplus-video.js +5 -4
- package/dist/byteplus-video.js.map +1 -1
- package/dist/chaos.cjs +5 -4
- package/dist/chaos.cjs.map +1 -1
- package/dist/chaos.d.cts.map +1 -1
- package/dist/chaos.d.ts.map +1 -1
- package/dist/chaos.js +5 -4
- package/dist/chaos.js.map +1 -1
- package/dist/cli.cjs +15 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +49 -74
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.d.cts.map +1 -1
- package/dist/cohere.d.ts.map +1 -1
- package/dist/cohere.js +47 -72
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +29 -1
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +7 -1
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +7 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +29 -2
- package/dist/config-loader.js.map +1 -1
- package/dist/count-tokens.cjs +146 -0
- package/dist/count-tokens.cjs.map +1 -0
- package/dist/count-tokens.js +146 -0
- package/dist/count-tokens.js.map +1 -0
- package/dist/elevenlabs-audio.cjs +36 -34
- package/dist/elevenlabs-audio.cjs.map +1 -1
- package/dist/elevenlabs-audio.d.cts.map +1 -1
- package/dist/elevenlabs-audio.d.ts.map +1 -1
- package/dist/elevenlabs-audio.js +33 -31
- package/dist/elevenlabs-audio.js.map +1 -1
- package/dist/elevenlabs-voice.cjs +38 -37
- package/dist/elevenlabs-voice.cjs.map +1 -1
- package/dist/elevenlabs-voice.d.cts.map +1 -1
- package/dist/elevenlabs-voice.d.ts.map +1 -1
- package/dist/elevenlabs-voice.js +33 -32
- package/dist/elevenlabs-voice.js.map +1 -1
- package/dist/embedding-request.cjs +16 -0
- package/dist/embedding-request.cjs.map +1 -0
- package/dist/embedding-request.js +14 -0
- package/dist/embedding-request.js.map +1 -0
- package/dist/embeddings.cjs +30 -20
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +30 -20
- package/dist/embeddings.js.map +1 -1
- package/dist/fal-audio.cjs +45 -43
- package/dist/fal-audio.cjs.map +1 -1
- package/dist/fal-audio.d.cts.map +1 -1
- package/dist/fal-audio.d.ts.map +1 -1
- package/dist/fal-audio.js +42 -40
- package/dist/fal-audio.js.map +1 -1
- package/dist/fal.cjs +17 -15
- package/dist/fal.cjs.map +1 -1
- package/dist/fal.js +16 -14
- package/dist/fal.js.map +1 -1
- package/dist/files.cjs +2 -4
- package/dist/files.cjs.map +1 -1
- package/dist/files.d.cts.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +2 -4
- package/dist/files.js.map +1 -1
- package/dist/fine-tuning.cjs +2 -4
- package/dist/fine-tuning.cjs.map +1 -1
- package/dist/fine-tuning.d.cts.map +1 -1
- package/dist/fine-tuning.d.ts.map +1 -1
- package/dist/fine-tuning.js +2 -4
- package/dist/fine-tuning.js.map +1 -1
- package/dist/fixture-loader.cjs +37 -42
- package/dist/fixture-loader.cjs.map +1 -1
- package/dist/fixture-loader.d.cts.map +1 -1
- package/dist/fixture-loader.d.ts.map +1 -1
- package/dist/fixture-loader.js +37 -42
- package/dist/fixture-loader.js.map +1 -1
- package/dist/gemini-embeddings.cjs +26 -24
- package/dist/gemini-embeddings.cjs.map +1 -1
- package/dist/gemini-embeddings.js +26 -24
- package/dist/gemini-embeddings.js.map +1 -1
- package/dist/gemini-interactions.cjs +50 -35
- package/dist/gemini-interactions.cjs.map +1 -1
- package/dist/gemini-interactions.d.cts +0 -1
- package/dist/gemini-interactions.d.cts.map +1 -1
- package/dist/gemini-interactions.d.ts +0 -1
- package/dist/gemini-interactions.d.ts.map +1 -1
- package/dist/gemini-interactions.js +49 -34
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +57 -67
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts.map +1 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +56 -67
- package/dist/gemini.js.map +1 -1
- package/dist/grok-video.cjs +14 -12
- package/dist/grok-video.cjs.map +1 -1
- package/dist/grok-video.d.cts.map +1 -1
- package/dist/grok-video.d.ts.map +1 -1
- package/dist/grok-video.js +8 -6
- package/dist/grok-video.js.map +1 -1
- package/dist/helpers.cjs +11 -68
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +12 -67
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +30 -28
- package/dist/images.cjs.map +1 -1
- package/dist/images.d.cts.map +1 -1
- package/dist/images.d.ts.map +1 -1
- package/dist/images.js +27 -25
- package/dist/images.js.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/journal.cjs +3 -1
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +2 -1
- package/dist/journal.js.map +1 -1
- package/dist/llmock.cjs +3 -0
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +3 -0
- package/dist/llmock.js.map +1 -1
- package/dist/mcp-handler.cjs +7 -3
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.js +7 -3
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-recorder.cjs +2 -1
- package/dist/mcp-recorder.cjs.map +1 -1
- package/dist/mcp-recorder.js +3 -2
- package/dist/mcp-recorder.js.map +1 -1
- package/dist/messages.cjs +111 -96
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.cts.map +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +109 -95
- package/dist/messages.js.map +1 -1
- package/dist/metrics.cjs +5 -2
- package/dist/metrics.cjs.map +1 -1
- package/dist/metrics.d.cts.map +1 -1
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +6 -3
- package/dist/metrics.js.map +1 -1
- package/dist/model-utils.cjs +1 -0
- package/dist/model-utils.cjs.map +1 -1
- package/dist/model-utils.js +1 -1
- package/dist/model-utils.js.map +1 -1
- package/dist/moderation.cjs +15 -12
- package/dist/moderation.cjs.map +1 -1
- package/dist/moderation.js +14 -11
- package/dist/moderation.js.map +1 -1
- package/dist/ollama.cjs +128 -68
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +124 -64
- package/dist/ollama.js.map +1 -1
- package/dist/openapi.cjs +323 -3
- package/dist/openapi.cjs.map +1 -1
- package/dist/openapi.d.cts.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +324 -4
- package/dist/openapi.js.map +1 -1
- package/dist/openrouter-chat.cjs +11 -155
- package/dist/openrouter-chat.cjs.map +1 -1
- package/dist/openrouter-chat.js +11 -155
- package/dist/openrouter-chat.js.map +1 -1
- package/dist/openrouter-video.cjs +51 -74
- package/dist/openrouter-video.cjs.map +1 -1
- package/dist/openrouter-video.d.cts.map +1 -1
- package/dist/openrouter-video.d.ts.map +1 -1
- package/dist/openrouter-video.js +37 -60
- package/dist/openrouter-video.js.map +1 -1
- package/dist/recorder.cjs +176 -95
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +176 -95
- package/dist/recorder.js.map +1 -1
- package/dist/rerank.cjs +13 -11
- package/dist/rerank.cjs.map +1 -1
- package/dist/rerank.js +12 -10
- package/dist/rerank.js.map +1 -1
- package/dist/response/catalog/anthropic-page.cjs +39 -0
- package/dist/response/catalog/anthropic-page.cjs.map +1 -0
- package/dist/response/catalog/anthropic-page.js +38 -0
- package/dist/response/catalog/anthropic-page.js.map +1 -0
- package/dist/response/catalog/collect.cjs +61 -0
- package/dist/response/catalog/collect.cjs.map +1 -0
- package/dist/response/catalog/collect.js +59 -0
- package/dist/response/catalog/collect.js.map +1 -0
- package/dist/response/catalog/gemini-page.cjs +25 -0
- package/dist/response/catalog/gemini-page.cjs.map +1 -0
- package/dist/response/catalog/gemini-page.js +24 -0
- package/dist/response/catalog/gemini-page.js.map +1 -0
- package/dist/response/catalog/render.cjs +182 -0
- package/dist/response/catalog/render.cjs.map +1 -0
- package/dist/response/catalog/render.js +171 -0
- package/dist/response/catalog/render.js.map +1 -0
- package/dist/response/errors.cjs +225 -0
- package/dist/response/errors.cjs.map +1 -0
- package/dist/response/errors.js +224 -0
- package/dist/response/errors.js.map +1 -0
- package/dist/response/finish.cjs +39 -0
- package/dist/response/finish.cjs.map +1 -0
- package/dist/response/finish.js +35 -0
- package/dist/response/finish.js.map +1 -0
- package/dist/response/policy.cjs +126 -0
- package/dist/response/policy.cjs.map +1 -0
- package/dist/response/policy.js +120 -0
- package/dist/response/policy.js.map +1 -0
- package/dist/response/profiles.cjs +69 -0
- package/dist/response/profiles.cjs.map +1 -0
- package/dist/response/profiles.js +65 -0
- package/dist/response/profiles.js.map +1 -0
- package/dist/response/usage/codecs/anthropic.cjs +52 -0
- package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
- package/dist/response/usage/codecs/anthropic.js +50 -0
- package/dist/response/usage/codecs/anthropic.js.map +1 -0
- package/dist/response/usage/codecs/cohere.cjs +36 -0
- package/dist/response/usage/codecs/cohere.cjs.map +1 -0
- package/dist/response/usage/codecs/cohere.js +35 -0
- package/dist/response/usage/codecs/cohere.js.map +1 -0
- package/dist/response/usage/codecs/converse.cjs +16 -0
- package/dist/response/usage/codecs/converse.cjs.map +1 -0
- package/dist/response/usage/codecs/converse.js +15 -0
- package/dist/response/usage/codecs/converse.js.map +1 -0
- package/dist/response/usage/codecs/gemini.cjs +31 -0
- package/dist/response/usage/codecs/gemini.cjs.map +1 -0
- package/dist/response/usage/codecs/gemini.js +31 -0
- package/dist/response/usage/codecs/gemini.js.map +1 -0
- package/dist/response/usage/codecs/interactions.cjs +22 -0
- package/dist/response/usage/codecs/interactions.cjs.map +1 -0
- package/dist/response/usage/codecs/interactions.js +21 -0
- package/dist/response/usage/codecs/interactions.js.map +1 -0
- package/dist/response/usage/codecs/ollama.cjs +17 -0
- package/dist/response/usage/codecs/ollama.cjs.map +1 -0
- package/dist/response/usage/codecs/ollama.js +17 -0
- package/dist/response/usage/codecs/ollama.js.map +1 -0
- package/dist/response/usage/codecs/openai.cjs +52 -0
- package/dist/response/usage/codecs/openai.cjs.map +1 -0
- package/dist/response/usage/codecs/openai.js +50 -0
- package/dist/response/usage/codecs/openai.js.map +1 -0
- package/dist/response/usage/codecs/openrouter.cjs +68 -0
- package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
- package/dist/response/usage/codecs/openrouter.js +67 -0
- package/dist/response/usage/codecs/openrouter.js.map +1 -0
- package/dist/response/usage/codecs/realtime.cjs +19 -0
- package/dist/response/usage/codecs/realtime.cjs.map +1 -0
- package/dist/response/usage/codecs/realtime.js +18 -0
- package/dist/response/usage/codecs/realtime.js.map +1 -0
- package/dist/response/usage/codecs/responses.cjs +21 -0
- package/dist/response/usage/codecs/responses.cjs.map +1 -0
- package/dist/response/usage/codecs/responses.js +20 -0
- package/dist/response/usage/codecs/responses.js.map +1 -0
- package/dist/response/usage/estimate.cjs +23 -0
- package/dist/response/usage/estimate.cjs.map +1 -0
- package/dist/response/usage/estimate.js +21 -0
- package/dist/response/usage/estimate.js.map +1 -0
- package/dist/response/usage/fields.cjs +72 -0
- package/dist/response/usage/fields.cjs.map +1 -0
- package/dist/response/usage/fields.js +70 -0
- package/dist/response/usage/fields.js.map +1 -0
- package/dist/response/usage/recording.cjs +52 -0
- package/dist/response/usage/recording.cjs.map +1 -0
- package/dist/response/usage/recording.js +52 -0
- package/dist/response/usage/recording.js.map +1 -0
- package/dist/responses.cjs +45 -58
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +44 -57
- package/dist/responses.js.map +1 -1
- package/dist/route-registry.cjs +45 -0
- package/dist/route-registry.cjs.map +1 -1
- package/dist/route-registry.d.cts.map +1 -1
- package/dist/route-registry.d.ts.map +1 -1
- package/dist/route-registry.js +41 -1
- package/dist/route-registry.js.map +1 -1
- package/dist/router.cjs +4 -0
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +3 -0
- package/dist/router.js.map +1 -1
- package/dist/search.cjs +13 -11
- package/dist/search.cjs.map +1 -1
- package/dist/search.js +12 -10
- package/dist/search.js.map +1 -1
- package/dist/server.cjs +222 -146
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +223 -147
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +20 -18
- package/dist/speech.cjs.map +1 -1
- package/dist/speech.d.cts.map +1 -1
- package/dist/speech.d.ts.map +1 -1
- package/dist/speech.js +19 -17
- package/dist/speech.js.map +1 -1
- package/dist/sse-writer.cjs +7 -0
- package/dist/sse-writer.cjs.map +1 -1
- package/dist/sse-writer.d.cts.map +1 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/sse-writer.js +7 -1
- package/dist/sse-writer.js.map +1 -1
- package/dist/stream-collapse.cjs +118 -11
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +10 -9
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +10 -9
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +118 -11
- package/dist/stream-collapse.js.map +1 -1
- package/dist/transcription.cjs +12 -10
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.cts.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +11 -9
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +62 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +62 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vector-mock.cjs +3 -8
- package/dist/vector-mock.cjs.map +1 -1
- package/dist/vector-mock.d.cts.map +1 -1
- package/dist/vector-mock.d.ts.map +1 -1
- package/dist/vector-mock.js +3 -8
- package/dist/vector-mock.js.map +1 -1
- package/dist/vector-stores.cjs +2 -4
- package/dist/vector-stores.cjs.map +1 -1
- package/dist/vector-stores.d.cts.map +1 -1
- package/dist/vector-stores.d.ts.map +1 -1
- package/dist/vector-stores.js +2 -4
- package/dist/vector-stores.js.map +1 -1
- package/dist/veo-video.cjs +16 -14
- package/dist/veo-video.cjs.map +1 -1
- package/dist/veo-video.js +10 -8
- package/dist/veo-video.js.map +1 -1
- package/dist/video.cjs +21 -19
- package/dist/video.cjs.map +1 -1
- package/dist/video.d.cts.map +1 -1
- package/dist/video.d.ts.map +1 -1
- package/dist/video.js +20 -18
- package/dist/video.js.map +1 -1
- package/dist/ws-gemini-live.cjs +11 -3
- package/dist/ws-gemini-live.cjs.map +1 -1
- package/dist/ws-gemini-live.d.cts +0 -1
- package/dist/ws-gemini-live.d.cts.map +1 -1
- package/dist/ws-gemini-live.d.ts +0 -1
- package/dist/ws-gemini-live.d.ts.map +1 -1
- package/dist/ws-gemini-live.js +10 -2
- package/dist/ws-gemini-live.js.map +1 -1
- package/dist/ws-live.cjs +6 -5
- package/dist/ws-live.cjs.map +1 -1
- package/dist/ws-live.js +5 -4
- package/dist/ws-live.js.map +1 -1
- package/dist/ws-realtime.cjs +28 -54
- package/dist/ws-realtime.cjs.map +1 -1
- package/dist/ws-realtime.d.cts.map +1 -1
- package/dist/ws-realtime.d.ts.map +1 -1
- package/dist/ws-realtime.js +25 -51
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +8 -6
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.js +7 -5
- package/dist/ws-responses.js.map +1 -1
- package/package.json +4 -1
- package/skills/write-fixtures/SKILL.md +25 -16
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { errorProfiles } from "./profiles.js";
|
|
2
|
+
|
|
3
|
+
//#region src/response/errors.ts
|
|
4
|
+
function buildOpenAIError(input, details) {
|
|
5
|
+
if (input === "service-validation") {
|
|
6
|
+
if (!details) throw new TypeError("Missing service validation error details");
|
|
7
|
+
return { error: {
|
|
8
|
+
message: details.message,
|
|
9
|
+
type: errorProfiles.openai.validationType
|
|
10
|
+
} };
|
|
11
|
+
}
|
|
12
|
+
if (input === "openrouter-error") {
|
|
13
|
+
if (!details || typeof details.code !== "number") throw new TypeError("Missing OpenRouter numeric error details");
|
|
14
|
+
return { error: {
|
|
15
|
+
code: details.code,
|
|
16
|
+
message: details.message,
|
|
17
|
+
...details.metadata !== void 0 && { metadata: details.metadata }
|
|
18
|
+
} };
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
message: input.message,
|
|
22
|
+
type: input.type,
|
|
23
|
+
...input.includeParam === true ? { param: input.param ?? null } : {},
|
|
24
|
+
code: input.code
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Native purpose templates preserve field presence and insertion order. No status or I/O. */
|
|
28
|
+
function renderError(wire, purpose, details) {
|
|
29
|
+
if (wire === "ollama-embed") return { body: JSON.stringify({ error: details.message }) };
|
|
30
|
+
const profile = errorProfiles[wire];
|
|
31
|
+
if (wire === "interactions" && (purpose === "validation" || purpose === "strict-miss" || purpose === "fixture-miss" || purpose === "fixture" || purpose === "misbehavior" || purpose === "unknown-response")) return { body: JSON.stringify({ error: {
|
|
32
|
+
code: details.code ?? "INVALID_ARGUMENT",
|
|
33
|
+
message: details.message
|
|
34
|
+
} }) };
|
|
35
|
+
switch (purpose) {
|
|
36
|
+
case "authentication":
|
|
37
|
+
if (wire === "messages") return { body: JSON.stringify({
|
|
38
|
+
type: "error",
|
|
39
|
+
error: {
|
|
40
|
+
type: "authentication_error",
|
|
41
|
+
message: details.message
|
|
42
|
+
}
|
|
43
|
+
}) };
|
|
44
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
45
|
+
code: 401,
|
|
46
|
+
message: details.message,
|
|
47
|
+
status: "UNAUTHENTICATED"
|
|
48
|
+
} }) };
|
|
49
|
+
return renderError(wire, "legacy-auth", details);
|
|
50
|
+
case "legacy-auth": return { body: JSON.stringify({ error: {
|
|
51
|
+
message: details.message,
|
|
52
|
+
type: "authentication_error",
|
|
53
|
+
code: "invalid_api_key"
|
|
54
|
+
} }) };
|
|
55
|
+
case "stream-failure": return { body: JSON.stringify({ error: { message: details.message } }) };
|
|
56
|
+
case "route-failure": return { body: JSON.stringify({ error: {
|
|
57
|
+
message: details.message,
|
|
58
|
+
type: details.type
|
|
59
|
+
} }) };
|
|
60
|
+
case "invalid-misbehavior-header":
|
|
61
|
+
if (wire === "ollama") return { body: JSON.stringify({ error: details.message }) };
|
|
62
|
+
if (wire === "cohere") return { body: JSON.stringify({ message: details.message }) };
|
|
63
|
+
if (wire === "interactions") return { body: JSON.stringify({ error: {
|
|
64
|
+
code: details.code,
|
|
65
|
+
message: details.message
|
|
66
|
+
} }) };
|
|
67
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
68
|
+
code: 400,
|
|
69
|
+
message: details.message,
|
|
70
|
+
status: "INVALID_ARGUMENT"
|
|
71
|
+
} }) };
|
|
72
|
+
if (wire === "messages") return { body: JSON.stringify({
|
|
73
|
+
type: "error",
|
|
74
|
+
error: {
|
|
75
|
+
type: profile.validationType,
|
|
76
|
+
code: details.code,
|
|
77
|
+
message: details.message
|
|
78
|
+
}
|
|
79
|
+
}) };
|
|
80
|
+
if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
|
|
81
|
+
__type: "ValidationException",
|
|
82
|
+
message: details.message
|
|
83
|
+
}) };
|
|
84
|
+
return { body: JSON.stringify({ error: {
|
|
85
|
+
message: details.message,
|
|
86
|
+
type: profile.validationType,
|
|
87
|
+
code: details.code
|
|
88
|
+
} }) };
|
|
89
|
+
case "validation":
|
|
90
|
+
case "strict-miss":
|
|
91
|
+
case "fixture-miss":
|
|
92
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
93
|
+
message: details.message,
|
|
94
|
+
code: details.bodyCode,
|
|
95
|
+
status: details.status
|
|
96
|
+
} }) };
|
|
97
|
+
if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
|
|
98
|
+
...details,
|
|
99
|
+
type: details.type ?? profile.validationType
|
|
100
|
+
}) }) };
|
|
101
|
+
return { body: JSON.stringify({ error: {
|
|
102
|
+
message: details.message,
|
|
103
|
+
type: details.type ?? profile.validationType
|
|
104
|
+
} }) };
|
|
105
|
+
case "thinking": return { body: JSON.stringify({
|
|
106
|
+
type: "error",
|
|
107
|
+
error: {
|
|
108
|
+
type: details.type ?? profile.validationType,
|
|
109
|
+
message: details.message
|
|
110
|
+
},
|
|
111
|
+
...wire === "messages" && details.requestId !== void 0 ? { request_id: details.requestId } : {}
|
|
112
|
+
}) };
|
|
113
|
+
case "fixture":
|
|
114
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
115
|
+
code: details.bodyCode,
|
|
116
|
+
message: details.message,
|
|
117
|
+
status: details.status
|
|
118
|
+
} }) };
|
|
119
|
+
if (wire === "openai") return { body: JSON.stringify({ error: {
|
|
120
|
+
message: details.message,
|
|
121
|
+
type: details.type ?? profile.fixtureType,
|
|
122
|
+
param: details.param ?? null,
|
|
123
|
+
code: details.code ?? null
|
|
124
|
+
} }) };
|
|
125
|
+
return { body: JSON.stringify({
|
|
126
|
+
type: "error",
|
|
127
|
+
error: {
|
|
128
|
+
type: details.type ?? profile.fixtureType,
|
|
129
|
+
message: details.message
|
|
130
|
+
}
|
|
131
|
+
}) };
|
|
132
|
+
case "tool-argument":
|
|
133
|
+
if (wire === "ollama") return { body: JSON.stringify({
|
|
134
|
+
error: details.message,
|
|
135
|
+
code: details.code
|
|
136
|
+
}) };
|
|
137
|
+
if (wire === "interactions") return { body: JSON.stringify({ error: {
|
|
138
|
+
code: details.code,
|
|
139
|
+
message: details.message
|
|
140
|
+
} }) };
|
|
141
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
142
|
+
code: 500,
|
|
143
|
+
message: details.message,
|
|
144
|
+
status: "INTERNAL",
|
|
145
|
+
details: details.googleDetails
|
|
146
|
+
} }) };
|
|
147
|
+
if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
|
|
148
|
+
__type: details.type ?? errorProfiles.bedrock.toolArgumentType,
|
|
149
|
+
message: details.message,
|
|
150
|
+
reason: details.code
|
|
151
|
+
}) };
|
|
152
|
+
if (wire === "messages") return { body: JSON.stringify({
|
|
153
|
+
type: "error",
|
|
154
|
+
error: {
|
|
155
|
+
type: details.type ?? profile.fixtureType,
|
|
156
|
+
code: details.code,
|
|
157
|
+
message: details.message
|
|
158
|
+
}
|
|
159
|
+
}) };
|
|
160
|
+
return { body: JSON.stringify({ error: {
|
|
161
|
+
message: details.message,
|
|
162
|
+
type: details.type ?? profile.fixtureType,
|
|
163
|
+
code: details.code
|
|
164
|
+
} }) };
|
|
165
|
+
case "misbehavior":
|
|
166
|
+
if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError(details) }) };
|
|
167
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
168
|
+
code: details.bodyCode,
|
|
169
|
+
message: details.message,
|
|
170
|
+
status: details.status
|
|
171
|
+
} }) };
|
|
172
|
+
if (wire === "cohere") return { body: JSON.stringify({
|
|
173
|
+
message: details.message,
|
|
174
|
+
code: details.code
|
|
175
|
+
}) };
|
|
176
|
+
if (wire === "ollama") return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };
|
|
177
|
+
if (wire === "bedrock-converse") return {
|
|
178
|
+
body: JSON.stringify({
|
|
179
|
+
__type: details.type,
|
|
180
|
+
message: details.message,
|
|
181
|
+
code: details.code
|
|
182
|
+
}),
|
|
183
|
+
headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
|
|
184
|
+
};
|
|
185
|
+
if (wire === "bedrock") return {
|
|
186
|
+
body: JSON.stringify({
|
|
187
|
+
__type: details.type,
|
|
188
|
+
code: details.code,
|
|
189
|
+
message: details.message
|
|
190
|
+
}),
|
|
191
|
+
headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
|
|
192
|
+
};
|
|
193
|
+
return { body: JSON.stringify({
|
|
194
|
+
type: "error",
|
|
195
|
+
error: {
|
|
196
|
+
type: details.type,
|
|
197
|
+
code: details.code,
|
|
198
|
+
message: details.message
|
|
199
|
+
}
|
|
200
|
+
}) };
|
|
201
|
+
case "unknown-response":
|
|
202
|
+
if (wire === "gemini") return { body: JSON.stringify({ error: {
|
|
203
|
+
message: details.message,
|
|
204
|
+
code: details.bodyCode,
|
|
205
|
+
status: details.status
|
|
206
|
+
} }) };
|
|
207
|
+
if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
|
|
208
|
+
...details,
|
|
209
|
+
type: details.type ?? "server_error"
|
|
210
|
+
}) }) };
|
|
211
|
+
return { body: JSON.stringify({ error: {
|
|
212
|
+
message: details.message,
|
|
213
|
+
type: details.type ?? "server_error"
|
|
214
|
+
} }) };
|
|
215
|
+
case "transport-failure": return { body: JSON.stringify({ error: {
|
|
216
|
+
message: details.message,
|
|
217
|
+
type: details.type ?? "proxy_error"
|
|
218
|
+
} }) };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
//#endregion
|
|
223
|
+
export { buildOpenAIError, renderError };
|
|
224
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/response/errors.ts"],"sourcesContent":["import { errorProfiles, type ErrorWire } from \"./profiles.js\";\n\nexport type ErrorPurpose =\n | \"validation\"\n | \"strict-miss\"\n | \"fixture-miss\"\n | \"thinking\"\n | \"fixture\"\n | \"tool-argument\"\n | \"misbehavior\"\n | \"unknown-response\"\n | \"transport-failure\"\n | \"route-failure\"\n | \"stream-failure\"\n | \"invalid-misbehavior-header\"\n | \"authentication\"\n | \"legacy-auth\";\n\nexport interface ErrorDetails {\n message: string;\n type?: string | null;\n param?: string | null;\n /** Explicitly retain the native OpenAI param slot; omitted preserves legacy templates. */\n includeParam?: true;\n /** Normalized correlation metadata explicitly supplied by native header-policy rejects. */\n requestId?: string;\n code?: string | null;\n bodyCode?: number;\n status?: string | null;\n googleDetails?: {\n \"@type\": string;\n reason: string;\n domain: string;\n metadata: { code: string };\n }[];\n}\n\ntype OpenAIInnerDetails = Pick<\n ErrorDetails,\n \"message\" | \"type\" | \"param\" | \"code\" | \"includeParam\"\n>;\ntype OpenAIInnerBody = {\n message: string;\n type?: string | null;\n param?: string | null;\n code?: string | null;\n};\ntype ServiceValidationBody = { error: { message: string; type: string } };\ntype OpenRouterErrorBody = {\n error: { code: number; message: string; metadata?: Record<string, unknown> };\n};\n\n/** Common error owner; fixed native forms preserve caller signatures and ordering. */\nexport function buildOpenAIError(details: OpenAIInnerDetails): OpenAIInnerBody;\nexport function buildOpenAIError(\n purpose: \"service-validation\",\n details: { message: string },\n): ServiceValidationBody;\nexport function buildOpenAIError(\n purpose: \"openrouter-error\",\n details: { code: number; message: string; metadata?: Record<string, unknown> },\n): OpenRouterErrorBody;\nexport function buildOpenAIError(\n input: OpenAIInnerDetails | \"service-validation\" | \"openrouter-error\",\n details?: { message: string; code?: number; metadata?: Record<string, unknown> },\n): OpenAIInnerBody | ServiceValidationBody | OpenRouterErrorBody {\n if (input === \"service-validation\") {\n if (!details) throw new TypeError(\"Missing service validation error details\");\n return {\n error: { message: details.message, type: errorProfiles.openai.validationType },\n };\n }\n if (input === \"openrouter-error\") {\n if (!details || typeof details.code !== \"number\")\n throw new TypeError(\"Missing OpenRouter numeric error details\");\n return {\n error: {\n code: details.code,\n message: details.message,\n ...(details.metadata !== undefined && { metadata: details.metadata }),\n },\n };\n }\n return {\n message: input.message,\n type: input.type,\n ...(input.includeParam === true ? { param: input.param ?? null } : {}),\n code: input.code,\n };\n}\n\n/** Native purpose templates preserve field presence and insertion order. No status or I/O. */\nexport function renderError(\n wire: ErrorWire,\n purpose: ErrorPurpose,\n details: ErrorDetails,\n): { body: string; headers?: Record<string, string> } {\n if (wire === \"ollama-embed\") {\n return { body: JSON.stringify({ error: details.message }) };\n }\n const profile = errorProfiles[wire];\n if (\n wire === \"interactions\" &&\n (purpose === \"validation\" ||\n purpose === \"strict-miss\" ||\n purpose === \"fixture-miss\" ||\n purpose === \"fixture\" ||\n purpose === \"misbehavior\" ||\n purpose === \"unknown-response\")\n ) {\n return {\n body: JSON.stringify({\n error: { code: details.code ?? \"INVALID_ARGUMENT\", message: details.message },\n }),\n };\n }\n switch (purpose) {\n case \"authentication\":\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: \"authentication_error\", message: details.message },\n }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 401, message: details.message, status: \"UNAUTHENTICATED\" },\n }),\n };\n }\n return renderError(wire, \"legacy-auth\", details);\n case \"legacy-auth\":\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: \"authentication_error\",\n code: \"invalid_api_key\",\n },\n }),\n };\n case \"stream-failure\":\n return { body: JSON.stringify({ error: { message: details.message } }) };\n case \"route-failure\":\n return {\n body: JSON.stringify({ error: { message: details.message, type: details.type } }),\n };\n case \"invalid-misbehavior-header\":\n if (wire === \"ollama\") return { body: JSON.stringify({ error: details.message }) };\n if (wire === \"cohere\") return { body: JSON.stringify({ message: details.message }) };\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 400, message: details.message, status: \"INVALID_ARGUMENT\" },\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: profile.validationType, code: details.code, message: details.message },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({ __type: \"ValidationException\", message: details.message }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: profile.validationType, code: details.code },\n }),\n };\n case \"validation\":\n case \"strict-miss\":\n case \"fixture-miss\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({\n ...details,\n type: details.type ?? profile.validationType,\n }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? profile.validationType },\n }),\n };\n case \"thinking\":\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.validationType, message: details.message },\n ...(wire === \"messages\" && details.requestId !== undefined\n ? { request_id: details.requestId }\n : {}),\n }),\n };\n case \"fixture\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n param: details.param ?? null,\n code: details.code ?? null,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.fixtureType, message: details.message },\n }),\n };\n case \"tool-argument\":\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: details.message, code: details.code }) };\n }\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: {\n code: 500,\n message: details.message,\n status: \"INTERNAL\",\n details: details.googleDetails,\n },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type ?? errorProfiles.bedrock.toolArgumentType,\n message: details.message,\n reason: details.code,\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: {\n type: details.type ?? profile.fixtureType,\n code: details.code,\n message: details.message,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n code: details.code,\n },\n }),\n };\n case \"misbehavior\":\n if (wire === \"openai\") {\n return { body: JSON.stringify({ error: buildOpenAIError(details) }) };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"cohere\") {\n return { body: JSON.stringify({ message: details.message, code: details.code }) };\n }\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };\n }\n if (wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n message: details.message,\n code: details.code,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n if (wire === \"bedrock\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n code: details.code,\n message: details.message,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type, code: details.code, message: details.message },\n }),\n };\n case \"unknown-response\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({ ...details, type: details.type ?? \"server_error\" }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"server_error\" },\n }),\n };\n case \"transport-failure\":\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"proxy_error\" },\n }),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/response/finish.ts
|
|
3
|
+
/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */
|
|
4
|
+
function mapAnthropicFinish(finishReason) {
|
|
5
|
+
if (finishReason === "stop") return "end_turn";
|
|
6
|
+
if (finishReason === "tool_calls") return "tool_use";
|
|
7
|
+
if (finishReason === "length") return "max_tokens";
|
|
8
|
+
return finishReason;
|
|
9
|
+
}
|
|
10
|
+
/** Responses status has its own table; caller defaults remain outside the mapper. */
|
|
11
|
+
function mapResponsesFinish(finishReason) {
|
|
12
|
+
if (finishReason === "stop") return "completed";
|
|
13
|
+
if (finishReason === "tool_calls") return "completed";
|
|
14
|
+
if (finishReason === "length") return "incomplete";
|
|
15
|
+
if (finishReason === "content_filter") return "failed";
|
|
16
|
+
return finishReason;
|
|
17
|
+
}
|
|
18
|
+
/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */
|
|
19
|
+
function mapGeminiFinish(finishReason) {
|
|
20
|
+
if (finishReason === "stop") return "STOP";
|
|
21
|
+
if (finishReason === "tool_calls") return "FUNCTION_CALL";
|
|
22
|
+
if (finishReason === "length") return "MAX_TOKENS";
|
|
23
|
+
if (finishReason === "content_filter") return "SAFETY";
|
|
24
|
+
return finishReason;
|
|
25
|
+
}
|
|
26
|
+
/** Cohere has its own native finish table; callers retain their falsy defaults. */
|
|
27
|
+
function mapCohereFinish(finishReason) {
|
|
28
|
+
if (finishReason === "stop") return "COMPLETE";
|
|
29
|
+
if (finishReason === "tool_calls") return "TOOL_CALL";
|
|
30
|
+
if (finishReason === "length") return "MAX_TOKENS";
|
|
31
|
+
return finishReason;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
exports.mapAnthropicFinish = mapAnthropicFinish;
|
|
36
|
+
exports.mapCohereFinish = mapCohereFinish;
|
|
37
|
+
exports.mapGeminiFinish = mapGeminiFinish;
|
|
38
|
+
exports.mapResponsesFinish = mapResponsesFinish;
|
|
39
|
+
//# sourceMappingURL=finish.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish.cjs","names":[],"sources":["../../src/response/finish.ts"],"sourcesContent":["/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */\nexport function mapAnthropicFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"end_turn\";\n if (finishReason === \"tool_calls\") return \"tool_use\";\n if (finishReason === \"length\") return \"max_tokens\";\n return finishReason;\n}\n\n/** Responses status has its own table; caller defaults remain outside the mapper. */\nexport function mapResponsesFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"completed\";\n if (finishReason === \"tool_calls\") return \"completed\";\n if (finishReason === \"length\") return \"incomplete\";\n if (finishReason === \"content_filter\") return \"failed\";\n return finishReason;\n}\n\n/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */\nexport function mapGeminiFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"STOP\";\n if (finishReason === \"tool_calls\") return \"FUNCTION_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n if (finishReason === \"content_filter\") return \"SAFETY\";\n return finishReason;\n}\n\n/** Cohere has its own native finish table; callers retain their falsy defaults. */\nexport function mapCohereFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"COMPLETE\";\n if (finishReason === \"tool_calls\") return \"TOOL_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n return finishReason;\n}\n"],"mappings":";;;AACA,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO;;;AAIT,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/response/finish.ts
|
|
2
|
+
/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */
|
|
3
|
+
function mapAnthropicFinish(finishReason) {
|
|
4
|
+
if (finishReason === "stop") return "end_turn";
|
|
5
|
+
if (finishReason === "tool_calls") return "tool_use";
|
|
6
|
+
if (finishReason === "length") return "max_tokens";
|
|
7
|
+
return finishReason;
|
|
8
|
+
}
|
|
9
|
+
/** Responses status has its own table; caller defaults remain outside the mapper. */
|
|
10
|
+
function mapResponsesFinish(finishReason) {
|
|
11
|
+
if (finishReason === "stop") return "completed";
|
|
12
|
+
if (finishReason === "tool_calls") return "completed";
|
|
13
|
+
if (finishReason === "length") return "incomplete";
|
|
14
|
+
if (finishReason === "content_filter") return "failed";
|
|
15
|
+
return finishReason;
|
|
16
|
+
}
|
|
17
|
+
/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */
|
|
18
|
+
function mapGeminiFinish(finishReason) {
|
|
19
|
+
if (finishReason === "stop") return "STOP";
|
|
20
|
+
if (finishReason === "tool_calls") return "FUNCTION_CALL";
|
|
21
|
+
if (finishReason === "length") return "MAX_TOKENS";
|
|
22
|
+
if (finishReason === "content_filter") return "SAFETY";
|
|
23
|
+
return finishReason;
|
|
24
|
+
}
|
|
25
|
+
/** Cohere has its own native finish table; callers retain their falsy defaults. */
|
|
26
|
+
function mapCohereFinish(finishReason) {
|
|
27
|
+
if (finishReason === "stop") return "COMPLETE";
|
|
28
|
+
if (finishReason === "tool_calls") return "TOOL_CALL";
|
|
29
|
+
if (finishReason === "length") return "MAX_TOKENS";
|
|
30
|
+
return finishReason;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
export { mapAnthropicFinish, mapCohereFinish, mapGeminiFinish, mapResponsesFinish };
|
|
35
|
+
//# sourceMappingURL=finish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish.js","names":[],"sources":["../../src/response/finish.ts"],"sourcesContent":["/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */\nexport function mapAnthropicFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"end_turn\";\n if (finishReason === \"tool_calls\") return \"tool_use\";\n if (finishReason === \"length\") return \"max_tokens\";\n return finishReason;\n}\n\n/** Responses status has its own table; caller defaults remain outside the mapper. */\nexport function mapResponsesFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"completed\";\n if (finishReason === \"tool_calls\") return \"completed\";\n if (finishReason === \"length\") return \"incomplete\";\n if (finishReason === \"content_filter\") return \"failed\";\n return finishReason;\n}\n\n/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */\nexport function mapGeminiFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"STOP\";\n if (finishReason === \"tool_calls\") return \"FUNCTION_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n if (finishReason === \"content_filter\") return \"SAFETY\";\n return finishReason;\n}\n\n/** Cohere has its own native finish table; callers retain their falsy defaults. */\nexport function mapCohereFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"COMPLETE\";\n if (finishReason === \"tool_calls\") return \"TOOL_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n return finishReason;\n}\n"],"mappings":";;AACA,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO;;;AAIT,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/response/policy.ts
|
|
3
|
+
/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */
|
|
4
|
+
function parsePolicyEntry(key, value) {
|
|
5
|
+
if (key === "requiredHeaders") {
|
|
6
|
+
const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
|
|
7
|
+
if (normalized === "off" || normalized === "enforce") return {
|
|
8
|
+
ok: true,
|
|
9
|
+
key,
|
|
10
|
+
value: normalized
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
ok: false,
|
|
14
|
+
reason: "expected \"off\" or \"enforce\"."
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (key === "authErrors" || key === "modelCatalog") {
|
|
18
|
+
const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
|
|
19
|
+
if (normalized === "legacy" || normalized === "native") return {
|
|
20
|
+
ok: true,
|
|
21
|
+
key,
|
|
22
|
+
value: normalized
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
ok: false,
|
|
26
|
+
reason: "expected \"legacy\" or \"native\"."
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
reason: "unknown policy key."
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Store one parsed entry without widening either key's value type. */
|
|
35
|
+
function assignPolicyEntry(target, entry) {
|
|
36
|
+
if (entry.key === "requiredHeaders") target.requiredHeaders = entry.value;
|
|
37
|
+
else target[entry.key] = entry.value;
|
|
38
|
+
}
|
|
39
|
+
/** Parse each programmatic entry independently without changing the caller's object. */
|
|
40
|
+
function parsePolicy(value, warn) {
|
|
41
|
+
const result = {};
|
|
42
|
+
if (value === void 0) return result;
|
|
43
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
44
|
+
warn("Ignoring policy: expected an object.");
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
48
|
+
const parsed = parsePolicyEntry(key, entry);
|
|
49
|
+
if (parsed.ok) assignPolicyEntry(result, parsed);
|
|
50
|
+
else warn(`Ignoring policy.${key}: ${parsed.reason}`);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/** A bad header entry does not erase a prior valid entry or other policy keys. */
|
|
55
|
+
function parsePolicyHeader(rawHeaders, warn) {
|
|
56
|
+
const result = {};
|
|
57
|
+
const header = rawHeaders?.["x-aimock-policy"];
|
|
58
|
+
if (header === void 0) return result;
|
|
59
|
+
const text = Array.isArray(header) ? header.join(",") : header;
|
|
60
|
+
for (const rawEntry of text.split(",")) {
|
|
61
|
+
const entry = rawEntry.trim();
|
|
62
|
+
const separator = entry.indexOf("=");
|
|
63
|
+
if (separator < 0) {
|
|
64
|
+
warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const key = entry.slice(0, separator);
|
|
68
|
+
const parsed = parsePolicyEntry(key, entry.slice(separator + 1));
|
|
69
|
+
if (parsed.ok) assignPolicyEntry(result, parsed);
|
|
70
|
+
else warn(`Ignoring policy.${key}: ${parsed.reason}`);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */
|
|
75
|
+
function resolvePolicy(defaults, rawHeaders, warn = (message) => defaults.logger.warn(message)) {
|
|
76
|
+
const strict = resolveStrictMode(defaults.strict, rawHeaders);
|
|
77
|
+
const server = parsePolicy(defaults.policy, warn);
|
|
78
|
+
const request = parsePolicyHeader(rawHeaders, warn);
|
|
79
|
+
return Object.freeze({
|
|
80
|
+
strict,
|
|
81
|
+
requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? "off",
|
|
82
|
+
authErrors: request.authErrors ?? server.authErrors ?? "legacy",
|
|
83
|
+
modelCatalog: request.modelCatalog ?? server.modelCatalog ?? "legacy"
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** Preserve the legacy request strict header grammar and server fallback. */
|
|
87
|
+
function resolveStrictMode(serverDefault, rawHeaders) {
|
|
88
|
+
if (rawHeaders) {
|
|
89
|
+
const header = rawHeaders["x-aimock-strict"];
|
|
90
|
+
const rawVal = typeof header === "string" ? header : Array.isArray(header) ? header[0] : void 0;
|
|
91
|
+
if (typeof rawVal === "string") {
|
|
92
|
+
const val = rawVal.trim().toLowerCase();
|
|
93
|
+
if (val === "true" || val === "1") return true;
|
|
94
|
+
if (val === "false" || val === "0") return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return serverDefault ?? false;
|
|
98
|
+
}
|
|
99
|
+
/** Journal fields retain their existing omitted-versus-overridden shape. */
|
|
100
|
+
function strictOverrideField(serverDefault, rawHeaders) {
|
|
101
|
+
const effective = resolveStrictMode(serverDefault, rawHeaders);
|
|
102
|
+
if (effective !== (serverDefault ?? false)) return { strictOverride: effective };
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
/** Named legacy decisions share one header read at the caller's existing site. */
|
|
106
|
+
function resolveRequestDecisions(serverDefault, rawHeaders) {
|
|
107
|
+
const strict = resolveStrictMode(serverDefault, rawHeaders);
|
|
108
|
+
return Object.freeze({
|
|
109
|
+
strict,
|
|
110
|
+
fixtureMiss: strict,
|
|
111
|
+
upstream: !strict,
|
|
112
|
+
reasoningSuppression: strict,
|
|
113
|
+
thinkingRejection: strict,
|
|
114
|
+
mcpRecordingStrict: strict,
|
|
115
|
+
strictOverride: strict !== (serverDefault ?? false) ? strict : void 0
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
exports.assignPolicyEntry = assignPolicyEntry;
|
|
121
|
+
exports.parsePolicy = parsePolicy;
|
|
122
|
+
exports.parsePolicyEntry = parsePolicyEntry;
|
|
123
|
+
exports.resolvePolicy = resolvePolicy;
|
|
124
|
+
exports.resolveRequestDecisions = resolveRequestDecisions;
|
|
125
|
+
exports.strictOverrideField = strictOverrideField;
|
|
126
|
+
//# sourceMappingURL=policy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.cjs","names":[],"sources":["../../src/response/policy.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport type { AimockPolicy, HandlerDefaults } from \"../types.js\";\n\n/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */\nexport function parsePolicyEntry(\n key: string,\n value: unknown,\n):\n | { ok: true; key: \"requiredHeaders\"; value: \"off\" | \"enforce\" }\n | { ok: true; key: \"authErrors\" | \"modelCatalog\"; value: \"legacy\" | \"native\" }\n | { ok: false; reason: string } {\n if (key === \"requiredHeaders\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"off\" || normalized === \"enforce\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"off\" or \"enforce\".' };\n }\n if (key === \"authErrors\" || key === \"modelCatalog\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"legacy\" || normalized === \"native\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"legacy\" or \"native\".' };\n }\n return { ok: false, reason: \"unknown policy key.\" };\n}\n\n/** Store one parsed entry without widening either key's value type. */\nexport function assignPolicyEntry(\n target: AimockPolicy,\n entry: Exclude<ReturnType<typeof parsePolicyEntry>, { ok: false }>,\n): void {\n if (entry.key === \"requiredHeaders\") target.requiredHeaders = entry.value;\n else target[entry.key] = entry.value;\n}\n\n/** Parse each programmatic entry independently without changing the caller's object. */\nexport function parsePolicy(value: unknown, warn: (message: string) => void): AimockPolicy {\n const result: AimockPolicy = {};\n if (value === undefined) return result;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n warn(\"Ignoring policy: expected an object.\");\n return result;\n }\n for (const [key, entry] of Object.entries(value)) {\n const parsed = parsePolicyEntry(key, entry);\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** A bad header entry does not erase a prior valid entry or other policy keys. */\nexport function parsePolicyHeader(\n rawHeaders: IncomingHttpHeaders | undefined,\n warn: (message: string) => void,\n): AimockPolicy {\n const result: AimockPolicy = {};\n const header = rawHeaders?.[\"x-aimock-policy\"];\n if (header === undefined) return result;\n const text = Array.isArray(header) ? header.join(\",\") : header;\n for (const rawEntry of text.split(\",\")) {\n const entry = rawEntry.trim();\n const separator = entry.indexOf(\"=\");\n if (separator < 0) {\n warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);\n continue;\n }\n const key = entry.slice(0, separator);\n const parsed = parsePolicyEntry(key, entry.slice(separator + 1));\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */\nexport function resolvePolicy(\n defaults: HandlerDefaults,\n rawHeaders?: IncomingHttpHeaders,\n warn: (message: string) => void = (message) => defaults.logger.warn(message),\n) {\n const strict = resolveStrictMode(defaults.strict, rawHeaders);\n const server = parsePolicy(defaults.policy, warn);\n const request = parsePolicyHeader(rawHeaders, warn);\n return Object.freeze({\n strict,\n requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? \"off\",\n authErrors: request.authErrors ?? server.authErrors ?? \"legacy\",\n modelCatalog: request.modelCatalog ?? server.modelCatalog ?? \"legacy\",\n });\n}\n\n/** Preserve the legacy request strict header grammar and server fallback. */\nexport function resolveStrictMode(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): boolean {\n if (rawHeaders) {\n const header = rawHeaders[\"x-aimock-strict\"];\n const rawVal =\n typeof header === \"string\" ? header : Array.isArray(header) ? header[0] : undefined;\n if (typeof rawVal === \"string\") {\n const val = rawVal.trim().toLowerCase();\n if (val === \"true\" || val === \"1\") return true;\n if (val === \"false\" || val === \"0\") return false;\n }\n }\n return serverDefault ?? false;\n}\n\n/** Journal fields retain their existing omitted-versus-overridden shape. */\nexport function strictOverrideField(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): { strictOverride?: boolean } {\n const effective = resolveStrictMode(serverDefault, rawHeaders);\n if (effective !== (serverDefault ?? false)) {\n return { strictOverride: effective };\n }\n return {};\n}\n\n/** Named legacy decisions share one header read at the caller's existing site. */\nexport function resolveRequestDecisions(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n) {\n const strict = resolveStrictMode(serverDefault, rawHeaders);\n return Object.freeze({\n strict,\n fixtureMiss: strict,\n upstream: !strict,\n reasoningSuppression: strict,\n thinkingRejection: strict,\n mcpRecordingStrict: strict,\n strictOverride: strict !== (serverDefault ?? false) ? strict : undefined,\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
//#region src/response/policy.ts
|
|
2
|
+
/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */
|
|
3
|
+
function parsePolicyEntry(key, value) {
|
|
4
|
+
if (key === "requiredHeaders") {
|
|
5
|
+
const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
|
|
6
|
+
if (normalized === "off" || normalized === "enforce") return {
|
|
7
|
+
ok: true,
|
|
8
|
+
key,
|
|
9
|
+
value: normalized
|
|
10
|
+
};
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
reason: "expected \"off\" or \"enforce\"."
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (key === "authErrors" || key === "modelCatalog") {
|
|
17
|
+
const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
|
|
18
|
+
if (normalized === "legacy" || normalized === "native") return {
|
|
19
|
+
ok: true,
|
|
20
|
+
key,
|
|
21
|
+
value: normalized
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
reason: "expected \"legacy\" or \"native\"."
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
reason: "unknown policy key."
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Store one parsed entry without widening either key's value type. */
|
|
34
|
+
function assignPolicyEntry(target, entry) {
|
|
35
|
+
if (entry.key === "requiredHeaders") target.requiredHeaders = entry.value;
|
|
36
|
+
else target[entry.key] = entry.value;
|
|
37
|
+
}
|
|
38
|
+
/** Parse each programmatic entry independently without changing the caller's object. */
|
|
39
|
+
function parsePolicy(value, warn) {
|
|
40
|
+
const result = {};
|
|
41
|
+
if (value === void 0) return result;
|
|
42
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
43
|
+
warn("Ignoring policy: expected an object.");
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
47
|
+
const parsed = parsePolicyEntry(key, entry);
|
|
48
|
+
if (parsed.ok) assignPolicyEntry(result, parsed);
|
|
49
|
+
else warn(`Ignoring policy.${key}: ${parsed.reason}`);
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/** A bad header entry does not erase a prior valid entry or other policy keys. */
|
|
54
|
+
function parsePolicyHeader(rawHeaders, warn) {
|
|
55
|
+
const result = {};
|
|
56
|
+
const header = rawHeaders?.["x-aimock-policy"];
|
|
57
|
+
if (header === void 0) return result;
|
|
58
|
+
const text = Array.isArray(header) ? header.join(",") : header;
|
|
59
|
+
for (const rawEntry of text.split(",")) {
|
|
60
|
+
const entry = rawEntry.trim();
|
|
61
|
+
const separator = entry.indexOf("=");
|
|
62
|
+
if (separator < 0) {
|
|
63
|
+
warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const key = entry.slice(0, separator);
|
|
67
|
+
const parsed = parsePolicyEntry(key, entry.slice(separator + 1));
|
|
68
|
+
if (parsed.ok) assignPolicyEntry(result, parsed);
|
|
69
|
+
else warn(`Ignoring policy.${key}: ${parsed.reason}`);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */
|
|
74
|
+
function resolvePolicy(defaults, rawHeaders, warn = (message) => defaults.logger.warn(message)) {
|
|
75
|
+
const strict = resolveStrictMode(defaults.strict, rawHeaders);
|
|
76
|
+
const server = parsePolicy(defaults.policy, warn);
|
|
77
|
+
const request = parsePolicyHeader(rawHeaders, warn);
|
|
78
|
+
return Object.freeze({
|
|
79
|
+
strict,
|
|
80
|
+
requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? "off",
|
|
81
|
+
authErrors: request.authErrors ?? server.authErrors ?? "legacy",
|
|
82
|
+
modelCatalog: request.modelCatalog ?? server.modelCatalog ?? "legacy"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/** Preserve the legacy request strict header grammar and server fallback. */
|
|
86
|
+
function resolveStrictMode(serverDefault, rawHeaders) {
|
|
87
|
+
if (rawHeaders) {
|
|
88
|
+
const header = rawHeaders["x-aimock-strict"];
|
|
89
|
+
const rawVal = typeof header === "string" ? header : Array.isArray(header) ? header[0] : void 0;
|
|
90
|
+
if (typeof rawVal === "string") {
|
|
91
|
+
const val = rawVal.trim().toLowerCase();
|
|
92
|
+
if (val === "true" || val === "1") return true;
|
|
93
|
+
if (val === "false" || val === "0") return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return serverDefault ?? false;
|
|
97
|
+
}
|
|
98
|
+
/** Journal fields retain their existing omitted-versus-overridden shape. */
|
|
99
|
+
function strictOverrideField(serverDefault, rawHeaders) {
|
|
100
|
+
const effective = resolveStrictMode(serverDefault, rawHeaders);
|
|
101
|
+
if (effective !== (serverDefault ?? false)) return { strictOverride: effective };
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
/** Named legacy decisions share one header read at the caller's existing site. */
|
|
105
|
+
function resolveRequestDecisions(serverDefault, rawHeaders) {
|
|
106
|
+
const strict = resolveStrictMode(serverDefault, rawHeaders);
|
|
107
|
+
return Object.freeze({
|
|
108
|
+
strict,
|
|
109
|
+
fixtureMiss: strict,
|
|
110
|
+
upstream: !strict,
|
|
111
|
+
reasoningSuppression: strict,
|
|
112
|
+
thinkingRejection: strict,
|
|
113
|
+
mcpRecordingStrict: strict,
|
|
114
|
+
strictOverride: strict !== (serverDefault ?? false) ? strict : void 0
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { assignPolicyEntry, parsePolicy, parsePolicyEntry, resolvePolicy, resolveRequestDecisions, strictOverrideField };
|
|
120
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","names":[],"sources":["../../src/response/policy.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport type { AimockPolicy, HandlerDefaults } from \"../types.js\";\n\n/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */\nexport function parsePolicyEntry(\n key: string,\n value: unknown,\n):\n | { ok: true; key: \"requiredHeaders\"; value: \"off\" | \"enforce\" }\n | { ok: true; key: \"authErrors\" | \"modelCatalog\"; value: \"legacy\" | \"native\" }\n | { ok: false; reason: string } {\n if (key === \"requiredHeaders\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"off\" || normalized === \"enforce\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"off\" or \"enforce\".' };\n }\n if (key === \"authErrors\" || key === \"modelCatalog\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"legacy\" || normalized === \"native\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"legacy\" or \"native\".' };\n }\n return { ok: false, reason: \"unknown policy key.\" };\n}\n\n/** Store one parsed entry without widening either key's value type. */\nexport function assignPolicyEntry(\n target: AimockPolicy,\n entry: Exclude<ReturnType<typeof parsePolicyEntry>, { ok: false }>,\n): void {\n if (entry.key === \"requiredHeaders\") target.requiredHeaders = entry.value;\n else target[entry.key] = entry.value;\n}\n\n/** Parse each programmatic entry independently without changing the caller's object. */\nexport function parsePolicy(value: unknown, warn: (message: string) => void): AimockPolicy {\n const result: AimockPolicy = {};\n if (value === undefined) return result;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n warn(\"Ignoring policy: expected an object.\");\n return result;\n }\n for (const [key, entry] of Object.entries(value)) {\n const parsed = parsePolicyEntry(key, entry);\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** A bad header entry does not erase a prior valid entry or other policy keys. */\nexport function parsePolicyHeader(\n rawHeaders: IncomingHttpHeaders | undefined,\n warn: (message: string) => void,\n): AimockPolicy {\n const result: AimockPolicy = {};\n const header = rawHeaders?.[\"x-aimock-policy\"];\n if (header === undefined) return result;\n const text = Array.isArray(header) ? header.join(\",\") : header;\n for (const rawEntry of text.split(\",\")) {\n const entry = rawEntry.trim();\n const separator = entry.indexOf(\"=\");\n if (separator < 0) {\n warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);\n continue;\n }\n const key = entry.slice(0, separator);\n const parsed = parsePolicyEntry(key, entry.slice(separator + 1));\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */\nexport function resolvePolicy(\n defaults: HandlerDefaults,\n rawHeaders?: IncomingHttpHeaders,\n warn: (message: string) => void = (message) => defaults.logger.warn(message),\n) {\n const strict = resolveStrictMode(defaults.strict, rawHeaders);\n const server = parsePolicy(defaults.policy, warn);\n const request = parsePolicyHeader(rawHeaders, warn);\n return Object.freeze({\n strict,\n requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? \"off\",\n authErrors: request.authErrors ?? server.authErrors ?? \"legacy\",\n modelCatalog: request.modelCatalog ?? server.modelCatalog ?? \"legacy\",\n });\n}\n\n/** Preserve the legacy request strict header grammar and server fallback. */\nexport function resolveStrictMode(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): boolean {\n if (rawHeaders) {\n const header = rawHeaders[\"x-aimock-strict\"];\n const rawVal =\n typeof header === \"string\" ? header : Array.isArray(header) ? header[0] : undefined;\n if (typeof rawVal === \"string\") {\n const val = rawVal.trim().toLowerCase();\n if (val === \"true\" || val === \"1\") return true;\n if (val === \"false\" || val === \"0\") return false;\n }\n }\n return serverDefault ?? false;\n}\n\n/** Journal fields retain their existing omitted-versus-overridden shape. */\nexport function strictOverrideField(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): { strictOverride?: boolean } {\n const effective = resolveStrictMode(serverDefault, rawHeaders);\n if (effective !== (serverDefault ?? false)) {\n return { strictOverride: effective };\n }\n return {};\n}\n\n/** Named legacy decisions share one header read at the caller's existing site. */\nexport function resolveRequestDecisions(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n) {\n const strict = resolveStrictMode(serverDefault, rawHeaders);\n return Object.freeze({\n strict,\n fixtureMiss: strict,\n upstream: !strict,\n reasoningSuppression: strict,\n thinkingRejection: strict,\n mcpRecordingStrict: strict,\n strictOverride: strict !== (serverDefault ?? false) ? strict : undefined,\n });\n}\n"],"mappings":"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"}
|