@copilotkit/aimock 1.43.0 → 1.44.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 (290) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +15 -0
  4. package/README.md +8 -2
  5. package/dist/agui-handler.d.ts.map +1 -1
  6. package/dist/agui-types.d.ts.map +1 -1
  7. package/dist/bedrock-converse.cjs +32 -4
  8. package/dist/bedrock-converse.cjs.map +1 -1
  9. package/dist/bedrock-converse.d.cts.map +1 -1
  10. package/dist/bedrock-converse.d.ts.map +1 -1
  11. package/dist/bedrock-converse.js +32 -4
  12. package/dist/bedrock-converse.js.map +1 -1
  13. package/dist/chaos.cjs +8 -5
  14. package/dist/chaos.cjs.map +1 -1
  15. package/dist/chaos.d.cts.map +1 -1
  16. package/dist/chaos.d.ts.map +1 -1
  17. package/dist/chaos.js +9 -6
  18. package/dist/chaos.js.map +1 -1
  19. package/dist/cli.cjs +89 -7
  20. package/dist/cli.cjs.map +1 -1
  21. package/dist/cli.js +91 -9
  22. package/dist/cli.js.map +1 -1
  23. package/dist/cohere.cjs +27 -1
  24. package/dist/cohere.cjs.map +1 -1
  25. package/dist/cohere.js +27 -1
  26. package/dist/cohere.js.map +1 -1
  27. package/dist/config-loader.cjs +1 -1
  28. package/dist/config-loader.d.ts.map +1 -1
  29. package/dist/config-loader.js +1 -1
  30. package/dist/constants.cjs +8 -0
  31. package/dist/constants.cjs.map +1 -1
  32. package/dist/constants.d.cts +6 -2
  33. package/dist/constants.d.ts +6 -2
  34. package/dist/constants.js +8 -1
  35. package/dist/constants.js.map +1 -1
  36. package/dist/echo-text.cjs +65 -0
  37. package/dist/echo-text.cjs.map +1 -0
  38. package/dist/echo-text.d.cts +22 -0
  39. package/dist/echo-text.d.cts.map +1 -0
  40. package/dist/echo-text.d.ts +22 -0
  41. package/dist/echo-text.d.ts.map +1 -0
  42. package/dist/echo-text.js +65 -0
  43. package/dist/echo-text.js.map +1 -0
  44. package/dist/embeddings.cjs +18 -1
  45. package/dist/embeddings.cjs.map +1 -1
  46. package/dist/embeddings.d.cts +1 -1
  47. package/dist/embeddings.d.cts.map +1 -1
  48. package/dist/embeddings.d.ts +1 -1
  49. package/dist/embeddings.d.ts.map +1 -1
  50. package/dist/embeddings.js +18 -1
  51. package/dist/embeddings.js.map +1 -1
  52. package/dist/files.cjs +9 -11
  53. package/dist/files.cjs.map +1 -1
  54. package/dist/files.d.cts.map +1 -1
  55. package/dist/files.d.ts.map +1 -1
  56. package/dist/files.js +10 -13
  57. package/dist/files.js.map +1 -1
  58. package/dist/fine-tuning.cjs +1 -19
  59. package/dist/fine-tuning.cjs.map +1 -1
  60. package/dist/fine-tuning.d.cts.map +1 -1
  61. package/dist/fine-tuning.d.ts.map +1 -1
  62. package/dist/fine-tuning.js +2 -20
  63. package/dist/fine-tuning.js.map +1 -1
  64. package/dist/fixture-loader-services.cjs +116 -0
  65. package/dist/fixture-loader-services.cjs.map +1 -0
  66. package/dist/fixture-loader-services.d.cts +48 -0
  67. package/dist/fixture-loader-services.d.cts.map +1 -0
  68. package/dist/fixture-loader-services.d.ts +48 -0
  69. package/dist/fixture-loader-services.d.ts.map +1 -0
  70. package/dist/fixture-loader-services.js +114 -0
  71. package/dist/fixture-loader-services.js.map +1 -0
  72. package/dist/fixture-loader.cjs +172 -11
  73. package/dist/fixture-loader.cjs.map +1 -1
  74. package/dist/fixture-loader.d.cts +95 -1
  75. package/dist/fixture-loader.d.cts.map +1 -1
  76. package/dist/fixture-loader.d.ts +95 -1
  77. package/dist/fixture-loader.d.ts.map +1 -1
  78. package/dist/fixture-loader.js +168 -12
  79. package/dist/fixture-loader.js.map +1 -1
  80. package/dist/gemini-embeddings.cjs +42 -2
  81. package/dist/gemini-embeddings.cjs.map +1 -1
  82. package/dist/gemini-embeddings.js +43 -3
  83. package/dist/gemini-embeddings.js.map +1 -1
  84. package/dist/gemini-interactions.cjs +38 -0
  85. package/dist/gemini-interactions.cjs.map +1 -1
  86. package/dist/gemini-interactions.d.cts.map +1 -1
  87. package/dist/gemini-interactions.d.ts.map +1 -1
  88. package/dist/gemini-interactions.js +38 -0
  89. package/dist/gemini-interactions.js.map +1 -1
  90. package/dist/gemini.cjs +8 -1
  91. package/dist/gemini.cjs.map +1 -1
  92. package/dist/gemini.d.cts.map +1 -1
  93. package/dist/gemini.d.ts.map +1 -1
  94. package/dist/gemini.js +8 -1
  95. package/dist/gemini.js.map +1 -1
  96. package/dist/helpers.cjs +276 -5
  97. package/dist/helpers.cjs.map +1 -1
  98. package/dist/helpers.d.cts.map +1 -1
  99. package/dist/helpers.d.ts.map +1 -1
  100. package/dist/helpers.js +275 -7
  101. package/dist/helpers.js.map +1 -1
  102. package/dist/images.cjs +3 -2
  103. package/dist/images.cjs.map +1 -1
  104. package/dist/images.js +3 -2
  105. package/dist/images.js.map +1 -1
  106. package/dist/index.cjs +30 -1
  107. package/dist/index.d.cts +8 -3
  108. package/dist/index.d.ts +8 -3
  109. package/dist/index.js +9 -3
  110. package/dist/jest.cjs +15 -10
  111. package/dist/jest.cjs.map +1 -1
  112. package/dist/jest.d.cts +4 -2
  113. package/dist/jest.d.cts.map +1 -1
  114. package/dist/jest.d.ts +4 -2
  115. package/dist/jest.d.ts.map +1 -1
  116. package/dist/jest.js +16 -11
  117. package/dist/jest.js.map +1 -1
  118. package/dist/journal.cjs +20 -0
  119. package/dist/journal.cjs.map +1 -1
  120. package/dist/journal.d.cts +16 -0
  121. package/dist/journal.d.cts.map +1 -1
  122. package/dist/journal.d.ts +16 -0
  123. package/dist/journal.d.ts.map +1 -1
  124. package/dist/journal.js +20 -0
  125. package/dist/journal.js.map +1 -1
  126. package/dist/llmock.cjs +82 -10
  127. package/dist/llmock.cjs.map +1 -1
  128. package/dist/llmock.d.cts +35 -0
  129. package/dist/llmock.d.cts.map +1 -1
  130. package/dist/llmock.d.ts +35 -0
  131. package/dist/llmock.d.ts.map +1 -1
  132. package/dist/llmock.js +83 -11
  133. package/dist/llmock.js.map +1 -1
  134. package/dist/mcp-fakes-mount.cjs +216 -0
  135. package/dist/mcp-fakes-mount.cjs.map +1 -0
  136. package/dist/mcp-fakes-mount.js +210 -0
  137. package/dist/mcp-fakes-mount.js.map +1 -0
  138. package/dist/mcp-fakes.cjs +1619 -0
  139. package/dist/mcp-fakes.cjs.map +1 -0
  140. package/dist/mcp-fakes.d.cts +101 -0
  141. package/dist/mcp-fakes.d.cts.map +1 -0
  142. package/dist/mcp-fakes.d.ts +101 -0
  143. package/dist/mcp-fakes.d.ts.map +1 -0
  144. package/dist/mcp-fakes.js +1614 -0
  145. package/dist/mcp-fakes.js.map +1 -0
  146. package/dist/mcp-handler.cjs +331 -17
  147. package/dist/mcp-handler.cjs.map +1 -1
  148. package/dist/mcp-handler.js +330 -18
  149. package/dist/mcp-handler.js.map +1 -1
  150. package/dist/mcp-mock.cjs +217 -49
  151. package/dist/mcp-mock.cjs.map +1 -1
  152. package/dist/mcp-mock.d.cts +66 -1
  153. package/dist/mcp-mock.d.cts.map +1 -1
  154. package/dist/mcp-mock.d.ts +66 -1
  155. package/dist/mcp-mock.d.ts.map +1 -1
  156. package/dist/mcp-mock.js +218 -50
  157. package/dist/mcp-mock.js.map +1 -1
  158. package/dist/mcp-stub.cjs +5 -1
  159. package/dist/mcp-stub.d.cts +3 -1
  160. package/dist/mcp-stub.d.ts +3 -1
  161. package/dist/mcp-stub.js +3 -1
  162. package/dist/mcp-types.d.cts +6 -0
  163. package/dist/mcp-types.d.ts +6 -0
  164. package/dist/message-text.cjs +192 -0
  165. package/dist/message-text.cjs.map +1 -0
  166. package/dist/message-text.d.cts +31 -0
  167. package/dist/message-text.d.cts.map +1 -0
  168. package/dist/message-text.d.ts +31 -0
  169. package/dist/message-text.d.ts.map +1 -0
  170. package/dist/message-text.js +184 -0
  171. package/dist/message-text.js.map +1 -0
  172. package/dist/messages.cjs +38 -0
  173. package/dist/messages.cjs.map +1 -1
  174. package/dist/messages.js +38 -0
  175. package/dist/messages.js.map +1 -1
  176. package/dist/metrics.cjs +46 -66
  177. package/dist/metrics.cjs.map +1 -1
  178. package/dist/metrics.d.cts +14 -6
  179. package/dist/metrics.d.cts.map +1 -1
  180. package/dist/metrics.d.ts +14 -6
  181. package/dist/metrics.d.ts.map +1 -1
  182. package/dist/metrics.js +32 -40
  183. package/dist/metrics.js.map +1 -1
  184. package/dist/ollama.cjs +5 -1
  185. package/dist/ollama.cjs.map +1 -1
  186. package/dist/ollama.d.cts.map +1 -1
  187. package/dist/ollama.d.ts.map +1 -1
  188. package/dist/ollama.js +5 -1
  189. package/dist/ollama.js.map +1 -1
  190. package/dist/openapi.cjs +3405 -0
  191. package/dist/openapi.cjs.map +1 -0
  192. package/dist/openapi.d.cts +30 -0
  193. package/dist/openapi.d.cts.map +1 -0
  194. package/dist/openapi.d.ts +30 -0
  195. package/dist/openapi.d.ts.map +1 -0
  196. package/dist/openapi.js +3404 -0
  197. package/dist/openapi.js.map +1 -0
  198. package/dist/openrouter-video.cjs +4 -4
  199. package/dist/openrouter-video.cjs.map +1 -1
  200. package/dist/openrouter-video.d.cts.map +1 -1
  201. package/dist/openrouter-video.d.ts.map +1 -1
  202. package/dist/openrouter-video.js +4 -4
  203. package/dist/openrouter-video.js.map +1 -1
  204. package/dist/recorder.cjs +9 -1
  205. package/dist/recorder.cjs.map +1 -1
  206. package/dist/recorder.d.cts.map +1 -1
  207. package/dist/recorder.d.ts.map +1 -1
  208. package/dist/recorder.js +9 -1
  209. package/dist/recorder.js.map +1 -1
  210. package/dist/responses.cjs +43 -4
  211. package/dist/responses.cjs.map +1 -1
  212. package/dist/responses.d.cts.map +1 -1
  213. package/dist/responses.d.ts.map +1 -1
  214. package/dist/responses.js +43 -4
  215. package/dist/responses.js.map +1 -1
  216. package/dist/route-registry.cjs +951 -0
  217. package/dist/route-registry.cjs.map +1 -0
  218. package/dist/route-registry.d.cts +33 -0
  219. package/dist/route-registry.d.cts.map +1 -0
  220. package/dist/route-registry.d.ts +33 -0
  221. package/dist/route-registry.d.ts.map +1 -0
  222. package/dist/route-registry.js +866 -0
  223. package/dist/route-registry.js.map +1 -0
  224. package/dist/router.cjs +1 -1
  225. package/dist/router.cjs.map +1 -1
  226. package/dist/router.js +1 -1
  227. package/dist/router.js.map +1 -1
  228. package/dist/server.cjs +590 -191
  229. package/dist/server.cjs.map +1 -1
  230. package/dist/server.d.cts +4 -1
  231. package/dist/server.d.cts.map +1 -1
  232. package/dist/server.d.ts +4 -1
  233. package/dist/server.d.ts.map +1 -1
  234. package/dist/server.js +498 -99
  235. package/dist/server.js.map +1 -1
  236. package/dist/speech.cjs +4 -2
  237. package/dist/speech.cjs.map +1 -1
  238. package/dist/speech.js +4 -2
  239. package/dist/speech.js.map +1 -1
  240. package/dist/suite.cjs +1 -1
  241. package/dist/suite.js +1 -1
  242. package/dist/transcription.cjs +2 -2
  243. package/dist/transcription.cjs.map +1 -1
  244. package/dist/transcription.d.cts.map +1 -1
  245. package/dist/transcription.d.ts.map +1 -1
  246. package/dist/transcription.js +2 -2
  247. package/dist/transcription.js.map +1 -1
  248. package/dist/types.cjs +18 -0
  249. package/dist/types.cjs.map +1 -0
  250. package/dist/types.d.cts +202 -2
  251. package/dist/types.d.cts.map +1 -1
  252. package/dist/types.d.ts +202 -2
  253. package/dist/types.d.ts.map +1 -1
  254. package/dist/types.js +17 -0
  255. package/dist/types.js.map +1 -0
  256. package/dist/validate-cli.cjs +89 -31
  257. package/dist/validate-cli.cjs.map +1 -1
  258. package/dist/validate-cli.js +91 -33
  259. package/dist/validate-cli.js.map +1 -1
  260. package/dist/vector-stores.cjs +1180 -0
  261. package/dist/vector-stores.cjs.map +1 -0
  262. package/dist/vector-stores.d.cts +106 -0
  263. package/dist/vector-stores.d.cts.map +1 -0
  264. package/dist/vector-stores.d.ts +106 -0
  265. package/dist/vector-stores.d.ts.map +1 -0
  266. package/dist/vector-stores.js +1164 -0
  267. package/dist/vector-stores.js.map +1 -0
  268. package/dist/vector-types.d.cts.map +1 -1
  269. package/dist/vector-types.d.ts.map +1 -1
  270. package/dist/video.cjs +19 -0
  271. package/dist/video.cjs.map +1 -1
  272. package/dist/video.d.cts.map +1 -1
  273. package/dist/video.d.ts.map +1 -1
  274. package/dist/video.js +19 -0
  275. package/dist/video.js.map +1 -1
  276. package/dist/vitest.cjs +15 -10
  277. package/dist/vitest.cjs.map +1 -1
  278. package/dist/vitest.d.cts +4 -2
  279. package/dist/vitest.d.cts.map +1 -1
  280. package/dist/vitest.d.ts +4 -2
  281. package/dist/vitest.d.ts.map +1 -1
  282. package/dist/vitest.js +16 -11
  283. package/dist/vitest.js.map +1 -1
  284. package/dist/ws-gemini-live.d.ts +2 -2
  285. package/dist/ws-realtime.d.ts +2 -2
  286. package/dist/ws-responses.cjs +14 -2
  287. package/dist/ws-responses.cjs.map +1 -1
  288. package/dist/ws-responses.js +14 -2
  289. package/dist/ws-responses.js.map +1 -1
  290. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-registry.cjs","names":[],"sources":["../src/route-registry.ts"],"sourcesContent":["/**\n * Single source of truth for every first-class HTTP route aimock serves.\n *\n * Both the HTTP dispatcher (`server.ts`) and the machine-readable catalog\n * (`openapi.ts` → `GET /__aimock/openapi.json` + `GET /__aimock/routes`) import\n * from this module. Drift is prevented three ways, not one:\n *\n * 1. Shared bindings — the dispatcher matches against the exact `*_PATH`\n * constants and `*_RE` patterns defined here (never inline literals), and\n * `metrics.ts` path-label normalization imports the same patterns, so the\n * three consumers cannot disagree on what a route looks like.\n * 2. Bidirectional tests (`openapi-catalog.test.ts`) — every catalog entry is\n * probed against the live router (catalog → router) AND every dispatch\n * literal/pattern imported from this module must have a catalog entry\n * whose example path it matches (router → catalog).\n * 3. Runtime drift guard — the dispatcher's terminal 404 consults\n * `matchRouteDefinition` and warns when the registry claims a route the\n * dispatcher just missed.\n *\n * `path` is the OpenAPI path template (`{param}` for dynamic segments).\n * `examplePath` is a concrete path the drift test probes against the live\n * server (a templated path can never be fetched verbatim).\n *\n * Plugin mounts (`Mountable`: A2A/MCP/AG-UI/vector) are dynamic per-server and\n * intentionally excluded — this registry covers the built-in first-class\n * surfaces only. Likewise excluded from `ROUTE_DEFINITIONS` (their bindings\n * above are still shared so dispatch cannot typo them): the WebSocket upgrades\n * (`REALTIME_PATH`, `GEMINI_LIVE_PATH`, `LIVE_PATH` — same URL as an HTTP\n * route or no HTTP method at all, so they cannot appear in an HTTP catalog)\n * and the header-gated fal.ai proxy branch (`FAL_ROUTE_RE` +\n * `x-fal-target-host`, a dynamic upstream mirror rather than a fixed route).\n */\n\nexport const COMPLETIONS_PATH = \"/v1/chat/completions\";\nexport const RESPONSES_PATH = \"/v1/responses\";\nexport const REALTIME_PATH = \"/v1/realtime\";\nexport const LIVE_PATH = \"/v1/live/sessions\";\nexport const GEMINI_LIVE_PATH =\n \"/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent\";\nexport const MESSAGES_PATH = \"/v1/messages\";\nexport const EMBEDDINGS_PATH = \"/v1/embeddings\";\nexport const COHERE_CHAT_PATH = \"/v2/chat\";\nexport const COHERE_EMBED_PATH = \"/v2/embed\";\nexport const SEARCH_PATH = \"/search\";\nexport const RERANK_PATH = \"/v2/rerank\";\nexport const MODERATIONS_PATH = \"/v1/moderations\";\nexport const IMAGES_PATH = \"/v1/images/generations\";\nexport const IMAGES_EDIT_PATH = \"/v1/images/edits\";\nexport const IMAGES_VARIATIONS_PATH = \"/v1/images/variations\";\nexport const SPEECH_PATH = \"/v1/audio/speech\";\nexport const TRANSCRIPTIONS_PATH = \"/v1/audio/transcriptions\";\nexport const TRANSLATIONS_PATH = \"/v1/audio/translations\";\nexport const VIDEOS_PATH = \"/v1/videos\";\n// Grok submit is an exact literal; Grok status reuses the OpenAI\n// `/v1/videos/{id}` shape (dispatch guards `id !== \"generations\"` and the\n// job-map lookup disambiguates Sora). Shared with metrics.ts normalization.\nexport const GROK_VIDEO_SUBMIT_PATH = \"/v1/videos/generations\";\nexport const GROK_VIDEO_STATUS_RE = /^\\/v1\\/videos\\/([^/]+)$/;\nexport const OPENAI_VIDEO_STATUS_RE = /^\\/v1\\/videos\\/([^/]+)$/;\nexport const GEMINI_PREDICT_RE = /^\\/v1beta\\/models\\/([^:]+):predict$/;\n// Veo submit (`:predictLongRunning`, anchored so it never collides with the\n// bare Gemini `:predict` route) + Veo operation polling. The operation RE\n// allows multi-segment names (`operations/.+`); the catalog template below\n// uses the single-segment canonical form. Shared with metrics.ts.\nexport const VEO_PREDICT_LRO_RE = /^\\/v1beta\\/models\\/([^:]+):predictLongRunning$/;\nexport const VEO_OPERATION_RE = /^\\/v1beta\\/(operations\\/.+)$/;\n// BytePlus Ark (Seedance) task lifecycle. The `/api/v3` prefix is ENUMERATED\n// rather than wildcarded: a tolerant prefix would additionally claim\n// `/fal/contents/generations/tasks`, which dispatches pre-rewrite ~1,100\n// lines ahead of every fal branch. Shared with metrics.ts normalization.\nexport const BYTEPLUS_VIDEO_SUBMIT_RE = /^(?:\\/api\\/v3)?\\/contents\\/generations\\/tasks$/;\nexport const BYTEPLUS_VIDEO_STATUS_RE = /^(?:\\/api\\/v3)?\\/contents\\/generations\\/tasks\\/([^/]+)$/;\nexport const ELEVENLABS_SOUND_GENERATION_PATH = \"/v1/sound-generation\";\nexport const ELEVENLABS_TTS_RE = /^\\/v1\\/text-to-speech\\/([^/]+)$/;\nexport const ELEVENLABS_MUSIC_RE = /^\\/v1\\/music(?:\\/(.+))?$/;\nexport const ELEVENLABS_VOICE_DESIGN_PATH = \"/v1/text-to-voice/design\";\nexport const ELEVENLABS_VOICE_CREATE_PATH = \"/v1/text-to-voice\";\nexport const ELEVENLABS_VOICE_RE = /^\\/v1\\/voices\\/([^/]+)$/;\nexport const FAL_QUEUE_SUBMIT_RE = /^\\/fal\\/queue\\/submit\\/(.+)$/;\nexport const FAL_QUEUE_REQUESTS_RE = /^\\/fal\\/queue\\/requests\\/(.+)$/;\nexport const FAL_RUN_RE = /^\\/fal\\/run\\/(.+)$/;\n// The fal.ai route shape, shared with server.ts dispatch and metrics.ts path\n// labels: a bare `/fal` is routed (header-gated upstream mirror), so one\n// binding keeps the route rule and the label rule from drifting.\nexport const FAL_ROUTE_RE = /^\\/fal(?:\\/.*)?$/;\nexport const GEMINI_INTERACTIONS_PATH = \"/v1beta/interactions\";\nexport const GEMINI_PATH_RE = /^\\/v1beta\\/models\\/([^:]+):(generateContent|streamGenerateContent)$/;\nexport const GEMINI_EMBED_RE = /^\\/v1beta\\/models\\/([^:]+):embedContent$/;\nexport const AZURE_DEPLOYMENT_RE =\n /^\\/openai\\/deployments\\/([^/]+)\\/(chat\\/completions|embeddings)$/;\nexport const BEDROCK_INVOKE_RE = /^\\/model\\/([^/]+)\\/invoke$/;\nexport const BEDROCK_STREAM_RE = /^\\/model\\/([^/]+)\\/invoke-with-response-stream$/;\nexport const BEDROCK_CONVERSE_RE = /^\\/model\\/([^/]+)\\/converse$/;\nexport const BEDROCK_CONVERSE_STREAM_RE = /^\\/model\\/([^/]+)\\/converse-stream$/;\nexport const VERTEX_AI_RE =\n /^\\/v1\\/projects\\/[^/]+\\/locations\\/[^/]+\\/publishers\\/google\\/models\\/([^/:]+):(generateContent|streamGenerateContent)$/;\n\nexport const OLLAMA_CHAT_PATH = \"/api/chat\";\nexport const OLLAMA_GENERATE_PATH = \"/api/generate\";\nexport const OLLAMA_EMBEDDINGS_PATH = \"/api/embeddings\";\nexport const OLLAMA_EMBED_PATH = \"/api/embed\";\nexport const OLLAMA_TAGS_PATH = \"/api/tags\";\n\nexport const OPENROUTER_VIDEOS_PATH = \"/api/v1/videos\";\nexport const OPENROUTER_VIDEO_MODELS_PATH = \"/api/v1/videos/models\";\nexport const OPENROUTER_MODELS_PATH = \"/api/v1/models\";\nexport const OPENROUTER_KEY_PATH = \"/api/v1/key\";\nexport const OPENROUTER_CREDITS_PATH = \"/api/v1/credits\";\n// Dispatched in server.ts (content RE → models exact → status RE → submit\n// exact) and reused by metrics.ts path-label normalization — one binding so\n// dispatch, catalog, and metric labels cannot disagree.\nexport const OPENROUTER_VIDEO_CONTENT_RE = /^\\/api\\/v1\\/videos\\/([^/]+)\\/content$/;\nexport const OPENROUTER_VIDEO_STATUS_RE = /^\\/api\\/v1\\/videos\\/([^/]+)$/;\n\nexport const HEALTH_PATH = \"/health\";\nexport const READY_PATH = \"/ready\";\nexport const METRICS_PATH = \"/metrics\";\nexport const MODELS_PATH = \"/v1/models\";\nexport const REQUESTS_PATH = \"/v1/_requests\";\n\nexport const FILES_PATH = \"/v1/files\";\n// Shared with metrics.ts path-label normalization (file ids are random\n// `file-…` values; labels collapse to `{id}`).\nexport const FILES_CONTENT_RE = /^\\/v1\\/files\\/([^/]+)\\/content$/;\nexport const FILES_ID_RE = /^\\/v1\\/files\\/([^/]+)$/;\n\n// OpenAI Batches API. Shared with server.ts dispatch and metrics.ts normalization.\nexport const BATCHES_PATH = \"/v1/batches\";\nexport const BATCHES_CANCEL_RE = /^\\/v1\\/batches\\/([^/]+)\\/cancel$/;\nexport const BATCHES_ID_RE = /^\\/v1\\/batches\\/([^/]+)$/;\nexport const FINE_TUNING_JOBS_PATH = \"/v1/fine_tuning/jobs\";\nexport const FINE_TUNING_ID_RE = /^\\/v1\\/fine_tuning\\/jobs\\/([^/]+)$/;\nexport const FINE_TUNING_CANCEL_RE = /^\\/v1\\/fine_tuning\\/jobs\\/([^/]+)\\/cancel$/;\nexport const FINE_TUNING_EVENTS_RE = /^\\/v1\\/fine_tuning\\/jobs\\/([^/]+)\\/events$/;\n\n// OpenAI Vector Stores API. Shared with server.ts dispatch and metrics.ts\n// path-label normalization (store/file/batch ids are caller-minted, so every\n// id-bearing path collapses to a placeholder). Dispatch order in server.ts is\n// most-specific RE first (search → batch-files → batch-cancel → batch → file →\n// id), then the two sub-collection REs below, then the collection exact path.\nexport const VECTOR_STORES_PATH = \"/v1/vector_stores\";\nexport const VECTOR_STORES_SEARCH_RE = /^\\/v1\\/vector_stores\\/([^/]+)\\/search$/;\nexport const VECTOR_STORES_BATCH_FILES_RE =\n /^\\/v1\\/vector_stores\\/([^/]+)\\/file_batches\\/([^/]+)\\/files$/;\nexport const VECTOR_STORES_BATCH_CANCEL_RE =\n /^\\/v1\\/vector_stores\\/([^/]+)\\/file_batches\\/([^/]+)\\/cancel$/;\nexport const VECTOR_STORES_BATCH_RE = /^\\/v1\\/vector_stores\\/([^/]+)\\/file_batches\\/([^/]+)$/;\nexport const VECTOR_STORES_FILE_RE = /^\\/v1\\/vector_stores\\/([^/]+)\\/files\\/([^/]+)$/;\nexport const VECTOR_STORES_ID_RE = /^\\/v1\\/vector_stores\\/([^/]+)$/;\nexport const VECTOR_STORES_FILES_RE = /^\\/v1\\/vector_stores\\/([^/]+)\\/files$/;\nexport const VECTOR_STORES_FILE_BATCHES_RE = /^\\/v1\\/vector_stores\\/([^/]+)\\/file_batches$/;\n\nexport const CONTROL_PREFIX = \"/__aimock\";\n\nexport interface RouteDefinition {\n method: string;\n /** OpenAPI path template, e.g. `/v1/text-to-speech/{voice_id}`. */\n path: string;\n /** Concrete path the live-router drift test probes. Defaults to `path`. */\n examplePath?: string;\n service: string;\n description: string;\n}\n\n/**\n * Every built-in route, in the same order the dispatcher checks them\n * (mounts → ollama → openrouter-video → byteplus → openrouter discovery →\n * azure/compat → ops → models/requests → provider handlers → fal → chat).\n * Regex branches are represented by their canonical OpenAPI template.\n */\nexport const ROUTE_DEFINITIONS: RouteDefinition[] = [\n // Ollama (pre-rewrite band)\n { method: \"POST\", path: OLLAMA_CHAT_PATH, service: \"ollama\", description: \"Ollama chat\" },\n {\n method: \"POST\",\n path: OLLAMA_GENERATE_PATH,\n service: \"ollama\",\n description: \"Ollama generate\",\n },\n {\n method: \"POST\",\n path: OLLAMA_EMBEDDINGS_PATH,\n service: \"ollama\",\n description: \"Ollama embeddings (legacy path)\",\n },\n {\n method: \"POST\",\n path: OLLAMA_EMBED_PATH,\n service: \"ollama\",\n description: \"Ollama embed (current path)\",\n },\n { method: \"GET\", path: OLLAMA_TAGS_PATH, service: \"ollama\", description: \"Ollama tags\" },\n // OpenRouter async video lifecycle\n {\n method: \"GET\",\n path: \"/api/v1/videos/{jobId}/content\",\n examplePath: \"/api/v1/videos/test-job/content\",\n service: \"video\",\n description: \"OpenRouter video content download\",\n },\n {\n method: \"GET\",\n path: OPENROUTER_VIDEO_MODELS_PATH,\n service: \"video\",\n description: \"OpenRouter video model listing\",\n },\n {\n method: \"GET\",\n path: \"/api/v1/videos/{jobId}\",\n examplePath: \"/api/v1/videos/test-job\",\n service: \"video\",\n description: \"OpenRouter video job status\",\n },\n {\n method: \"POST\",\n path: OPENROUTER_VIDEOS_PATH,\n service: \"video\",\n description: \"OpenRouter video job submit\",\n },\n // BytePlus Ark (Seedance) — canonical + /api/v3-prefixed aliases\n {\n method: \"GET\",\n path: \"/contents/generations/tasks/{id}\",\n examplePath: \"/contents/generations/tasks/test-id\",\n service: \"video\",\n description: \"BytePlus video task status\",\n },\n {\n method: \"GET\",\n path: \"/api/v3/contents/generations/tasks/{id}\",\n examplePath: \"/api/v3/contents/generations/tasks/test-id\",\n service: \"video\",\n description: \"BytePlus video task status (api/v3 prefix)\",\n },\n {\n method: \"POST\",\n path: \"/contents/generations/tasks\",\n service: \"video\",\n description: \"BytePlus video task submit\",\n },\n {\n method: \"POST\",\n path: \"/api/v3/contents/generations/tasks\",\n service: \"video\",\n description: \"BytePlus video task submit (api/v3 prefix)\",\n },\n // OpenRouter discovery\n {\n method: \"GET\",\n path: OPENROUTER_MODELS_PATH,\n service: \"openrouter\",\n description: \"OpenRouter models\",\n },\n {\n method: \"GET\",\n path: OPENROUTER_KEY_PATH,\n service: \"openrouter\",\n description: \"OpenRouter key info\",\n },\n {\n method: \"GET\",\n path: OPENROUTER_CREDITS_PATH,\n service: \"openrouter\",\n description: \"OpenRouter credits\",\n },\n // Azure OpenAI deployments (rewritten to /v1/* downstream)\n {\n method: \"POST\",\n path: \"/openai/deployments/{deploymentId}/chat/completions\",\n examplePath: \"/openai/deployments/test-deployment/chat/completions\",\n service: \"azure\",\n description: \"Azure OpenAI chat completions\",\n },\n {\n method: \"POST\",\n path: \"/openai/deployments/{deploymentId}/embeddings\",\n examplePath: \"/openai/deployments/test-deployment/embeddings\",\n service: \"azure\",\n description: \"Azure OpenAI embeddings\",\n },\n // Ops\n { method: \"GET\", path: HEALTH_PATH, service: \"ops\", description: \"Health probe (public)\" },\n { method: \"GET\", path: READY_PATH, service: \"ops\", description: \"Readiness probe (public)\" },\n { method: \"GET\", path: METRICS_PATH, service: \"ops\", description: \"Prometheus metrics (public)\" },\n // Models + legacy journal\n { method: \"GET\", path: MODELS_PATH, service: \"openai\", description: \"Models listing\" },\n { method: \"GET\", path: REQUESTS_PATH, service: \"control\", description: \"Legacy journal listing\" },\n {\n method: \"DELETE\",\n path: REQUESTS_PATH,\n service: \"control\",\n description: \"Legacy journal clear\",\n },\n // OpenAI Responses + Anthropic + Cohere + core OpenAI\n { method: \"POST\", path: RESPONSES_PATH, service: \"openai\", description: \"OpenAI Responses API\" },\n { method: \"POST\", path: MESSAGES_PATH, service: \"anthropic\", description: \"Anthropic messages\" },\n { method: \"POST\", path: COHERE_CHAT_PATH, service: \"cohere\", description: \"Cohere chat\" },\n { method: \"POST\", path: COHERE_EMBED_PATH, service: \"cohere\", description: \"Cohere embed\" },\n { method: \"POST\", path: EMBEDDINGS_PATH, service: \"openai\", description: \"OpenAI embeddings\" },\n {\n method: \"POST\",\n path: IMAGES_PATH,\n service: \"images\",\n description: \"Image generation\",\n },\n {\n method: \"POST\",\n path: IMAGES_EDIT_PATH,\n service: \"images\",\n description: \"Image edits (multipart)\",\n },\n {\n method: \"POST\",\n path: \"/v1/images/variations\",\n service: \"images\",\n description: \"Image variations (removed upstream 2026-05-12 — replays the real 404)\",\n },\n { method: \"POST\", path: SPEECH_PATH, service: \"speech\", description: \"Text-to-speech\" },\n {\n method: \"POST\",\n path: TRANSCRIPTIONS_PATH,\n service: \"transcription\",\n description: \"Audio transcription (multipart)\",\n },\n {\n method: \"POST\",\n path: TRANSLATIONS_PATH,\n service: \"transcription\",\n description: \"Audio translation (multipart)\",\n },\n // Video: Sora submit, Grok submit, shared status\n {\n method: \"POST\",\n path: VIDEOS_PATH,\n service: \"video\",\n description: \"Video generation submit (Sora)\",\n },\n {\n method: \"POST\",\n path: \"/v1/videos/generations\",\n service: \"video\",\n description: \"Grok video generation submit\",\n },\n {\n method: \"GET\",\n path: \"/v1/videos/{id}\",\n examplePath: \"/v1/videos/test-id\",\n service: \"video\",\n description: \"Video job status (Sora/Grok)\",\n },\n // Veo\n {\n method: \"POST\",\n path: \"/v1beta/models/{model}:predictLongRunning\",\n examplePath: \"/v1beta/models/veo-3:predictLongRunning\",\n service: \"video\",\n description: \"Veo video submit\",\n },\n {\n method: \"GET\",\n path: \"/v1beta/operations/{name}\",\n examplePath: \"/v1beta/operations/test-op\",\n service: \"video\",\n description: \"Veo operation status\",\n },\n // Gemini Imagen + interactions + embeddings + generate\n {\n method: \"POST\",\n path: \"/v1beta/models/{model}:predict\",\n examplePath: \"/v1beta/models/imagen-3:predict\",\n service: \"gemini\",\n description: \"Gemini Imagen predict\",\n },\n {\n method: \"POST\",\n path: GEMINI_INTERACTIONS_PATH,\n service: \"gemini\",\n description: \"Gemini interactions\",\n },\n {\n method: \"POST\",\n path: \"/v1beta/models/{model}:embedContent\",\n examplePath: \"/v1beta/models/text-embedding-004:embedContent\",\n service: \"gemini\",\n description: \"Gemini embedContent\",\n },\n {\n method: \"POST\",\n path: \"/v1beta/models/{model}:generateContent\",\n examplePath: \"/v1beta/models/gemini-2.0-flash:generateContent\",\n service: \"gemini\",\n description: \"Gemini generateContent\",\n },\n {\n method: \"POST\",\n path: \"/v1beta/models/{model}:streamGenerateContent\",\n examplePath: \"/v1beta/models/gemini-2.0-flash:streamGenerateContent\",\n service: \"gemini\",\n description: \"Gemini streaming\",\n },\n // Vertex AI (same shapes, full resource path)\n {\n method: \"POST\",\n path: \"/v1/projects/{project}/locations/{location}/publishers/google/models/{model}:generateContent\",\n examplePath:\n \"/v1/projects/test-proj/locations/us-central1/publishers/google/models/gemini-2.0-flash:generateContent\",\n service: \"vertex\",\n description: \"Vertex AI generateContent\",\n },\n {\n method: \"POST\",\n path: \"/v1/projects/{project}/locations/{location}/publishers/google/models/{model}:streamGenerateContent\",\n examplePath:\n \"/v1/projects/test-proj/locations/us-central1/publishers/google/models/gemini-2.0-flash:streamGenerateContent\",\n service: \"vertex\",\n description: \"Vertex AI streaming\",\n },\n // Bedrock\n {\n method: \"POST\",\n path: \"/model/{modelId}/invoke\",\n examplePath: \"/model/anthropic.claude-3/invoke\",\n service: \"bedrock\",\n description: \"Bedrock invoke\",\n },\n {\n method: \"POST\",\n path: \"/model/{modelId}/invoke-with-response-stream\",\n examplePath: \"/model/anthropic.claude-3/invoke-with-response-stream\",\n service: \"bedrock\",\n description: \"Bedrock streaming invoke\",\n },\n {\n method: \"POST\",\n path: \"/model/{modelId}/converse\",\n examplePath: \"/model/anthropic.claude-3/converse\",\n service: \"bedrock\",\n description: \"Bedrock converse\",\n },\n {\n method: \"POST\",\n path: \"/model/{modelId}/converse-stream\",\n examplePath: \"/model/anthropic.claude-3/converse-stream\",\n service: \"bedrock\",\n description: \"Bedrock converse streaming\",\n },\n // Search / rerank / moderation\n { method: \"POST\", path: SEARCH_PATH, service: \"search\", description: \"Tavily search\" },\n { method: \"POST\", path: RERANK_PATH, service: \"rerank\", description: \"Cohere rerank\" },\n { method: \"POST\", path: MODERATIONS_PATH, service: \"moderation\", description: \"Moderation\" },\n // ElevenLabs\n {\n method: \"POST\",\n path: ELEVENLABS_SOUND_GENERATION_PATH,\n service: \"elevenlabs\",\n description: \"ElevenLabs sound generation\",\n },\n {\n method: \"POST\",\n path: \"/v1/text-to-voice/design\",\n service: \"elevenlabs\",\n description: \"ElevenLabs voice design preview\",\n },\n {\n method: \"POST\",\n path: \"/v1/text-to-voice\",\n service: \"elevenlabs\",\n description: \"ElevenLabs save designed voice\",\n },\n {\n method: \"GET\",\n path: \"/v1/voices/{voice_id}\",\n examplePath: \"/v1/voices/test-voice\",\n service: \"elevenlabs\",\n description: \"ElevenLabs voice slot get\",\n },\n {\n method: \"DELETE\",\n path: \"/v1/voices/{voice_id}\",\n examplePath: \"/v1/voices/test-voice\",\n service: \"elevenlabs\",\n description: \"ElevenLabs voice slot delete\",\n },\n {\n method: \"POST\",\n path: \"/v1/text-to-speech/{voice_id}\",\n examplePath: \"/v1/text-to-speech/test-voice\",\n service: \"elevenlabs\",\n description: \"ElevenLabs text-to-speech\",\n },\n {\n method: \"POST\",\n path: \"/v1/music\",\n service: \"elevenlabs\",\n description: \"ElevenLabs music\",\n },\n {\n method: \"POST\",\n path: \"/v1/music/{subtype}\",\n examplePath: \"/v1/music/generation\",\n service: \"elevenlabs\",\n description: \"ElevenLabs music sub-operation\",\n },\n // fal.ai\n {\n method: \"POST\",\n path: \"/fal/queue/submit/{model}\",\n examplePath: \"/fal/queue/submit/fal-ai-test\",\n service: \"fal\",\n description: \"fal.ai queue submit\",\n },\n {\n method: \"GET\",\n path: \"/fal/queue/requests/{requestId}\",\n examplePath: \"/fal/queue/requests/test-id\",\n service: \"fal\",\n description: \"fal.ai queue status/result\",\n },\n {\n method: \"POST\",\n path: \"/fal/queue/requests/{requestId}\",\n examplePath: \"/fal/queue/requests/test-id\",\n service: \"fal\",\n description: \"fal.ai queue status/result (POST)\",\n },\n {\n method: \"PUT\",\n path: \"/fal/queue/requests/{requestId}\",\n examplePath: \"/fal/queue/requests/test-id\",\n service: \"fal\",\n description: \"fal.ai queue status/result (PUT)\",\n },\n {\n method: \"POST\",\n path: \"/fal/run/{model}\",\n examplePath: \"/fal/run/fal-ai-test\",\n service: \"fal\",\n description: \"fal.ai synchronous run\",\n },\n // OpenAI Batches API (cancel before id: the id RE would swallow /cancel)\n {\n method: \"POST\",\n path: \"/v1/batches/{batch_id}/cancel\",\n examplePath: \"/v1/batches/batch-test123/cancel\",\n service: \"batches\",\n description: \"Batch cancel\",\n },\n {\n method: \"GET\",\n path: \"/v1/batches/{batch_id}\",\n examplePath: \"/v1/batches/batch-test123\",\n service: \"batches\",\n description: \"Batch retrieve\",\n },\n { method: \"GET\", path: BATCHES_PATH, service: \"batches\", description: \"Batch list\" },\n {\n method: \"POST\",\n path: BATCHES_PATH,\n service: \"batches\",\n description: \"Batch create\",\n },\n // OpenAI Files API\n {\n method: \"GET\",\n path: \"/v1/files/{file_id}/content\",\n examplePath: \"/v1/files/file-test123/content\",\n service: \"files\",\n description: \"File content download\",\n },\n {\n method: \"GET\",\n path: \"/v1/files/{file_id}\",\n examplePath: \"/v1/files/file-test123\",\n service: \"files\",\n description: \"File retrieve\",\n },\n {\n method: \"DELETE\",\n path: \"/v1/files/{file_id}\",\n examplePath: \"/v1/files/file-test123\",\n service: \"files\",\n description: \"File delete\",\n },\n { method: \"GET\", path: \"/v1/files\", service: \"files\", description: \"File list\" },\n {\n method: \"POST\",\n path: \"/v1/files\",\n service: \"files\",\n description: \"File upload (JSON or multipart)\",\n },\n // OpenAI fine-tuning jobs\n {\n method: \"POST\",\n path: \"/v1/fine_tuning/jobs/{job_id}/cancel\",\n examplePath: \"/v1/fine_tuning/jobs/ftjob-test123/cancel\",\n service: \"fine-tuning\",\n description: \"Fine-tuning job cancel\",\n },\n {\n method: \"GET\",\n path: \"/v1/fine_tuning/jobs/{job_id}/events\",\n examplePath: \"/v1/fine_tuning/jobs/ftjob-test123/events\",\n service: \"fine-tuning\",\n description: \"Fine-tuning job events\",\n },\n {\n method: \"GET\",\n path: \"/v1/fine_tuning/jobs/{job_id}\",\n examplePath: \"/v1/fine_tuning/jobs/ftjob-test123\",\n service: \"fine-tuning\",\n description: \"Fine-tuning job retrieve\",\n },\n {\n method: \"GET\",\n path: \"/v1/fine_tuning/jobs\",\n service: \"fine-tuning\",\n description: \"Fine-tuning job list\",\n },\n {\n method: \"POST\",\n path: \"/v1/fine_tuning/jobs\",\n service: \"fine-tuning\",\n description: \"Fine-tuning job create\",\n },\n // OpenAI Vector Stores (cancel before id is not needed: the id RE is\n // anchored to the exact 3-segment path so it cannot swallow sub-resources;\n // most-specific REs still read first in the dispatcher).\n {\n method: \"POST\",\n path: \"/v1/vector_stores/{vector_store_id}/search\",\n examplePath: \"/v1/vector_stores/vs-test123/search\",\n service: \"vector-stores\",\n description: \"Vector store search\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/files\",\n examplePath: \"/v1/vector_stores/vs-test123/file_batches/vsbf-test123/files\",\n service: \"vector-stores\",\n description: \"Vector file batch files list\",\n },\n {\n method: \"POST\",\n path: \"/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/cancel\",\n examplePath: \"/v1/vector_stores/vs-test123/file_batches/vsbf-test123/cancel\",\n service: \"vector-stores\",\n description: \"Vector file batch cancel\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}\",\n examplePath: \"/v1/vector_stores/vs-test123/file_batches/vsbf-test123\",\n service: \"vector-stores\",\n description: \"Vector file batch retrieve\",\n },\n {\n method: \"POST\",\n path: \"/v1/vector_stores/{vector_store_id}/file_batches\",\n examplePath: \"/v1/vector_stores/vs-test123/file_batches\",\n service: \"vector-stores\",\n description: \"Vector file batch create\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores/{vector_store_id}/files/{file_id}\",\n examplePath: \"/v1/vector_stores/vs-test123/files/file-test123\",\n service: \"vector-stores\",\n description: \"Vector store file retrieve\",\n },\n {\n method: \"DELETE\",\n path: \"/v1/vector_stores/{vector_store_id}/files/{file_id}\",\n examplePath: \"/v1/vector_stores/vs-test123/files/file-test123\",\n service: \"vector-stores\",\n description: \"Vector store file delete\",\n },\n {\n method: \"POST\",\n path: \"/v1/vector_stores/{vector_store_id}/files\",\n examplePath: \"/v1/vector_stores/vs-test123/files\",\n service: \"vector-stores\",\n description: \"Vector store file attach\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores/{vector_store_id}/files\",\n examplePath: \"/v1/vector_stores/vs-test123/files\",\n service: \"vector-stores\",\n description: \"Vector store files list\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores/{vector_store_id}\",\n examplePath: \"/v1/vector_stores/vs-test123\",\n service: \"vector-stores\",\n description: \"Vector store retrieve\",\n },\n {\n method: \"POST\",\n path: \"/v1/vector_stores/{vector_store_id}\",\n examplePath: \"/v1/vector_stores/vs-test123\",\n service: \"vector-stores\",\n description: \"Vector store modify\",\n },\n {\n method: \"DELETE\",\n path: \"/v1/vector_stores/{vector_store_id}\",\n examplePath: \"/v1/vector_stores/vs-test123\",\n service: \"vector-stores\",\n description: \"Vector store delete\",\n },\n {\n method: \"GET\",\n path: \"/v1/vector_stores\",\n service: \"vector-stores\",\n description: \"Vector store list\",\n },\n {\n method: \"POST\",\n path: \"/v1/vector_stores\",\n service: \"vector-stores\",\n description: \"Vector store create\",\n },\n // Chat completions (terminal dispatcher branch)\n {\n method: \"POST\",\n path: COMPLETIONS_PATH,\n service: \"openai\",\n description: \"OpenAI chat completions\",\n },\n // Control API\n { method: \"GET\", path: \"/__aimock/health\", service: \"control\", description: \"Control health\" },\n { method: \"GET\", path: \"/__aimock/journal\", service: \"control\", description: \"Request journal\" },\n {\n method: \"GET\",\n path: \"/__aimock/fixtures\",\n service: \"control\",\n description: \"Fixture count\",\n },\n { method: \"POST\", path: \"/__aimock/fixtures\", service: \"control\", description: \"Add fixtures\" },\n {\n method: \"DELETE\",\n path: \"/__aimock/fixtures\",\n service: \"control\",\n description: \"Clear fixtures\",\n },\n { method: \"GET\", path: \"/__aimock/chaos\", service: \"control\", description: \"Read chaos config\" },\n { method: \"POST\", path: \"/__aimock/chaos\", service: \"control\", description: \"Set chaos config\" },\n {\n method: \"DELETE\",\n path: \"/__aimock/chaos\",\n service: \"control\",\n description: \"Clear chaos override\",\n },\n { method: \"POST\", path: \"/__aimock/reset\", service: \"control\", description: \"Full reset\" },\n {\n method: \"POST\",\n path: \"/__aimock/reset/journal\",\n service: \"control\",\n description: \"Journal-only reset\",\n },\n {\n method: \"POST\",\n path: \"/__aimock/reset/fixtures\",\n service: \"control\",\n description: \"Full reset (deprecated alias)\",\n },\n { method: \"POST\", path: \"/__aimock/error\", service: \"control\", description: \"One-shot error\" },\n {\n method: \"GET\",\n path: \"/__aimock/openapi.json\",\n service: \"control\",\n description: \"OpenAPI catalog\",\n },\n { method: \"GET\", path: \"/__aimock/routes\", service: \"control\", description: \"Flat route list\" },\n];\n\n/**\n * Compile an OpenAPI path template (`{param}` segments) to the equivalent\n * single-segment matcher. Every `{param}` becomes `[^/]+`; everything else\n * matches literally (including `:action` suffixes like `:predict`).\n *\n * This is intentionally the CANONICAL matcher, not a copy of each\n * dispatcher's regex: a couple of dispatch regexes are deliberately wider\n * (e.g. `VEO_OPERATION_RE` allows multi-segment operation names), so the\n * registry matcher may miss exotic paths the dispatcher serves — but it must\n * never CLAIM a path the dispatcher does not serve, which is the direction\n * the runtime drift guard relies on.\n */\nexport function templateToRegExp(template: string): RegExp {\n const pattern = template\n .split(/(\\{[^}]+\\})/g)\n .map((part) =>\n /^\\{[^}]+\\}$/.test(part) ? \"[^/]+\" : part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n )\n .join(\"\");\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Find the registry entry serving `METHOD pathname`, in dispatcher order\n * (first match wins — `ROUTE_DEFINITIONS` is kept in dispatch order for\n * exactly this reason). Returns `undefined` when no catalog entry covers the\n * request. Method comparison is case-insensitive, like the dispatcher.\n */\nexport function matchRouteDefinition(\n method: string,\n pathname: string,\n): RouteDefinition | undefined {\n const want = method.toUpperCase();\n for (const def of ROUTE_DEFINITIONS) {\n if (def.method.toUpperCase() !== want) continue;\n if (def.path === pathname) return def;\n if (def.path.includes(\"{\") && templateToRegExp(def.path).test(pathname)) return def;\n }\n return undefined;\n}\n"],"mappings":"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AS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CAED;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CAED;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAO,MAAM;EAAc,SAAS;EAAW,aAAa;EAAc;CACpF;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CAED;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAO,MAAM;EAAa,SAAS;EAAS,aAAa;EAAa;CAChF;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CAED;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CAID;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,aAAa;EACb,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CAED;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CAED;EAAE,QAAQ;EAAO,MAAM;EAAoB,SAAS;EAAW,aAAa;EAAkB;CAC9F;EAAE,QAAQ;EAAO,MAAM;EAAqB,SAAS;EAAW,aAAa;EAAmB;CAChG;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAQ,MAAM;EAAsB,SAAS;EAAW,aAAa;EAAgB;CAC/F;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAO,MAAM;EAAmB,SAAS;EAAW,aAAa;EAAqB;CAChG;EAAE,QAAQ;EAAQ,MAAM;EAAmB,SAAS;EAAW,aAAa;EAAoB;CAChG;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAQ,MAAM;EAAmB,SAAS;EAAW,aAAa;EAAc;CAC1F;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAQ,MAAM;EAAmB,SAAS;EAAW,aAAa;EAAkB;CAC9F;EACE,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACd;CACD;EAAE,QAAQ;EAAO,MAAM;EAAoB,SAAS;EAAW,aAAa;EAAmB;CAChG;;;;;;;;;;;;;AAcD,SAAgB,iBAAiB,UAA0B;CACzD,MAAM,UAAU,SACb,MAAM,eAAe,CACrB,KAAK,SACJ,cAAc,KAAK,KAAK,GAAG,UAAU,KAAK,QAAQ,uBAAuB,OAAO,CACjF,CACA,KAAK,GAAG;AACX,QAAO,IAAI,OAAO,IAAI,QAAQ,GAAG;;;;;;;;AASnC,SAAgB,qBACd,QACA,UAC6B;CAC7B,MAAM,OAAO,OAAO,aAAa;AACjC,MAAK,MAAM,OAAO,mBAAmB;AACnC,MAAI,IAAI,OAAO,aAAa,KAAK,KAAM;AACvC,MAAI,IAAI,SAAS,SAAU,QAAO;AAClC,MAAI,IAAI,KAAK,SAAS,IAAI,IAAI,iBAAiB,IAAI,KAAK,CAAC,KAAK,SAAS,CAAE,QAAO"}
