@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.
Files changed (492) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +11 -2
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.cts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/aws-event-stream.cjs +20 -23
  25. package/dist/aws-event-stream.cjs.map +1 -1
  26. package/dist/aws-event-stream.d.cts +0 -1
  27. package/dist/aws-event-stream.d.ts +0 -1
  28. package/dist/aws-event-stream.js +20 -24
  29. package/dist/aws-event-stream.js.map +1 -1
  30. package/dist/batches.cjs +2 -4
  31. package/dist/batches.cjs.map +1 -1
  32. package/dist/batches.d.cts.map +1 -1
  33. package/dist/batches.d.ts.map +1 -1
  34. package/dist/batches.js +2 -4
  35. package/dist/batches.js.map +1 -1
  36. package/dist/bedrock-converse.cjs +139 -161
  37. package/dist/bedrock-converse.cjs.map +1 -1
  38. package/dist/bedrock-converse.d.cts.map +1 -1
  39. package/dist/bedrock-converse.d.ts.map +1 -1
  40. package/dist/bedrock-converse.js +137 -159
  41. package/dist/bedrock-converse.js.map +1 -1
  42. package/dist/bedrock.cjs +175 -216
  43. package/dist/bedrock.cjs.map +1 -1
  44. package/dist/bedrock.d.cts.map +1 -1
  45. package/dist/bedrock.d.ts.map +1 -1
  46. package/dist/bedrock.js +172 -213
  47. package/dist/bedrock.js.map +1 -1
  48. package/dist/byteplus-video.cjs +11 -10
  49. package/dist/byteplus-video.cjs.map +1 -1
  50. package/dist/byteplus-video.d.cts.map +1 -1
  51. package/dist/byteplus-video.d.ts.map +1 -1
  52. package/dist/byteplus-video.js +5 -4
  53. package/dist/byteplus-video.js.map +1 -1
  54. package/dist/chaos.cjs +5 -4
  55. package/dist/chaos.cjs.map +1 -1
  56. package/dist/chaos.d.cts.map +1 -1
  57. package/dist/chaos.d.ts.map +1 -1
  58. package/dist/chaos.js +5 -4
  59. package/dist/chaos.js.map +1 -1
  60. package/dist/cli.cjs +15 -0
  61. package/dist/cli.cjs.map +1 -1
  62. package/dist/cli.js +15 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/cohere.cjs +107 -180
  65. package/dist/cohere.cjs.map +1 -1
  66. package/dist/cohere.d.cts.map +1 -1
  67. package/dist/cohere.d.ts.map +1 -1
  68. package/dist/cohere.js +106 -179
  69. package/dist/cohere.js.map +1 -1
  70. package/dist/config-loader.cjs +29 -1
  71. package/dist/config-loader.cjs.map +1 -1
  72. package/dist/config-loader.d.cts +7 -1
  73. package/dist/config-loader.d.cts.map +1 -1
  74. package/dist/config-loader.d.ts +7 -1
  75. package/dist/config-loader.d.ts.map +1 -1
  76. package/dist/config-loader.js +29 -2
  77. package/dist/config-loader.js.map +1 -1
  78. package/dist/count-tokens.cjs +146 -0
  79. package/dist/count-tokens.cjs.map +1 -0
  80. package/dist/count-tokens.js +146 -0
  81. package/dist/count-tokens.js.map +1 -0
  82. package/dist/elevenlabs-audio.cjs +36 -34
  83. package/dist/elevenlabs-audio.cjs.map +1 -1
  84. package/dist/elevenlabs-audio.d.cts.map +1 -1
  85. package/dist/elevenlabs-audio.d.ts.map +1 -1
  86. package/dist/elevenlabs-audio.js +33 -31
  87. package/dist/elevenlabs-audio.js.map +1 -1
  88. package/dist/elevenlabs-voice.cjs +38 -37
  89. package/dist/elevenlabs-voice.cjs.map +1 -1
  90. package/dist/elevenlabs-voice.d.cts.map +1 -1
  91. package/dist/elevenlabs-voice.d.ts.map +1 -1
  92. package/dist/elevenlabs-voice.js +33 -32
  93. package/dist/elevenlabs-voice.js.map +1 -1
  94. package/dist/embedding-request.cjs +16 -0
  95. package/dist/embedding-request.cjs.map +1 -0
  96. package/dist/embedding-request.js +14 -0
  97. package/dist/embedding-request.js.map +1 -0
  98. package/dist/embeddings.cjs +30 -20
  99. package/dist/embeddings.cjs.map +1 -1
  100. package/dist/embeddings.d.cts.map +1 -1
  101. package/dist/embeddings.d.ts.map +1 -1
  102. package/dist/embeddings.js +30 -20
  103. package/dist/embeddings.js.map +1 -1
  104. package/dist/fal-audio.cjs +45 -43
  105. package/dist/fal-audio.cjs.map +1 -1
  106. package/dist/fal-audio.d.cts.map +1 -1
  107. package/dist/fal-audio.d.ts.map +1 -1
  108. package/dist/fal-audio.js +42 -40
  109. package/dist/fal-audio.js.map +1 -1
  110. package/dist/fal.cjs +17 -15
  111. package/dist/fal.cjs.map +1 -1
  112. package/dist/fal.js +16 -14
  113. package/dist/fal.js.map +1 -1
  114. package/dist/files.cjs +2 -4
  115. package/dist/files.cjs.map +1 -1
  116. package/dist/files.d.cts.map +1 -1
  117. package/dist/files.d.ts.map +1 -1
  118. package/dist/files.js +2 -4
  119. package/dist/files.js.map +1 -1
  120. package/dist/fine-tuning.cjs +2 -4
  121. package/dist/fine-tuning.cjs.map +1 -1
  122. package/dist/fine-tuning.d.cts.map +1 -1
  123. package/dist/fine-tuning.d.ts.map +1 -1
  124. package/dist/fine-tuning.js +2 -4
  125. package/dist/fine-tuning.js.map +1 -1
  126. package/dist/fixture-loader.cjs +140 -44
  127. package/dist/fixture-loader.cjs.map +1 -1
  128. package/dist/fixture-loader.d.cts.map +1 -1
  129. package/dist/fixture-loader.d.ts.map +1 -1
  130. package/dist/fixture-loader.js +141 -46
  131. package/dist/fixture-loader.js.map +1 -1
  132. package/dist/gemini-embeddings.cjs +26 -24
  133. package/dist/gemini-embeddings.cjs.map +1 -1
  134. package/dist/gemini-embeddings.js +26 -24
  135. package/dist/gemini-embeddings.js.map +1 -1
  136. package/dist/gemini-interactions.cjs +113 -156
  137. package/dist/gemini-interactions.cjs.map +1 -1
  138. package/dist/gemini-interactions.d.cts +0 -1
  139. package/dist/gemini-interactions.d.cts.map +1 -1
  140. package/dist/gemini-interactions.d.ts +0 -1
  141. package/dist/gemini-interactions.d.ts.map +1 -1
  142. package/dist/gemini-interactions.js +113 -156
  143. package/dist/gemini-interactions.js.map +1 -1
  144. package/dist/gemini.cjs +295 -218
  145. package/dist/gemini.cjs.map +1 -1
  146. package/dist/gemini.d.cts.map +1 -1
  147. package/dist/gemini.d.ts.map +1 -1
  148. package/dist/gemini.js +295 -219
  149. package/dist/gemini.js.map +1 -1
  150. package/dist/grok-video.cjs +14 -12
  151. package/dist/grok-video.cjs.map +1 -1
  152. package/dist/grok-video.d.cts.map +1 -1
  153. package/dist/grok-video.d.ts.map +1 -1
  154. package/dist/grok-video.js +8 -6
  155. package/dist/grok-video.js.map +1 -1
  156. package/dist/helpers.cjs +411 -75
  157. package/dist/helpers.cjs.map +1 -1
  158. package/dist/helpers.d.cts +51 -1
  159. package/dist/helpers.d.cts.map +1 -1
  160. package/dist/helpers.d.ts +51 -1
  161. package/dist/helpers.d.ts.map +1 -1
  162. package/dist/helpers.js +402 -74
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/images.cjs +30 -28
  165. package/dist/images.cjs.map +1 -1
  166. package/dist/images.d.cts.map +1 -1
  167. package/dist/images.d.ts.map +1 -1
  168. package/dist/images.js +27 -25
  169. package/dist/images.js.map +1 -1
  170. package/dist/index.cjs +4 -2
  171. package/dist/index.d.cts +4 -4
  172. package/dist/index.d.ts +4 -4
  173. package/dist/index.js +4 -4
  174. package/dist/journal.cjs +3 -1
  175. package/dist/journal.cjs.map +1 -1
  176. package/dist/journal.d.cts.map +1 -1
  177. package/dist/journal.d.ts.map +1 -1
  178. package/dist/journal.js +2 -1
  179. package/dist/journal.js.map +1 -1
  180. package/dist/llmock.cjs +3 -0
  181. package/dist/llmock.cjs.map +1 -1
  182. package/dist/llmock.d.cts.map +1 -1
  183. package/dist/llmock.d.ts.map +1 -1
  184. package/dist/llmock.js +3 -0
  185. package/dist/llmock.js.map +1 -1
  186. package/dist/mcp-fakes.d.cts.map +1 -1
  187. package/dist/mcp-handler.cjs +7 -3
  188. package/dist/mcp-handler.cjs.map +1 -1
  189. package/dist/mcp-handler.js +7 -3
  190. package/dist/mcp-handler.js.map +1 -1
  191. package/dist/mcp-recorder.cjs +2 -1
  192. package/dist/mcp-recorder.cjs.map +1 -1
  193. package/dist/mcp-recorder.js +3 -2
  194. package/dist/mcp-recorder.js.map +1 -1
  195. package/dist/messages.cjs +235 -202
  196. package/dist/messages.cjs.map +1 -1
  197. package/dist/messages.d.cts.map +1 -1
  198. package/dist/messages.d.ts.map +1 -1
  199. package/dist/messages.js +234 -202
  200. package/dist/messages.js.map +1 -1
  201. package/dist/metrics.cjs +5 -2
  202. package/dist/metrics.cjs.map +1 -1
  203. package/dist/metrics.d.cts.map +1 -1
  204. package/dist/metrics.d.ts.map +1 -1
  205. package/dist/metrics.js +6 -3
  206. package/dist/metrics.js.map +1 -1
  207. package/dist/misbehavior.cjs +62 -3
  208. package/dist/misbehavior.cjs.map +1 -1
  209. package/dist/misbehavior.d.cts.map +1 -1
  210. package/dist/misbehavior.d.ts.map +1 -1
  211. package/dist/misbehavior.js +63 -4
  212. package/dist/misbehavior.js.map +1 -1
  213. package/dist/model-utils.cjs +1 -0
  214. package/dist/model-utils.cjs.map +1 -1
  215. package/dist/model-utils.js +1 -1
  216. package/dist/model-utils.js.map +1 -1
  217. package/dist/moderation.cjs +15 -12
  218. package/dist/moderation.cjs.map +1 -1
  219. package/dist/moderation.js +14 -11
  220. package/dist/moderation.js.map +1 -1
  221. package/dist/ndjson-writer.cjs +21 -23
  222. package/dist/ndjson-writer.cjs.map +1 -1
  223. package/dist/ndjson-writer.d.cts +0 -1
  224. package/dist/ndjson-writer.d.cts.map +1 -1
  225. package/dist/ndjson-writer.d.ts +0 -1
  226. package/dist/ndjson-writer.d.ts.map +1 -1
  227. package/dist/ndjson-writer.js +21 -24
  228. package/dist/ndjson-writer.js.map +1 -1
  229. package/dist/ollama.cjs +276 -210
  230. package/dist/ollama.cjs.map +1 -1
  231. package/dist/ollama.d.cts.map +1 -1
  232. package/dist/ollama.d.ts.map +1 -1
  233. package/dist/ollama.js +273 -207
  234. package/dist/ollama.js.map +1 -1
  235. package/dist/openapi.cjs +323 -3
  236. package/dist/openapi.cjs.map +1 -1
  237. package/dist/openapi.d.cts.map +1 -1
  238. package/dist/openapi.d.ts.map +1 -1
  239. package/dist/openapi.js +324 -4
  240. package/dist/openapi.js.map +1 -1
  241. package/dist/openrouter-chat.cjs +11 -155
  242. package/dist/openrouter-chat.cjs.map +1 -1
  243. package/dist/openrouter-chat.js +11 -155
  244. package/dist/openrouter-chat.js.map +1 -1
  245. package/dist/openrouter-video.cjs +51 -74
  246. package/dist/openrouter-video.cjs.map +1 -1
  247. package/dist/openrouter-video.d.cts.map +1 -1
  248. package/dist/openrouter-video.d.ts.map +1 -1
  249. package/dist/openrouter-video.js +37 -60
  250. package/dist/openrouter-video.js.map +1 -1
  251. package/dist/raw-validation.cjs +177 -0
  252. package/dist/raw-validation.cjs.map +1 -0
  253. package/dist/raw-validation.js +176 -0
  254. package/dist/raw-validation.js.map +1 -0
  255. package/dist/recorder.cjs +176 -95
  256. package/dist/recorder.cjs.map +1 -1
  257. package/dist/recorder.d.cts.map +1 -1
  258. package/dist/recorder.d.ts.map +1 -1
  259. package/dist/recorder.js +176 -95
  260. package/dist/recorder.js.map +1 -1
  261. package/dist/rerank.cjs +13 -11
  262. package/dist/rerank.cjs.map +1 -1
  263. package/dist/rerank.js +12 -10
  264. package/dist/rerank.js.map +1 -1
  265. package/dist/response/catalog/anthropic-page.cjs +39 -0
  266. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  267. package/dist/response/catalog/anthropic-page.js +38 -0
  268. package/dist/response/catalog/anthropic-page.js.map +1 -0
  269. package/dist/response/catalog/collect.cjs +61 -0
  270. package/dist/response/catalog/collect.cjs.map +1 -0
  271. package/dist/response/catalog/collect.js +59 -0
  272. package/dist/response/catalog/collect.js.map +1 -0
  273. package/dist/response/catalog/gemini-page.cjs +25 -0
  274. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  275. package/dist/response/catalog/gemini-page.js +24 -0
  276. package/dist/response/catalog/gemini-page.js.map +1 -0
  277. package/dist/response/catalog/render.cjs +182 -0
  278. package/dist/response/catalog/render.cjs.map +1 -0
  279. package/dist/response/catalog/render.js +171 -0
  280. package/dist/response/catalog/render.js.map +1 -0
  281. package/dist/response/deliver.cjs +144 -0
  282. package/dist/response/deliver.cjs.map +1 -0
  283. package/dist/response/deliver.js +143 -0
  284. package/dist/response/deliver.js.map +1 -0
  285. package/dist/response/errors.cjs +225 -0
  286. package/dist/response/errors.cjs.map +1 -0
  287. package/dist/response/errors.js +224 -0
  288. package/dist/response/errors.js.map +1 -0
  289. package/dist/response/finish.cjs +39 -0
  290. package/dist/response/finish.cjs.map +1 -0
  291. package/dist/response/finish.js +35 -0
  292. package/dist/response/finish.js.map +1 -0
  293. package/dist/response/frame-loop.cjs +102 -0
  294. package/dist/response/frame-loop.cjs.map +1 -0
  295. package/dist/response/frame-loop.js +100 -0
  296. package/dist/response/frame-loop.js.map +1 -0
  297. package/dist/response/lifecycle.cjs +223 -0
  298. package/dist/response/lifecycle.cjs.map +1 -0
  299. package/dist/response/lifecycle.js +211 -0
  300. package/dist/response/lifecycle.js.map +1 -0
  301. package/dist/response/policy.cjs +126 -0
  302. package/dist/response/policy.cjs.map +1 -0
  303. package/dist/response/policy.js +120 -0
  304. package/dist/response/policy.js.map +1 -0
  305. package/dist/response/profiles.cjs +69 -0
  306. package/dist/response/profiles.cjs.map +1 -0
  307. package/dist/response/profiles.js +65 -0
  308. package/dist/response/profiles.js.map +1 -0
  309. package/dist/response/proxy.cjs +71 -0
  310. package/dist/response/proxy.cjs.map +1 -0
  311. package/dist/response/proxy.js +70 -0
  312. package/dist/response/proxy.js.map +1 -0
  313. package/dist/response/raw.cjs +228 -0
  314. package/dist/response/raw.cjs.map +1 -0
  315. package/dist/response/raw.js +227 -0
  316. package/dist/response/raw.js.map +1 -0
  317. package/dist/response/timing.cjs +157 -0
  318. package/dist/response/timing.cjs.map +1 -0
  319. package/dist/response/timing.js +150 -0
  320. package/dist/response/timing.js.map +1 -0
  321. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  322. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  323. package/dist/response/usage/codecs/anthropic.js +50 -0
  324. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  325. package/dist/response/usage/codecs/cohere.cjs +36 -0
  326. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  327. package/dist/response/usage/codecs/cohere.js +35 -0
  328. package/dist/response/usage/codecs/cohere.js.map +1 -0
  329. package/dist/response/usage/codecs/converse.cjs +16 -0
  330. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  331. package/dist/response/usage/codecs/converse.js +15 -0
  332. package/dist/response/usage/codecs/converse.js.map +1 -0
  333. package/dist/response/usage/codecs/gemini.cjs +31 -0
  334. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  335. package/dist/response/usage/codecs/gemini.js +31 -0
  336. package/dist/response/usage/codecs/gemini.js.map +1 -0
  337. package/dist/response/usage/codecs/interactions.cjs +22 -0
  338. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  339. package/dist/response/usage/codecs/interactions.js +21 -0
  340. package/dist/response/usage/codecs/interactions.js.map +1 -0
  341. package/dist/response/usage/codecs/ollama.cjs +17 -0
  342. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  343. package/dist/response/usage/codecs/ollama.js +17 -0
  344. package/dist/response/usage/codecs/ollama.js.map +1 -0
  345. package/dist/response/usage/codecs/openai.cjs +52 -0
  346. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  347. package/dist/response/usage/codecs/openai.js +50 -0
  348. package/dist/response/usage/codecs/openai.js.map +1 -0
  349. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  350. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  351. package/dist/response/usage/codecs/openrouter.js +67 -0
  352. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  353. package/dist/response/usage/codecs/realtime.cjs +19 -0
  354. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  355. package/dist/response/usage/codecs/realtime.js +18 -0
  356. package/dist/response/usage/codecs/realtime.js.map +1 -0
  357. package/dist/response/usage/codecs/responses.cjs +21 -0
  358. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  359. package/dist/response/usage/codecs/responses.js +20 -0
  360. package/dist/response/usage/codecs/responses.js.map +1 -0
  361. package/dist/response/usage/estimate.cjs +23 -0
  362. package/dist/response/usage/estimate.cjs.map +1 -0
  363. package/dist/response/usage/estimate.js +21 -0
  364. package/dist/response/usage/estimate.js.map +1 -0
  365. package/dist/response/usage/fields.cjs +72 -0
  366. package/dist/response/usage/fields.cjs.map +1 -0
  367. package/dist/response/usage/fields.js +70 -0
  368. package/dist/response/usage/fields.js.map +1 -0
  369. package/dist/response/usage/recording.cjs +52 -0
  370. package/dist/response/usage/recording.cjs.map +1 -0
  371. package/dist/response/usage/recording.js +52 -0
  372. package/dist/response/usage/recording.js.map +1 -0
  373. package/dist/responses.cjs +304 -196
  374. package/dist/responses.cjs.map +1 -1
  375. package/dist/responses.d.cts.map +1 -1
  376. package/dist/responses.d.ts.map +1 -1
  377. package/dist/responses.js +303 -195
  378. package/dist/responses.js.map +1 -1
  379. package/dist/route-registry.cjs +45 -0
  380. package/dist/route-registry.cjs.map +1 -1
  381. package/dist/route-registry.d.cts.map +1 -1
  382. package/dist/route-registry.d.ts.map +1 -1
  383. package/dist/route-registry.js +41 -1
  384. package/dist/route-registry.js.map +1 -1
  385. package/dist/router.cjs +24 -4
  386. package/dist/router.cjs.map +1 -1
  387. package/dist/router.d.cts +7 -1
  388. package/dist/router.d.cts.map +1 -1
  389. package/dist/router.d.ts +7 -1
  390. package/dist/router.d.ts.map +1 -1
  391. package/dist/router.js +24 -5
  392. package/dist/router.js.map +1 -1
  393. package/dist/search.cjs +13 -11
  394. package/dist/search.cjs.map +1 -1
  395. package/dist/search.js +12 -10
  396. package/dist/search.js.map +1 -1
  397. package/dist/server.cjs +293 -248
  398. package/dist/server.cjs.map +1 -1
  399. package/dist/server.d.cts.map +1 -1
  400. package/dist/server.d.ts.map +1 -1
  401. package/dist/server.js +294 -249
  402. package/dist/server.js.map +1 -1
  403. package/dist/speech.cjs +20 -18
  404. package/dist/speech.cjs.map +1 -1
  405. package/dist/speech.d.cts.map +1 -1
  406. package/dist/speech.d.ts.map +1 -1
  407. package/dist/speech.js +19 -17
  408. package/dist/speech.js.map +1 -1
  409. package/dist/sse-writer.cjs +56 -30
  410. package/dist/sse-writer.cjs.map +1 -1
  411. package/dist/sse-writer.d.cts +0 -1
  412. package/dist/sse-writer.d.cts.map +1 -1
  413. package/dist/sse-writer.d.ts +0 -1
  414. package/dist/sse-writer.d.ts.map +1 -1
  415. package/dist/sse-writer.js +55 -31
  416. package/dist/sse-writer.js.map +1 -1
  417. package/dist/stream-collapse.cjs +118 -11
  418. package/dist/stream-collapse.cjs.map +1 -1
  419. package/dist/stream-collapse.d.cts +10 -9
  420. package/dist/stream-collapse.d.cts.map +1 -1
  421. package/dist/stream-collapse.d.ts +10 -9
  422. package/dist/stream-collapse.d.ts.map +1 -1
  423. package/dist/stream-collapse.js +118 -11
  424. package/dist/stream-collapse.js.map +1 -1
  425. package/dist/transcription.cjs +31 -43
  426. package/dist/transcription.cjs.map +1 -1
  427. package/dist/transcription.d.cts.map +1 -1
  428. package/dist/transcription.d.ts.map +1 -1
  429. package/dist/transcription.js +31 -43
  430. package/dist/transcription.js.map +1 -1
  431. package/dist/types.cjs.map +1 -1
  432. package/dist/types.d.cts +231 -9
  433. package/dist/types.d.cts.map +1 -1
  434. package/dist/types.d.ts +231 -9
  435. package/dist/types.d.ts.map +1 -1
  436. package/dist/types.js.map +1 -1
  437. package/dist/vector-mock.cjs +3 -8
  438. package/dist/vector-mock.cjs.map +1 -1
  439. package/dist/vector-mock.d.cts.map +1 -1
  440. package/dist/vector-mock.d.ts.map +1 -1
  441. package/dist/vector-mock.js +3 -8
  442. package/dist/vector-mock.js.map +1 -1
  443. package/dist/vector-stores.cjs +2 -4
  444. package/dist/vector-stores.cjs.map +1 -1
  445. package/dist/vector-stores.d.cts.map +1 -1
  446. package/dist/vector-stores.d.ts.map +1 -1
  447. package/dist/vector-stores.js +2 -4
  448. package/dist/vector-stores.js.map +1 -1
  449. package/dist/veo-video.cjs +16 -14
  450. package/dist/veo-video.cjs.map +1 -1
  451. package/dist/veo-video.js +10 -8
  452. package/dist/veo-video.js.map +1 -1
  453. package/dist/video.cjs +21 -19
  454. package/dist/video.cjs.map +1 -1
  455. package/dist/video.d.cts.map +1 -1
  456. package/dist/video.d.ts.map +1 -1
  457. package/dist/video.js +20 -18
  458. package/dist/video.js.map +1 -1
  459. package/dist/ws-framing.cjs +12 -6
  460. package/dist/ws-framing.cjs.map +1 -1
  461. package/dist/ws-framing.d.cts +2 -0
  462. package/dist/ws-framing.d.cts.map +1 -1
  463. package/dist/ws-framing.d.ts +2 -0
  464. package/dist/ws-framing.d.ts.map +1 -1
  465. package/dist/ws-framing.js +12 -6
  466. package/dist/ws-framing.js.map +1 -1
  467. package/dist/ws-gemini-live.cjs +131 -96
  468. package/dist/ws-gemini-live.cjs.map +1 -1
  469. package/dist/ws-gemini-live.d.cts +0 -1
  470. package/dist/ws-gemini-live.d.cts.map +1 -1
  471. package/dist/ws-gemini-live.d.ts +0 -1
  472. package/dist/ws-gemini-live.d.ts.map +1 -1
  473. package/dist/ws-gemini-live.js +130 -95
  474. package/dist/ws-gemini-live.js.map +1 -1
  475. package/dist/ws-live.cjs +6 -5
  476. package/dist/ws-live.cjs.map +1 -1
  477. package/dist/ws-live.js +5 -4
  478. package/dist/ws-live.js.map +1 -1
  479. package/dist/ws-realtime.cjs +108 -124
  480. package/dist/ws-realtime.cjs.map +1 -1
  481. package/dist/ws-realtime.d.cts.map +1 -1
  482. package/dist/ws-realtime.d.ts.map +1 -1
  483. package/dist/ws-realtime.js +105 -121
  484. package/dist/ws-realtime.js.map +1 -1
  485. package/dist/ws-responses.cjs +80 -59
  486. package/dist/ws-responses.cjs.map +1 -1
  487. package/dist/ws-responses.d.cts.map +1 -1
  488. package/dist/ws-responses.d.ts.map +1 -1
  489. package/dist/ws-responses.js +79 -58
  490. package/dist/ws-responses.js.map +1 -1
  491. package/package.json +4 -1
  492. package/skills/write-fixtures/SKILL.md +57 -16
