@copilotkit/aimock 1.45.1 → 1.47.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 +25 -1
- package/README.md +11 -2
- 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/aws-event-stream.cjs +20 -23
- package/dist/aws-event-stream.cjs.map +1 -1
- package/dist/aws-event-stream.d.cts +0 -1
- package/dist/aws-event-stream.d.ts +0 -1
- package/dist/aws-event-stream.js +20 -24
- package/dist/aws-event-stream.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 +139 -161
- 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 +137 -159
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +175 -216
- 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 +172 -213
- 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 +107 -180
- 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 +106 -179
- 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 +140 -44
- 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 +141 -46
- 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 +113 -156
- 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 +113 -156
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +295 -218
- 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 +295 -219
- 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 +411 -75
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +51 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts +51 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +402 -74
- 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.cjs +4 -2
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- 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-fakes.d.cts.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 +235 -202
- 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 +234 -202
- 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/misbehavior.cjs +62 -3
- package/dist/misbehavior.cjs.map +1 -1
- package/dist/misbehavior.d.cts.map +1 -1
- package/dist/misbehavior.d.ts.map +1 -1
- package/dist/misbehavior.js +63 -4
- package/dist/misbehavior.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/ndjson-writer.cjs +21 -23
- package/dist/ndjson-writer.cjs.map +1 -1
- package/dist/ndjson-writer.d.cts +0 -1
- package/dist/ndjson-writer.d.cts.map +1 -1
- package/dist/ndjson-writer.d.ts +0 -1
- package/dist/ndjson-writer.d.ts.map +1 -1
- package/dist/ndjson-writer.js +21 -24
- package/dist/ndjson-writer.js.map +1 -1
- package/dist/ollama.cjs +276 -210
- 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 +273 -207
- 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/raw-validation.cjs +177 -0
- package/dist/raw-validation.cjs.map +1 -0
- package/dist/raw-validation.js +176 -0
- package/dist/raw-validation.js.map +1 -0
- 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/deliver.cjs +144 -0
- package/dist/response/deliver.cjs.map +1 -0
- package/dist/response/deliver.js +143 -0
- package/dist/response/deliver.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/frame-loop.cjs +102 -0
- package/dist/response/frame-loop.cjs.map +1 -0
- package/dist/response/frame-loop.js +100 -0
- package/dist/response/frame-loop.js.map +1 -0
- package/dist/response/lifecycle.cjs +223 -0
- package/dist/response/lifecycle.cjs.map +1 -0
- package/dist/response/lifecycle.js +211 -0
- package/dist/response/lifecycle.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/proxy.cjs +71 -0
- package/dist/response/proxy.cjs.map +1 -0
- package/dist/response/proxy.js +70 -0
- package/dist/response/proxy.js.map +1 -0
- package/dist/response/raw.cjs +228 -0
- package/dist/response/raw.cjs.map +1 -0
- package/dist/response/raw.js +227 -0
- package/dist/response/raw.js.map +1 -0
- package/dist/response/timing.cjs +157 -0
- package/dist/response/timing.cjs.map +1 -0
- package/dist/response/timing.js +150 -0
- package/dist/response/timing.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 +304 -196
- 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 +303 -195
- 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 +24 -4
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts +7 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts +7 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +24 -5
- 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 +293 -248
- 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 +294 -249
- 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 +56 -30
- package/dist/sse-writer.cjs.map +1 -1
- package/dist/sse-writer.d.cts +0 -1
- package/dist/sse-writer.d.cts.map +1 -1
- package/dist/sse-writer.d.ts +0 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/sse-writer.js +55 -31
- 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 +31 -43
- 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 +31 -43
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +231 -9
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +231 -9
- 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-framing.cjs +12 -6
- package/dist/ws-framing.cjs.map +1 -1
- package/dist/ws-framing.d.cts +2 -0
- package/dist/ws-framing.d.cts.map +1 -1
- package/dist/ws-framing.d.ts +2 -0
- package/dist/ws-framing.d.ts.map +1 -1
- package/dist/ws-framing.js +12 -6
- package/dist/ws-framing.js.map +1 -1
- package/dist/ws-gemini-live.cjs +131 -96
- 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 +130 -95
- 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 +108 -124
- 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 +105 -121
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +80 -59
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.d.cts.map +1 -1
- package/dist/ws-responses.d.ts.map +1 -1
- package/dist/ws-responses.js +79 -58
- package/dist/ws-responses.js.map +1 -1
- package/package.json +4 -1
- package/skills/write-fixtures/SKILL.md +57 -16
package/dist/vector-mock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-mock.js","names":["http"],"sources":["../src/vector-mock.ts"],"sourcesContent":["import * as http from \"node:http\";\nimport type { Mountable, JournalEntry } from \"./types.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { MetricsRegistry } from \"./metrics.js\";\nimport type {\n VectorMockOptions,\n VectorCollection,\n VectorEntry,\n QueryResult,\n VectorQuery,\n QueryHandler,\n} from \"./vector-types.js\";\nimport { createVectorRequestHandler, type VectorState } from \"./vector-handler.js\";\nimport { flattenHeaders, isJsonObject, readBody } from \"./helpers.js\";\n\nexport class VectorMock implements Mountable {\n private collections: Map<string, VectorCollection> = new Map();\n private queryHandlers: Map<string, QueryHandler> = new Map();\n private server: http.Server | null = null;\n private journal: Journal | null = null;\n private registry: MetricsRegistry | null = null;\n private options: VectorMockOptions;\n private requestHandler: ReturnType<typeof createVectorRequestHandler>;\n\n constructor(options?: VectorMockOptions) {\n this.options = options ?? {};\n this.requestHandler = this.buildHandler();\n }\n\n // ---- Configuration ----\n\n addCollection(name: string, opts: { dimension: number }): this {\n const collection: VectorCollection = {\n name,\n dimension: opts.dimension,\n vectors: new Map(),\n };\n this.collections.set(name, collection);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n upsert(collection: string, vectors: VectorEntry[]): this {\n let col = this.collections.get(collection);\n if (!col) {\n const dim = vectors.length > 0 ? vectors[0].values.length : 0;\n col = { name: collection, dimension: dim, vectors: new Map() };\n this.collections.set(collection, col);\n }\n for (const v of vectors) {\n col.vectors.set(v.id, v);\n }\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n onQuery(\n collection: string,\n results: QueryResult[] | ((query: VectorQuery) => QueryResult[]),\n ): this {\n this.queryHandlers.set(collection, results);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n deleteCollection(name: string): this {\n this.collections.delete(name);\n this.queryHandlers.delete(name);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n // ---- Mountable interface ----\n\n async handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n ): Promise<boolean> {\n // Only consume the request body for methods that carry a body,\n // avoiding double-consumption when the route doesn't match.\n let parsed: Record<string, unknown> = {};\n if (req.method !== \"GET\" && req.method !== \"DELETE\" && req.method !== \"HEAD\") {\n const body = await readBody(req);\n try {\n if (body) parsed = JSON.parse(body);\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: `Malformed JSON body: ${detail}` }));\n return true;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`)\n // before the route handlers touch fields — `body.ids`, `body.vectors`,\n // `body.points` and friends throw a TypeError on `null` that nothing\n // catches, killing the process rather than answering the request.\n // Arrays and scalars are rejected for the same reason the JSON handlers\n // reject them: every field reads as `undefined` and the handler answers\n // a misleading `200` on a degenerate empty result.\n if (!isJsonObject(parsed)) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return true;\n }\n }\n\n const handled = this.requestHandler(req, res, pathname, parsed);\n\n // Record vector operation metric\n if (handled && this.registry) {\n const { operation, provider } = classifyVectorRequest(req.method ?? \"GET\", pathname);\n this.registry.incrementCounter(\"aimock_vector_requests_total\", { operation, provider });\n }\n\n // Journal the request after the handler completes\n if (handled && this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n\n // When mounted, an unmatched path is answered by the parent server, not\n // here, so journal it once the response is out and only if it really was\n // a 404 — otherwise a path this wrapper declines but the server rewrites\n // and serves would be journaled twice. Keeps mounted mode in step with\n // the standalone 404 journaling below.\n if (!handled && this.journal) {\n const journal = this.journal;\n res.once(\"finish\", () => {\n if (res.statusCode !== 404) return;\n journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 404, fixture: null },\n });\n });\n }\n\n return handled;\n }\n\n health(): { status: string; collections: number } {\n return {\n status: \"ok\",\n collections: this.collections.size,\n };\n }\n\n setJournal(journal: Journal): void {\n this.journal = journal;\n }\n\n setRegistry(registry: MetricsRegistry): void {\n this.registry = registry;\n }\n\n // ---- Standalone mode ----\n\n async start(): Promise<string> {\n if (this.server) {\n throw new Error(\"Server already started\");\n }\n\n const host = this.options.host ?? \"127.0.0.1\";\n const port = this.options.port ?? 0;\n\n return new Promise((resolve, reject) => {\n const srv = http.createServer((req, res) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const body = Buffer.concat(chunks).toString();\n let parsed: Record<string, unknown> = {};\n try {\n if (body) parsed = JSON.parse(body);\n } catch (parseErr) {\n if (req.method !== \"GET\") {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: `Malformed JSON body: ${detail}` }));\n return;\n }\n }\n\n // Same non-object rejection as the mounted path above — a `null`\n // body otherwise reaches the route handlers and throws an uncaught\n // TypeError that takes the standalone server's process down.\n if (req.method !== \"GET\" && !isJsonObject(parsed)) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n },\n }),\n );\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${host}`);\n\n const handled = this.requestHandler(req, res, url.pathname, parsed);\n\n if (handled && this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n if (!handled) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 404, fixture: null },\n });\n }\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n });\n });\n\n srv.listen(port, host, () => {\n this.server = srv;\n const addr = srv.address();\n if (typeof addr === \"object\" && addr !== null) {\n resolve(`http://${host}:${addr.port}`);\n } else {\n resolve(`http://${host}:${port}`);\n }\n });\n\n srv.on(\"error\", reject);\n });\n }\n\n async stop(): Promise<void> {\n if (!this.server) {\n throw new Error(\"Server not started\");\n }\n const srv = this.server;\n this.server = null;\n await new Promise<void>((resolve, reject) => {\n srv.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n // ---- Inspection ----\n\n getRequests(): JournalEntry[] {\n if (!this.journal) return [];\n return this.journal.getAll().filter((e) => e.service === \"vector\");\n }\n\n reset(): this {\n this.collections.clear();\n this.queryHandlers.clear();\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n // ---- Internal ----\n\n private buildHandler() {\n const state: VectorState = {\n collections: this.collections,\n queryHandlers: this.queryHandlers,\n };\n return createVectorRequestHandler(state);\n }\n}\n\n// ---- Helpers ----\n\n/**\n * Classify a vector request by operation and provider based on HTTP method and pathname.\n */\nfunction classifyVectorRequest(\n method: string,\n pathname: string,\n): { operation: string; provider: string } {\n // Pinecone paths\n if (pathname === \"/query\" && method === \"POST\") {\n return { operation: \"query\", provider: \"pinecone\" };\n }\n if (pathname === \"/vectors/upsert\" && method === \"POST\") {\n return { operation: \"upsert\", provider: \"pinecone\" };\n }\n if (pathname === \"/vectors/delete\" && method === \"POST\") {\n return { operation: \"delete\", provider: \"pinecone\" };\n }\n if (pathname === \"/describe-index-stats\" && method === \"GET\") {\n return { operation: \"describe\", provider: \"pinecone\" };\n }\n\n // Qdrant paths\n if (/^\\/collections\\/[^/]+\\/points\\/search$/.test(pathname) && method === \"POST\") {\n return { operation: \"query\", provider: \"qdrant\" };\n }\n if (/^\\/collections\\/[^/]+\\/points$/.test(pathname) && method === \"PUT\") {\n return { operation: \"upsert\", provider: \"qdrant\" };\n }\n if (/^\\/collections\\/[^/]+\\/points\\/delete$/.test(pathname) && method === \"POST\") {\n return { operation: \"delete\", provider: \"qdrant\" };\n }\n\n // ChromaDB paths\n if (/^\\/api\\/v1\\/collections\\/[^/]+\\/query$/.test(pathname) && method === \"POST\") {\n return { operation: \"query\", provider: \"chromadb\" };\n }\n if (/^\\/api\\/v1\\/collections\\/[^/]+\\/add$/.test(pathname) && method === \"POST\") {\n return { operation: \"upsert\", provider: \"chromadb\" };\n }\n if (pathname === \"/api/v1/collections\" && method === \"GET\") {\n return { operation: \"list\", provider: \"chromadb\" };\n }\n if (/^\\/api\\/v1\\/collections\\/[^/]+$/.test(pathname) && method === \"DELETE\") {\n return { operation: \"delete\", provider: \"chromadb\" };\n }\n\n return { operation: \"unknown\", provider: \"unknown\" };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vector-mock.js","names":["http"],"sources":["../src/vector-mock.ts"],"sourcesContent":["import * as http from \"node:http\";\nimport { buildOpenAIError } from \"./response/errors.js\";\nimport type { Mountable, JournalEntry } from \"./types.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { MetricsRegistry } from \"./metrics.js\";\nimport type {\n VectorMockOptions,\n VectorCollection,\n VectorEntry,\n QueryResult,\n VectorQuery,\n QueryHandler,\n} from \"./vector-types.js\";\nimport { createVectorRequestHandler, type VectorState } from \"./vector-handler.js\";\nimport { flattenHeaders, isJsonObject, readBody } from \"./helpers.js\";\n\nexport class VectorMock implements Mountable {\n private collections: Map<string, VectorCollection> = new Map();\n private queryHandlers: Map<string, QueryHandler> = new Map();\n private server: http.Server | null = null;\n private journal: Journal | null = null;\n private registry: MetricsRegistry | null = null;\n private options: VectorMockOptions;\n private requestHandler: ReturnType<typeof createVectorRequestHandler>;\n\n constructor(options?: VectorMockOptions) {\n this.options = options ?? {};\n this.requestHandler = this.buildHandler();\n }\n\n // ---- Configuration ----\n\n addCollection(name: string, opts: { dimension: number }): this {\n const collection: VectorCollection = {\n name,\n dimension: opts.dimension,\n vectors: new Map(),\n };\n this.collections.set(name, collection);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n upsert(collection: string, vectors: VectorEntry[]): this {\n let col = this.collections.get(collection);\n if (!col) {\n const dim = vectors.length > 0 ? vectors[0].values.length : 0;\n col = { name: collection, dimension: dim, vectors: new Map() };\n this.collections.set(collection, col);\n }\n for (const v of vectors) {\n col.vectors.set(v.id, v);\n }\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n onQuery(\n collection: string,\n results: QueryResult[] | ((query: VectorQuery) => QueryResult[]),\n ): this {\n this.queryHandlers.set(collection, results);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n deleteCollection(name: string): this {\n this.collections.delete(name);\n this.queryHandlers.delete(name);\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n // ---- Mountable interface ----\n\n async handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n ): Promise<boolean> {\n // Only consume the request body for methods that carry a body,\n // avoiding double-consumption when the route doesn't match.\n let parsed: Record<string, unknown> = {};\n if (req.method !== \"GET\" && req.method !== \"DELETE\" && req.method !== \"HEAD\") {\n const body = await readBody(req);\n try {\n if (body) parsed = JSON.parse(body);\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: `Malformed JSON body: ${detail}` }));\n return true;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`)\n // before the route handlers touch fields — `body.ids`, `body.vectors`,\n // `body.points` and friends throw a TypeError on `null` that nothing\n // catches, killing the process rather than answering the request.\n // Arrays and scalars are rejected for the same reason the JSON handlers\n // reject them: every field reads as `undefined` and the handler answers\n // a misleading `200` on a degenerate empty result.\n if (!isJsonObject(parsed)) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n buildOpenAIError(\"service-validation\", {\n message: \"Request body must be a JSON object\",\n }),\n ),\n );\n return true;\n }\n }\n\n const handled = this.requestHandler(req, res, pathname, parsed);\n\n // Record vector operation metric\n if (handled && this.registry) {\n const { operation, provider } = classifyVectorRequest(req.method ?? \"GET\", pathname);\n this.registry.incrementCounter(\"aimock_vector_requests_total\", { operation, provider });\n }\n\n // Journal the request after the handler completes\n if (handled && this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n\n // When mounted, an unmatched path is answered by the parent server, not\n // here, so journal it once the response is out and only if it really was\n // a 404 — otherwise a path this wrapper declines but the server rewrites\n // and serves would be journaled twice. Keeps mounted mode in step with\n // the standalone 404 journaling below.\n if (!handled && this.journal) {\n const journal = this.journal;\n res.once(\"finish\", () => {\n if (res.statusCode !== 404) return;\n journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 404, fixture: null },\n });\n });\n }\n\n return handled;\n }\n\n health(): { status: string; collections: number } {\n return {\n status: \"ok\",\n collections: this.collections.size,\n };\n }\n\n setJournal(journal: Journal): void {\n this.journal = journal;\n }\n\n setRegistry(registry: MetricsRegistry): void {\n this.registry = registry;\n }\n\n // ---- Standalone mode ----\n\n async start(): Promise<string> {\n if (this.server) {\n throw new Error(\"Server already started\");\n }\n\n const host = this.options.host ?? \"127.0.0.1\";\n const port = this.options.port ?? 0;\n\n return new Promise((resolve, reject) => {\n const srv = http.createServer((req, res) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const body = Buffer.concat(chunks).toString();\n let parsed: Record<string, unknown> = {};\n try {\n if (body) parsed = JSON.parse(body);\n } catch (parseErr) {\n if (req.method !== \"GET\") {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: `Malformed JSON body: ${detail}` }));\n return;\n }\n }\n\n // Same non-object rejection as the mounted path above — a `null`\n // body otherwise reaches the route handlers and throws an uncaught\n // TypeError that takes the standalone server's process down.\n if (req.method !== \"GET\" && !isJsonObject(parsed)) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 400, fixture: null },\n });\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n buildOpenAIError(\"service-validation\", {\n message: \"Request body must be a JSON object\",\n }),\n ),\n );\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${host}`);\n\n const handled = this.requestHandler(req, res, url.pathname, parsed);\n\n if (handled && this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n if (!handled) {\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"GET\",\n path: req.url ?? \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector\",\n response: { status: 404, fixture: null },\n });\n }\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n });\n });\n\n srv.listen(port, host, () => {\n this.server = srv;\n const addr = srv.address();\n if (typeof addr === \"object\" && addr !== null) {\n resolve(`http://${host}:${addr.port}`);\n } else {\n resolve(`http://${host}:${port}`);\n }\n });\n\n srv.on(\"error\", reject);\n });\n }\n\n async stop(): Promise<void> {\n if (!this.server) {\n throw new Error(\"Server not started\");\n }\n const srv = this.server;\n this.server = null;\n await new Promise<void>((resolve, reject) => {\n srv.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n // ---- Inspection ----\n\n getRequests(): JournalEntry[] {\n if (!this.journal) return [];\n return this.journal.getAll().filter((e) => e.service === \"vector\");\n }\n\n reset(): this {\n this.collections.clear();\n this.queryHandlers.clear();\n this.requestHandler = this.buildHandler();\n return this;\n }\n\n // ---- Internal ----\n\n private buildHandler() {\n const state: VectorState = {\n collections: this.collections,\n queryHandlers: this.queryHandlers,\n };\n return createVectorRequestHandler(state);\n }\n}\n\n// ---- Helpers ----\n\n/**\n * Classify a vector request by operation and provider based on HTTP method and pathname.\n */\nfunction classifyVectorRequest(\n method: string,\n pathname: string,\n): { operation: string; provider: string } {\n // Pinecone paths\n if (pathname === \"/query\" && method === \"POST\") {\n return { operation: \"query\", provider: \"pinecone\" };\n }\n if (pathname === \"/vectors/upsert\" && method === \"POST\") {\n return { operation: \"upsert\", provider: \"pinecone\" };\n }\n if (pathname === \"/vectors/delete\" && method === \"POST\") {\n return { operation: \"delete\", provider: \"pinecone\" };\n }\n if (pathname === \"/describe-index-stats\" && method === \"GET\") {\n return { operation: \"describe\", provider: \"pinecone\" };\n }\n\n // Qdrant paths\n if (/^\\/collections\\/[^/]+\\/points\\/search$/.test(pathname) && method === \"POST\") {\n return { operation: \"query\", provider: \"qdrant\" };\n }\n if (/^\\/collections\\/[^/]+\\/points$/.test(pathname) && method === \"PUT\") {\n return { operation: \"upsert\", provider: \"qdrant\" };\n }\n if (/^\\/collections\\/[^/]+\\/points\\/delete$/.test(pathname) && method === \"POST\") {\n return { operation: \"delete\", provider: \"qdrant\" };\n }\n\n // ChromaDB paths\n if (/^\\/api\\/v1\\/collections\\/[^/]+\\/query$/.test(pathname) && method === \"POST\") {\n return { operation: \"query\", provider: \"chromadb\" };\n }\n if (/^\\/api\\/v1\\/collections\\/[^/]+\\/add$/.test(pathname) && method === \"POST\") {\n return { operation: \"upsert\", provider: \"chromadb\" };\n }\n if (pathname === \"/api/v1/collections\" && method === \"GET\") {\n return { operation: \"list\", provider: \"chromadb\" };\n }\n if (/^\\/api\\/v1\\/collections\\/[^/]+$/.test(pathname) && method === \"DELETE\") {\n return { operation: \"delete\", provider: \"chromadb\" };\n }\n\n return { operation: \"unknown\", provider: \"unknown\" };\n}\n"],"mappings":"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"}
|
package/dist/vector-stores.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_errors = require('./response/errors.cjs');
|
|
2
3
|
const require_helpers = require('./helpers.cjs');
|
|
3
4
|
const require_chaos = require('./chaos.cjs');
|
|
4
5
|
const require_fine_tuning = require('./fine-tuning.cjs');
|
|
@@ -81,10 +82,7 @@ function underscoreId(prefix) {
|
|
|
81
82
|
return `${prefix}_${(0, node_crypto.randomBytes)(12).toString("base64url")}`;
|
|
82
83
|
}
|
|
83
84
|
function invalid(message) {
|
|
84
|
-
return {
|
|
85
|
-
message,
|
|
86
|
-
type: "invalid_request_error"
|
|
87
|
-
} };
|
|
85
|
+
return require_errors.buildOpenAIError("service-validation", { message });
|
|
88
86
|
}
|
|
89
87
|
function writeJson(res, status, payload, setCorsHeaders) {
|
|
90
88
|
setCorsHeaders(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-stores.cjs","names":["applyChaosAsync","flattenHeaders","isJsonObject","parseStrictIntegerText","getStoredFileBytes","readMetadata","getStoredFileName"],"sources":["../src/vector-stores.ts"],"sourcesContent":["/**\n * OpenAI Vector Stores API mock.\n *\n * Covers vector-store lifecycle and direct search for uploaded `Files`:\n *\n * - `POST /v1/vector_stores` (create)\n * - `GET /v1/vector_stores` (list)\n * - `GET /v1/vector_stores/{id}` (retrieve)\n * - `POST /v1/vector_stores/{id}` (modify)\n * - `DELETE /v1/vector_stores/{id}` (delete)\n * - `POST /v1/vector_stores/{id}/files` (attach a file)\n * - `GET /v1/vector_stores/{id}/files` (list attached files)\n * - `GET /v1/vector_stores/{id}/files/{file_id}` (retrieve an attached file)\n * - `DELETE /v1/vector_stores/{id}/files/{file_id}` (detach a file)\n * - `POST /v1/vector_stores/{id}/file_batches` (create a file batch)\n * - `GET /v1/vector_stores/{id}/file_batches/{batch_id}` (retrieve a batch)\n * - `POST /v1/vector_stores/{id}/file_batches/{batch_id}/cancel` (cancel)\n * - `GET /v1/vector_stores/{id}/file_batches/{batch_id}/files` (batch files)\n * - `POST /v1/vector_stores/{id}/search` (deterministic file search)\n *\n * Supports offline upload → vector-store → direct search tests. Attach a\n * `file-…` id, poll it to `completed`, then call the search endpoint.\n * This mock does not execute hosted `file_search` tools in Responses or\n * Assistants. Responses requests need separate matching fixtures; vector-store\n * contents do not automatically produce model responses.\n *\n * Lifecycle (deterministic poll progression, like the batches mock):\n *\n * store: in_progress → completed (completed at once when no file is\n * pending; `expired` once `expires_at` passes)\n * file: in_progress → completed | failed | cancelled (first retrieve after\n * attach shows `in_progress`, the second lands the outcome)\n * batch: in_progress → completed | failed | cancelled (same two-poll rule;\n * `cancel` on a live batch answers `cancelling`, next retrieve is\n * `cancelled`)\n *\n * Outcome control: send `X-AIMock-Vector-Outcome: completed | failed |\n * cancelled` on `POST …/files` or `POST …/file_batches` (default\n * `completed`, unknown values 400). Same header family as\n * `X-AIMock-Batch-Outcome`.\n *\n * Files must exist in the Files store (`GET /v1/files/{id}` would 200 for\n * them): attaching an unknown `file_id` is a 404 naming the file, so a suite\n * that forgets the upload step fails loudly instead of indexing a ghost.\n * `usage_bytes` is the real byte length from the Files store; a file the\n * store has no bytes for reports `0`.\n *\n * Search is deterministic, not semantic: only `completed` files are searched,\n * results are ordered by a stable hash of `query + file_id` so the same query\n * always ranks the same way, and every result carries its file's name plus a\n * canned text snippet quoting the query. Direct search supports tests of top-k,\n * score thresholds, and empty-store behaviour. It does not measure semantic\n * relevance.\n *\n * State is in-memory per process and cleared by the full reset path.\n * Every branch journals with `service: \"vector-stores\"` and runs through the\n * chaos gate so fault-injection suites can target this surface.\n *\n * Wire shapes follow the vendored `openai` SDK 4.x\n * (`resources/vector-stores/…`) and the `openai/openai-openapi` spec where\n * they agree (`id`, `object`, `created_at`, `name`, `usage_bytes`,\n * `file_counts`, `status`, `metadata`, `expires_after`/`expires_at`,\n * `last_active_at`, list envelopes with `object: \"list\"`, `data`,\n * `first_id`, `last_id`, `has_more`). Timestamps are Unix seconds. Anything\n * the sources leave unspecified (poll counts, the exact 400 texts, the\n * `cancelled` landing without a cancel call, search scoring) is this mock's\n * own contract and documented as such.\n */\n\nimport type * as http from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport { flattenHeaders, isJsonObject, parseStrictIntegerText } from \"./helpers.js\";\nimport { applyChaosAsync, type ChaosAsyncOutcome } from \"./chaos.js\";\nimport { readMetadata } from \"./fine-tuning.js\";\nimport { getStoredFileBytes, getStoredFileName } from \"./files.js\";\nimport type { ChaosDefaults } from \"./types.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { MetricsRegistry } from \"./metrics.js\";\n\nexport type VectorStoreStatus = \"expired\" | \"in_progress\" | \"completed\";\nexport type VectorStoreFileStatus = \"in_progress\" | \"completed\" | \"failed\" | \"cancelled\";\nexport type VectorFileBatchStatus =\n | \"in_progress\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"cancelling\";\n\nexport interface VectorStoreObject {\n id: string;\n object: \"vector_store\";\n created_at: number;\n name: string;\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n status: VectorStoreStatus;\n metadata: Record<string, string> | null;\n expires_after?: { anchor: \"last_active_at\"; days: number };\n expires_at?: number | null;\n last_active_at?: number | null;\n chunking_strategy?: { type: \"auto\" } | { type: \"static\"; static: Record<string, number> };\n}\n\ntype FileAttributes = Record<string, string | number | boolean>;\n\ntype AttributeFilter =\n | {\n type: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n key: string;\n value: string | number | boolean;\n }\n | { type: \"and\" | \"or\"; filters: AttributeFilter[] };\n\nexport interface VectorStoreFileObject {\n id: string;\n object: \"vector_store.file\";\n attributes: FileAttributes | null;\n created_at: number;\n vector_store_id: string;\n status: VectorStoreFileStatus;\n usage_bytes: number;\n chunking_strategy?: { type: \"static\"; static: Record<string, number> };\n last_error?: { code: string; message: string } | null;\n}\n\nexport interface VectorFileBatchObject {\n id: string;\n object: \"vector_store.file_batch\";\n created_at: number;\n vector_store_id: string;\n status: VectorFileBatchStatus;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n}\n\nexport interface VectorSearchResult {\n attributes: FileAttributes | null;\n file_id: string;\n filename: string;\n score: number;\n content: { type: \"text\"; text: string }[];\n}\n\nconst stores = new Map<string, VectorStoreObject>();\nconst storeFiles = new Map<string, VectorStoreFileObject>();\nconst storePolls = new Map<string, number>();\nconst fileOutcomes = new Map<string, VectorStoreFileStatus>();\nconst fileBatches = new Map<string, VectorFileBatchObject>();\nconst batchPolls = new Map<string, number>();\nconst batchOutcomes = new Map<string, VectorStoreFileStatus>();\n// Keep attachment identity: a detached file ID may later be attached again.\nconst batchMembers = new Map<string, VectorStoreFileObject[]>();\nlet lastStamp = 0;\n\nexport function clearVectorStoreStore(): void {\n stores.clear();\n storeFiles.clear();\n storePolls.clear();\n fileOutcomes.clear();\n fileBatches.clear();\n batchPolls.clear();\n batchOutcomes.clear();\n batchMembers.clear();\n lastStamp = 0;\n}\n\n/** Remove every vector attachment when its underlying uploaded File is deleted. */\nexport function removeVectorStoreFile(fileId: string): void {\n const affectedStores = new Set<string>();\n for (const [key, entry] of storeFiles) {\n if (entry.id !== fileId) continue;\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n affectedStores.add(entry.vector_store_id);\n }\n for (const [batchId, members] of batchMembers) {\n const remaining = members.filter((entry) => entry.id !== fileId);\n if (remaining.length === members.length) continue;\n batchMembers.set(batchId, remaining);\n const batch = fileBatches.get(batchId);\n if (!batch) continue;\n batch.file_counts = batchCounts(batchId);\n if (remaining.length === 0 && !TERMINAL_BATCH_STATUSES.has(batch.status)) {\n batch.status = batch.status === \"cancelling\" ? \"cancelled\" : \"completed\";\n batchPolls.delete(batchId);\n batchOutcomes.delete(batchId);\n }\n affectedStores.add(batch.vector_store_id);\n }\n for (const storeId of affectedStores) {\n const store = stores.get(storeId);\n if (store) refreshStoreStatus(store);\n }\n}\n\nconst TERMINAL_FILE_STATUSES = new Set<VectorStoreFileStatus>([\"completed\", \"failed\", \"cancelled\"]);\nconst TERMINAL_BATCH_STATUSES = new Set<VectorFileBatchStatus>([\n \"completed\",\n \"failed\",\n \"cancelled\",\n]);\nconst OUTCOMES = new Set([\"completed\", \"failed\", \"cancelled\"]);\nconst OUTCOME_HEADER = \"x-aimock-vector-outcome\";\nconst DEFAULT_PAGE_LIMIT = 20;\nconst MAX_PAGE_LIMIT = 100;\n\nfunction stamp(): number {\n lastStamp = Math.max(Math.floor(Date.now() / 1000), lastStamp);\n return lastStamp;\n}\n\nfunction underscoreId(prefix: string): string {\n return `${prefix}_${randomBytes(12).toString(\"base64url\")}`;\n}\n\nfunction invalid(message: string): { error: { message: string; type: string } } {\n return { error: { message, type: \"invalid_request_error\" } };\n}\n\nfunction writeJson(\n res: http.ServerResponse,\n status: number,\n payload: unknown,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): void {\n setCorsHeaders(res);\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n}\n\ntype Defaults = { logger: Logger; chaos?: ChaosDefaults; registry?: MetricsRegistry };\n\nfunction journalVs(\n journal: Journal,\n method: string,\n path: string,\n headers: Record<string, string>,\n status: number,\n): void {\n journal.add({\n method,\n path,\n headers,\n body: null,\n service: \"vector-stores\",\n response: { status, fixture: null, source: \"internal\" },\n });\n}\n\nasync function chaosHit(\n req: http.IncomingMessage,\n journal: Journal,\n defaults: Defaults,\n method: string,\n path: string,\n res: http.ServerResponse,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<ChaosAsyncOutcome> {\n setCorsHeaders(res);\n return await applyChaosAsync(\n res,\n null,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method,\n path,\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector-stores\",\n },\n \"internal\",\n defaults.registry,\n defaults.logger,\n );\n}\n\nfunction fileKey(storeId: string, fileId: string): string {\n return `${storeId}:${fileId}`;\n}\n\nfunction touch(store: VectorStoreObject): void {\n refreshStoreStatus(store);\n if (store.status === \"expired\") return;\n const now = stamp();\n store.last_active_at = now;\n if (store.expires_after) {\n store.expires_at = now + store.expires_after.days * 86400;\n }\n refreshStoreStatus(store);\n}\n\nfunction refreshStoreStatus(store: VectorStoreObject): void {\n const now = Math.floor(Date.now() / 1000);\n const expired =\n store.expires_at !== undefined && store.expires_at !== null && now >= store.expires_at;\n const files = [...storeFiles.values()].filter((f) => f.vector_store_id === store.id);\n const pending = files.filter((f) => f.status === \"in_progress\").length;\n const batchesLive = [...fileBatches.values()].filter(\n (b) =>\n b.vector_store_id === store.id && (b.status === \"in_progress\" || b.status === \"cancelling\"),\n ).length;\n store.status = expired ? \"expired\" : pending + batchesLive > 0 ? \"in_progress\" : \"completed\";\n let usage = 0;\n let inProgress = 0;\n let completed = 0;\n let failed = 0;\n let cancelled = 0;\n for (const f of files) {\n if (f.status === \"completed\") usage += f.usage_bytes;\n if (f.status === \"in_progress\") inProgress += 1;\n else if (f.status === \"completed\") completed += 1;\n else if (f.status === \"failed\") failed += 1;\n else cancelled += 1;\n }\n store.usage_bytes = usage;\n store.file_counts = {\n in_progress: inProgress,\n completed,\n failed,\n cancelled,\n total: files.length,\n };\n}\n\nfunction readExpiresAfter(\n value: unknown,\n):\n | { ok: true; value: { anchor: \"last_active_at\"; days: number } | null }\n | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: null };\n if (!isJsonObject(value)) {\n return { ok: false, message: \"Invalid parameter: 'expires_after' must be an object\" };\n }\n if (value[\"anchor\"] !== \"last_active_at\") {\n return {\n ok: false,\n message: \"Invalid parameter: 'expires_after.anchor' must be 'last_active_at'\",\n };\n }\n const days = value[\"days\"];\n if (typeof days !== \"number\" || !Number.isInteger(days) || days < 1 || days > 365) {\n return {\n ok: false,\n message: \"Invalid parameter: 'expires_after.days' must be an integer between 1 and 365\",\n };\n }\n return { ok: true, value: { anchor: \"last_active_at\", days } };\n}\n\nfunction readChunkingStrategy(\n value: unknown,\n):\n | { ok: true; value: VectorStoreObject[\"chunking_strategy\"] | null }\n | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: null };\n if (!isJsonObject(value)) {\n return { ok: false, message: \"Invalid parameter: 'chunking_strategy' must be an object\" };\n }\n if (value[\"type\"] === \"auto\") return { ok: true, value: { type: \"auto\" } };\n if (value[\"type\"] === \"static\") {\n const inner = value[\"static\"];\n if (!isJsonObject(inner)) {\n return {\n ok: false,\n message: \"Invalid parameter: 'chunking_strategy.static' must be an object\",\n };\n }\n const maxTokens = inner[\"max_chunk_size_tokens\"];\n const overlap = inner[\"chunk_overlap_tokens\"];\n if (\n typeof maxTokens !== \"number\" ||\n !Number.isInteger(maxTokens) ||\n maxTokens < 100 ||\n maxTokens > 4096\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'chunking_strategy.static.max_chunk_size_tokens' must be an integer between 100 and 4096\",\n };\n }\n if (\n typeof overlap !== \"number\" ||\n !Number.isInteger(overlap) ||\n overlap < 0 ||\n overlap > 2048 ||\n overlap * 2 > maxTokens\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'chunking_strategy.static.chunk_overlap_tokens' must be an integer between 0 and 2048 and at most half of max_chunk_size_tokens\",\n };\n }\n return {\n ok: true,\n value: {\n type: \"static\",\n static: { max_chunk_size_tokens: maxTokens, chunk_overlap_tokens: overlap },\n },\n };\n }\n return {\n ok: false,\n message: \"Invalid parameter: 'chunking_strategy.type' must be 'auto' or 'static'\",\n };\n}\n\nfunction isAttributeValue(value: unknown): value is string | number | boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction readAttributes(\n value: unknown,\n): { ok: true; value: FileAttributes | null } | { ok: false; message: string } {\n if (value === undefined || value === null) return { ok: true, value: null };\n if (!isJsonObject(value) || Object.keys(value).length > 16) {\n return {\n ok: false,\n message: \"Invalid parameter: 'attributes' must be an object with at most 16 pairs or null\",\n };\n }\n const entries: [string, string | number | boolean][] = [];\n for (const [key, entry] of Object.entries(value)) {\n if (\n [...key].length > 64 ||\n !isAttributeValue(entry) ||\n (typeof entry === \"string\" && [...entry].length > 512)\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'attributes' keys must be at most 64 characters and values must be strings of at most 512 characters, finite numbers or booleans\",\n };\n }\n entries.push([key, entry]);\n }\n return { ok: true, value: Object.fromEntries(entries) };\n}\n\n// Bound parsing and the later matching traversal of the validated filter tree.\nconst MAX_ATTRIBUTE_FILTER_DEPTH = 64;\n\nfunction readAttributeFilter(\n value: unknown,\n depth = 0,\n): { ok: true; value: AttributeFilter | null } | { ok: false; message: string } {\n if (depth > MAX_ATTRIBUTE_FILTER_DEPTH) {\n return {\n ok: false,\n message: `Invalid parameter: 'filters' nesting must not exceed ${MAX_ATTRIBUTE_FILTER_DEPTH} levels`,\n };\n }\n if (value === undefined) return { ok: true, value: null };\n const error = {\n ok: false,\n message:\n \"Invalid parameter: 'filters' must be a comparison (eq, ne, gt, gte, lt, lte) with key and scalar value, or an and/or filter with an array of filters\",\n } as const;\n if (!isJsonObject(value)) return error;\n const type = value[\"type\"];\n if (type === \"and\" || type === \"or\") {\n if (!Array.isArray(value[\"filters\"])) return error;\n const filters: AttributeFilter[] = [];\n for (const item of value[\"filters\"]) {\n const child = readAttributeFilter(item, depth + 1);\n if (!child.ok) return child;\n if (child.value === null) return error;\n filters.push(child.value);\n }\n return { ok: true, value: { type, filters } };\n }\n const key = value[\"key\"];\n const operand = value[\"value\"];\n if (\n (type === \"eq\" ||\n type === \"ne\" ||\n type === \"gt\" ||\n type === \"gte\" ||\n type === \"lt\" ||\n type === \"lte\") &&\n typeof key === \"string\" &&\n isAttributeValue(operand)\n ) {\n return { ok: true, value: { type, key, value: operand } };\n }\n return error;\n}\n\nfunction matchesAttributeFilter(\n attributes: FileAttributes | null,\n filter: AttributeFilter,\n): boolean {\n if (filter.type === \"and\")\n return filter.filters.every((child) => matchesAttributeFilter(attributes, child));\n if (filter.type === \"or\")\n return filter.filters.some((child) => matchesAttributeFilter(attributes, child));\n if (!(\"key\" in filter) || attributes === null || !Object.hasOwn(attributes, filter.key))\n return false;\n const actual = attributes[filter.key];\n if (typeof actual !== typeof filter.value) return false;\n switch (filter.type) {\n case \"eq\":\n return actual === filter.value;\n case \"ne\":\n return actual !== filter.value;\n case \"gt\":\n return actual > filter.value;\n case \"gte\":\n return actual >= filter.value;\n case \"lt\":\n return actual < filter.value;\n case \"lte\":\n return actual <= filter.value;\n }\n}\n\nfunction readFileIds(\n value: unknown,\n): { ok: true; value: string[] } | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: [] };\n if (!Array.isArray(value)) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must be an array of strings\" };\n }\n if (value.length > 2000) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must contain at most 2000 files\" };\n }\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must be an array of strings\" };\n }\n }\n return { ok: true, value: value as string[] };\n}\n\nfunction readOutcome(\n req: http.IncomingMessage,\n): { ok: true; value: VectorStoreFileStatus } | { ok: false; message: string } {\n const raw = req.headers[OUTCOME_HEADER];\n const text = (Array.isArray(raw) ? raw[0] : raw)?.trim().toLowerCase();\n if (text === undefined || text === \"\") return { ok: true, value: \"completed\" };\n if (!OUTCOMES.has(text)) {\n return {\n ok: false,\n message: `Invalid ${OUTCOME_HEADER} '${text}'. Expected one of: ${[...OUTCOMES].join(\", \")}`,\n };\n }\n return { ok: true, value: text as VectorStoreFileStatus };\n}\n\nfunction queryParams(url: string | undefined): URLSearchParams {\n const target = url ?? \"/\";\n const start = target.indexOf(\"?\");\n return new URLSearchParams(start === -1 ? \"\" : target.slice(start + 1));\n}\n\nfunction singleParam(\n params: URLSearchParams,\n name: string,\n): { ok: true; value: string | null } | { ok: false; message: string } {\n const all = params.getAll(name);\n if (all.length > 1) {\n return {\n ok: false,\n message: `Invalid parameter: '${name}' was given ${all.length} times; it takes a single value`,\n };\n }\n return { ok: true, value: all.length === 0 ? null : all[0] };\n}\n\nexport interface PageResult<T> {\n ok: boolean;\n page?: {\n object: \"list\";\n data: T[];\n first_id: string | null;\n last_id: string | null;\n has_more: boolean;\n };\n message?: string;\n}\n\nfunction paginateOrdered<T extends { id: string; created_at: number }>(\n itemsNewestFirst: T[],\n url: string | undefined,\n): PageResult<T> {\n const params = queryParams(url);\n const readLimit = singleParam(params, \"limit\");\n if (!readLimit.ok) return { ok: false, message: readLimit.message };\n const readOrder = singleParam(params, \"order\");\n if (!readOrder.ok) return { ok: false, message: readOrder.message };\n const readAfter = singleParam(params, \"after\");\n if (!readAfter.ok) return { ok: false, message: readAfter.message };\n const readBefore = singleParam(params, \"before\");\n if (!readBefore.ok) return { ok: false, message: readBefore.message };\n let limit = DEFAULT_PAGE_LIMIT;\n if (readLimit.value !== null) {\n const n = parseStrictIntegerText(readLimit.value);\n if (n === null || n < 1 || n > MAX_PAGE_LIMIT) {\n return {\n ok: false,\n message: `Invalid parameter: 'limit' must be an integer between 1 and ${MAX_PAGE_LIMIT}, got '${readLimit.value}'`,\n };\n }\n limit = n;\n }\n const order = readOrder.value ?? \"desc\";\n if (order !== \"asc\" && order !== \"desc\") {\n return { ok: false, message: \"Invalid parameter: 'order' must be 'asc' or 'desc'\" };\n }\n if (readAfter.value !== null && readBefore.value !== null) {\n return { ok: false, message: \"Invalid parameter: 'after' and 'before' are mutually exclusive\" };\n }\n const ordered = order === \"desc\" ? itemsNewestFirst : [...itemsNewestFirst].reverse();\n let start = 0;\n if (readAfter.value !== null) {\n const idx = ordered.findIndex((it) => it.id === readAfter.value);\n if (idx === -1) {\n return {\n ok: false,\n message: `Invalid parameter: 'after' is not a known cursor: '${readAfter.value}'`,\n };\n }\n start = idx + 1;\n } else if (readBefore.value !== null) {\n const idx = ordered.findIndex((it) => it.id === readBefore.value);\n if (idx === -1) {\n return {\n ok: false,\n message: `Invalid parameter: 'before' is not a known cursor: '${readBefore.value}'`,\n };\n }\n start = Math.max(0, idx - limit);\n const data = ordered.slice(start, idx);\n return {\n ok: true,\n page: {\n object: \"list\",\n data,\n first_id: data[0]?.id ?? null,\n last_id: data[data.length - 1]?.id ?? null,\n has_more: start > 0,\n },\n };\n }\n const rest = ordered.slice(start);\n const data = rest.slice(0, limit);\n return {\n ok: true,\n page: {\n object: \"list\",\n data,\n first_id: data[0]?.id ?? null,\n last_id: data[data.length - 1]?.id ?? null,\n has_more: rest.length > limit,\n },\n };\n}\n\nfunction parseJsonBody(raw: string): { ok: true; value: unknown } | { ok: false; message: string } {\n if (raw.trim() === \"\") return { ok: true, value: {} };\n try {\n return { ok: true, value: JSON.parse(raw) as unknown };\n } catch (err) {\n return {\n ok: false,\n message: `Malformed JSON: ${err instanceof Error ? err.message : \"unknown\"}`,\n };\n }\n}\n\nfunction attachFile(\n store: VectorStoreObject,\n fileId: string,\n chunking: VectorStoreObject[\"chunking_strategy\"],\n outcome: VectorStoreFileStatus,\n attributes: FileAttributes | null = null,\n): VectorStoreFileObject {\n const bytes = getStoredFileBytes(fileId);\n const now = stamp();\n const entry: VectorStoreFileObject = {\n id: fileId,\n object: \"vector_store.file\",\n attributes,\n created_at: now,\n vector_store_id: store.id,\n status: \"in_progress\",\n usage_bytes: bytes?.length ?? 0,\n last_error: null,\n };\n if (chunking) {\n entry.chunking_strategy =\n chunking.type === \"auto\"\n ? {\n type: \"static\",\n static: { max_chunk_size_tokens: 800, chunk_overlap_tokens: 400 },\n }\n : chunking;\n }\n storeFiles.set(fileKey(store.id, fileId), entry);\n storePolls.set(fileKey(store.id, fileId), 0);\n fileOutcomes.set(fileKey(store.id, fileId), outcome);\n touch(store);\n return entry;\n}\n\nfunction advanceFile(entry: VectorStoreFileObject): VectorStoreFileObject {\n if (TERMINAL_FILE_STATUSES.has(entry.status)) return entry;\n const key = fileKey(entry.vector_store_id, entry.id);\n const polls = (storePolls.get(key) ?? 0) + 1;\n storePolls.set(key, polls);\n if (polls >= 2) {\n const outcome = fileOutcomes.get(key) ?? \"completed\";\n entry.status = outcome;\n if (outcome === \"failed\") {\n entry.last_error = {\n code: \"mock_ingest_failed\",\n message: \"Mock ingestion failed for this file\",\n };\n } else {\n entry.last_error = null;\n }\n }\n const store = stores.get(entry.vector_store_id);\n if (store) refreshStoreStatus(store);\n return entry;\n}\n\nfunction batchCounts(batchId: string): VectorFileBatchObject[\"file_counts\"] {\n const members = batchMembers.get(batchId) ?? [];\n let inProgress = 0;\n let completed = 0;\n let failed = 0;\n let cancelled = 0;\n for (const entry of members) {\n if (entry.status === \"in_progress\") inProgress += 1;\n else if (entry.status === \"completed\") completed += 1;\n else if (entry.status === \"failed\") failed += 1;\n else cancelled += 1;\n }\n return { in_progress: inProgress, completed, failed, cancelled, total: members.length };\n}\n\nfunction advanceBatch(batch: VectorFileBatchObject): VectorFileBatchObject {\n if (TERMINAL_BATCH_STATUSES.has(batch.status)) {\n batch.file_counts = batchCounts(batch.id);\n return batch;\n }\n if (batch.status === \"cancelling\") {\n batch.status = \"cancelled\";\n for (const entry of batchMembers.get(batch.id) ?? []) {\n if (entry.status === \"in_progress\") entry.status = \"cancelled\";\n }\n batch.file_counts = batchCounts(batch.id);\n const store = stores.get(batch.vector_store_id);\n if (store) refreshStoreStatus(store);\n return batch;\n }\n const polls = (batchPolls.get(batch.id) ?? 0) + 1;\n batchPolls.set(batch.id, polls);\n if (polls === 1) {\n batch.status = \"in_progress\";\n } else {\n const outcome = batchOutcomes.get(batch.id) ?? \"completed\";\n batch.status = outcome;\n for (const entry of batchMembers.get(batch.id) ?? []) {\n if (entry.status === \"in_progress\") {\n entry.status = outcome === \"completed\" ? \"completed\" : outcome;\n if (outcome === \"failed\") {\n entry.last_error = {\n code: \"mock_ingest_failed\",\n message: \"Mock ingestion failed for this file\",\n };\n }\n }\n }\n }\n batch.file_counts = batchCounts(batch.id);\n const store = stores.get(batch.vector_store_id);\n if (store) refreshStoreStatus(store);\n return batch;\n}\n\nfunction scoreFor(query: string, fileId: string): number {\n let h = 2166136261;\n const text = `${query}::${fileId}`;\n for (let i = 0; i < text.length; i++) {\n h = Math.imul(h ^ text.charCodeAt(i), 16777619);\n }\n return ((h >>> 0) % 10000) / 10000;\n}\n\nexport async function handleVectorStoresCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? \"/v1/vector_stores\";\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n if (body[\"name\"] !== undefined && typeof body[\"name\"] !== \"string\") {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Invalid parameter: 'name' must be a string\"), setCorsHeaders);\n return;\n }\n const metadata = readMetadata(body[\"metadata\"]);\n if (!metadata.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(metadata.message), setCorsHeaders);\n return;\n }\n const expires = readExpiresAfter(body[\"expires_after\"]);\n if (!expires.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(expires.message), setCorsHeaders);\n return;\n }\n const chunking = readChunkingStrategy(body[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n const fileIds = readFileIds(body[\"file_ids\"]);\n if (!fileIds.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(fileIds.message), setCorsHeaders);\n return;\n }\n for (const fileId of fileIds.value) {\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const now = stamp();\n const id = underscoreId(\"vs\");\n const store: VectorStoreObject = {\n id,\n object: \"vector_store\",\n created_at: now,\n name: typeof body[\"name\"] === \"string\" ? body[\"name\"] : `vector-store-${id.slice(3, 9)}`,\n usage_bytes: 0,\n file_counts: { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 },\n status: \"completed\",\n metadata: metadata.value,\n last_active_at: now,\n expires_at: null,\n };\n if (expires.value) {\n store.expires_after = expires.value;\n store.expires_at = now + expires.value.days * 86400;\n }\n if (chunking.value) store.chunking_strategy = chunking.value;\n stores.set(id, store);\n for (const fileId of fileIds.value) {\n attachFile(store, fileId, chunking.value ?? undefined, outcome.value);\n }\n refreshStoreStatus(store);\n defaults.logger.debug(`Vector stores mock: created ${id}`);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresList(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? \"/v1/vector_stores\";\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n for (const store of stores.values()) refreshStoreStatus(store);\n const data = [...stores.values()].reverse();\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoresRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresModify(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n let name = store.name;\n let metadata = store.metadata;\n let expiresAfter = store.expires_after;\n if (body[\"name\"] !== undefined) {\n if (body[\"name\"] !== null && typeof body[\"name\"] !== \"string\") {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'name' must be a string or null\"),\n setCorsHeaders,\n );\n return;\n }\n name = body[\"name\"] ?? \"\";\n }\n if (body[\"metadata\"] !== undefined) {\n const parsedMetadata = readMetadata(body[\"metadata\"]);\n if (!parsedMetadata.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsedMetadata.message), setCorsHeaders);\n return;\n }\n metadata = parsedMetadata.value;\n }\n if (body[\"expires_after\"] !== undefined) {\n if (body[\"expires_after\"] === null) {\n expiresAfter = undefined;\n } else {\n const expires = readExpiresAfter(body[\"expires_after\"]);\n if (!expires.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(expires.message), setCorsHeaders);\n return;\n }\n if (expires.value) {\n expiresAfter = expires.value;\n }\n }\n }\n // Commit only after every supplied field has passed validation.\n store.name = name;\n store.metadata = metadata;\n if (body[\"expires_after\"] !== undefined) {\n if (expiresAfter) {\n store.expires_after = expiresAfter;\n store.expires_at = stamp() + expiresAfter.days * 86400;\n } else {\n delete store.expires_after;\n store.expires_at = null;\n }\n }\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresDelete(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"DELETE\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n stores.delete(storeId);\n for (const key of [...storeFiles.keys()]) {\n if (key.startsWith(`${storeId}:`)) {\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n }\n }\n for (const [batchId, batch] of [...fileBatches.entries()]) {\n if (batch.vector_store_id === storeId) {\n fileBatches.delete(batchId);\n batchPolls.delete(batchId);\n batchOutcomes.delete(batchId);\n batchMembers.delete(batchId);\n }\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n { id: storeId, object: \"vector_store.deleted\", deleted: true },\n setCorsHeaders,\n );\n}\n\nexport async function handleVectorStoreFilesCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const fileId = parsed.value[\"file_id\"];\n if (typeof fileId !== \"string\" || fileId.length === 0) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_id' must be a non-empty string\"),\n setCorsHeaders,\n );\n return;\n }\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n if (storeFiles.has(fileKey(storeId, fileId))) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(`File ${fileId} is already attached to vector store ${storeId}`),\n setCorsHeaders,\n );\n return;\n }\n const chunking = readChunkingStrategy(parsed.value[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n const attributes = readAttributes(parsed.value[\"attributes\"]);\n if (!attributes.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(attributes.message), setCorsHeaders);\n return;\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const entry = attachFile(\n store,\n fileId,\n chunking.value ?? undefined,\n outcome.value,\n attributes.value,\n );\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, entry, setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesList(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const params = queryParams(req.url);\n const readFilter = singleParam(params, \"filter\");\n if (!readFilter.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(readFilter.message), setCorsHeaders);\n return;\n }\n if (\n readFilter.value !== null &&\n !TERMINAL_FILE_STATUSES.has(readFilter.value as VectorStoreFileStatus) &&\n readFilter.value !== \"in_progress\"\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'filter' must be 'in_progress', 'completed', 'failed' or 'cancelled'\",\n ),\n setCorsHeaders,\n );\n return;\n }\n let data = [...storeFiles.values()]\n .filter((f) => f.vector_store_id === storeId)\n .sort((a, b) => b.created_at - a.created_at || (a.id < b.id ? 1 : -1));\n if (readFilter.value !== null) data = data.filter((f) => f.status === readFilter.value);\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n fileId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files/${fileId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const entry = storeFiles.get(fileKey(storeId, fileId));\n if (!entry) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store file: ${fileId}`), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, advanceFile(entry), setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesDelete(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n fileId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files/${fileId}`;\n const method = req.method ?? \"DELETE\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const key = fileKey(storeId, fileId);\n if (!storeFiles.has(key)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store file: ${fileId}`), setCorsHeaders);\n return;\n }\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n { id: fileId, object: \"vector_store.file.deleted\", deleted: true },\n setCorsHeaders,\n );\n}\n\nexport async function handleVectorFileBatchesCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const fileIds = readFileIds(parsed.value[\"file_ids\"]);\n if (!fileIds.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(fileIds.message), setCorsHeaders);\n return;\n }\n if (fileIds.value.length === 0) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_ids' must contain at least one file\"),\n setCorsHeaders,\n );\n return;\n }\n if (new Set(fileIds.value).size !== fileIds.value.length) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_ids' must not contain duplicate file IDs\"),\n setCorsHeaders,\n );\n return;\n }\n const chunking = readChunkingStrategy(parsed.value[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n for (const fileId of fileIds.value) {\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n }\n const attributes = readAttributes(parsed.value[\"attributes\"]);\n if (!attributes.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(attributes.message), setCorsHeaders);\n return;\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const id = underscoreId(\"vsfb\");\n const batch: VectorFileBatchObject = {\n id,\n object: \"vector_store.file_batch\",\n created_at: stamp(),\n vector_store_id: storeId,\n status: \"in_progress\",\n file_counts: {\n in_progress: fileIds.value.length,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: fileIds.value.length,\n },\n };\n fileBatches.set(id, batch);\n batchPolls.set(id, 0);\n batchOutcomes.set(id, outcome.value);\n const members: VectorStoreFileObject[] = [];\n for (const fileId of fileIds.value) {\n const entry =\n storeFiles.get(fileKey(storeId, fileId)) ??\n attachFile(store, fileId, chunking.value ?? undefined, outcome.value, attributes.value);\n members.push(entry);\n }\n batchMembers.set(id, members);\n batch.file_counts = batchCounts(id);\n refreshStoreStatus(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, batch, setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, advanceBatch(batch), setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesCancel(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}/cancel`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n if (TERMINAL_BATCH_STATUSES.has(batch.status)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(`Cannot cancel a file batch with status ${batch.status}.`),\n setCorsHeaders,\n );\n return;\n }\n if (batch.status !== \"cancelling\") batch.status = \"cancelling\";\n batch.file_counts = batchCounts(batch.id);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, batch, setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesFiles(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}/files`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n const params = queryParams(req.url);\n const readFilter = singleParam(params, \"filter\");\n if (!readFilter.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(readFilter.message), setCorsHeaders);\n return;\n }\n if (\n readFilter.value !== null &&\n !TERMINAL_FILE_STATUSES.has(readFilter.value as VectorStoreFileStatus) &&\n readFilter.value !== \"in_progress\"\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'filter' must be 'in_progress', 'completed', 'failed' or 'cancelled'\",\n ),\n setCorsHeaders,\n );\n return;\n }\n const members = batchMembers.get(batchId) ?? [];\n let data = [...members].sort((a, b) => b.created_at - a.created_at || (a.id < b.id ? 1 : -1));\n if (readFilter.value !== null) data = data.filter((f) => f.status === readFilter.value);\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoresSearch(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/search`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n const query = body[\"query\"];\n const queries = typeof query === \"string\" ? [query] : query;\n if (\n !Array.isArray(queries) ||\n queries.length === 0 ||\n !queries.every((entry) => typeof entry === \"string\" && entry.length > 0)\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'query' must be a non-empty string or a non-empty array of non-empty strings\",\n ),\n setCorsHeaders,\n );\n return;\n }\n // Preserve string ranking; arrays use their entries joined in request order.\n const normalizedQuery = queries.join(\"\\n\");\n let maxResults = 10;\n if (body[\"max_num_results\"] !== undefined) {\n const n = body[\"max_num_results\"];\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 1 || n > 50) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'max_num_results' must be an integer between 1 and 50\"),\n setCorsHeaders,\n );\n return;\n }\n maxResults = n;\n }\n let threshold = 0;\n if (body[\"ranking_options\"] !== undefined) {\n if (!isJsonObject(body[\"ranking_options\"])) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'ranking_options' must be an object\"),\n setCorsHeaders,\n );\n return;\n }\n const score = body[\"ranking_options\"][\"score_threshold\"];\n if (score !== undefined) {\n if (typeof score !== \"number\" || score < 0 || score > 1) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'ranking_options.score_threshold' must be a number between 0 and 1\",\n ),\n setCorsHeaders,\n );\n return;\n }\n threshold = score;\n }\n }\n const filters = readAttributeFilter(body[\"filters\"]);\n if (!filters.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(filters.message), setCorsHeaders);\n return;\n }\n const completed = [...storeFiles.values()].filter(\n (f) =>\n f.vector_store_id === storeId &&\n f.status === \"completed\" &&\n (filters.value === null || matchesAttributeFilter(f.attributes, filters.value)),\n );\n const ranked: VectorSearchResult[] = completed\n .map((f) => ({ file: f, score: scoreFor(normalizedQuery, f.id) }))\n .filter((entry) => entry.score >= threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults)\n .map((entry) => ({\n file_id: entry.file.id,\n attributes: entry.file.attributes,\n filename: getStoredFileName(entry.file.id) ?? `file-${entry.file.id.slice(0, 8)}.txt`,\n score: Math.round(entry.score * 10000) / 10000,\n content: [\n {\n type: \"text\" as const,\n text: `Mock chunk from ${entry.file.id} answering \"${normalizedQuery.slice(0, 120)}\"`,\n },\n ],\n }));\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n {\n object: \"vector_store.search_results_page\",\n search_query: query,\n data: ranked,\n has_more: false,\n },\n setCorsHeaders,\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vector-stores.cjs","names":["buildOpenAIError","applyChaosAsync","flattenHeaders","isJsonObject","parseStrictIntegerText","getStoredFileBytes","readMetadata","getStoredFileName"],"sources":["../src/vector-stores.ts"],"sourcesContent":["/**\n * OpenAI Vector Stores API mock.\n *\n * Covers vector-store lifecycle and direct search for uploaded `Files`:\n *\n * - `POST /v1/vector_stores` (create)\n * - `GET /v1/vector_stores` (list)\n * - `GET /v1/vector_stores/{id}` (retrieve)\n * - `POST /v1/vector_stores/{id}` (modify)\n * - `DELETE /v1/vector_stores/{id}` (delete)\n * - `POST /v1/vector_stores/{id}/files` (attach a file)\n * - `GET /v1/vector_stores/{id}/files` (list attached files)\n * - `GET /v1/vector_stores/{id}/files/{file_id}` (retrieve an attached file)\n * - `DELETE /v1/vector_stores/{id}/files/{file_id}` (detach a file)\n * - `POST /v1/vector_stores/{id}/file_batches` (create a file batch)\n * - `GET /v1/vector_stores/{id}/file_batches/{batch_id}` (retrieve a batch)\n * - `POST /v1/vector_stores/{id}/file_batches/{batch_id}/cancel` (cancel)\n * - `GET /v1/vector_stores/{id}/file_batches/{batch_id}/files` (batch files)\n * - `POST /v1/vector_stores/{id}/search` (deterministic file search)\n *\n * Supports offline upload → vector-store → direct search tests. Attach a\n * `file-…` id, poll it to `completed`, then call the search endpoint.\n * This mock does not execute hosted `file_search` tools in Responses or\n * Assistants. Responses requests need separate matching fixtures; vector-store\n * contents do not automatically produce model responses.\n *\n * Lifecycle (deterministic poll progression, like the batches mock):\n *\n * store: in_progress → completed (completed at once when no file is\n * pending; `expired` once `expires_at` passes)\n * file: in_progress → completed | failed | cancelled (first retrieve after\n * attach shows `in_progress`, the second lands the outcome)\n * batch: in_progress → completed | failed | cancelled (same two-poll rule;\n * `cancel` on a live batch answers `cancelling`, next retrieve is\n * `cancelled`)\n *\n * Outcome control: send `X-AIMock-Vector-Outcome: completed | failed |\n * cancelled` on `POST …/files` or `POST …/file_batches` (default\n * `completed`, unknown values 400). Same header family as\n * `X-AIMock-Batch-Outcome`.\n *\n * Files must exist in the Files store (`GET /v1/files/{id}` would 200 for\n * them): attaching an unknown `file_id` is a 404 naming the file, so a suite\n * that forgets the upload step fails loudly instead of indexing a ghost.\n * `usage_bytes` is the real byte length from the Files store; a file the\n * store has no bytes for reports `0`.\n *\n * Search is deterministic, not semantic: only `completed` files are searched,\n * results are ordered by a stable hash of `query + file_id` so the same query\n * always ranks the same way, and every result carries its file's name plus a\n * canned text snippet quoting the query. Direct search supports tests of top-k,\n * score thresholds, and empty-store behaviour. It does not measure semantic\n * relevance.\n *\n * State is in-memory per process and cleared by the full reset path.\n * Every branch journals with `service: \"vector-stores\"` and runs through the\n * chaos gate so fault-injection suites can target this surface.\n *\n * Wire shapes follow the vendored `openai` SDK 4.x\n * (`resources/vector-stores/…`) and the `openai/openai-openapi` spec where\n * they agree (`id`, `object`, `created_at`, `name`, `usage_bytes`,\n * `file_counts`, `status`, `metadata`, `expires_after`/`expires_at`,\n * `last_active_at`, list envelopes with `object: \"list\"`, `data`,\n * `first_id`, `last_id`, `has_more`). Timestamps are Unix seconds. Anything\n * the sources leave unspecified (poll counts, the exact 400 texts, the\n * `cancelled` landing without a cancel call, search scoring) is this mock's\n * own contract and documented as such.\n */\n\nimport type * as http from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport { flattenHeaders, isJsonObject, parseStrictIntegerText } from \"./helpers.js\";\nimport { applyChaosAsync, type ChaosAsyncOutcome } from \"./chaos.js\";\nimport { readMetadata } from \"./fine-tuning.js\";\nimport { getStoredFileBytes, getStoredFileName } from \"./files.js\";\nimport type { ChaosDefaults } from \"./types.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { MetricsRegistry } from \"./metrics.js\";\nimport { buildOpenAIError } from \"./response/errors.js\";\n\nexport type VectorStoreStatus = \"expired\" | \"in_progress\" | \"completed\";\nexport type VectorStoreFileStatus = \"in_progress\" | \"completed\" | \"failed\" | \"cancelled\";\nexport type VectorFileBatchStatus =\n | \"in_progress\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"cancelling\";\n\nexport interface VectorStoreObject {\n id: string;\n object: \"vector_store\";\n created_at: number;\n name: string;\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n status: VectorStoreStatus;\n metadata: Record<string, string> | null;\n expires_after?: { anchor: \"last_active_at\"; days: number };\n expires_at?: number | null;\n last_active_at?: number | null;\n chunking_strategy?: { type: \"auto\" } | { type: \"static\"; static: Record<string, number> };\n}\n\ntype FileAttributes = Record<string, string | number | boolean>;\n\ntype AttributeFilter =\n | {\n type: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n key: string;\n value: string | number | boolean;\n }\n | { type: \"and\" | \"or\"; filters: AttributeFilter[] };\n\nexport interface VectorStoreFileObject {\n id: string;\n object: \"vector_store.file\";\n attributes: FileAttributes | null;\n created_at: number;\n vector_store_id: string;\n status: VectorStoreFileStatus;\n usage_bytes: number;\n chunking_strategy?: { type: \"static\"; static: Record<string, number> };\n last_error?: { code: string; message: string } | null;\n}\n\nexport interface VectorFileBatchObject {\n id: string;\n object: \"vector_store.file_batch\";\n created_at: number;\n vector_store_id: string;\n status: VectorFileBatchStatus;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n}\n\nexport interface VectorSearchResult {\n attributes: FileAttributes | null;\n file_id: string;\n filename: string;\n score: number;\n content: { type: \"text\"; text: string }[];\n}\n\nconst stores = new Map<string, VectorStoreObject>();\nconst storeFiles = new Map<string, VectorStoreFileObject>();\nconst storePolls = new Map<string, number>();\nconst fileOutcomes = new Map<string, VectorStoreFileStatus>();\nconst fileBatches = new Map<string, VectorFileBatchObject>();\nconst batchPolls = new Map<string, number>();\nconst batchOutcomes = new Map<string, VectorStoreFileStatus>();\n// Keep attachment identity: a detached file ID may later be attached again.\nconst batchMembers = new Map<string, VectorStoreFileObject[]>();\nlet lastStamp = 0;\n\nexport function clearVectorStoreStore(): void {\n stores.clear();\n storeFiles.clear();\n storePolls.clear();\n fileOutcomes.clear();\n fileBatches.clear();\n batchPolls.clear();\n batchOutcomes.clear();\n batchMembers.clear();\n lastStamp = 0;\n}\n\n/** Remove every vector attachment when its underlying uploaded File is deleted. */\nexport function removeVectorStoreFile(fileId: string): void {\n const affectedStores = new Set<string>();\n for (const [key, entry] of storeFiles) {\n if (entry.id !== fileId) continue;\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n affectedStores.add(entry.vector_store_id);\n }\n for (const [batchId, members] of batchMembers) {\n const remaining = members.filter((entry) => entry.id !== fileId);\n if (remaining.length === members.length) continue;\n batchMembers.set(batchId, remaining);\n const batch = fileBatches.get(batchId);\n if (!batch) continue;\n batch.file_counts = batchCounts(batchId);\n if (remaining.length === 0 && !TERMINAL_BATCH_STATUSES.has(batch.status)) {\n batch.status = batch.status === \"cancelling\" ? \"cancelled\" : \"completed\";\n batchPolls.delete(batchId);\n batchOutcomes.delete(batchId);\n }\n affectedStores.add(batch.vector_store_id);\n }\n for (const storeId of affectedStores) {\n const store = stores.get(storeId);\n if (store) refreshStoreStatus(store);\n }\n}\n\nconst TERMINAL_FILE_STATUSES = new Set<VectorStoreFileStatus>([\"completed\", \"failed\", \"cancelled\"]);\nconst TERMINAL_BATCH_STATUSES = new Set<VectorFileBatchStatus>([\n \"completed\",\n \"failed\",\n \"cancelled\",\n]);\nconst OUTCOMES = new Set([\"completed\", \"failed\", \"cancelled\"]);\nconst OUTCOME_HEADER = \"x-aimock-vector-outcome\";\nconst DEFAULT_PAGE_LIMIT = 20;\nconst MAX_PAGE_LIMIT = 100;\n\nfunction stamp(): number {\n lastStamp = Math.max(Math.floor(Date.now() / 1000), lastStamp);\n return lastStamp;\n}\n\nfunction underscoreId(prefix: string): string {\n return `${prefix}_${randomBytes(12).toString(\"base64url\")}`;\n}\n\nfunction invalid(message: string): { error: { message: string; type: string } } {\n return buildOpenAIError(\"service-validation\", { message });\n}\n\nfunction writeJson(\n res: http.ServerResponse,\n status: number,\n payload: unknown,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): void {\n setCorsHeaders(res);\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n}\n\ntype Defaults = { logger: Logger; chaos?: ChaosDefaults; registry?: MetricsRegistry };\n\nfunction journalVs(\n journal: Journal,\n method: string,\n path: string,\n headers: Record<string, string>,\n status: number,\n): void {\n journal.add({\n method,\n path,\n headers,\n body: null,\n service: \"vector-stores\",\n response: { status, fixture: null, source: \"internal\" },\n });\n}\n\nasync function chaosHit(\n req: http.IncomingMessage,\n journal: Journal,\n defaults: Defaults,\n method: string,\n path: string,\n res: http.ServerResponse,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<ChaosAsyncOutcome> {\n setCorsHeaders(res);\n return await applyChaosAsync(\n res,\n null,\n defaults.chaos,\n req.headers,\n req.url,\n journal,\n {\n method,\n path,\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"vector-stores\",\n },\n \"internal\",\n defaults.registry,\n defaults.logger,\n );\n}\n\nfunction fileKey(storeId: string, fileId: string): string {\n return `${storeId}:${fileId}`;\n}\n\nfunction touch(store: VectorStoreObject): void {\n refreshStoreStatus(store);\n if (store.status === \"expired\") return;\n const now = stamp();\n store.last_active_at = now;\n if (store.expires_after) {\n store.expires_at = now + store.expires_after.days * 86400;\n }\n refreshStoreStatus(store);\n}\n\nfunction refreshStoreStatus(store: VectorStoreObject): void {\n const now = Math.floor(Date.now() / 1000);\n const expired =\n store.expires_at !== undefined && store.expires_at !== null && now >= store.expires_at;\n const files = [...storeFiles.values()].filter((f) => f.vector_store_id === store.id);\n const pending = files.filter((f) => f.status === \"in_progress\").length;\n const batchesLive = [...fileBatches.values()].filter(\n (b) =>\n b.vector_store_id === store.id && (b.status === \"in_progress\" || b.status === \"cancelling\"),\n ).length;\n store.status = expired ? \"expired\" : pending + batchesLive > 0 ? \"in_progress\" : \"completed\";\n let usage = 0;\n let inProgress = 0;\n let completed = 0;\n let failed = 0;\n let cancelled = 0;\n for (const f of files) {\n if (f.status === \"completed\") usage += f.usage_bytes;\n if (f.status === \"in_progress\") inProgress += 1;\n else if (f.status === \"completed\") completed += 1;\n else if (f.status === \"failed\") failed += 1;\n else cancelled += 1;\n }\n store.usage_bytes = usage;\n store.file_counts = {\n in_progress: inProgress,\n completed,\n failed,\n cancelled,\n total: files.length,\n };\n}\n\nfunction readExpiresAfter(\n value: unknown,\n):\n | { ok: true; value: { anchor: \"last_active_at\"; days: number } | null }\n | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: null };\n if (!isJsonObject(value)) {\n return { ok: false, message: \"Invalid parameter: 'expires_after' must be an object\" };\n }\n if (value[\"anchor\"] !== \"last_active_at\") {\n return {\n ok: false,\n message: \"Invalid parameter: 'expires_after.anchor' must be 'last_active_at'\",\n };\n }\n const days = value[\"days\"];\n if (typeof days !== \"number\" || !Number.isInteger(days) || days < 1 || days > 365) {\n return {\n ok: false,\n message: \"Invalid parameter: 'expires_after.days' must be an integer between 1 and 365\",\n };\n }\n return { ok: true, value: { anchor: \"last_active_at\", days } };\n}\n\nfunction readChunkingStrategy(\n value: unknown,\n):\n | { ok: true; value: VectorStoreObject[\"chunking_strategy\"] | null }\n | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: null };\n if (!isJsonObject(value)) {\n return { ok: false, message: \"Invalid parameter: 'chunking_strategy' must be an object\" };\n }\n if (value[\"type\"] === \"auto\") return { ok: true, value: { type: \"auto\" } };\n if (value[\"type\"] === \"static\") {\n const inner = value[\"static\"];\n if (!isJsonObject(inner)) {\n return {\n ok: false,\n message: \"Invalid parameter: 'chunking_strategy.static' must be an object\",\n };\n }\n const maxTokens = inner[\"max_chunk_size_tokens\"];\n const overlap = inner[\"chunk_overlap_tokens\"];\n if (\n typeof maxTokens !== \"number\" ||\n !Number.isInteger(maxTokens) ||\n maxTokens < 100 ||\n maxTokens > 4096\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'chunking_strategy.static.max_chunk_size_tokens' must be an integer between 100 and 4096\",\n };\n }\n if (\n typeof overlap !== \"number\" ||\n !Number.isInteger(overlap) ||\n overlap < 0 ||\n overlap > 2048 ||\n overlap * 2 > maxTokens\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'chunking_strategy.static.chunk_overlap_tokens' must be an integer between 0 and 2048 and at most half of max_chunk_size_tokens\",\n };\n }\n return {\n ok: true,\n value: {\n type: \"static\",\n static: { max_chunk_size_tokens: maxTokens, chunk_overlap_tokens: overlap },\n },\n };\n }\n return {\n ok: false,\n message: \"Invalid parameter: 'chunking_strategy.type' must be 'auto' or 'static'\",\n };\n}\n\nfunction isAttributeValue(value: unknown): value is string | number | boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction readAttributes(\n value: unknown,\n): { ok: true; value: FileAttributes | null } | { ok: false; message: string } {\n if (value === undefined || value === null) return { ok: true, value: null };\n if (!isJsonObject(value) || Object.keys(value).length > 16) {\n return {\n ok: false,\n message: \"Invalid parameter: 'attributes' must be an object with at most 16 pairs or null\",\n };\n }\n const entries: [string, string | number | boolean][] = [];\n for (const [key, entry] of Object.entries(value)) {\n if (\n [...key].length > 64 ||\n !isAttributeValue(entry) ||\n (typeof entry === \"string\" && [...entry].length > 512)\n ) {\n return {\n ok: false,\n message:\n \"Invalid parameter: 'attributes' keys must be at most 64 characters and values must be strings of at most 512 characters, finite numbers or booleans\",\n };\n }\n entries.push([key, entry]);\n }\n return { ok: true, value: Object.fromEntries(entries) };\n}\n\n// Bound parsing and the later matching traversal of the validated filter tree.\nconst MAX_ATTRIBUTE_FILTER_DEPTH = 64;\n\nfunction readAttributeFilter(\n value: unknown,\n depth = 0,\n): { ok: true; value: AttributeFilter | null } | { ok: false; message: string } {\n if (depth > MAX_ATTRIBUTE_FILTER_DEPTH) {\n return {\n ok: false,\n message: `Invalid parameter: 'filters' nesting must not exceed ${MAX_ATTRIBUTE_FILTER_DEPTH} levels`,\n };\n }\n if (value === undefined) return { ok: true, value: null };\n const error = {\n ok: false,\n message:\n \"Invalid parameter: 'filters' must be a comparison (eq, ne, gt, gte, lt, lte) with key and scalar value, or an and/or filter with an array of filters\",\n } as const;\n if (!isJsonObject(value)) return error;\n const type = value[\"type\"];\n if (type === \"and\" || type === \"or\") {\n if (!Array.isArray(value[\"filters\"])) return error;\n const filters: AttributeFilter[] = [];\n for (const item of value[\"filters\"]) {\n const child = readAttributeFilter(item, depth + 1);\n if (!child.ok) return child;\n if (child.value === null) return error;\n filters.push(child.value);\n }\n return { ok: true, value: { type, filters } };\n }\n const key = value[\"key\"];\n const operand = value[\"value\"];\n if (\n (type === \"eq\" ||\n type === \"ne\" ||\n type === \"gt\" ||\n type === \"gte\" ||\n type === \"lt\" ||\n type === \"lte\") &&\n typeof key === \"string\" &&\n isAttributeValue(operand)\n ) {\n return { ok: true, value: { type, key, value: operand } };\n }\n return error;\n}\n\nfunction matchesAttributeFilter(\n attributes: FileAttributes | null,\n filter: AttributeFilter,\n): boolean {\n if (filter.type === \"and\")\n return filter.filters.every((child) => matchesAttributeFilter(attributes, child));\n if (filter.type === \"or\")\n return filter.filters.some((child) => matchesAttributeFilter(attributes, child));\n if (!(\"key\" in filter) || attributes === null || !Object.hasOwn(attributes, filter.key))\n return false;\n const actual = attributes[filter.key];\n if (typeof actual !== typeof filter.value) return false;\n switch (filter.type) {\n case \"eq\":\n return actual === filter.value;\n case \"ne\":\n return actual !== filter.value;\n case \"gt\":\n return actual > filter.value;\n case \"gte\":\n return actual >= filter.value;\n case \"lt\":\n return actual < filter.value;\n case \"lte\":\n return actual <= filter.value;\n }\n}\n\nfunction readFileIds(\n value: unknown,\n): { ok: true; value: string[] } | { ok: false; message: string } {\n if (value === undefined) return { ok: true, value: [] };\n if (!Array.isArray(value)) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must be an array of strings\" };\n }\n if (value.length > 2000) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must contain at most 2000 files\" };\n }\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n return { ok: false, message: \"Invalid parameter: 'file_ids' must be an array of strings\" };\n }\n }\n return { ok: true, value: value as string[] };\n}\n\nfunction readOutcome(\n req: http.IncomingMessage,\n): { ok: true; value: VectorStoreFileStatus } | { ok: false; message: string } {\n const raw = req.headers[OUTCOME_HEADER];\n const text = (Array.isArray(raw) ? raw[0] : raw)?.trim().toLowerCase();\n if (text === undefined || text === \"\") return { ok: true, value: \"completed\" };\n if (!OUTCOMES.has(text)) {\n return {\n ok: false,\n message: `Invalid ${OUTCOME_HEADER} '${text}'. Expected one of: ${[...OUTCOMES].join(\", \")}`,\n };\n }\n return { ok: true, value: text as VectorStoreFileStatus };\n}\n\nfunction queryParams(url: string | undefined): URLSearchParams {\n const target = url ?? \"/\";\n const start = target.indexOf(\"?\");\n return new URLSearchParams(start === -1 ? \"\" : target.slice(start + 1));\n}\n\nfunction singleParam(\n params: URLSearchParams,\n name: string,\n): { ok: true; value: string | null } | { ok: false; message: string } {\n const all = params.getAll(name);\n if (all.length > 1) {\n return {\n ok: false,\n message: `Invalid parameter: '${name}' was given ${all.length} times; it takes a single value`,\n };\n }\n return { ok: true, value: all.length === 0 ? null : all[0] };\n}\n\nexport interface PageResult<T> {\n ok: boolean;\n page?: {\n object: \"list\";\n data: T[];\n first_id: string | null;\n last_id: string | null;\n has_more: boolean;\n };\n message?: string;\n}\n\nfunction paginateOrdered<T extends { id: string; created_at: number }>(\n itemsNewestFirst: T[],\n url: string | undefined,\n): PageResult<T> {\n const params = queryParams(url);\n const readLimit = singleParam(params, \"limit\");\n if (!readLimit.ok) return { ok: false, message: readLimit.message };\n const readOrder = singleParam(params, \"order\");\n if (!readOrder.ok) return { ok: false, message: readOrder.message };\n const readAfter = singleParam(params, \"after\");\n if (!readAfter.ok) return { ok: false, message: readAfter.message };\n const readBefore = singleParam(params, \"before\");\n if (!readBefore.ok) return { ok: false, message: readBefore.message };\n let limit = DEFAULT_PAGE_LIMIT;\n if (readLimit.value !== null) {\n const n = parseStrictIntegerText(readLimit.value);\n if (n === null || n < 1 || n > MAX_PAGE_LIMIT) {\n return {\n ok: false,\n message: `Invalid parameter: 'limit' must be an integer between 1 and ${MAX_PAGE_LIMIT}, got '${readLimit.value}'`,\n };\n }\n limit = n;\n }\n const order = readOrder.value ?? \"desc\";\n if (order !== \"asc\" && order !== \"desc\") {\n return { ok: false, message: \"Invalid parameter: 'order' must be 'asc' or 'desc'\" };\n }\n if (readAfter.value !== null && readBefore.value !== null) {\n return { ok: false, message: \"Invalid parameter: 'after' and 'before' are mutually exclusive\" };\n }\n const ordered = order === \"desc\" ? itemsNewestFirst : [...itemsNewestFirst].reverse();\n let start = 0;\n if (readAfter.value !== null) {\n const idx = ordered.findIndex((it) => it.id === readAfter.value);\n if (idx === -1) {\n return {\n ok: false,\n message: `Invalid parameter: 'after' is not a known cursor: '${readAfter.value}'`,\n };\n }\n start = idx + 1;\n } else if (readBefore.value !== null) {\n const idx = ordered.findIndex((it) => it.id === readBefore.value);\n if (idx === -1) {\n return {\n ok: false,\n message: `Invalid parameter: 'before' is not a known cursor: '${readBefore.value}'`,\n };\n }\n start = Math.max(0, idx - limit);\n const data = ordered.slice(start, idx);\n return {\n ok: true,\n page: {\n object: \"list\",\n data,\n first_id: data[0]?.id ?? null,\n last_id: data[data.length - 1]?.id ?? null,\n has_more: start > 0,\n },\n };\n }\n const rest = ordered.slice(start);\n const data = rest.slice(0, limit);\n return {\n ok: true,\n page: {\n object: \"list\",\n data,\n first_id: data[0]?.id ?? null,\n last_id: data[data.length - 1]?.id ?? null,\n has_more: rest.length > limit,\n },\n };\n}\n\nfunction parseJsonBody(raw: string): { ok: true; value: unknown } | { ok: false; message: string } {\n if (raw.trim() === \"\") return { ok: true, value: {} };\n try {\n return { ok: true, value: JSON.parse(raw) as unknown };\n } catch (err) {\n return {\n ok: false,\n message: `Malformed JSON: ${err instanceof Error ? err.message : \"unknown\"}`,\n };\n }\n}\n\nfunction attachFile(\n store: VectorStoreObject,\n fileId: string,\n chunking: VectorStoreObject[\"chunking_strategy\"],\n outcome: VectorStoreFileStatus,\n attributes: FileAttributes | null = null,\n): VectorStoreFileObject {\n const bytes = getStoredFileBytes(fileId);\n const now = stamp();\n const entry: VectorStoreFileObject = {\n id: fileId,\n object: \"vector_store.file\",\n attributes,\n created_at: now,\n vector_store_id: store.id,\n status: \"in_progress\",\n usage_bytes: bytes?.length ?? 0,\n last_error: null,\n };\n if (chunking) {\n entry.chunking_strategy =\n chunking.type === \"auto\"\n ? {\n type: \"static\",\n static: { max_chunk_size_tokens: 800, chunk_overlap_tokens: 400 },\n }\n : chunking;\n }\n storeFiles.set(fileKey(store.id, fileId), entry);\n storePolls.set(fileKey(store.id, fileId), 0);\n fileOutcomes.set(fileKey(store.id, fileId), outcome);\n touch(store);\n return entry;\n}\n\nfunction advanceFile(entry: VectorStoreFileObject): VectorStoreFileObject {\n if (TERMINAL_FILE_STATUSES.has(entry.status)) return entry;\n const key = fileKey(entry.vector_store_id, entry.id);\n const polls = (storePolls.get(key) ?? 0) + 1;\n storePolls.set(key, polls);\n if (polls >= 2) {\n const outcome = fileOutcomes.get(key) ?? \"completed\";\n entry.status = outcome;\n if (outcome === \"failed\") {\n entry.last_error = {\n code: \"mock_ingest_failed\",\n message: \"Mock ingestion failed for this file\",\n };\n } else {\n entry.last_error = null;\n }\n }\n const store = stores.get(entry.vector_store_id);\n if (store) refreshStoreStatus(store);\n return entry;\n}\n\nfunction batchCounts(batchId: string): VectorFileBatchObject[\"file_counts\"] {\n const members = batchMembers.get(batchId) ?? [];\n let inProgress = 0;\n let completed = 0;\n let failed = 0;\n let cancelled = 0;\n for (const entry of members) {\n if (entry.status === \"in_progress\") inProgress += 1;\n else if (entry.status === \"completed\") completed += 1;\n else if (entry.status === \"failed\") failed += 1;\n else cancelled += 1;\n }\n return { in_progress: inProgress, completed, failed, cancelled, total: members.length };\n}\n\nfunction advanceBatch(batch: VectorFileBatchObject): VectorFileBatchObject {\n if (TERMINAL_BATCH_STATUSES.has(batch.status)) {\n batch.file_counts = batchCounts(batch.id);\n return batch;\n }\n if (batch.status === \"cancelling\") {\n batch.status = \"cancelled\";\n for (const entry of batchMembers.get(batch.id) ?? []) {\n if (entry.status === \"in_progress\") entry.status = \"cancelled\";\n }\n batch.file_counts = batchCounts(batch.id);\n const store = stores.get(batch.vector_store_id);\n if (store) refreshStoreStatus(store);\n return batch;\n }\n const polls = (batchPolls.get(batch.id) ?? 0) + 1;\n batchPolls.set(batch.id, polls);\n if (polls === 1) {\n batch.status = \"in_progress\";\n } else {\n const outcome = batchOutcomes.get(batch.id) ?? \"completed\";\n batch.status = outcome;\n for (const entry of batchMembers.get(batch.id) ?? []) {\n if (entry.status === \"in_progress\") {\n entry.status = outcome === \"completed\" ? \"completed\" : outcome;\n if (outcome === \"failed\") {\n entry.last_error = {\n code: \"mock_ingest_failed\",\n message: \"Mock ingestion failed for this file\",\n };\n }\n }\n }\n }\n batch.file_counts = batchCounts(batch.id);\n const store = stores.get(batch.vector_store_id);\n if (store) refreshStoreStatus(store);\n return batch;\n}\n\nfunction scoreFor(query: string, fileId: string): number {\n let h = 2166136261;\n const text = `${query}::${fileId}`;\n for (let i = 0; i < text.length; i++) {\n h = Math.imul(h ^ text.charCodeAt(i), 16777619);\n }\n return ((h >>> 0) % 10000) / 10000;\n}\n\nexport async function handleVectorStoresCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? \"/v1/vector_stores\";\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n if (body[\"name\"] !== undefined && typeof body[\"name\"] !== \"string\") {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Invalid parameter: 'name' must be a string\"), setCorsHeaders);\n return;\n }\n const metadata = readMetadata(body[\"metadata\"]);\n if (!metadata.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(metadata.message), setCorsHeaders);\n return;\n }\n const expires = readExpiresAfter(body[\"expires_after\"]);\n if (!expires.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(expires.message), setCorsHeaders);\n return;\n }\n const chunking = readChunkingStrategy(body[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n const fileIds = readFileIds(body[\"file_ids\"]);\n if (!fileIds.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(fileIds.message), setCorsHeaders);\n return;\n }\n for (const fileId of fileIds.value) {\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const now = stamp();\n const id = underscoreId(\"vs\");\n const store: VectorStoreObject = {\n id,\n object: \"vector_store\",\n created_at: now,\n name: typeof body[\"name\"] === \"string\" ? body[\"name\"] : `vector-store-${id.slice(3, 9)}`,\n usage_bytes: 0,\n file_counts: { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 },\n status: \"completed\",\n metadata: metadata.value,\n last_active_at: now,\n expires_at: null,\n };\n if (expires.value) {\n store.expires_after = expires.value;\n store.expires_at = now + expires.value.days * 86400;\n }\n if (chunking.value) store.chunking_strategy = chunking.value;\n stores.set(id, store);\n for (const fileId of fileIds.value) {\n attachFile(store, fileId, chunking.value ?? undefined, outcome.value);\n }\n refreshStoreStatus(store);\n defaults.logger.debug(`Vector stores mock: created ${id}`);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresList(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? \"/v1/vector_stores\";\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n for (const store of stores.values()) refreshStoreStatus(store);\n const data = [...stores.values()].reverse();\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoresRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresModify(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n let name = store.name;\n let metadata = store.metadata;\n let expiresAfter = store.expires_after;\n if (body[\"name\"] !== undefined) {\n if (body[\"name\"] !== null && typeof body[\"name\"] !== \"string\") {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'name' must be a string or null\"),\n setCorsHeaders,\n );\n return;\n }\n name = body[\"name\"] ?? \"\";\n }\n if (body[\"metadata\"] !== undefined) {\n const parsedMetadata = readMetadata(body[\"metadata\"]);\n if (!parsedMetadata.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsedMetadata.message), setCorsHeaders);\n return;\n }\n metadata = parsedMetadata.value;\n }\n if (body[\"expires_after\"] !== undefined) {\n if (body[\"expires_after\"] === null) {\n expiresAfter = undefined;\n } else {\n const expires = readExpiresAfter(body[\"expires_after\"]);\n if (!expires.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(expires.message), setCorsHeaders);\n return;\n }\n if (expires.value) {\n expiresAfter = expires.value;\n }\n }\n }\n // Commit only after every supplied field has passed validation.\n store.name = name;\n store.metadata = metadata;\n if (body[\"expires_after\"] !== undefined) {\n if (expiresAfter) {\n store.expires_after = expiresAfter;\n store.expires_at = stamp() + expiresAfter.days * 86400;\n } else {\n delete store.expires_after;\n store.expires_at = null;\n }\n }\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, store, setCorsHeaders);\n}\n\nexport async function handleVectorStoresDelete(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}`;\n const method = req.method ?? \"DELETE\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n stores.delete(storeId);\n for (const key of [...storeFiles.keys()]) {\n if (key.startsWith(`${storeId}:`)) {\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n }\n }\n for (const [batchId, batch] of [...fileBatches.entries()]) {\n if (batch.vector_store_id === storeId) {\n fileBatches.delete(batchId);\n batchPolls.delete(batchId);\n batchOutcomes.delete(batchId);\n batchMembers.delete(batchId);\n }\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n { id: storeId, object: \"vector_store.deleted\", deleted: true },\n setCorsHeaders,\n );\n}\n\nexport async function handleVectorStoreFilesCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const fileId = parsed.value[\"file_id\"];\n if (typeof fileId !== \"string\" || fileId.length === 0) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_id' must be a non-empty string\"),\n setCorsHeaders,\n );\n return;\n }\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n if (storeFiles.has(fileKey(storeId, fileId))) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(`File ${fileId} is already attached to vector store ${storeId}`),\n setCorsHeaders,\n );\n return;\n }\n const chunking = readChunkingStrategy(parsed.value[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n const attributes = readAttributes(parsed.value[\"attributes\"]);\n if (!attributes.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(attributes.message), setCorsHeaders);\n return;\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const entry = attachFile(\n store,\n fileId,\n chunking.value ?? undefined,\n outcome.value,\n attributes.value,\n );\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, entry, setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesList(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const params = queryParams(req.url);\n const readFilter = singleParam(params, \"filter\");\n if (!readFilter.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(readFilter.message), setCorsHeaders);\n return;\n }\n if (\n readFilter.value !== null &&\n !TERMINAL_FILE_STATUSES.has(readFilter.value as VectorStoreFileStatus) &&\n readFilter.value !== \"in_progress\"\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'filter' must be 'in_progress', 'completed', 'failed' or 'cancelled'\",\n ),\n setCorsHeaders,\n );\n return;\n }\n let data = [...storeFiles.values()]\n .filter((f) => f.vector_store_id === storeId)\n .sort((a, b) => b.created_at - a.created_at || (a.id < b.id ? 1 : -1));\n if (readFilter.value !== null) data = data.filter((f) => f.status === readFilter.value);\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n fileId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files/${fileId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const entry = storeFiles.get(fileKey(storeId, fileId));\n if (!entry) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store file: ${fileId}`), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, advanceFile(entry), setCorsHeaders);\n}\n\nexport async function handleVectorStoreFilesDelete(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n fileId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/files/${fileId}`;\n const method = req.method ?? \"DELETE\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const key = fileKey(storeId, fileId);\n if (!storeFiles.has(key)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store file: ${fileId}`), setCorsHeaders);\n return;\n }\n storeFiles.delete(key);\n storePolls.delete(key);\n fileOutcomes.delete(key);\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n { id: fileId, object: \"vector_store.file.deleted\", deleted: true },\n setCorsHeaders,\n );\n}\n\nexport async function handleVectorFileBatchesCreate(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const fileIds = readFileIds(parsed.value[\"file_ids\"]);\n if (!fileIds.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(fileIds.message), setCorsHeaders);\n return;\n }\n if (fileIds.value.length === 0) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_ids' must contain at least one file\"),\n setCorsHeaders,\n );\n return;\n }\n if (new Set(fileIds.value).size !== fileIds.value.length) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'file_ids' must not contain duplicate file IDs\"),\n setCorsHeaders,\n );\n return;\n }\n const chunking = readChunkingStrategy(parsed.value[\"chunking_strategy\"]);\n if (!chunking.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(chunking.message), setCorsHeaders);\n return;\n }\n for (const fileId of fileIds.value) {\n if (getStoredFileBytes(fileId) === undefined) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file: ${fileId}`), setCorsHeaders);\n return;\n }\n }\n const attributes = readAttributes(parsed.value[\"attributes\"]);\n if (!attributes.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(attributes.message), setCorsHeaders);\n return;\n }\n const outcome = readOutcome(req);\n if (!outcome.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(outcome.message), setCorsHeaders);\n return;\n }\n const id = underscoreId(\"vsfb\");\n const batch: VectorFileBatchObject = {\n id,\n object: \"vector_store.file_batch\",\n created_at: stamp(),\n vector_store_id: storeId,\n status: \"in_progress\",\n file_counts: {\n in_progress: fileIds.value.length,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: fileIds.value.length,\n },\n };\n fileBatches.set(id, batch);\n batchPolls.set(id, 0);\n batchOutcomes.set(id, outcome.value);\n const members: VectorStoreFileObject[] = [];\n for (const fileId of fileIds.value) {\n const entry =\n storeFiles.get(fileKey(storeId, fileId)) ??\n attachFile(store, fileId, chunking.value ?? undefined, outcome.value, attributes.value);\n members.push(entry);\n }\n batchMembers.set(id, members);\n batch.file_counts = batchCounts(id);\n refreshStoreStatus(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, batch, setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesRetrieve(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, advanceBatch(batch), setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesCancel(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}/cancel`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n if (TERMINAL_BATCH_STATUSES.has(batch.status)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(`Cannot cancel a file batch with status ${batch.status}.`),\n setCorsHeaders,\n );\n return;\n }\n if (batch.status !== \"cancelling\") batch.status = \"cancelling\";\n batch.file_counts = batchCounts(batch.id);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, batch, setCorsHeaders);\n}\n\nexport async function handleVectorFileBatchesFiles(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n batchId: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/file_batches/${batchId}/files`;\n const method = req.method ?? \"GET\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n if (!stores.has(storeId)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const batch = fileBatches.get(batchId);\n if (!batch || batch.vector_store_id !== storeId) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such file batch: ${batchId}`), setCorsHeaders);\n return;\n }\n const params = queryParams(req.url);\n const readFilter = singleParam(params, \"filter\");\n if (!readFilter.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(readFilter.message), setCorsHeaders);\n return;\n }\n if (\n readFilter.value !== null &&\n !TERMINAL_FILE_STATUSES.has(readFilter.value as VectorStoreFileStatus) &&\n readFilter.value !== \"in_progress\"\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'filter' must be 'in_progress', 'completed', 'failed' or 'cancelled'\",\n ),\n setCorsHeaders,\n );\n return;\n }\n const members = batchMembers.get(batchId) ?? [];\n let data = [...members].sort((a, b) => b.created_at - a.created_at || (a.id < b.id ? 1 : -1));\n if (readFilter.value !== null) data = data.filter((f) => f.status === readFilter.value);\n const result = paginateOrdered(data, req.url);\n if (!result.ok || !result.page) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(result.message ?? \"Invalid pagination\"), setCorsHeaders);\n return;\n }\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(res, 200, result.page, setCorsHeaders);\n}\n\nexport async function handleVectorStoresSearch(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n storeId: string,\n raw: string,\n journal: Journal,\n defaults: Defaults,\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const path = req.url ?? `/v1/vector_stores/${storeId}/search`;\n const method = req.method ?? \"POST\";\n if (await chaosHit(req, journal, defaults, method, path, res, setCorsHeaders)) return;\n const store = stores.get(storeId);\n if (!store) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 404);\n writeJson(res, 404, invalid(`No such vector store: ${storeId}`), setCorsHeaders);\n return;\n }\n const parsed = parseJsonBody(raw);\n if (!parsed.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(parsed.message), setCorsHeaders);\n return;\n }\n if (!isJsonObject(parsed.value)) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(\"Request body must be a JSON object\"), setCorsHeaders);\n return;\n }\n const body = parsed.value;\n const query = body[\"query\"];\n const queries = typeof query === \"string\" ? [query] : query;\n if (\n !Array.isArray(queries) ||\n queries.length === 0 ||\n !queries.every((entry) => typeof entry === \"string\" && entry.length > 0)\n ) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'query' must be a non-empty string or a non-empty array of non-empty strings\",\n ),\n setCorsHeaders,\n );\n return;\n }\n // Preserve string ranking; arrays use their entries joined in request order.\n const normalizedQuery = queries.join(\"\\n\");\n let maxResults = 10;\n if (body[\"max_num_results\"] !== undefined) {\n const n = body[\"max_num_results\"];\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 1 || n > 50) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'max_num_results' must be an integer between 1 and 50\"),\n setCorsHeaders,\n );\n return;\n }\n maxResults = n;\n }\n let threshold = 0;\n if (body[\"ranking_options\"] !== undefined) {\n if (!isJsonObject(body[\"ranking_options\"])) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\"Invalid parameter: 'ranking_options' must be an object\"),\n setCorsHeaders,\n );\n return;\n }\n const score = body[\"ranking_options\"][\"score_threshold\"];\n if (score !== undefined) {\n if (typeof score !== \"number\" || score < 0 || score > 1) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(\n res,\n 400,\n invalid(\n \"Invalid parameter: 'ranking_options.score_threshold' must be a number between 0 and 1\",\n ),\n setCorsHeaders,\n );\n return;\n }\n threshold = score;\n }\n }\n const filters = readAttributeFilter(body[\"filters\"]);\n if (!filters.ok) {\n journalVs(journal, method, path, flattenHeaders(req.headers), 400);\n writeJson(res, 400, invalid(filters.message), setCorsHeaders);\n return;\n }\n const completed = [...storeFiles.values()].filter(\n (f) =>\n f.vector_store_id === storeId &&\n f.status === \"completed\" &&\n (filters.value === null || matchesAttributeFilter(f.attributes, filters.value)),\n );\n const ranked: VectorSearchResult[] = completed\n .map((f) => ({ file: f, score: scoreFor(normalizedQuery, f.id) }))\n .filter((entry) => entry.score >= threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults)\n .map((entry) => ({\n file_id: entry.file.id,\n attributes: entry.file.attributes,\n filename: getStoredFileName(entry.file.id) ?? `file-${entry.file.id.slice(0, 8)}.txt`,\n score: Math.round(entry.score * 10000) / 10000,\n content: [\n {\n type: \"text\" as const,\n text: `Mock chunk from ${entry.file.id} answering \"${normalizedQuery.slice(0, 120)}\"`,\n },\n ],\n }));\n touch(store);\n journalVs(journal, method, path, flattenHeaders(req.headers), 200);\n writeJson(\n res,\n 200,\n {\n object: \"vector_store.search_results_page\",\n search_query: query,\n data: ranked,\n has_more: false,\n },\n setCorsHeaders,\n );\n}\n"],"mappings":";;;;;;;;;AA4JA,MAAM,yBAAS,IAAI,KAAgC;AACnD,MAAM,6BAAa,IAAI,KAAoC;AAC3D,MAAM,6BAAa,IAAI,KAAqB;AAC5C,MAAM,+BAAe,IAAI,KAAoC;AAC7D,MAAM,8BAAc,IAAI,KAAoC;AAC5D,MAAM,6BAAa,IAAI,KAAqB;AAC5C,MAAM,gCAAgB,IAAI,KAAoC;AAE9D,MAAM,+BAAe,IAAI,KAAsC;AAC/D,IAAI,YAAY;AAEhB,SAAgB,wBAA8B;AAC5C,QAAO,OAAO;AACd,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB,aAAY,OAAO;AACnB,YAAW,OAAO;AAClB,eAAc,OAAO;AACrB,cAAa,OAAO;AACpB,aAAY;;;AAId,SAAgB,sBAAsB,QAAsB;CAC1D,MAAM,iCAAiB,IAAI,KAAa;AACxC,MAAK,MAAM,CAAC,KAAK,UAAU,YAAY;AACrC,MAAI,MAAM,OAAO,OAAQ;AACzB,aAAW,OAAO,IAAI;AACtB,aAAW,OAAO,IAAI;AACtB,eAAa,OAAO,IAAI;AACxB,iBAAe,IAAI,MAAM,gBAAgB;;AAE3C,MAAK,MAAM,CAAC,SAAS,YAAY,cAAc;EAC7C,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM,OAAO,OAAO;AAChE,MAAI,UAAU,WAAW,QAAQ,OAAQ;AACzC,eAAa,IAAI,SAAS,UAAU;EACpC,MAAM,QAAQ,YAAY,IAAI,QAAQ;AACtC,MAAI,CAAC,MAAO;AACZ,QAAM,cAAc,YAAY,QAAQ;AACxC,MAAI,UAAU,WAAW,KAAK,CAAC,wBAAwB,IAAI,MAAM,OAAO,EAAE;AACxE,SAAM,SAAS,MAAM,WAAW,eAAe,cAAc;AAC7D,cAAW,OAAO,QAAQ;AAC1B,iBAAc,OAAO,QAAQ;;AAE/B,iBAAe,IAAI,MAAM,gBAAgB;;AAE3C,MAAK,MAAM,WAAW,gBAAgB;EACpC,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,MAAI,MAAO,oBAAmB,MAAM;;;AAIxC,MAAM,yBAAyB,IAAI,IAA2B;CAAC;CAAa;CAAU;CAAY,CAAC;AACnG,MAAM,0BAA0B,IAAI,IAA2B;CAC7D;CACA;CACA;CACD,CAAC;AACF,MAAM,WAAW,IAAI,IAAI;CAAC;CAAa;CAAU;CAAY,CAAC;AAC9D,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAC3B,MAAM,iBAAiB;AAEvB,SAAS,QAAgB;AACvB,aAAY,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,EAAE,UAAU;AAC9D,QAAO;;AAGT,SAAS,aAAa,QAAwB;AAC5C,QAAO,GAAG,OAAO,gCAAe,GAAG,CAAC,SAAS,YAAY;;AAG3D,SAAS,QAAQ,SAA+D;AAC9E,QAAOA,gCAAiB,sBAAsB,EAAE,SAAS,CAAC;;AAG5D,SAAS,UACP,KACA,QACA,SACA,gBACM;AACN,gBAAe,IAAI;AACnB,KAAI,UAAU,QAAQ,EAAE,gBAAgB,oBAAoB,CAAC;AAC7D,KAAI,IAAI,KAAK,UAAU,QAAQ,CAAC;;AAKlC,SAAS,UACP,SACA,QACA,MACA,SACA,QACM;AACN,SAAQ,IAAI;EACV;EACA;EACA;EACA,MAAM;EACN,SAAS;EACT,UAAU;GAAE;GAAQ,SAAS;GAAM,QAAQ;GAAY;EACxD,CAAC;;AAGJ,eAAe,SACb,KACA,SACA,UACA,QACA,MACA,KACA,gBAC4B;AAC5B,gBAAe,IAAI;AACnB,QAAO,MAAMC,8BACX,KACA,MACA,SAAS,OACT,IAAI,SACJ,IAAI,KACJ,SACA;EACE;EACA;EACA,SAASC,+BAAe,IAAI,QAAQ;EACpC,MAAM;EACN,SAAS;EACV,EACD,YACA,SAAS,UACT,SAAS,OACV;;AAGH,SAAS,QAAQ,SAAiB,QAAwB;AACxD,QAAO,GAAG,QAAQ,GAAG;;AAGvB,SAAS,MAAM,OAAgC;AAC7C,oBAAmB,MAAM;AACzB,KAAI,MAAM,WAAW,UAAW;CAChC,MAAM,MAAM,OAAO;AACnB,OAAM,iBAAiB;AACvB,KAAI,MAAM,cACR,OAAM,aAAa,MAAM,MAAM,cAAc,OAAO;AAEtD,oBAAmB,MAAM;;AAG3B,SAAS,mBAAmB,OAAgC;CAC1D,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CACzC,MAAM,UACJ,MAAM,eAAe,UAAa,MAAM,eAAe,QAAQ,OAAO,MAAM;CAC9E,MAAM,QAAQ,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,QAAQ,MAAM,EAAE,oBAAoB,MAAM,GAAG;CACpF,MAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC;CAChE,MAAM,cAAc,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,QAC3C,MACC,EAAE,oBAAoB,MAAM,OAAO,EAAE,WAAW,iBAAiB,EAAE,WAAW,cACjF,CAAC;AACF,OAAM,SAAS,UAAU,YAAY,UAAU,cAAc,IAAI,gBAAgB;CACjF,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,YAAY;CAChB,IAAI,SAAS;CACb,IAAI,YAAY;AAChB,MAAK,MAAM,KAAK,OAAO;AACrB,MAAI,EAAE,WAAW,YAAa,UAAS,EAAE;AACzC,MAAI,EAAE,WAAW,cAAe,eAAc;WACrC,EAAE,WAAW,YAAa,cAAa;WACvC,EAAE,WAAW,SAAU,WAAU;MACrC,cAAa;;AAEpB,OAAM,cAAc;AACpB,OAAM,cAAc;EAClB,aAAa;EACb;EACA;EACA;EACA,OAAO,MAAM;EACd;;AAGH,SAAS,iBACP,OAGiC;AACjC,KAAI,UAAU,OAAW,QAAO;EAAE,IAAI;EAAM,OAAO;EAAM;AACzD,KAAI,CAACC,6BAAa,MAAM,CACtB,QAAO;EAAE,IAAI;EAAO,SAAS;EAAwD;AAEvF,KAAI,MAAM,cAAc,iBACtB,QAAO;EACL,IAAI;EACJ,SAAS;EACV;CAEH,MAAM,OAAO,MAAM;AACnB,KAAI,OAAO,SAAS,YAAY,CAAC,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,IAC5E,QAAO;EACL,IAAI;EACJ,SAAS;EACV;AAEH,QAAO;EAAE,IAAI;EAAM,OAAO;GAAE,QAAQ;GAAkB;GAAM;EAAE;;AAGhE,SAAS,qBACP,OAGiC;AACjC,KAAI,UAAU,OAAW,QAAO;EAAE,IAAI;EAAM,OAAO;EAAM;AACzD,KAAI,CAACA,6BAAa,MAAM,CACtB,QAAO;EAAE,IAAI;EAAO,SAAS;EAA4D;AAE3F,KAAI,MAAM,YAAY,OAAQ,QAAO;EAAE,IAAI;EAAM,OAAO,EAAE,MAAM,QAAQ;EAAE;AAC1E,KAAI,MAAM,YAAY,UAAU;EAC9B,MAAM,QAAQ,MAAM;AACpB,MAAI,CAACA,6BAAa,MAAM,CACtB,QAAO;GACL,IAAI;GACJ,SAAS;GACV;EAEH,MAAM,YAAY,MAAM;EACxB,MAAM,UAAU,MAAM;AACtB,MACE,OAAO,cAAc,YACrB,CAAC,OAAO,UAAU,UAAU,IAC5B,YAAY,OACZ,YAAY,KAEZ,QAAO;GACL,IAAI;GACJ,SACE;GACH;AAEH,MACE,OAAO,YAAY,YACnB,CAAC,OAAO,UAAU,QAAQ,IAC1B,UAAU,KACV,UAAU,QACV,UAAU,IAAI,UAEd,QAAO;GACL,IAAI;GACJ,SACE;GACH;AAEH,SAAO;GACL,IAAI;GACJ,OAAO;IACL,MAAM;IACN,QAAQ;KAAE,uBAAuB;KAAW,sBAAsB;KAAS;IAC5E;GACF;;AAEH,QAAO;EACL,IAAI;EACJ,SAAS;EACV;;AAGH,SAAS,iBAAiB,OAAoD;AAC5E,QACE,OAAO,UAAU,YACjB,OAAO,UAAU,aAChB,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM;;AAIxD,SAAS,eACP,OAC6E;AAC7E,KAAI,UAAU,UAAa,UAAU,KAAM,QAAO;EAAE,IAAI;EAAM,OAAO;EAAM;AAC3E,KAAI,CAACA,6BAAa,MAAM,IAAI,OAAO,KAAK,MAAM,CAAC,SAAS,GACtD,QAAO;EACL,IAAI;EACJ,SAAS;EACV;CAEH,MAAM,UAAiD,EAAE;AACzD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE;AAChD,MACE,CAAC,GAAG,IAAI,CAAC,SAAS,MAClB,CAAC,iBAAiB,MAAM,IACvB,OAAO,UAAU,YAAY,CAAC,GAAG,MAAM,CAAC,SAAS,IAElD,QAAO;GACL,IAAI;GACJ,SACE;GACH;AAEH,UAAQ,KAAK,CAAC,KAAK,MAAM,CAAC;;AAE5B,QAAO;EAAE,IAAI;EAAM,OAAO,OAAO,YAAY,QAAQ;EAAE;;AAIzD,MAAM,6BAA6B;AAEnC,SAAS,oBACP,OACA,QAAQ,GACsE;AAC9E,KAAI,QAAQ,2BACV,QAAO;EACL,IAAI;EACJ,SAAS,wDAAwD,2BAA2B;EAC7F;AAEH,KAAI,UAAU,OAAW,QAAO;EAAE,IAAI;EAAM,OAAO;EAAM;CACzD,MAAM,QAAQ;EACZ,IAAI;EACJ,SACE;EACH;AACD,KAAI,CAACA,6BAAa,MAAM,CAAE,QAAO;CACjC,MAAM,OAAO,MAAM;AACnB,KAAI,SAAS,SAAS,SAAS,MAAM;AACnC,MAAI,CAAC,MAAM,QAAQ,MAAM,WAAW,CAAE,QAAO;EAC7C,MAAM,UAA6B,EAAE;AACrC,OAAK,MAAM,QAAQ,MAAM,YAAY;GACnC,MAAM,QAAQ,oBAAoB,MAAM,QAAQ,EAAE;AAClD,OAAI,CAAC,MAAM,GAAI,QAAO;AACtB,OAAI,MAAM,UAAU,KAAM,QAAO;AACjC,WAAQ,KAAK,MAAM,MAAM;;AAE3B,SAAO;GAAE,IAAI;GAAM,OAAO;IAAE;IAAM;IAAS;GAAE;;CAE/C,MAAM,MAAM,MAAM;CAClB,MAAM,UAAU,MAAM;AACtB,MACG,SAAS,QACR,SAAS,QACT,SAAS,QACT,SAAS,SACT,SAAS,QACT,SAAS,UACX,OAAO,QAAQ,YACf,iBAAiB,QAAQ,CAEzB,QAAO;EAAE,IAAI;EAAM,OAAO;GAAE;GAAM;GAAK,OAAO;GAAS;EAAE;AAE3D,QAAO;;AAGT,SAAS,uBACP,YACA,QACS;AACT,KAAI,OAAO,SAAS,MAClB,QAAO,OAAO,QAAQ,OAAO,UAAU,uBAAuB,YAAY,MAAM,CAAC;AACnF,KAAI,OAAO,SAAS,KAClB,QAAO,OAAO,QAAQ,MAAM,UAAU,uBAAuB,YAAY,MAAM,CAAC;AAClF,KAAI,EAAE,SAAS,WAAW,eAAe,QAAQ,CAAC,OAAO,OAAO,YAAY,OAAO,IAAI,CACrF,QAAO;CACT,MAAM,SAAS,WAAW,OAAO;AACjC,KAAI,OAAO,WAAW,OAAO,OAAO,MAAO,QAAO;AAClD,SAAQ,OAAO,MAAf;EACE,KAAK,KACH,QAAO,WAAW,OAAO;EAC3B,KAAK,KACH,QAAO,WAAW,OAAO;EAC3B,KAAK,KACH,QAAO,SAAS,OAAO;EACzB,KAAK,MACH,QAAO,UAAU,OAAO;EAC1B,KAAK,KACH,QAAO,SAAS,OAAO;EACzB,KAAK,MACH,QAAO,UAAU,OAAO;;;AAI9B,SAAS,YACP,OACgE;AAChE,KAAI,UAAU,OAAW,QAAO;EAAE,IAAI;EAAM,OAAO,EAAE;EAAE;AACvD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO;EAAE,IAAI;EAAO,SAAS;EAA6D;AAE5F,KAAI,MAAM,SAAS,IACjB,QAAO;EAAE,IAAI;EAAO,SAAS;EAAiE;AAEhG,MAAK,MAAM,SAAS,MAClB,KAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAChD,QAAO;EAAE,IAAI;EAAO,SAAS;EAA6D;AAG9F,QAAO;EAAE,IAAI;EAAa;EAAmB;;AAG/C,SAAS,YACP,KAC6E;CAC7E,MAAM,MAAM,IAAI,QAAQ;CACxB,MAAM,QAAQ,MAAM,QAAQ,IAAI,GAAG,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;AACtE,KAAI,SAAS,UAAa,SAAS,GAAI,QAAO;EAAE,IAAI;EAAM,OAAO;EAAa;AAC9E,KAAI,CAAC,SAAS,IAAI,KAAK,CACrB,QAAO;EACL,IAAI;EACJ,SAAS,WAAW,eAAe,IAAI,KAAK,sBAAsB,CAAC,GAAG,SAAS,CAAC,KAAK,KAAK;EAC3F;AAEH,QAAO;EAAE,IAAI;EAAM,OAAO;EAA+B;;AAG3D,SAAS,YAAY,KAA0C;CAC7D,MAAM,SAAS,OAAO;CACtB,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACjC,QAAO,IAAI,gBAAgB,UAAU,KAAK,KAAK,OAAO,MAAM,QAAQ,EAAE,CAAC;;AAGzE,SAAS,YACP,QACA,MACqE;CACrE,MAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,KAAI,IAAI,SAAS,EACf,QAAO;EACL,IAAI;EACJ,SAAS,uBAAuB,KAAK,cAAc,IAAI,OAAO;EAC/D;AAEH,QAAO;EAAE,IAAI;EAAM,OAAO,IAAI,WAAW,IAAI,OAAO,IAAI;EAAI;;AAe9D,SAAS,gBACP,kBACA,KACe;CACf,MAAM,SAAS,YAAY,IAAI;CAC/B,MAAM,YAAY,YAAY,QAAQ,QAAQ;AAC9C,KAAI,CAAC,UAAU,GAAI,QAAO;EAAE,IAAI;EAAO,SAAS,UAAU;EAAS;CACnE,MAAM,YAAY,YAAY,QAAQ,QAAQ;AAC9C,KAAI,CAAC,UAAU,GAAI,QAAO;EAAE,IAAI;EAAO,SAAS,UAAU;EAAS;CACnE,MAAM,YAAY,YAAY,QAAQ,QAAQ;AAC9C,KAAI,CAAC,UAAU,GAAI,QAAO;EAAE,IAAI;EAAO,SAAS,UAAU;EAAS;CACnE,MAAM,aAAa,YAAY,QAAQ,SAAS;AAChD,KAAI,CAAC,WAAW,GAAI,QAAO;EAAE,IAAI;EAAO,SAAS,WAAW;EAAS;CACrE,IAAI,QAAQ;AACZ,KAAI,UAAU,UAAU,MAAM;EAC5B,MAAM,IAAIC,uCAAuB,UAAU,MAAM;AACjD,MAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,eAC7B,QAAO;GACL,IAAI;GACJ,SAAS,+DAA+D,eAAe,SAAS,UAAU,MAAM;GACjH;AAEH,UAAQ;;CAEV,MAAM,QAAQ,UAAU,SAAS;AACjC,KAAI,UAAU,SAAS,UAAU,OAC/B,QAAO;EAAE,IAAI;EAAO,SAAS;EAAsD;AAErF,KAAI,UAAU,UAAU,QAAQ,WAAW,UAAU,KACnD,QAAO;EAAE,IAAI;EAAO,SAAS;EAAkE;CAEjG,MAAM,UAAU,UAAU,SAAS,mBAAmB,CAAC,GAAG,iBAAiB,CAAC,SAAS;CACrF,IAAI,QAAQ;AACZ,KAAI,UAAU,UAAU,MAAM;EAC5B,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,OAAO,UAAU,MAAM;AAChE,MAAI,QAAQ,GACV,QAAO;GACL,IAAI;GACJ,SAAS,sDAAsD,UAAU,MAAM;GAChF;AAEH,UAAQ,MAAM;YACL,WAAW,UAAU,MAAM;EACpC,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,OAAO,WAAW,MAAM;AACjE,MAAI,QAAQ,GACV,QAAO;GACL,IAAI;GACJ,SAAS,uDAAuD,WAAW,MAAM;GAClF;AAEH,UAAQ,KAAK,IAAI,GAAG,MAAM,MAAM;EAChC,MAAM,OAAO,QAAQ,MAAM,OAAO,IAAI;AACtC,SAAO;GACL,IAAI;GACJ,MAAM;IACJ,QAAQ;IACR;IACA,UAAU,KAAK,IAAI,MAAM;IACzB,SAAS,KAAK,KAAK,SAAS,IAAI,MAAM;IACtC,UAAU,QAAQ;IACnB;GACF;;CAEH,MAAM,OAAO,QAAQ,MAAM,MAAM;CACjC,MAAM,OAAO,KAAK,MAAM,GAAG,MAAM;AACjC,QAAO;EACL,IAAI;EACJ,MAAM;GACJ,QAAQ;GACR;GACA,UAAU,KAAK,IAAI,MAAM;GACzB,SAAS,KAAK,KAAK,SAAS,IAAI,MAAM;GACtC,UAAU,KAAK,SAAS;GACzB;EACF;;AAGH,SAAS,cAAc,KAA4E;AACjG,KAAI,IAAI,MAAM,KAAK,GAAI,QAAO;EAAE,IAAI;EAAM,OAAO,EAAE;EAAE;AACrD,KAAI;AACF,SAAO;GAAE,IAAI;GAAM,OAAO,KAAK,MAAM,IAAI;GAAa;UAC/C,KAAK;AACZ,SAAO;GACL,IAAI;GACJ,SAAS,mBAAmB,eAAe,QAAQ,IAAI,UAAU;GAClE;;;AAIL,SAAS,WACP,OACA,QACA,UACA,SACA,aAAoC,MACb;CACvB,MAAM,QAAQC,iCAAmB,OAAO;CAExC,MAAM,QAA+B;EACnC,IAAI;EACJ,QAAQ;EACR;EACA,YALU,OAAO;EAMjB,iBAAiB,MAAM;EACvB,QAAQ;EACR,aAAa,OAAO,UAAU;EAC9B,YAAY;EACb;AACD,KAAI,SACF,OAAM,oBACJ,SAAS,SAAS,SACd;EACE,MAAM;EACN,QAAQ;GAAE,uBAAuB;GAAK,sBAAsB;GAAK;EAClE,GACD;AAER,YAAW,IAAI,QAAQ,MAAM,IAAI,OAAO,EAAE,MAAM;AAChD,YAAW,IAAI,QAAQ,MAAM,IAAI,OAAO,EAAE,EAAE;AAC5C,cAAa,IAAI,QAAQ,MAAM,IAAI,OAAO,EAAE,QAAQ;AACpD,OAAM,MAAM;AACZ,QAAO;;AAGT,SAAS,YAAY,OAAqD;AACxE,KAAI,uBAAuB,IAAI,MAAM,OAAO,CAAE,QAAO;CACrD,MAAM,MAAM,QAAQ,MAAM,iBAAiB,MAAM,GAAG;CACpD,MAAM,SAAS,WAAW,IAAI,IAAI,IAAI,KAAK;AAC3C,YAAW,IAAI,KAAK,MAAM;AAC1B,KAAI,SAAS,GAAG;EACd,MAAM,UAAU,aAAa,IAAI,IAAI,IAAI;AACzC,QAAM,SAAS;AACf,MAAI,YAAY,SACd,OAAM,aAAa;GACjB,MAAM;GACN,SAAS;GACV;MAED,OAAM,aAAa;;CAGvB,MAAM,QAAQ,OAAO,IAAI,MAAM,gBAAgB;AAC/C,KAAI,MAAO,oBAAmB,MAAM;AACpC,QAAO;;AAGT,SAAS,YAAY,SAAuD;CAC1E,MAAM,UAAU,aAAa,IAAI,QAAQ,IAAI,EAAE;CAC/C,IAAI,aAAa;CACjB,IAAI,YAAY;CAChB,IAAI,SAAS;CACb,IAAI,YAAY;AAChB,MAAK,MAAM,SAAS,QAClB,KAAI,MAAM,WAAW,cAAe,eAAc;UACzC,MAAM,WAAW,YAAa,cAAa;UAC3C,MAAM,WAAW,SAAU,WAAU;KACzC,cAAa;AAEpB,QAAO;EAAE,aAAa;EAAY;EAAW;EAAQ;EAAW,OAAO,QAAQ;EAAQ;;AAGzF,SAAS,aAAa,OAAqD;AACzE,KAAI,wBAAwB,IAAI,MAAM,OAAO,EAAE;AAC7C,QAAM,cAAc,YAAY,MAAM,GAAG;AACzC,SAAO;;AAET,KAAI,MAAM,WAAW,cAAc;AACjC,QAAM,SAAS;AACf,OAAK,MAAM,SAAS,aAAa,IAAI,MAAM,GAAG,IAAI,EAAE,CAClD,KAAI,MAAM,WAAW,cAAe,OAAM,SAAS;AAErD,QAAM,cAAc,YAAY,MAAM,GAAG;EACzC,MAAM,QAAQ,OAAO,IAAI,MAAM,gBAAgB;AAC/C,MAAI,MAAO,oBAAmB,MAAM;AACpC,SAAO;;CAET,MAAM,SAAS,WAAW,IAAI,MAAM,GAAG,IAAI,KAAK;AAChD,YAAW,IAAI,MAAM,IAAI,MAAM;AAC/B,KAAI,UAAU,EACZ,OAAM,SAAS;MACV;EACL,MAAM,UAAU,cAAc,IAAI,MAAM,GAAG,IAAI;AAC/C,QAAM,SAAS;AACf,OAAK,MAAM,SAAS,aAAa,IAAI,MAAM,GAAG,IAAI,EAAE,CAClD,KAAI,MAAM,WAAW,eAAe;AAClC,SAAM,SAAS,YAAY,cAAc,cAAc;AACvD,OAAI,YAAY,SACd,OAAM,aAAa;IACjB,MAAM;IACN,SAAS;IACV;;;AAKT,OAAM,cAAc,YAAY,MAAM,GAAG;CACzC,MAAM,QAAQ,OAAO,IAAI,MAAM,gBAAgB;AAC/C,KAAI,MAAO,oBAAmB,MAAM;AACpC,QAAO;;AAGT,SAAS,SAAS,OAAe,QAAwB;CACvD,IAAI,IAAI;CACR,MAAM,OAAO,GAAG,MAAM,IAAI;AAC1B,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,KAAK,IAAI,KAAK,WAAW,EAAE,EAAE,SAAS;AAEjD,SAAS,MAAM,KAAK,MAAS;;AAG/B,eAAsB,yBACpB,KACA,KACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO;CACxB,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,SAAS,cAAc,IAAI;AACjC,KAAI,CAAC,OAAO,IAAI;AACd,YAAU,SAAS,QAAQ,MAAMH,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,eAAe;AAC5D;;AAEF,KAAI,CAACC,6BAAa,OAAO,MAAM,EAAE;AAC/B,YAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,qCAAqC,EAAE,eAAe;AAClF;;CAEF,MAAM,OAAO,OAAO;AACpB,KAAI,KAAK,YAAY,UAAa,OAAO,KAAK,YAAY,UAAU;AAClE,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,6CAA6C,EAAE,eAAe;AAC1F;;CAEF,MAAM,WAAWI,iCAAa,KAAK,YAAY;AAC/C,KAAI,CAAC,SAAS,IAAI;AAChB,YAAU,SAAS,QAAQ,MAAMJ,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,SAAS,QAAQ,EAAE,eAAe;AAC9D;;CAEF,MAAM,UAAU,iBAAiB,KAAK,iBAAiB;AACvD,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;CAEF,MAAM,WAAW,qBAAqB,KAAK,qBAAqB;AAChE,KAAI,CAAC,SAAS,IAAI;AAChB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,SAAS,QAAQ,EAAE,eAAe;AAC9D;;CAEF,MAAM,UAAU,YAAY,KAAK,YAAY;AAC7C,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;AAEF,MAAK,MAAM,UAAU,QAAQ,MAC3B,KAAIG,iCAAmB,OAAO,KAAK,QAAW;AAC5C,YAAU,SAAS,QAAQ,MAAMH,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,iBAAiB,SAAS,EAAE,eAAe;AACvE;;CAGJ,MAAM,UAAU,YAAY,IAAI;AAChC,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;CAEF,MAAM,MAAM,OAAO;CACnB,MAAM,KAAK,aAAa,KAAK;CAC7B,MAAM,QAA2B;EAC/B;EACA,QAAQ;EACR,YAAY;EACZ,MAAM,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,gBAAgB,GAAG,MAAM,GAAG,EAAE;EACtF,aAAa;EACb,aAAa;GAAE,aAAa;GAAG,WAAW;GAAG,QAAQ;GAAG,WAAW;GAAG,OAAO;GAAG;EAChF,QAAQ;EACR,UAAU,SAAS;EACnB,gBAAgB;EAChB,YAAY;EACb;AACD,KAAI,QAAQ,OAAO;AACjB,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,aAAa,MAAM,QAAQ,MAAM,OAAO;;AAEhD,KAAI,SAAS,MAAO,OAAM,oBAAoB,SAAS;AACvD,QAAO,IAAI,IAAI,MAAM;AACrB,MAAK,MAAM,UAAU,QAAQ,MAC3B,YAAW,OAAO,QAAQ,SAAS,SAAS,QAAW,QAAQ,MAAM;AAEvE,oBAAmB,MAAM;AACzB,UAAS,OAAO,MAAM,+BAA+B,KAAK;AAC1D,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,uBACpB,KACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO;CACxB,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAC/E,MAAK,MAAM,SAAS,OAAO,QAAQ,CAAE,oBAAmB,MAAM;CAE9D,MAAM,SAAS,gBADF,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,SAAS,EACN,IAAI,IAAI;AAC7C,KAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,WAAW,qBAAqB,EAAE,eAAe;AACpF;;AAEF,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,MAAM,eAAe;;AAGlD,eAAsB,2BACpB,KACA,KACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB;CAC7C,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;AAEF,OAAM,MAAM;AACZ,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,yBACpB,KACA,KACA,SACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB;CAC7C,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,SAAS,cAAc,IAAI;AACjC,KAAI,CAAC,OAAO,IAAI;AACd,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,eAAe;AAC5D;;AAEF,KAAI,CAACC,6BAAa,OAAO,MAAM,EAAE;AAC/B,YAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,qCAAqC,EAAE,eAAe;AAClF;;CAEF,MAAM,OAAO,OAAO;CACpB,IAAI,OAAO,MAAM;CACjB,IAAI,WAAW,MAAM;CACrB,IAAI,eAAe,MAAM;AACzB,KAAI,KAAK,YAAY,QAAW;AAC9B,MAAI,KAAK,YAAY,QAAQ,OAAO,KAAK,YAAY,UAAU;AAC7D,aAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,aACE,KACA,KACA,QAAQ,qDAAqD,EAC7D,eACD;AACD;;AAEF,SAAO,KAAK,WAAW;;AAEzB,KAAI,KAAK,gBAAgB,QAAW;EAClC,MAAM,iBAAiBI,iCAAa,KAAK,YAAY;AACrD,MAAI,CAAC,eAAe,IAAI;AACtB,aAAU,SAAS,QAAQ,MAAMJ,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,aAAU,KAAK,KAAK,QAAQ,eAAe,QAAQ,EAAE,eAAe;AACpE;;AAEF,aAAW,eAAe;;AAE5B,KAAI,KAAK,qBAAqB,OAC5B,KAAI,KAAK,qBAAqB,KAC5B,gBAAe;MACV;EACL,MAAM,UAAU,iBAAiB,KAAK,iBAAiB;AACvD,MAAI,CAAC,QAAQ,IAAI;AACf,aAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,aAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;AAEF,MAAI,QAAQ,MACV,gBAAe,QAAQ;;AAK7B,OAAM,OAAO;AACb,OAAM,WAAW;AACjB,KAAI,KAAK,qBAAqB,OAC5B,KAAI,cAAc;AAChB,QAAM,gBAAgB;AACtB,QAAM,aAAa,OAAO,GAAG,aAAa,OAAO;QAC5C;AACL,SAAO,MAAM;AACb,QAAM,aAAa;;AAGvB,OAAM,MAAM;AACZ,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,yBACpB,KACA,KACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB;CAC7C,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAE/E,KAAI,CADU,OAAO,IAAI,QAAQ,EACrB;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;AAEF,QAAO,OAAO,QAAQ;AACtB,MAAK,MAAM,OAAO,CAAC,GAAG,WAAW,MAAM,CAAC,CACtC,KAAI,IAAI,WAAW,GAAG,QAAQ,GAAG,EAAE;AACjC,aAAW,OAAO,IAAI;AACtB,aAAW,OAAO,IAAI;AACtB,eAAa,OAAO,IAAI;;AAG5B,MAAK,MAAM,CAAC,SAAS,UAAU,CAAC,GAAG,YAAY,SAAS,CAAC,CACvD,KAAI,MAAM,oBAAoB,SAAS;AACrC,cAAY,OAAO,QAAQ;AAC3B,aAAW,OAAO,QAAQ;AAC1B,gBAAc,OAAO,QAAQ;AAC7B,eAAa,OAAO,QAAQ;;AAGhC,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WACE,KACA,KACA;EAAE,IAAI;EAAS,QAAQ;EAAwB,SAAS;EAAM,EAC9D,eACD;;AAGH,eAAsB,6BACpB,KACA,KACA,SACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ;CACrD,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,SAAS,cAAc,IAAI;AACjC,KAAI,CAAC,OAAO,IAAI;AACd,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,eAAe;AAC5D;;AAEF,KAAI,CAACC,6BAAa,OAAO,MAAM,EAAE;AAC/B,YAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,qCAAqC,EAAE,eAAe;AAClF;;CAEF,MAAM,SAAS,OAAO,MAAM;AAC5B,KAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AACrD,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QAAQ,0DAA0D,EAClE,eACD;AACD;;AAEF,KAAIG,iCAAmB,OAAO,KAAK,QAAW;AAC5C,YAAU,SAAS,QAAQ,MAAMH,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,iBAAiB,SAAS,EAAE,eAAe;AACvE;;AAEF,KAAI,WAAW,IAAI,QAAQ,SAAS,OAAO,CAAC,EAAE;AAC5C,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QAAQ,QAAQ,OAAO,uCAAuC,UAAU,EACxE,eACD;AACD;;CAEF,MAAM,WAAW,qBAAqB,OAAO,MAAM,qBAAqB;AACxE,KAAI,CAAC,SAAS,IAAI;AAChB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,SAAS,QAAQ,EAAE,eAAe;AAC9D;;CAEF,MAAM,aAAa,eAAe,OAAO,MAAM,cAAc;AAC7D,KAAI,CAAC,WAAW,IAAI;AAClB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,WAAW,QAAQ,EAAE,eAAe;AAChE;;CAEF,MAAM,UAAU,YAAY,IAAI;AAChC,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;CAEF,MAAM,QAAQ,WACZ,OACA,QACA,SAAS,SAAS,QAClB,QAAQ,OACR,WAAW,MACZ;AACD,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,2BACpB,KACA,KACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ;CACrD,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAE/E,KAAI,CADU,OAAO,IAAI,QAAQ,EACrB;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAGF,MAAM,aAAa,YADJ,YAAY,IAAI,IAAI,EACI,SAAS;AAChD,KAAI,CAAC,WAAW,IAAI;AAClB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,WAAW,QAAQ,EAAE,eAAe;AAChE;;AAEF,KACE,WAAW,UAAU,QACrB,CAAC,uBAAuB,IAAI,WAAW,MAA+B,IACtE,WAAW,UAAU,eACrB;AACA,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QACE,0FACD,EACD,eACD;AACD;;CAEF,IAAI,OAAO,CAAC,GAAG,WAAW,QAAQ,CAAC,CAChC,QAAQ,MAAM,EAAE,oBAAoB,QAAQ,CAC5C,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;AACxE,KAAI,WAAW,UAAU,KAAM,QAAO,KAAK,QAAQ,MAAM,EAAE,WAAW,WAAW,MAAM;CACvF,MAAM,SAAS,gBAAgB,MAAM,IAAI,IAAI;AAC7C,KAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,WAAW,qBAAqB,EAAE,eAAe;AACpF;;AAEF,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,MAAM,eAAe;;AAGlD,eAAsB,+BACpB,KACA,KACA,SACA,QACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ,SAAS;CAC9D,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAC/E,KAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;AACxB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,QAAQ,WAAW,IAAI,QAAQ,SAAS,OAAO,CAAC;AACtD,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,8BAA8B,SAAS,EAAE,eAAe;AACpF;;AAEF,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,YAAY,MAAM,EAAE,eAAe;;AAGzD,eAAsB,6BACpB,KACA,KACA,SACA,QACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ,SAAS;CAC9D,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,MAAM,QAAQ,SAAS,OAAO;AACpC,KAAI,CAAC,WAAW,IAAI,IAAI,EAAE;AACxB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,8BAA8B,SAAS,EAAE,eAAe;AACpF;;AAEF,YAAW,OAAO,IAAI;AACtB,YAAW,OAAO,IAAI;AACtB,cAAa,OAAO,IAAI;AACxB,OAAM,MAAM;AACZ,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WACE,KACA,KACA;EAAE,IAAI;EAAQ,QAAQ;EAA6B,SAAS;EAAM,EAClE,eACD;;AAGH,eAAsB,8BACpB,KACA,KACA,SACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ;CACrD,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,SAAS,cAAc,IAAI;AACjC,KAAI,CAAC,OAAO,IAAI;AACd,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,eAAe;AAC5D;;AAEF,KAAI,CAACC,6BAAa,OAAO,MAAM,EAAE;AAC/B,YAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,qCAAqC,EAAE,eAAe;AAClF;;CAEF,MAAM,UAAU,YAAY,OAAO,MAAM,YAAY;AACrD,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;AAEF,KAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QAAQ,+DAA+D,EACvE,eACD;AACD;;AAEF,KAAI,IAAI,IAAI,QAAQ,MAAM,CAAC,SAAS,QAAQ,MAAM,QAAQ;AACxD,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QAAQ,oEAAoE,EAC5E,eACD;AACD;;CAEF,MAAM,WAAW,qBAAqB,OAAO,MAAM,qBAAqB;AACxE,KAAI,CAAC,SAAS,IAAI;AAChB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,SAAS,QAAQ,EAAE,eAAe;AAC9D;;AAEF,MAAK,MAAM,UAAU,QAAQ,MAC3B,KAAIG,iCAAmB,OAAO,KAAK,QAAW;AAC5C,YAAU,SAAS,QAAQ,MAAMH,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,iBAAiB,SAAS,EAAE,eAAe;AACvE;;CAGJ,MAAM,aAAa,eAAe,OAAO,MAAM,cAAc;AAC7D,KAAI,CAAC,WAAW,IAAI;AAClB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,WAAW,QAAQ,EAAE,eAAe;AAChE;;CAEF,MAAM,UAAU,YAAY,IAAI;AAChC,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;CAEF,MAAM,KAAK,aAAa,OAAO;CAC/B,MAAM,QAA+B;EACnC;EACA,QAAQ;EACR,YAAY,OAAO;EACnB,iBAAiB;EACjB,QAAQ;EACR,aAAa;GACX,aAAa,QAAQ,MAAM;GAC3B,WAAW;GACX,QAAQ;GACR,WAAW;GACX,OAAO,QAAQ,MAAM;GACtB;EACF;AACD,aAAY,IAAI,IAAI,MAAM;AAC1B,YAAW,IAAI,IAAI,EAAE;AACrB,eAAc,IAAI,IAAI,QAAQ,MAAM;CACpC,MAAM,UAAmC,EAAE;AAC3C,MAAK,MAAM,UAAU,QAAQ,OAAO;EAClC,MAAM,QACJ,WAAW,IAAI,QAAQ,SAAS,OAAO,CAAC,IACxC,WAAW,OAAO,QAAQ,SAAS,SAAS,QAAW,QAAQ,OAAO,WAAW,MAAM;AACzF,UAAQ,KAAK,MAAM;;AAErB,cAAa,IAAI,IAAI,QAAQ;AAC7B,OAAM,cAAc,YAAY,GAAG;AACnC,oBAAmB,MAAM;AACzB,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,gCACpB,KACA,KACA,SACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ,gBAAgB;CACrE,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAC/E,KAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;AACxB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,QAAQ,YAAY,IAAI,QAAQ;AACtC,KAAI,CAAC,SAAS,MAAM,oBAAoB,SAAS;AAC/C,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,uBAAuB,UAAU,EAAE,eAAe;AAC9E;;AAEF,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,aAAa,MAAM,EAAE,eAAe;;AAG1D,eAAsB,8BACpB,KACA,KACA,SACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ,gBAAgB,QAAQ;CAC7E,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAC/E,KAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;AACxB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,QAAQ,YAAY,IAAI,QAAQ;AACtC,KAAI,CAAC,SAAS,MAAM,oBAAoB,SAAS;AAC/C,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,uBAAuB,UAAU,EAAE,eAAe;AAC9E;;AAEF,KAAI,wBAAwB,IAAI,MAAM,OAAO,EAAE;AAC7C,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QAAQ,0CAA0C,MAAM,OAAO,GAAG,EAClE,eACD;AACD;;AAEF,KAAI,MAAM,WAAW,aAAc,OAAM,SAAS;AAClD,OAAM,cAAc,YAAY,MAAM,GAAG;AACzC,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,eAAe;;AAG5C,eAAsB,6BACpB,KACA,KACA,SACA,SACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ,gBAAgB,QAAQ;CAC7E,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;AAC/E,KAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;AACxB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,QAAQ,YAAY,IAAI,QAAQ;AACtC,KAAI,CAAC,SAAS,MAAM,oBAAoB,SAAS;AAC/C,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,uBAAuB,UAAU,EAAE,eAAe;AAC9E;;CAGF,MAAM,aAAa,YADJ,YAAY,IAAI,IAAI,EACI,SAAS;AAChD,KAAI,CAAC,WAAW,IAAI;AAClB,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,WAAW,QAAQ,EAAE,eAAe;AAChE;;AAEF,KACE,WAAW,UAAU,QACrB,CAAC,uBAAuB,IAAI,WAAW,MAA+B,IACtE,WAAW,UAAU,eACrB;AACA,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QACE,0FACD,EACD,eACD;AACD;;CAGF,IAAI,OAAO,CAAC,GADI,aAAa,IAAI,QAAQ,IAAI,EAAE,CACxB,CAAC,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;AAC7F,KAAI,WAAW,UAAU,KAAM,QAAO,KAAK,QAAQ,MAAM,EAAE,WAAW,WAAW,MAAM;CACvF,MAAM,SAAS,gBAAgB,MAAM,IAAI,IAAI;AAC7C,KAAI,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;AAC9B,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,WAAW,qBAAqB,EAAE,eAAe;AACpF;;AAEF,WAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WAAU,KAAK,KAAK,OAAO,MAAM,eAAe;;AAGlD,eAAsB,yBACpB,KACA,KACA,SACA,KACA,SACA,UACA,gBACe;CACf,MAAM,OAAO,IAAI,OAAO,qBAAqB,QAAQ;CACrD,MAAM,SAAS,IAAI,UAAU;AAC7B,KAAI,MAAM,SAAS,KAAK,SAAS,UAAU,QAAQ,MAAM,KAAK,eAAe,CAAE;CAC/E,MAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,KAAI,CAAC,OAAO;AACV,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,yBAAyB,UAAU,EAAE,eAAe;AAChF;;CAEF,MAAM,SAAS,cAAc,IAAI;AACjC,KAAI,CAAC,OAAO,IAAI;AACd,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,eAAe;AAC5D;;AAEF,KAAI,CAACC,6BAAa,OAAO,MAAM,EAAE;AAC/B,YAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,qCAAqC,EAAE,eAAe;AAClF;;CAEF,MAAM,OAAO,OAAO;CACpB,MAAM,QAAQ,KAAK;CACnB,MAAM,UAAU,OAAO,UAAU,WAAW,CAAC,MAAM,GAAG;AACtD,KACE,CAAC,MAAM,QAAQ,QAAQ,IACvB,QAAQ,WAAW,KACnB,CAAC,QAAQ,OAAO,UAAU,OAAO,UAAU,YAAY,MAAM,SAAS,EAAE,EACxE;AACA,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YACE,KACA,KACA,QACE,kGACD,EACD,eACD;AACD;;CAGF,MAAM,kBAAkB,QAAQ,KAAK,KAAK;CAC1C,IAAI,aAAa;AACjB,KAAI,KAAK,uBAAuB,QAAW;EACzC,MAAM,IAAI,KAAK;AACf,MAAI,OAAO,MAAM,YAAY,CAAC,OAAO,UAAU,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI;AACpE,aAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,aACE,KACA,KACA,QAAQ,2EAA2E,EACnF,eACD;AACD;;AAEF,eAAa;;CAEf,IAAI,YAAY;AAChB,KAAI,KAAK,uBAAuB,QAAW;AACzC,MAAI,CAACC,6BAAa,KAAK,mBAAmB,EAAE;AAC1C,aAAU,SAAS,QAAQ,MAAMD,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,aACE,KACA,KACA,QAAQ,yDAAyD,EACjE,eACD;AACD;;EAEF,MAAM,QAAQ,KAAK,mBAAmB;AACtC,MAAI,UAAU,QAAW;AACvB,OAAI,OAAO,UAAU,YAAY,QAAQ,KAAK,QAAQ,GAAG;AACvD,cAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,cACE,KACA,KACA,QACE,wFACD,EACD,eACD;AACD;;AAEF,eAAY;;;CAGhB,MAAM,UAAU,oBAAoB,KAAK,WAAW;AACpD,KAAI,CAAC,QAAQ,IAAI;AACf,YAAU,SAAS,QAAQ,MAAMA,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,YAAU,KAAK,KAAK,QAAQ,QAAQ,QAAQ,EAAE,eAAe;AAC7D;;CAQF,MAAM,SANY,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,QACxC,MACC,EAAE,oBAAoB,WACtB,EAAE,WAAW,gBACZ,QAAQ,UAAU,QAAQ,uBAAuB,EAAE,YAAY,QAAQ,MAAM,EACjF,CAEE,KAAK,OAAO;EAAE,MAAM;EAAG,OAAO,SAAS,iBAAiB,EAAE,GAAG;EAAE,EAAE,CACjE,QAAQ,UAAU,MAAM,SAAS,UAAU,CAC3C,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CACjC,MAAM,GAAG,WAAW,CACpB,KAAK,WAAW;EACf,SAAS,MAAM,KAAK;EACpB,YAAY,MAAM,KAAK;EACvB,UAAUK,gCAAkB,MAAM,KAAK,GAAG,IAAI,QAAQ,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAC;EAChF,OAAO,KAAK,MAAM,MAAM,QAAQ,IAAM,GAAG;EACzC,SAAS,CACP;GACE,MAAM;GACN,MAAM,mBAAmB,MAAM,KAAK,GAAG,cAAc,gBAAgB,MAAM,GAAG,IAAI,CAAC;GACpF,CACF;EACF,EAAE;AACL,OAAM,MAAM;AACZ,WAAU,SAAS,QAAQ,MAAML,+BAAe,IAAI,QAAQ,EAAE,IAAI;AAClE,WACE,KACA,KACA;EACE,QAAQ;EACR,cAAc;EACd,MAAM;EACN,UAAU;EACX,EACD,eACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-stores.d.cts","names":[],"sources":["../src/vector-stores.ts"],"sourcesContent":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"vector-stores.d.cts","names":[],"sources":["../src/vector-stores.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-stores.d.ts","names":[],"sources":["../src/vector-stores.ts"],"sourcesContent":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"vector-stores.d.ts","names":[],"sources":["../src/vector-stores.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/vector-stores.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildOpenAIError } from "./response/errors.js";
|
|
1
2
|
import { flattenHeaders, isJsonObject, parseStrictIntegerText } from "./helpers.js";
|
|
2
3
|
import { applyChaosAsync } from "./chaos.js";
|
|
3
4
|
import { readMetadata } from "./fine-tuning.js";
|
|
@@ -80,10 +81,7 @@ function underscoreId(prefix) {
|
|
|
80
81
|
return `${prefix}_${randomBytes(12).toString("base64url")}`;
|
|
81
82
|
}
|
|
82
83
|
function invalid(message) {
|
|
83
|
-
return {
|
|
84
|
-
message,
|
|
85
|
-
type: "invalid_request_error"
|
|
86
|
-
} };
|
|
84
|
+
return buildOpenAIError("service-validation", { message });
|
|
87
85
|
}
|
|
88
86
|
function writeJson(res, status, payload, setCorsHeaders) {
|
|
89
87
|
setCorsHeaders(res);
|