@vertesia/common 1.5.0-dev.20260725.083715Z → 1.5.0-dev.20260804.124748Z

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 (521) hide show
  1. package/lib/access-control-values.d.ts +98 -0
  2. package/lib/access-control-values.d.ts.map +1 -0
  3. package/lib/access-control-values.js +101 -0
  4. package/lib/access-control-values.js.map +1 -0
  5. package/lib/access-control.d.ts +22 -119
  6. package/lib/access-control.d.ts.map +1 -1
  7. package/lib/access-control.js +6 -78
  8. package/lib/access-control.js.map +1 -1
  9. package/lib/account-values.d.ts +53 -0
  10. package/lib/account-values.d.ts.map +1 -0
  11. package/lib/account-values.js +91 -0
  12. package/lib/account-values.js.map +1 -0
  13. package/lib/analytics.d.ts +12 -38
  14. package/lib/analytics.d.ts.map +1 -1
  15. package/lib/api-schemas/access-control.d.ts +215 -0
  16. package/lib/api-schemas/access-control.d.ts.map +1 -0
  17. package/lib/api-schemas/access-control.js +165 -0
  18. package/lib/api-schemas/access-control.js.map +1 -0
  19. package/lib/api-schemas/account.d.ts +101 -0
  20. package/lib/api-schemas/account.d.ts.map +1 -0
  21. package/lib/api-schemas/account.js +136 -0
  22. package/lib/api-schemas/account.js.map +1 -0
  23. package/lib/api-schemas/adapter.d.ts +80 -0
  24. package/lib/api-schemas/adapter.d.ts.map +1 -0
  25. package/lib/api-schemas/adapter.js +726 -0
  26. package/lib/api-schemas/adapter.js.map +1 -0
  27. package/lib/api-schemas/agent-runs.d.ts +3781 -0
  28. package/lib/api-schemas/agent-runs.d.ts.map +1 -0
  29. package/lib/api-schemas/agent-runs.js +991 -0
  30. package/lib/api-schemas/agent-runs.js.map +1 -0
  31. package/lib/api-schemas/analytics.d.ts +86 -0
  32. package/lib/api-schemas/analytics.d.ts.map +1 -0
  33. package/lib/api-schemas/analytics.js +58 -0
  34. package/lib/api-schemas/analytics.js.map +1 -0
  35. package/lib/api-schemas/apikey.d.ts +231 -0
  36. package/lib/api-schemas/apikey.d.ts.map +1 -0
  37. package/lib/api-schemas/apikey.js +172 -0
  38. package/lib/api-schemas/apikey.js.map +1 -0
  39. package/lib/api-schemas/app-lifecycle.d.ts +1114 -0
  40. package/lib/api-schemas/app-lifecycle.d.ts.map +1 -0
  41. package/lib/api-schemas/app-lifecycle.js +750 -0
  42. package/lib/api-schemas/app-lifecycle.js.map +1 -0
  43. package/lib/api-schemas/app-runtime.d.ts +9056 -0
  44. package/lib/api-schemas/app-runtime.d.ts.map +1 -0
  45. package/lib/api-schemas/app-runtime.js +782 -0
  46. package/lib/api-schemas/app-runtime.js.map +1 -0
  47. package/lib/api-schemas/apps.d.ts +247 -0
  48. package/lib/api-schemas/apps.d.ts.map +1 -0
  49. package/lib/api-schemas/apps.js +366 -0
  50. package/lib/api-schemas/apps.js.map +1 -0
  51. package/lib/api-schemas/audit-trail.d.ts +465 -0
  52. package/lib/api-schemas/audit-trail.d.ts.map +1 -0
  53. package/lib/api-schemas/audit-trail.js +218 -0
  54. package/lib/api-schemas/audit-trail.js.map +1 -0
  55. package/lib/api-schemas/bulk-operation.d.ts +104 -0
  56. package/lib/api-schemas/bulk-operation.d.ts.map +1 -0
  57. package/lib/api-schemas/bulk-operation.js +66 -0
  58. package/lib/api-schemas/bulk-operation.js.map +1 -0
  59. package/lib/api-schemas/commands.d.ts +50 -0
  60. package/lib/api-schemas/commands.d.ts.map +1 -0
  61. package/lib/api-schemas/commands.js +58 -0
  62. package/lib/api-schemas/commands.js.map +1 -0
  63. package/lib/api-schemas/content.d.ts +3561 -0
  64. package/lib/api-schemas/content.d.ts.map +1 -0
  65. package/lib/api-schemas/content.js +842 -0
  66. package/lib/api-schemas/content.js.map +1 -0
  67. package/lib/api-schemas/cost-analytics.d.ts +300 -0
  68. package/lib/api-schemas/cost-analytics.d.ts.map +1 -0
  69. package/lib/api-schemas/cost-analytics.js +218 -0
  70. package/lib/api-schemas/cost-analytics.js.map +1 -0
  71. package/lib/api-schemas/dashboard.d.ts +408 -0
  72. package/lib/api-schemas/dashboard.d.ts.map +1 -0
  73. package/lib/api-schemas/dashboard.js +311 -0
  74. package/lib/api-schemas/dashboard.js.map +1 -0
  75. package/lib/api-schemas/data-store.d.ts +1650 -0
  76. package/lib/api-schemas/data-store.d.ts.map +1 -0
  77. package/lib/api-schemas/data-store.js +504 -0
  78. package/lib/api-schemas/data-store.js.map +1 -0
  79. package/lib/api-schemas/document-processing.d.ts +1501 -0
  80. package/lib/api-schemas/document-processing.d.ts.map +1 -0
  81. package/lib/api-schemas/document-processing.js +312 -0
  82. package/lib/api-schemas/document-processing.js.map +1 -0
  83. package/lib/api-schemas/embeddings.d.ts +184 -0
  84. package/lib/api-schemas/embeddings.d.ts.map +1 -0
  85. package/lib/api-schemas/embeddings.js +102 -0
  86. package/lib/api-schemas/embeddings.js.map +1 -0
  87. package/lib/api-schemas/environment.d.ts +412 -0
  88. package/lib/api-schemas/environment.d.ts.map +1 -0
  89. package/lib/api-schemas/environment.js +170 -0
  90. package/lib/api-schemas/environment.js.map +1 -0
  91. package/lib/api-schemas/events.d.ts +4880 -0
  92. package/lib/api-schemas/events.d.ts.map +1 -0
  93. package/lib/api-schemas/events.js +832 -0
  94. package/lib/api-schemas/events.js.map +1 -0
  95. package/lib/api-schemas/files.d.ts +107 -0
  96. package/lib/api-schemas/files.d.ts.map +1 -0
  97. package/lib/api-schemas/files.js +137 -0
  98. package/lib/api-schemas/files.js.map +1 -0
  99. package/lib/api-schemas/group.d.ts +122 -0
  100. package/lib/api-schemas/group.d.ts.map +1 -0
  101. package/lib/api-schemas/group.js +142 -0
  102. package/lib/api-schemas/group.js.map +1 -0
  103. package/lib/api-schemas/index.d.ts +36 -0
  104. package/lib/api-schemas/index.d.ts.map +1 -0
  105. package/lib/api-schemas/index.js +36 -0
  106. package/lib/api-schemas/index.js.map +1 -0
  107. package/lib/api-schemas/indexing.d.ts +144 -0
  108. package/lib/api-schemas/indexing.d.ts.map +1 -0
  109. package/lib/api-schemas/indexing.js +217 -0
  110. package/lib/api-schemas/indexing.js.map +1 -0
  111. package/lib/api-schemas/integrations.d.ts +269 -0
  112. package/lib/api-schemas/integrations.d.ts.map +1 -0
  113. package/lib/api-schemas/integrations.js +335 -0
  114. package/lib/api-schemas/integrations.js.map +1 -0
  115. package/lib/api-schemas/interaction.d.ts +22454 -0
  116. package/lib/api-schemas/interaction.d.ts.map +1 -0
  117. package/lib/api-schemas/interaction.js +2065 -0
  118. package/lib/api-schemas/interaction.js.map +1 -0
  119. package/lib/api-schemas/invites.d.ts +162 -0
  120. package/lib/api-schemas/invites.d.ts.map +1 -0
  121. package/lib/api-schemas/invites.js +106 -0
  122. package/lib/api-schemas/invites.js.map +1 -0
  123. package/lib/api-schemas/oauth-server.d.ts +415 -0
  124. package/lib/api-schemas/oauth-server.d.ts.map +1 -0
  125. package/lib/api-schemas/oauth-server.js +193 -0
  126. package/lib/api-schemas/oauth-server.js.map +1 -0
  127. package/lib/api-schemas/oauth.d.ts +150 -0
  128. package/lib/api-schemas/oauth.d.ts.map +1 -0
  129. package/lib/api-schemas/oauth.js +148 -0
  130. package/lib/api-schemas/oauth.js.map +1 -0
  131. package/lib/api-schemas/parameters.d.ts +64 -0
  132. package/lib/api-schemas/parameters.d.ts.map +1 -0
  133. package/lib/api-schemas/parameters.js +246 -0
  134. package/lib/api-schemas/parameters.js.map +1 -0
  135. package/lib/api-schemas/process.d.ts +499 -0
  136. package/lib/api-schemas/process.d.ts.map +1 -0
  137. package/lib/api-schemas/process.js +817 -0
  138. package/lib/api-schemas/process.js.map +1 -0
  139. package/lib/api-schemas/project-configuration.d.ts +4900 -0
  140. package/lib/api-schemas/project-configuration.d.ts.map +1 -0
  141. package/lib/api-schemas/project-configuration.js +425 -0
  142. package/lib/api-schemas/project-configuration.js.map +1 -0
  143. package/lib/api-schemas/project.d.ts +7247 -0
  144. package/lib/api-schemas/project.d.ts.map +1 -0
  145. package/lib/api-schemas/project.js +185 -0
  146. package/lib/api-schemas/project.js.map +1 -0
  147. package/lib/api-schemas/prompt.d.ts +70 -0
  148. package/lib/api-schemas/prompt.d.ts.map +1 -0
  149. package/lib/api-schemas/prompt.js +77 -0
  150. package/lib/api-schemas/prompt.js.map +1 -0
  151. package/lib/api-schemas/quota.d.ts +90 -0
  152. package/lib/api-schemas/quota.d.ts.map +1 -0
  153. package/lib/api-schemas/quota.js +95 -0
  154. package/lib/api-schemas/quota.js.map +1 -0
  155. package/lib/api-schemas/registry.d.ts +97458 -0
  156. package/lib/api-schemas/registry.d.ts.map +1 -0
  157. package/lib/api-schemas/registry.js +2586 -0
  158. package/lib/api-schemas/registry.js.map +1 -0
  159. package/lib/api-schemas/schema-primitives.d.ts +5 -0
  160. package/lib/api-schemas/schema-primitives.d.ts.map +1 -0
  161. package/lib/api-schemas/schema-primitives.js +11 -0
  162. package/lib/api-schemas/schema-primitives.js.map +1 -0
  163. package/lib/api-schemas/secrets.d.ts +497 -0
  164. package/lib/api-schemas/secrets.d.ts.map +1 -0
  165. package/lib/api-schemas/secrets.js +298 -0
  166. package/lib/api-schemas/secrets.js.map +1 -0
  167. package/lib/api-schemas/store.d.ts +22140 -0
  168. package/lib/api-schemas/store.d.ts.map +1 -0
  169. package/lib/api-schemas/store.js +557 -0
  170. package/lib/api-schemas/store.js.map +1 -0
  171. package/lib/api-schemas/sts.d.ts +156 -0
  172. package/lib/api-schemas/sts.d.ts.map +1 -0
  173. package/lib/api-schemas/sts.js +96 -0
  174. package/lib/api-schemas/sts.js.map +1 -0
  175. package/lib/api-schemas/task.d.ts +215 -0
  176. package/lib/api-schemas/task.d.ts.map +1 -0
  177. package/lib/api-schemas/task.js +95 -0
  178. package/lib/api-schemas/task.js.map +1 -0
  179. package/lib/api-schemas/tools.d.ts +111 -0
  180. package/lib/api-schemas/tools.d.ts.map +1 -0
  181. package/lib/api-schemas/tools.js +122 -0
  182. package/lib/api-schemas/tools.js.map +1 -0
  183. package/lib/api-schemas/user.d.ts +208 -0
  184. package/lib/api-schemas/user.d.ts.map +1 -0
  185. package/lib/api-schemas/user.js +180 -0
  186. package/lib/api-schemas/user.js.map +1 -0
  187. package/lib/api-schemas/view-execution.d.ts +3163 -0
  188. package/lib/api-schemas/view-execution.d.ts.map +1 -0
  189. package/lib/api-schemas/view-execution.js +172 -0
  190. package/lib/api-schemas/view-execution.js.map +1 -0
  191. package/lib/api-schemas/views.d.ts +5990 -0
  192. package/lib/api-schemas/views.d.ts.map +1 -0
  193. package/lib/api-schemas/views.js +396 -0
  194. package/lib/api-schemas/views.js.map +1 -0
  195. package/lib/api-schemas/workflow-runs.d.ts +2209 -0
  196. package/lib/api-schemas/workflow-runs.d.ts.map +1 -0
  197. package/lib/api-schemas/workflow-runs.js +589 -0
  198. package/lib/api-schemas/workflow-runs.js.map +1 -0
  199. package/lib/apikey-values.d.ts +10 -0
  200. package/lib/apikey-values.d.ts.map +1 -0
  201. package/lib/apikey-values.js +11 -0
  202. package/lib/apikey-values.js.map +1 -0
  203. package/lib/apikey.d.ts +37 -36
  204. package/lib/apikey.d.ts.map +1 -1
  205. package/lib/apikey.js +5 -4
  206. package/lib/apikey.js.map +1 -1
  207. package/lib/apps.d.ts +107 -1151
  208. package/lib/apps.d.ts.map +1 -1
  209. package/lib/apps.js.map +1 -1
  210. package/lib/ask-user.d.ts +8 -1
  211. package/lib/ask-user.d.ts.map +1 -1
  212. package/lib/audit-trail.d.ts +17 -128
  213. package/lib/audit-trail.d.ts.map +1 -1
  214. package/lib/audit-trail.js.map +1 -1
  215. package/lib/browser-credentials.d.ts +11 -106
  216. package/lib/browser-credentials.d.ts.map +1 -1
  217. package/lib/common.d.ts +59 -81
  218. package/lib/common.d.ts.map +1 -1
  219. package/lib/cost-analytics.d.ts +14 -167
  220. package/lib/cost-analytics.d.ts.map +1 -1
  221. package/lib/cost-analytics.js.map +1 -1
  222. package/lib/data-platform.d.ts +122 -786
  223. package/lib/data-platform.d.ts.map +1 -1
  224. package/lib/data-platform.js +41 -61
  225. package/lib/data-platform.js.map +1 -1
  226. package/lib/email.d.ts +5 -17
  227. package/lib/email.d.ts.map +1 -1
  228. package/lib/email.js +0 -3
  229. package/lib/email.js.map +1 -1
  230. package/lib/embeddings.d.ts +14 -56
  231. package/lib/embeddings.d.ts.map +1 -1
  232. package/lib/environment.d.ts +19 -115
  233. package/lib/environment.d.ts.map +1 -1
  234. package/lib/environment.js +3 -0
  235. package/lib/environment.js.map +1 -1
  236. package/lib/facets.d.ts +4 -7
  237. package/lib/facets.d.ts.map +1 -1
  238. package/lib/group.d.ts +33 -39
  239. package/lib/group.d.ts.map +1 -1
  240. package/lib/group.js +0 -1
  241. package/lib/group.js.map +1 -1
  242. package/lib/index.d.ts +7 -0
  243. package/lib/index.d.ts.map +1 -1
  244. package/lib/index.js.map +1 -1
  245. package/lib/integrations.d.ts +20 -108
  246. package/lib/integrations.d.ts.map +1 -1
  247. package/lib/integrations.js.map +1 -1
  248. package/lib/interaction-values.d.ts +11 -0
  249. package/lib/interaction-values.d.ts.map +1 -0
  250. package/lib/interaction-values.js +24 -0
  251. package/lib/interaction-values.js.map +1 -0
  252. package/lib/interaction.d.ts +88 -778
  253. package/lib/interaction.d.ts.map +1 -1
  254. package/lib/interaction.js +8 -12
  255. package/lib/interaction.js.map +1 -1
  256. package/lib/meters.d.ts +11 -7
  257. package/lib/meters.d.ts.map +1 -1
  258. package/lib/meters.js.map +1 -1
  259. package/lib/oauth-server.d.ts +33 -119
  260. package/lib/oauth-server.d.ts.map +1 -1
  261. package/lib/oauth.d.ts +14 -96
  262. package/lib/oauth.d.ts.map +1 -1
  263. package/lib/oauth.js +0 -4
  264. package/lib/oauth.js.map +1 -1
  265. package/lib/payload.d.ts +15 -38
  266. package/lib/payload.d.ts.map +1 -1
  267. package/lib/platform-event.d.ts +49 -462
  268. package/lib/platform-event.d.ts.map +1 -1
  269. package/lib/platform-event.js.map +1 -1
  270. package/lib/principal-context.d.ts +10 -15
  271. package/lib/principal-context.d.ts.map +1 -1
  272. package/lib/project-values.d.ts +24 -0
  273. package/lib/project-values.d.ts.map +1 -0
  274. package/lib/project-values.js +42 -0
  275. package/lib/project-values.js.map +1 -0
  276. package/lib/project.d.ts +55 -503
  277. package/lib/project.d.ts.map +1 -1
  278. package/lib/project.js +6 -76
  279. package/lib/project.js.map +1 -1
  280. package/lib/prompt.d.ts +20 -51
  281. package/lib/prompt.d.ts.map +1 -1
  282. package/lib/prompt.js.map +1 -1
  283. package/lib/query.d.ts +27 -88
  284. package/lib/query.d.ts.map +1 -1
  285. package/lib/rate-limiter.d.ts +19 -70
  286. package/lib/rate-limiter.d.ts.map +1 -1
  287. package/lib/rate-limiter.js +0 -3
  288. package/lib/rate-limiter.js.map +1 -1
  289. package/lib/refs.d.ts +3 -11
  290. package/lib/refs.d.ts.map +1 -1
  291. package/lib/refs.js.map +1 -1
  292. package/lib/roles/types.d.ts +14 -20
  293. package/lib/roles/types.d.ts.map +1 -1
  294. package/lib/roles/types.js +5 -9
  295. package/lib/roles/types.js.map +1 -1
  296. package/lib/runs.d.ts +6 -25
  297. package/lib/runs.d.ts.map +1 -1
  298. package/lib/secrets.d.ts +20 -105
  299. package/lib/secrets.d.ts.map +1 -1
  300. package/lib/store/agent-approval.d.ts +5 -14
  301. package/lib/store/agent-approval.d.ts.map +1 -1
  302. package/lib/store/agent-approval.js.map +1 -1
  303. package/lib/store/agent-run.d.ts +57 -358
  304. package/lib/store/agent-run.d.ts.map +1 -1
  305. package/lib/store/collections.d.ts +11 -63
  306. package/lib/store/collections.d.ts.map +1 -1
  307. package/lib/store/collections.js.map +1 -1
  308. package/lib/store/conversation-state.d.ts +61 -61
  309. package/lib/store/conversation-state.d.ts.map +1 -1
  310. package/lib/store/conversation-state.js +2 -0
  311. package/lib/store/conversation-state.js.map +1 -1
  312. package/lib/store/doc-analyzer.d.ts +9 -32
  313. package/lib/store/doc-analyzer.d.ts.map +1 -1
  314. package/lib/store/dsl-workflow.d.ts +37 -151
  315. package/lib/store/dsl-workflow.d.ts.map +1 -1
  316. package/lib/store/dsl-workflow.js.map +1 -1
  317. package/lib/store/editing-policy-schema.generated.d.ts +3 -0
  318. package/lib/store/editing-policy-schema.generated.d.ts.map +1 -0
  319. package/lib/store/editing-policy-schema.generated.js +28 -0
  320. package/lib/store/editing-policy-schema.generated.js.map +1 -0
  321. package/lib/store/grounded-extraction.d.ts +7 -104
  322. package/lib/store/grounded-extraction.d.ts.map +1 -1
  323. package/lib/store/grounded-extraction.js.map +1 -1
  324. package/lib/store/index.d.ts +2 -0
  325. package/lib/store/index.d.ts.map +1 -1
  326. package/lib/store/index.js +3 -0
  327. package/lib/store/index.js.map +1 -1
  328. package/lib/store/intake-policy-schema.generated.d.ts +3 -0
  329. package/lib/store/intake-policy-schema.generated.d.ts.map +1 -0
  330. package/lib/store/intake-policy-schema.generated.js +1425 -0
  331. package/lib/store/intake-policy-schema.generated.js.map +1 -0
  332. package/lib/store/process-schema.d.ts +80 -0
  333. package/lib/store/process-schema.d.ts.map +1 -1
  334. package/lib/store/process-schema.js +79 -0
  335. package/lib/store/process-schema.js.map +1 -1
  336. package/lib/store/process-validation.d.ts.map +1 -1
  337. package/lib/store/process-validation.js +70 -2
  338. package/lib/store/process-validation.js.map +1 -1
  339. package/lib/store/process.d.ts +36 -125
  340. package/lib/store/process.d.ts.map +1 -1
  341. package/lib/store/process.js.map +1 -1
  342. package/lib/store/rendering.d.ts +9 -64
  343. package/lib/store/rendering.d.ts.map +1 -1
  344. package/lib/store/rendering.js.map +1 -1
  345. package/lib/store/store.d.ts +98 -700
  346. package/lib/store/store.d.ts.map +1 -1
  347. package/lib/store/store.js +4 -456
  348. package/lib/store/store.js.map +1 -1
  349. package/lib/store/task.d.ts +15 -59
  350. package/lib/store/task.d.ts.map +1 -1
  351. package/lib/store/task.js +0 -3
  352. package/lib/store/task.js.map +1 -1
  353. package/lib/store/workflow.d.ts +54 -518
  354. package/lib/store/workflow.d.ts.map +1 -1
  355. package/lib/store/workflow.js +23 -11
  356. package/lib/store/workflow.js.map +1 -1
  357. package/lib/sts-token-types.d.ts +12 -66
  358. package/lib/sts-token-types.d.ts.map +1 -1
  359. package/lib/sts-token-types.js.map +1 -1
  360. package/lib/tools.d.ts +8 -100
  361. package/lib/tools.d.ts.map +1 -1
  362. package/lib/transient-tokens-values.d.ts +11 -0
  363. package/lib/transient-tokens-values.d.ts.map +1 -0
  364. package/lib/transient-tokens-values.js +12 -0
  365. package/lib/transient-tokens-values.js.map +1 -0
  366. package/lib/transient-tokens.d.ts +15 -13
  367. package/lib/transient-tokens.d.ts.map +1 -1
  368. package/lib/transient-tokens.js +5 -5
  369. package/lib/transient-tokens.js.map +1 -1
  370. package/lib/user.d.ts +54 -155
  371. package/lib/user.d.ts.map +1 -1
  372. package/lib/user.js +1 -78
  373. package/lib/user.js.map +1 -1
  374. package/lib/versions.d.ts +24 -1
  375. package/lib/versions.d.ts.map +1 -1
  376. package/lib/versions.js +23 -0
  377. package/lib/versions.js.map +1 -1
  378. package/lib/vertesia-common.js +6 -2
  379. package/lib/vertesia-common.js.map +1 -1
  380. package/lib/views-schema.d.ts +4 -4
  381. package/lib/views.d.ts +56 -312
  382. package/lib/views.d.ts.map +1 -1
  383. package/lib/views.js.map +1 -1
  384. package/package.json +13 -4
  385. package/src/access-control-values.ts +113 -0
  386. package/src/access-control.ts +33 -138
  387. package/src/account-values.ts +95 -0
  388. package/src/analytics.ts +18 -42
  389. package/src/api-schemas/access-control.contract.test.ts +209 -0
  390. package/src/api-schemas/access-control.ts +208 -0
  391. package/src/api-schemas/account.contract.test.ts +318 -0
  392. package/src/api-schemas/account.ts +150 -0
  393. package/src/api-schemas/adapter-edge-cases.test.ts +480 -0
  394. package/src/api-schemas/adapter.ts +778 -0
  395. package/src/api-schemas/agent-runs.ts +1081 -0
  396. package/src/api-schemas/analytics.ts +65 -0
  397. package/src/api-schemas/apikey.contract.test.ts +270 -0
  398. package/src/api-schemas/apikey.ts +199 -0
  399. package/src/api-schemas/app-lifecycle.ts +841 -0
  400. package/src/api-schemas/app-runtime.ts +919 -0
  401. package/src/api-schemas/apps.ts +415 -0
  402. package/src/api-schemas/audit-trail.ts +243 -0
  403. package/src/api-schemas/bulk-operation.contract.test.ts +39 -0
  404. package/src/api-schemas/bulk-operation.ts +75 -0
  405. package/src/api-schemas/bundle-isolation.test.ts +80 -0
  406. package/src/api-schemas/commands.contract.test.ts +51 -0
  407. package/src/api-schemas/commands.ts +62 -0
  408. package/src/api-schemas/content.ts +939 -0
  409. package/src/api-schemas/cost-analytics.contract.test.ts +64 -0
  410. package/src/api-schemas/cost-analytics.ts +235 -0
  411. package/src/api-schemas/dashboard.contract.test.ts +127 -0
  412. package/src/api-schemas/dashboard.ts +351 -0
  413. package/src/api-schemas/data-store.contract.test.ts +91 -0
  414. package/src/api-schemas/data-store.ts +571 -0
  415. package/src/api-schemas/document-processing.contract.test.ts +76 -0
  416. package/src/api-schemas/document-processing.ts +344 -0
  417. package/src/api-schemas/embeddings.ts +113 -0
  418. package/src/api-schemas/environment.contract.test.ts +184 -0
  419. package/src/api-schemas/environment.ts +190 -0
  420. package/src/api-schemas/events.ts +921 -0
  421. package/src/api-schemas/files.ts +159 -0
  422. package/src/api-schemas/group.contract.test.ts +205 -0
  423. package/src/api-schemas/group.ts +155 -0
  424. package/src/api-schemas/index.ts +35 -0
  425. package/src/api-schemas/indexing.contract.test.ts +83 -0
  426. package/src/api-schemas/indexing.ts +234 -0
  427. package/src/api-schemas/integrations.ts +369 -0
  428. package/src/api-schemas/interaction.ts +2357 -0
  429. package/src/api-schemas/invites.contract.test.ts +268 -0
  430. package/src/api-schemas/invites.ts +127 -0
  431. package/src/api-schemas/llumiverse.contract.test.ts +108 -0
  432. package/src/api-schemas/oauth-server.ts +219 -0
  433. package/src/api-schemas/oauth.contract.test.ts +118 -0
  434. package/src/api-schemas/oauth.ts +166 -0
  435. package/src/api-schemas/parameters.test.ts +402 -0
  436. package/src/api-schemas/parameters.ts +310 -0
  437. package/src/api-schemas/process.ts +929 -0
  438. package/src/api-schemas/project-configuration.ts +478 -0
  439. package/src/api-schemas/project.contract.test.ts +365 -0
  440. package/src/api-schemas/project.ts +214 -0
  441. package/src/api-schemas/prompt.ts +88 -0
  442. package/src/api-schemas/pruning-limits.test.ts +189 -0
  443. package/src/api-schemas/quota.contract.test.ts +147 -0
  444. package/src/api-schemas/quota.ts +122 -0
  445. package/src/api-schemas/registry-groups.test.ts +91 -0
  446. package/src/api-schemas/registry.ts +3487 -0
  447. package/src/api-schemas/response-pruning.test.ts +260 -0
  448. package/src/api-schemas/schema-primitives.ts +12 -0
  449. package/src/api-schemas/secrets.ts +332 -0
  450. package/src/api-schemas/store.contract.test.ts +450 -0
  451. package/src/api-schemas/store.ts +604 -0
  452. package/src/api-schemas/sts.contract.test.ts +80 -0
  453. package/src/api-schemas/sts.ts +110 -0
  454. package/src/api-schemas/task.ts +104 -0
  455. package/src/api-schemas/tools.ts +140 -0
  456. package/src/api-schemas/user.contract.test.ts +191 -0
  457. package/src/api-schemas/user.ts +204 -0
  458. package/src/api-schemas/view-execution.ts +200 -0
  459. package/src/api-schemas/views.ts +437 -0
  460. package/src/api-schemas/workflow-runs.ts +653 -0
  461. package/src/apikey-values.ts +10 -0
  462. package/src/apikey.ts +49 -40
  463. package/src/apps.ts +234 -1213
  464. package/src/ask-user.ts +9 -1
  465. package/src/audit-trail.ts +45 -137
  466. package/src/browser-credentials.ts +21 -106
  467. package/src/common.ts +67 -78
  468. package/src/cost-analytics.ts +37 -176
  469. package/src/data-platform.ts +205 -776
  470. package/src/email.ts +5 -17
  471. package/src/embeddings.ts +22 -60
  472. package/src/environment.ts +52 -126
  473. package/src/facets.ts +4 -7
  474. package/src/group.ts +38 -42
  475. package/src/index.ts +11 -0
  476. package/src/integrations.ts +39 -129
  477. package/src/interaction-values.ts +23 -0
  478. package/src/interaction.ts +162 -902
  479. package/src/meters.ts +11 -7
  480. package/src/oauth-server.ts +58 -127
  481. package/src/oauth.ts +24 -108
  482. package/src/payload.ts +25 -40
  483. package/src/platform-event.ts +98 -484
  484. package/src/principal-context.ts +11 -15
  485. package/src/project-values.ts +41 -0
  486. package/src/project.ts +116 -588
  487. package/src/prompt.ts +34 -61
  488. package/src/query.ts +34 -93
  489. package/src/rate-limiter.ts +27 -75
  490. package/src/refs.ts +4 -11
  491. package/src/roles/types.ts +20 -20
  492. package/src/runs.ts +11 -24
  493. package/src/secrets.ts +38 -117
  494. package/src/store/agent-approval.ts +9 -14
  495. package/src/store/agent-run.ts +93 -450
  496. package/src/store/collections.ts +21 -63
  497. package/src/store/content-type-editing.test.ts +1 -1
  498. package/src/store/conversation-state.ts +75 -64
  499. package/src/store/doc-analyzer.ts +17 -33
  500. package/src/store/dsl-workflow.ts +62 -158
  501. package/src/store/editing-policy-schema.generated.ts +30 -0
  502. package/src/store/grounded-extraction.ts +13 -104
  503. package/src/store/index.ts +3 -0
  504. package/src/store/intake-policy-schema.generated.ts +1442 -0
  505. package/src/store/process-schema.test.ts +43 -0
  506. package/src/store/process-schema.ts +79 -0
  507. package/src/store/process-validation.test.ts +141 -0
  508. package/src/store/process-validation.ts +82 -2
  509. package/src/store/process.ts +70 -146
  510. package/src/store/rendering.ts +15 -64
  511. package/src/store/store.ts +197 -1204
  512. package/src/store/task.ts +25 -59
  513. package/src/store/workflow.ts +97 -557
  514. package/src/sts-token-types.ts +24 -75
  515. package/src/tools.ts +18 -97
  516. package/src/transient-tokens-values.ts +11 -0
  517. package/src/transient-tokens.ts +16 -13
  518. package/src/user.ts +74 -214
  519. package/src/versions.ts +24 -0
  520. package/src/views-schema.test.ts +9 -1
  521. package/src/views.ts +106 -329