@@ -1 +1 @@
1
- {"version":3,"file":"vector-stores.js","names":[],"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.js","names":[],"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":"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"}
@@ -1,4 +1,6 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ const require_errors = require('./response/errors.cjs');
3
+ const require_policy = require('./response/policy.cjs');
2
4
  const require_helpers = require('./helpers.cjs');
3
5
  const require_sse_writer = require('./sse-writer.cjs');
4
6
  const require_chaos = require('./chaos.cjs');
@@ -197,9 +199,9 @@ async function handleVeoVideoCreate(req, res, raw, model, fixtures, journal, def
197
199
  path,
198
200
  headers: require_helpers.flattenHeaders(req.headers),
199
201
  body: syntheticReq
200
- }, fixture ? "fixture" : require_helpers.resolveStrictMode(defaults.strict, req.headers) ? "internal" : defaults.record?.providers.veo ? "proxy" : "internal", defaults.registry, defaults.logger)) return;
202
+ }, fixture ? "fixture" : require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss ? "internal" : defaults.record?.providers.veo ? "proxy" : "internal", defaults.registry, defaults.logger)) return;
201
203
  if (!fixture) {
202
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
204
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
203
205
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
204
206
  defaults.logger.error(require_helpers.strictNoMatchLogLine(method, path, skippedBySequenceOrTurn));
205
207
  journal.add({
@@ -210,7 +212,7 @@ async function handleVeoVideoCreate(req, res, raw, model, fixtures, journal, def
210
212
  response: {
211
213
  status: 503,
212
214
  fixture: null,
213
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
215
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
214
216
  }
215
217
  });
216
218
  require_sse_writer.writeErrorResponse(res, 503, geminiError(503, strictMessage, "UNAVAILABLE"));
@@ -238,7 +240,7 @@ async function handleVeoVideoCreate(req, res, raw, model, fixtures, journal, def
238
240
  response: {
239
241
  status: 404,
240
242
  fixture: null,
241
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
243
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
242
244
  }
243
245
  });
244
246
  require_sse_writer.writeErrorResponse(res, 404, geminiError(404, "No fixture matched", "NOT_FOUND"));
@@ -336,7 +338,7 @@ async function handleVeoVideoStatus(req, res, operationName, fixtures, journal,
336
338
  return;
337
339
  }
338
340
  if (job.kind === "record") {
339
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
341
+ if (!require_policy.resolveRequestDecisions(defaults.strict, req.headers).upstream) {
340
342
  defaults.logger.error(`STRICT: Veo operation ${operationName} is proxied live upstream (record mode) — refusing the upstream poll`);
341
343
  journal.add({
342
344
  method,
@@ -346,7 +348,7 @@ async function handleVeoVideoStatus(req, res, operationName, fixtures, journal,
346
348
  response: {
347
349
  status: 503,
348
350
  fixture: null,
349
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
351
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
350
352
  }
351
353
  });
352
354
  require_sse_writer.writeErrorResponse(res, 503, geminiError(503, `Strict mode: Veo operation ${operationName} is proxied live upstream (record mode) — nothing reaches an upstream under strict mode`, "UNAVAILABLE"));
@@ -431,13 +433,13 @@ async function proxyVeoVideoSubmit(args) {
431
433
  status: 502,
432
434
  fixture: null,
433
435
  source: "proxy",
434
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
436
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
435
437
  }
436
438
  });
437
- require_sse_writer.writeErrorResponse(res, 502, JSON.stringify({ error: {
439
+ require_sse_writer.writeErrorResponse(res, 502, require_errors.renderError("openai", "transport-failure", {
438
440
  message: `Proxy to upstream failed: ${msg}`,
439
441
  type: "proxy_error"
440
- } }));
442
+ }).body);
441
443
  return "handled";
442
444
  };
443
445
  const submitPath = `/v1beta/models/${syntheticReq.model}:predictLongRunning`;
@@ -481,7 +483,7 @@ async function proxyVeoVideoSubmit(args) {
481
483
  status: fetched.status,
482
484
  fixture: null,
483
485
  source: "proxy",
484
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
486
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
485
487
  }
486
488
  });