@@ -0,0 +1,33 @@
1
+ //#region src/route-registry.d.ts
2
+
3
+ interface RouteDefinition {
4
+ method: string;
5
+ /** OpenAPI path template, e.g. `/v1/text-to-speech/{voice_id}`. */
6
+ path: string;
7
+ /** Concrete path the live-router drift test probes. Defaults to `path`. */
8
+ examplePath?: string;
9
+ service: string;
10
+ description: string;
11
+ }
12
+ /**
13
+ * Every built-in route, in the same order the dispatcher checks them
14
+ * (mounts → ollama → openrouter-video → byteplus → openrouter discovery →
15
+ * azure/compat → ops → models/requests → provider handlers → fal → chat).
16
+ * Regex branches are represented by their canonical OpenAPI template.
17
+ */
18
+ declare const ROUTE_DEFINITIONS: RouteDefinition[];
19
+ /**
20
+ * Compile an OpenAPI path template (`{param}` segments) to the equivalent
21
+ * single-segment matcher. Every `{param}` becomes `[^/]+`; everything else
22
+ * matches literally (including `:action` suffixes like `:predict`).
23
+ *
24
+ * This is intentionally the CANONICAL matcher, not a copy of each
25
+ * dispatcher's regex: a couple of dispatch regexes are deliberately wider
26
+ * (e.g. `VEO_OPERATION_RE` allows multi-segment operation names), so the
27
+ * registry matcher may miss exotic paths the dispatcher serves — but it must
28
+ * never CLAIM a path the dispatcher does not serve, which is the direction
29
+ * the runtime drift guard relies on.
30
+ */
31
+ //#endregion
32
+ export { ROUTE_DEFINITIONS, RouteDefinition };
33
+ //# sourceMappingURL=route-registry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-registry.d.cts","names":[],"sources":["../src/route-registry.ts"],"sourcesContent":[],"mappings":";;UA0JiB,eAAA;;;;;;;;;;;;;;;cAgBJ,mBAAmB"}
@@ -0,0 +1,33 @@
1
+ //#region src/route-registry.d.ts
2
+
3
+ interface RouteDefinition {
4
+ method: string;
5
+ /** OpenAPI path template, e.g. `/v1/text-to-speech/{voice_id}`. */
6
+ path: string;
7
+ /** Concrete path the live-router drift test probes. Defaults to `path`. */
8
+ examplePath?: string;
9
+ service: string;
10
+ description: string;
11
+ }
12
+ /**
13
+ * Every built-in route, in the same order the dispatcher checks them
14
+ * (mounts → ollama → openrouter-video → byteplus → openrouter discovery →
15
+ * azure/compat → ops → models/requests → provider handlers → fal → chat).
16
+ * Regex branches are represented by their canonical OpenAPI template.
17
+ */
18
+ declare const ROUTE_DEFINITIONS: RouteDefinition[];
19
+ /**
20
+ * Compile an OpenAPI path template (`{param}` segments) to the equivalent
21
+ * single-segment matcher. Every `{param}` becomes `[^/]+`; everything else
22
+ * matches literally (including `:action` suffixes like `:predict`).
23
+ *
24
+ * This is intentionally the CANONICAL matcher, not a copy of each
25
+ * dispatcher's regex: a couple of dispatch regexes are deliberately wider
26
+ * (e.g. `VEO_OPERATION_RE` allows multi-segment operation names), so the
27
+ * registry matcher may miss exotic paths the dispatcher serves — but it must
28
+ * never CLAIM a path the dispatcher does not serve, which is the direction
29
+ * the runtime drift guard relies on.
30
+ */
31
+ //#endregion
32
+ export { ROUTE_DEFINITIONS, RouteDefinition };
33
+ //# sourceMappingURL=route-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-registry.d.ts","names":[],"sources":["../src/route-registry.ts"],"sourcesContent":[],"mappings":";;UA0JiB,eAAA;;;;;;;;;;;;;;;cAgBJ,mBAAmB"}