@@ -0,0 +1,402 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { type JsonObject, toOpenApiComponents } from './adapter.js';
3
+ import { normalizeParameters } from './parameters.js';
4
+ import { ApiSchemaComponents, normalizeApiParameters, validateApiRequest } from './registry.js';
5
+
6
+ /**
7
+ * Fixtures are LOCAL rather than added to the registry, on purpose. `ApiSchemaComponents` is what the
8
+ * OpenAPI document publishes, so registering a component to exercise a coercion rule would put it in
9
+ * the spec. Everything below drives the pure normalizer against hand-built components; the two tests
10
+ * at the bottom then bind to the real registry to prove the published component is the one used.
11
+ */
12
+ const COMPONENTS: Record<string, JsonObject> = toOpenApiComponents(
13
+ {
14
+ Params: {
15
+ type: 'object',
16
+ properties: {
17
+ name: { type: 'string' },
18
+ limit: { type: 'integer' },
19
+ ratio: { type: 'number' },
20
+ enabled: { type: 'boolean' },
21
+ level: { type: 'string', enum: ['account', 'project'] },
22
+ tags: { type: 'array', items: { type: 'string' } },
23
+ ids: { type: 'array', items: { type: 'integer' } },
24
+ // What zod emits for `z.union([z.string(), z.array(z.string())])`, and what the scanner
25
+ // publishes as a single `type: array` parameter with `explode: true`.
26
+ single_or_many: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }] },
27
+ statuses: { type: 'array', items: { $ref: '#/components/schemas/Status' } },
28
+ // The same union shape as `single_or_many`, over an enum: what `ListTasksQuery`
29
+ // declares for `status`.
30
+ status_or_many: {
31
+ anyOf: [
32
+ { $ref: '#/components/schemas/Status' },
33
+ { type: 'array', items: { $ref: '#/components/schemas/Status' } },
34
+ ],
35
+ },
36
+ // An enum with a comma inside a member, which is what makes splitting ambiguous.
37
+ separators: { type: 'array', items: { type: 'string', enum: ['a,b', 'c'] } },
38
+ nullable_count: { anyOf: [{ type: 'integer' }, { type: 'null' }] },
39
+ listed_type: { type: ['integer', 'null'] },
40
+ freeform: {},
41
+ status: { $ref: '#/components/schemas/Status' },
42
+ },
43
+ required: ['name'],
44
+ },
45
+ Status: { type: 'string', enum: ['on', 'off'] },
46
+ Headers: {
47
+ type: 'object',
48
+ properties: { 'X-Request-Id': { type: 'string' }, 'x-retry-count': { type: 'integer' } },
49
+ },
50
+ NotAnObject: { type: 'string' },
51
+ },
52
+ {},
53
+ );
54
+
55
+ function normalize(raw: Record<string, string | string[] | undefined>, component = 'Params') {
56
+ return normalizeParameters(component, raw, 'query', COMPONENTS[component], COMPONENTS);
57
+ }
58
+
59
+ describe('required and optional values', () => {
60
+ it('omits a parameter that did not arrive, leaving requiredness to the component', () => {
61
+ // The distinction that matters: omitted, not present-as-undefined. Validating `undefined`
62
+ // against `type: string` would report a type error where the contract says "absent".
63
+ expect(normalize({ name: 'acme' }).value).toEqual({ name: 'acme' });
64
+ expect('limit' in normalize({ name: 'acme' }).value).toBe(false);
65
+ });
66
+
67
+ it('treats an explicitly undefined transport value as absence too', () => {
68
+ // `ctx.headers` exposes this shape for a header that was not sent.
69
+ expect(normalize({ name: 'acme', limit: undefined }).value).toEqual({ name: 'acme' });
70
+ });
71
+
72
+ it('produces an empty object when every declared parameter is optional and none arrived', () => {
73
+ expect(normalizeParameters('Headers', {}, 'query', COMPONENTS.Headers, COMPONENTS).value).toEqual({});
74
+ });
75
+
76
+ it('leaves a missing required parameter for the component to reject, rather than inventing a message', () => {
77
+ // The normalizer never rejects: it omits `name` and returns. That the omission is an error is
78
+ // the component's own statement, which keeps one contract in charge of requiredness.
79
+ expect(() => normalize({ limit: '5' })).not.toThrow();
80
+ expect(normalize({ limit: '5' }).value).toEqual({ limit: 5 });
81
+ });
82
+
83
+ it('keeps an empty string as a value for a string parameter', () => {
84
+ // `?name=` is a present, empty value. A `type: string` can hold it, so it passes through and
85
+ // the component decides — inventing absence here would let the server read a URL the schema
86
+ // does not describe.
87
+ expect(normalize({ name: '' }).value).toEqual({ name: '' });
88
+ });
89
+ });
90
+
91
+ describe('scalar coercion', () => {
92
+ it.each([
93
+ ['integer', 'limit', '25', 25],
94
+ ['integer with exponent', 'limit', '1e3', 1000],
95
+ ['integer, zero-padded', 'limit', '007', 7],
96
+ ['negative integer', 'limit', '-3', -3],
97
+ ['number', 'ratio', '1.5', 1.5],
98
+ ['number, leading dot', 'ratio', '.5', 0.5],
99
+ ['number, explicit plus', 'ratio', '+2', 2],
100
+ ['boolean true', 'enabled', 'true', true],
101
+ ['boolean false', 'enabled', 'false', false],
102
+ ['boolean spelled as 1', 'enabled', '1', true],
103
+ ['boolean spelled as 0', 'enabled', '0', false],
104
+ ['string is untouched', 'name', '25', '25'],
105
+ ['enum is untouched', 'level', 'account', 'account'],
106
+ ['a schema with no type is untouched', 'freeform', 'anything', 'anything'],
107
+ ])('coerces %s', (_label, key, raw, expected) => {
108
+ expect(normalize({ [key]: raw }).value[key]).toBe(expected);
109
+ });
110
+
111
+ it('coerces through a $ref to a hoisted enum', () => {
112
+ // Reached through the adapter's own reference resolution, so what is coerced towards and what
113
+ // the spec publishes are read off the same node.
114
+ expect(normalize({ status: 'on' }).value.status).toBe('on');
115
+ });
116
+
117
+ it.each([
118
+ ['a nullable integer union', 'nullable_count'],
119
+ ['a type list containing null', 'listed_type'],
120
+ ])('coerces %s as its non-null type', (_label, key) => {
121
+ expect(normalize({ [key]: '4' }).value[key]).toBe(4);
122
+ });
123
+ });
124
+
125
+ describe('invalid coercion is left for the component to report', () => {
126
+ it.each([
127
+ ['non-numeric text', 'limit', 'abc'],
128
+ ['an empty value for a number', 'limit', ''],
129
+ ['whitespace around a number', 'limit', ' 1'],
130
+ ['hex', 'limit', '0x10'],
131
+ ['Infinity', 'ratio', 'Infinity'],
132
+ ['NaN', 'ratio', 'NaN'],
133
+ ['a trailing exponent', 'limit', '1e'],
134
+ ['a boolean spelled as yes', 'enabled', 'yes'],
135
+ ['an empty value for a boolean', 'enabled', ''],
136
+ ['a capitalised boolean', 'enabled', 'True'],
137
+ ])('leaves %s as the original text', (_label, key, raw) => {
138
+ const { value } = normalize({ name: 'acme', [key]: raw });
139
+ // Left as text rather than coerced to NaN or a guess: the component then reports a type error
140
+ // naming this parameter, which is a better message than anything invented here.
141
+ expect(value[key]).toBe(raw);
142
+ });
143
+
144
+ it('does not truncate a non-integral value for an integer parameter', () => {
145
+ // Coerced to a number and handed on, so `type: integer` rejects it. `parseInt` would have
146
+ // silently produced 1 and accepted a request the document says is invalid.
147
+ expect(normalize({ name: 'a', limit: '1.5' }).value.limit).toBe(1.5);
148
+ });
149
+ });
150
+
151
+ describe('arrays and repeated values', () => {
152
+ it('wraps a single occurrence, matching the published explode: true', () => {
153
+ expect(normalize({ name: 'a', tags: 'x' }).value.tags).toEqual(['x']);
154
+ });
155
+
156
+ it('collects repeated occurrences in arrival order', () => {
157
+ expect(normalize({ name: 'a', tags: ['x', 'y'] }).value.tags).toEqual(['x', 'y']);
158
+ });
159
+
160
+ it('coerces each item', () => {
161
+ expect(normalize({ name: 'a', ids: ['1', '2'] }).value.ids).toEqual([1, 2]);
162
+ });
163
+
164
+ it('leaves an uncoercible item in place rather than dropping it', () => {
165
+ // Dropping would silently shorten the array; the component reports the bad item by index.
166
+ expect(normalize({ name: 'a', ids: ['1', 'x'] }).value.ids).toEqual([1, 'x']);
167
+ });
168
+
169
+ it('reads a string-or-array union as an array, the shape the spec publishes', () => {
170
+ // The scanner collapses this union into one `type: array` parameter with `explode: true`, so
171
+ // reading the scalar variant would hand the handler a bare string where the spec promised an
172
+ // array.
173
+ expect(normalize({ name: 'a', single_or_many: 'x' }).value.single_or_many).toEqual(['x']);
174
+ expect(normalize({ name: 'a', single_or_many: ['x', 'y'] }).value.single_or_many).toEqual(['x', 'y']);
175
+ });
176
+
177
+ it('hands repeated occurrences of a single-valued parameter on as an array, so the component rejects them', () => {
178
+ // `?level=account&level=project` is ambiguous and nothing published says which wins. Passing the
179
+ // array through makes the component report a type error instead of the server silently picking
180
+ // one — which is what several hand-written handlers do today.
181
+ expect(normalize({ name: 'a', level: ['account', 'project'] }).value.level).toEqual(['account', 'project']);
182
+ });
183
+ });
184
+
185
+ /**
186
+ * Comma-splitting applies to every array parameter, not only to enums.
187
+ *
188
+ * `explode: true` — what the document publishes — describes repeated keys and says nothing about
189
+ * commas, so this is something the server accepts BEYOND what it promises. It does so because
190
+ * `@vertesia/client` joins every array parameter with `,`, which means every SDK in the field sends
191
+ * the comma form, and because it is what all the hand-written readers this layer replaced already
192
+ * did: `readArray`, `parseTagsFilter`, `parseSourcesQuery`, and the agent-run search's `sort`,
193
+ * `tags` and `categories`.
194
+ */
195
+ describe('comma-joined values, for an array parameter', () => {
196
+ it('splits a plain string array, which is what most filters are', () => {
197
+ // The regression this pins: with splitting limited to enums, `@vertesia/client`'s
198
+ // `sort: ['lol:sideways', 'started_at:desc']` arrived as ONE clause `lol:sideways,started_at:desc`,
199
+ // so the agent-run search sorted on an unmapped field and returned an arbitrary order.
200
+ expect(normalize({ name: 'a', tags: 'x,y' }).value.tags).toEqual(['x', 'y']);
201
+ });
202
+
203
+ it('splits one occurrence into several values', () => {
204
+ expect(normalize({ name: 'a', statuses: 'on,off' }).value.statuses).toEqual(['on', 'off']);
205
+ });
206
+
207
+ it('splits through the single-or-many union, which is how ListTasksQuery declares status', () => {
208
+ expect(normalize({ name: 'a', status_or_many: 'on,off' }).value.status_or_many).toEqual(['on', 'off']);
209
+ expect(normalize({ name: 'a', status_or_many: 'on' }).value.status_or_many).toEqual(['on']);
210
+ });
211
+
212
+ it('composes with repetition rather than replacing it', () => {
213
+ // Both spellings mean the same list, so mixing them is not a third case to decide.
214
+ expect(normalize({ name: 'a', statuses: ['on,off', 'on'] }).value.statuses).toEqual(['on', 'off', 'on']);
215
+ });
216
+
217
+ it('leaves an unknown member in place for the enum to reject', () => {
218
+ // Not dropped: the component reports `bogus` by index, so the caller learns which value was
219
+ // wrong rather than getting a silently shorter filter.
220
+ expect(normalize({ name: 'a', statuses: 'on,bogus' }).value.statuses).toEqual(['on', 'bogus']);
221
+ });
222
+
223
+ it('cannot express a value that contains a comma — the cost of the rule above', () => {
224
+ // `'a,b'` is a declared member of this enum, and it is now unreachable: the caller has no way
225
+ // to escape the separator. Pinned rather than fixed because it is not a new limit — every
226
+ // reader this layer replaced split unconditionally — and because no published parameter has
227
+ // a comma-bearing member today. It is the reason a parameter whose values may legitimately
228
+ // contain commas must not be declared as an array of plain strings.
229
+ expect(normalize({ name: 'a', separators: 'a,b' }).value.separators).toEqual(['a', 'b']);
230
+ });
231
+ });
232
+
233
+ describe('undeclared parameters', () => {
234
+ it('reports undeclared query keys without removing or rejecting anything', () => {
235
+ const { value, undeclared } = normalize({ name: 'a', sort: 'asc', page: '2' });
236
+ expect(undeclared).toEqual(['sort', 'page']);
237
+ // Not in the validated copy, so the component never sees them: whether they are an error is
238
+ // the endpoint's policy, not the component's.
239
+ expect(value).toEqual({ name: 'a' });
240
+ });
241
+
242
+ it('reports nothing when every key is declared', () => {
243
+ expect(normalize({ name: 'a', limit: '1' }).undeclared).toEqual([]);
244
+ });
245
+
246
+ it('does not report a declared key that arrived as undefined', () => {
247
+ expect(normalize({ name: 'a', limit: undefined }).undeclared).toEqual([]);
248
+ });
249
+
250
+ it('never reports undeclared headers, however many arrive', () => {
251
+ // Structural, not a policy: every request carries headers no endpoint declares, so a caller
252
+ // that rejected on this list could only ever reject correct requests.
253
+ const { undeclared } = normalizeParameters(
254
+ 'Headers',
255
+ { accept: '*/*', 'user-agent': 'curl/8', 'x-datadog-trace-id': '1', authorization: 'Bearer x' },
256
+ 'header',
257
+ COMPONENTS.Headers,
258
+ COMPONENTS,
259
+ );
260
+ expect(undeclared).toEqual([]);
261
+ });
262
+ });
263
+
264
+ describe('header name casing', () => {
265
+ function headers(raw: Record<string, string | string[] | undefined>) {
266
+ return normalizeParameters('Headers', raw, 'header', COMPONENTS.Headers, COMPONENTS);
267
+ }
268
+
269
+ it('matches a declared mixed-case name against the lowercased name Node delivers', () => {
270
+ // HTTP field names are case-insensitive and Node has already lowercased them, so a component
271
+ // spelling `X-Request-Id` would never match a real request without this.
272
+ expect(headers({ 'x-request-id': 'abc' }).value).toEqual({ 'X-Request-Id': 'abc' });
273
+ });
274
+
275
+ it('keys the copy by the declared spelling, which is what the component validates', () => {
276
+ expect(Object.keys(headers({ 'x-request-id': 'abc' }).value)).toEqual(['X-Request-Id']);
277
+ });
278
+
279
+ it('coerces a lowercase-declared header too', () => {
280
+ expect(headers({ 'x-retry-count': '2' }).value['x-retry-count']).toBe(2);
281
+ });
282
+
283
+ it('does not case-fold query names, where case is significant', () => {
284
+ // Query parameter names are octet-exact; folding them would make `?Name=` and `?name=` the
285
+ // same parameter, which no part of the document says.
286
+ const { value, undeclared } = normalize({ Name: 'a' });
287
+ expect(value).toEqual({});
288
+ expect(undeclared).toEqual(['Name']);
289
+ });
290
+ });
291
+
292
+ describe('the request is never mutated', () => {
293
+ it('leaves the raw object untouched, including values it coerced', () => {
294
+ // Koa memoizes `ctx.query` per query string and hands the same object to every later reader,
295
+ // so coercing in place would retype values for middleware that never opted in.
296
+ const raw = { name: 'acme', limit: '25', enabled: 'true', tags: 'x' };
297
+ const snapshot = structuredClone(raw);
298
+ const { value } = normalize(raw);
299
+ expect(raw).toEqual(snapshot);
300
+ expect(value).not.toBe(raw);
301
+ expect(value.limit).toBe(25);
302
+ });
303
+
304
+ it('does not alias an array value into the copy', () => {
305
+ const tags = ['x', 'y'];
306
+ const { value } = normalize({ name: 'a', tags });
307
+ expect(value.tags).not.toBe(tags);
308
+ expect(tags).toEqual(['x', 'y']);
309
+ });
310
+ });
311
+
312
+ describe('declaration errors', () => {
313
+ it('refuses a component that is not an object schema', () => {
314
+ // Cannot be expanded into named parameters, and the scanner would not publish one either.
315
+ // Failing is the only honest option: reaching the handler with an unchecked query while the
316
+ // spec advertises a checked one is the drift this whole arrangement exists to prevent.
317
+ expect(() => normalize({}, 'NotAnObject')).toThrow(/not an object schema with properties/);
318
+ });
319
+
320
+ it('refuses a component that does not exist', () => {
321
+ expect(() => normalizeParameters('Missing', {}, 'query', undefined, COMPONENTS)).toThrow(
322
+ /not an object schema with properties/,
323
+ );
324
+ });
325
+ });
326
+
327
+ describe('inherited members are not read as parameters', () => {
328
+ it('ignores a prototype member with a declared name', () => {
329
+ // A `hasOwn` check rather than a truthiness test: without it a component declaring `toString`
330
+ // would receive a function.
331
+ const components: Record<string, JsonObject> = {
332
+ Proto: { type: 'object', properties: { toString: { type: 'string' } } },
333
+ };
334
+ expect(normalizeParameters('Proto', {}, 'query', components.Proto, components).value).toEqual({});
335
+ });
336
+ });
337
+
338
+ describe('bound to the published registry', () => {
339
+ it('normalizes against the same component object the document publishes', () => {
340
+ // The property this slice exists for: one declaration drives the published parameter and the
341
+ // runtime check. `ApiKeyListQuery` is the component `ListApiKeys` declares.
342
+ expect(normalizeApiParameters('ApiKeyListQuery', { level: 'account' }, 'query').value).toEqual({
343
+ level: 'account',
344
+ });
345
+ expect(ApiSchemaComponents.ApiKeyListQuery.properties).toMatchObject({
346
+ level: { enum: ['account', 'project'] },
347
+ });
348
+ });
349
+
350
+ it('produces a copy the registry validator accepts, and rejects a value outside the enum', () => {
351
+ // End to end through the real validators, which is what the enforcer runs.
352
+ const good = normalizeApiParameters('ApiKeyListQuery', { level: 'project' }, 'query');
353
+ expect(validateApiRequest('ApiKeyListQuery', good.value)).toMatchObject({ valid: true });
354
+
355
+ const bad = normalizeApiParameters('ApiKeyListQuery', { level: 'bogus' }, 'query');
356
+ expect(validateApiRequest('ApiKeyListQuery', bad.value)).toMatchObject({ valid: false });
357
+ });
358
+
359
+ it('accepts an absent optional parameter', () => {
360
+ const empty = normalizeApiParameters('ApiKeyListQuery', {}, 'query');
361
+ expect(empty.value).toEqual({});
362
+ expect(validateApiRequest('ApiKeyListQuery', empty.value)).toMatchObject({ valid: true });
363
+ });
364
+
365
+ /**
366
+ * `GET /tasks` is the endpoint the enum rule exists for. `TaskApi.list` builds its status
367
+ * parameter as `query.status.join(',')`, so every SDK in the field sends the comma form; these
368
+ * assertions are what stops enforcement from turning our own client's multi-status listing into
369
+ * a 400.
370
+ */
371
+ it('accepts every spelling of the ListTasksQuery status parameter', () => {
372
+ for (const raw of ['pending,completed', ['pending', 'completed'], ['pending,completed']]) {
373
+ const { value } = normalizeApiParameters('ListTasksQuery', { status: raw }, 'query');
374
+ expect(value.status).toEqual(['pending', 'completed']);
375
+ expect(validateApiRequest('ListTasksQuery', value)).toMatchObject({ valid: true });
376
+ }
377
+ });
378
+
379
+ it('coerces the ListTasksQuery paging parameters, and rejects text that is not a number', () => {
380
+ const good = normalizeApiParameters('ListTasksQuery', { limit: '25', offset: '50' }, 'query');
381
+ expect(good.value).toEqual({ limit: 25, offset: 50 });
382
+ expect(validateApiRequest('ListTasksQuery', good.value)).toMatchObject({ valid: true });
383
+
384
+ // `parseInt('abc')` reached Mongo as `NaN` before this, which disabled the page size cap.
385
+ const bad = normalizeApiParameters('ListTasksQuery', { limit: 'abc' }, 'query');
386
+ expect(validateApiRequest('ListTasksQuery', bad.value)).toMatchObject({ valid: false });
387
+ });
388
+
389
+ it('rejects a status outside the published enum', () => {
390
+ const { value } = normalizeApiParameters('ListTasksQuery', { status: 'pending,bogus' }, 'query');
391
+ expect(validateApiRequest('ListTasksQuery', value)).toMatchObject({ valid: false });
392
+ });
393
+
394
+ it('leaves an undeclared ListTasksQuery parameter out of the validated copy rather than rejecting', () => {
395
+ // `GET /tasks` does not set `rejectUndeclaredQuery`, so a stale `?sort=` keeps working. The
396
+ // undeclared list is reported for the endpoint to act on; the component never sees the key.
397
+ const { value, undeclared } = normalizeApiParameters('ListTasksQuery', { sort: 'asc' }, 'query');
398
+ expect(undeclared).toEqual(['sort']);
399
+ expect(value).toEqual({});
400
+ expect(validateApiRequest('ListTasksQuery', value)).toMatchObject({ valid: true });
401
+ });
402
+ });