487
489
  res.writeHead(fetched.status, { "Content-Type": fetched.contentType ?? "application/json" });
@@ -536,7 +538,7 @@ async function proxyVeoVideoSubmit(args) {
536
538
  status: 200,
537
539
  fixture: null,
538
540
  source: "proxy",
539
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
541
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
540
542
  }
541
543
  });
542
544
  res.writeHead(200, { "Content-Type": "application/json" });
@@ -567,7 +569,7 @@ async function proxyVeoVideoRecordPoll(args) {
567
569
  status,
568
570
  fixture: null,
569
571
  source: "proxy",
570
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
572
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
571
573
  }
572
574
  });
573
575
  };
@@ -575,10 +577,10 @@ async function proxyVeoVideoRecordPoll(args) {
575
577
  logger.error(`Veo video poll proxy failed: ${msg}`);
576
578
  if (require_chaos.responseGone(res)) return;
577
579
  journalProxy(502);
578
- require_sse_writer.writeErrorResponse(res, 502, JSON.stringify({ error: {
580
+ require_sse_writer.writeErrorResponse(res, 502, require_errors.renderError("openai", "transport-failure", {
579
581
  message: `Proxy to upstream failed: ${msg}`,
580
582
  type: "proxy_error"
581
- } }));
583
+ }).body);
582
584
  };
583
585
  const record = defaults.record;
584
586
  if (!record) {