@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,189 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { findUnprunablePaths, pruneToSchema, toOpenApiComponents } from './adapter.js';
3
+ import { findUnprunableApiPaths } from './registry.js';
4
+
5
+ /**
6
+ * Pins the shapes where pruning declines to narrow.
7
+ *
8
+ * These are limitations, not bugs: guessing which branch of an ambiguous schema applies risks
9
+ * deleting legitimate data. They are pinned here so the boundary is explicit and cannot be
10
+ * mistaken for a secret-removal guarantee — anything sensitive needs an explicit response mapper
11
+ * or a request/response type split.
12
+ */
13
+ describe('shapes where pruning passes values through untouched', () => {
14
+ const SENSITIVE = { a: 'x', stripe_secret: 'sk_live_leak' };
15
+
16
+ it('an allOf intersection is not pruned', () => {
17
+ const components = toOpenApiComponents({
18
+ Merged: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
19
+ });
20
+ expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Merged' }, components)).toEqual(SENSITIVE);
21
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Merged' }, components)).toEqual([' (allOf)']);
22
+ });
23
+
24
+ it('a union without a discriminator is not pruned', () => {
25
+ const components = toOpenApiComponents({
26
+ Loose: {
27
+ anyOf: [
28
+ { type: 'object', properties: { a: { type: 'string' } } },
29
+ { type: 'object', properties: { b: { type: 'string' } } },
30
+ ],
31
+ },
32
+ });
33
+ expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Loose' }, components)).toEqual(SENSITIVE);
34
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Loose' }, components)).toEqual([
35
+ ' (union without discriminator)',
36
+ ]);
37
+ });
38
+
39
+ it('a discriminator value with no mapping entry is not pruned', () => {
40
+ const components = toOpenApiComponents({
41
+ Union: {
42
+ anyOf: [{ $ref: '#/$defs/A' }, { $ref: '#/$defs/B' }],
43
+ $defs: {
44
+ A: { type: 'object', properties: { kind: { const: 'a' } }, required: ['kind'] },
45
+ B: { type: 'object', properties: { kind: { const: 'b' } }, required: ['kind'] },
46
+ },
47
+ },
48
+ });
49
+ const unknownBranch = { kind: 'c', stripe_secret: 'sk_live_leak' };
50
+ expect(pruneToSchema(unknownBranch, { $ref: '#/components/schemas/Union' }, components)).toEqual(unknownBranch);
51
+ });
52
+
53
+ it('an unresolvable reference is not pruned', () => {
54
+ expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Absent' }, {})).toEqual(SENSITIVE);
55
+ });
56
+
57
+ it('patternProperties is not pruned — its keys are declared but absent from `properties`', () => {
58
+ const components = toOpenApiComponents({
59
+ Headers: {
60
+ type: 'object',
61
+ properties: { a: { type: 'string' } },
62
+ patternProperties: { '^x-': { type: 'string' } },
63
+ },
64
+ });
65
+ const payload = { a: 'x', 'x-trace': 'declared-by-pattern', stripe_secret: 'sk_live_leak' };
66
+ expect(pruneToSchema(payload, { $ref: '#/components/schemas/Headers' }, components)).toEqual(payload);
67
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Headers' }, components)).toEqual([
68
+ ' (patternProperties)',
69
+ ]);
70
+ });
71
+
72
+ it('prefixItems is not pruned — tuple positions have their own schemas', () => {
73
+ const components = toOpenApiComponents({
74
+ Pair: { type: 'array', prefixItems: [{ type: 'string' }, { type: 'object' }] },
75
+ });
76
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Pair' }, components)).toEqual([' (prefixItems)']);
77
+ });
78
+
79
+ it('a non-composable sibling further down a reference chain is not pruned', () => {
80
+ // The sibling sits on the alias, not on the node being pruned, so it is only visible once
81
+ // the chain is followed. Reporting it as an unresolved reference would send someone
82
+ // looking for a missing component that exists.
83
+ const components = toOpenApiComponents({
84
+ Alias: { $ref: '#/components/schemas/Closed', additionalProperties: true },
85
+ Closed: { type: 'object', properties: { a: { type: 'string' } }, additionalProperties: false },
86
+ });
87
+ const ref = { $ref: '#/components/schemas/Alias' };
88
+ expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
89
+ expect(findUnprunablePaths(ref, components)).toEqual([
90
+ ' ($ref with unsupported sibling: additionalProperties)',
91
+ ]);
92
+ });
93
+
94
+ it('a reference chain that cycles is not pruned', () => {
95
+ // Mutual aliases never reach a schema describing an object, so there is nothing to narrow
96
+ // against. Following them would loop forever.
97
+ const components = toOpenApiComponents({
98
+ Ping: { $ref: '#/components/schemas/Pong' },
99
+ Pong: { $ref: '#/components/schemas/Ping' },
100
+ });
101
+ const ref = { $ref: '#/components/schemas/Ping' };
102
+ expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
103
+ expect(findUnprunablePaths(ref, components)).toEqual([' (circular $ref)']);
104
+ });
105
+
106
+ it('a $ref with a non-composable sibling is not pruned', () => {
107
+ // Siblings apply conjunctively, so a sibling `additionalProperties: true` does NOT reopen
108
+ // a closed target. Composing that correctly is not something to guess at.
109
+ const components = toOpenApiComponents({
110
+ Wrapper: {
111
+ type: 'object',
112
+ properties: { inner: { $ref: '#/$defs/Closed', additionalProperties: true } },
113
+ $defs: {
114
+ Closed: {
115
+ type: 'object',
116
+ properties: { a: { type: 'string' } },
117
+ additionalProperties: false,
118
+ },
119
+ },
120
+ },
121
+ });
122
+ const payload = { inner: { a: 'x', stripe_secret: 'sk_live_leak' } };
123
+ expect(pruneToSchema(payload, { $ref: '#/components/schemas/Wrapper' }, components)).toEqual(payload);
124
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Wrapper' }, components)).toEqual([
125
+ '/inner ($ref with unsupported sibling: additionalProperties)',
126
+ ]);
127
+ });
128
+ });
129
+
130
+ describe('findUnprunablePaths reports where a component is not closed', () => {
131
+ it('returns nothing for the fully prunable Account component', () => {
132
+ expect(findUnprunableApiPaths('Account')).toEqual([]);
133
+ });
134
+
135
+ it('returns nothing for the discriminated Stripe union', () => {
136
+ // A discriminated union IS prunable — the discriminator selects the branch.
137
+ expect(findUnprunableApiPaths('StripeBillingStatusResponse')).toEqual([]);
138
+ });
139
+
140
+ it('reports the path of a nested ambiguous schema', () => {
141
+ const components = toOpenApiComponents({
142
+ Outer: {
143
+ type: 'object',
144
+ properties: {
145
+ payload: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
146
+ rows: {
147
+ type: 'array',
148
+ items: { anyOf: [{ type: 'object' }, { type: 'object', properties: {} }] },
149
+ },
150
+ },
151
+ },
152
+ });
153
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Outer' }, components).sort()).toEqual([
154
+ '/payload (allOf)',
155
+ '/rows[] (union without discriminator)',
156
+ ]);
157
+ });
158
+
159
+ it('reports an ambiguous schema reached through a map value', () => {
160
+ // additionalProperties is the path every value in a Record<string, T> takes, so its
161
+ // limitations are the map's limitations.
162
+ const components = toOpenApiComponents({
163
+ Registry: {
164
+ type: 'object',
165
+ additionalProperties: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
166
+ },
167
+ });
168
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Registry' }, components)).toEqual(['{} (allOf)']);
169
+ });
170
+
171
+ it('does not flag a scalar union expressed through references', () => {
172
+ // Every branch resolves to an enum, so there are no properties to narrow and the missing
173
+ // discriminator is irrelevant.
174
+ const components = toOpenApiComponents({
175
+ Choice: {
176
+ anyOf: [{ $ref: '#/$defs/Colour' }, { type: 'null' }],
177
+ $defs: { Colour: { type: 'string', enum: ['red', 'green'] } },
178
+ },
179
+ });
180
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Choice' }, components)).toEqual([]);
181
+ });
182
+
183
+ it('terminates on a recursive component', () => {
184
+ const components = toOpenApiComponents({
185
+ Node: { type: 'object', properties: { children: { type: 'array', items: { $ref: '#' } } } },
186
+ });
187
+ expect(findUnprunablePaths({ $ref: '#/components/schemas/Node' }, components)).toEqual([]);
188
+ });
189
+ });
@@ -0,0 +1,147 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ import { describe, expect, it } from 'vitest';
3
+ import type {
4
+ QuotaEffectiveTier,
5
+ QuotaStandingAdmissionClass,
6
+ QuotaStandingResource,
7
+ QuotaStandingResponse,
8
+ QuotaStandingWindow,
9
+ QuotaTierResponse,
10
+ } from '../rate-limiter.js';
11
+ import type { JsonObject } from './adapter.js';
12
+ import { ApiSchemaComponents, apiComponentRef, validateApiResponse } from './registry.js';
13
+
14
+ /** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
15
+ type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
16
+ function assertType<T extends true>(_ok: T): void {}
17
+
18
+ function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
19
+ const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
20
+ ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
21
+ return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
22
+ }
23
+
24
+ const VALID_WINDOW = { limit: 600, used: 12, remaining: 588, window_ms: 60_000 };
25
+
26
+ const VALID_STANDING = {
27
+ tenant_id: '1589ba_149d0b',
28
+ available: true,
29
+ base_tier: 'default',
30
+ effective_tier: 'enterprise',
31
+ api: [{ resource: 'objects', name: 'Content objects', burst: VALID_WINDOW, quota: VALID_WINDOW }],
32
+ admission: {
33
+ classes: [{ class: 'ExecuteConversationWorkflow', tenant_active: 3 }],
34
+ note: 'Budget is global and discovered.',
35
+ },
36
+ llm: { note: 'Shared per environment/model.' },
37
+ };
38
+
39
+ describe('gate 1 — the schema is the single source of truth for the public quota types', () => {
40
+ it('publishes the exact schema-derived type, not a hand-written twin', () => {
41
+ // The whole closure, not only the two types the endpoints return. A hand-written
42
+ // QuotaStandingWindow beside an inferred QuotaStandingResponse would leave the drift path
43
+ // open one level down, where it is harder to see.
44
+ expect(true).toBe(true);
45
+ });
46
+
47
+ it('resolves nested component references to concrete property types', () => {
48
+ // Schema-first only pays off if a $ref survives inference as the referenced type rather
49
+ // than degrading to `unknown` — that is what makes the SDK usable.
50
+ assertType<Equals<QuotaStandingResponse['api'], QuotaStandingResource[]>>(true);
51
+ assertType<Equals<QuotaStandingResource['burst'], QuotaStandingWindow>>(true);
52
+ assertType<Equals<QuotaStandingResponse['admission']['classes'], QuotaStandingAdmissionClass[]>>(true);
53
+ assertType<Equals<QuotaStandingResponse['effective_tier'], QuotaEffectiveTier>>(true);
54
+ assertType<Equals<QuotaTierResponse['tier'], QuotaEffectiveTier>>(true);
55
+ expect(true).toBe(true);
56
+ });
57
+
58
+ it('keeps every quota field required, as the published document declares', () => {
59
+ // `?:` on an inferred field is invisible at the call site until a consumer hits undefined.
60
+ // Identity above would catch a change here, but only by failing somewhere less obvious.
61
+ assertType<Equals<QuotaStandingResponse['available'], boolean>>(true);
62
+ assertType<Equals<QuotaStandingWindow['remaining'], number>>(true);
63
+ assertType<Equals<QuotaStandingResponse['llm'], { note: string }>>(true);
64
+ expect(true).toBe(true);
65
+ });
66
+ });
67
+
68
+ describe('gate 2 — the published components match the closure the types come from', () => {
69
+ it('hoists every id-bearing quota schema into its own component', () => {
70
+ // Six components for two endpoints: the registry must be self-contained, so a canonical
71
+ // component may not reference a TypeScript-derived one.
72
+ const quota = Object.keys(ApiSchemaComponents)
73
+ .filter((name) => name.startsWith('Quota'))
74
+ .sort();
75
+ expect(quota).toEqual([
76
+ 'QuotaEffectiveTier',
77
+ 'QuotaStandingAdmissionClass',
78
+ 'QuotaStandingResource',
79
+ 'QuotaStandingResponse',
80
+ 'QuotaStandingWindow',
81
+ // QuotaTier is the account tier enum, converted with the account slice.
82
+ 'QuotaTier',
83
+ 'QuotaTierResponse',
84
+ ]);
85
+ });
86
+
87
+ it('shares one QuotaStandingWindow component across both referencing properties', () => {
88
+ // The literal pointer, not apiComponentRef: that helper only accepts registry entry names,
89
+ // and QuotaStandingWindow is a hoisted sub-component rather than a slot's contract.
90
+ const props = ApiSchemaComponents.QuotaStandingResource.properties as Record<string, JsonObject>;
91
+ expect(props.burst).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
92
+ expect(props.quota).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
93
+ });
94
+
95
+ it('keeps admission and llm anonymous, as the document publishes them', () => {
96
+ // Naming them would add a $ref the spec does not carry, changing the generated clients.
97
+ const props = ApiSchemaComponents.QuotaStandingResponse.properties as Record<string, JsonObject>;
98
+ expect(props.admission.$ref).toBeUndefined();
99
+ expect(props.admission.type).toBe('object');
100
+ expect(props.llm.$ref).toBeUndefined();
101
+ expect(Object.keys(ApiSchemaComponents)).not.toContain('QuotaStandingAdmission');
102
+ });
103
+ });
104
+
105
+ describe('gate 3 — AJV validates the same canonical objects that are published', () => {
106
+ it('accepts a full standing payload', () => {
107
+ expect(compile('QuotaStandingResponse')(VALID_STANDING)).toBe(true);
108
+ expect(compile('QuotaTierResponse')({ tier: 'enterprise' })).toBe(true);
109
+ });
110
+
111
+ it('rejects a missing required field', () => {
112
+ const { available: _dropped, ...incomplete } = VALID_STANDING;
113
+ expect(compile('QuotaStandingResponse')(incomplete)).toBe(false);
114
+ });
115
+
116
+ it('rejects a numeric window value sent as a string', () => {
117
+ // No coerceTypes: one AJV configuration serves bodies and responses, so a JSON number that
118
+ // arrives as text is a contract violation rather than something quietly repaired.
119
+ const bad = { ...VALID_WINDOW, used: '12' };
120
+ expect(compile('QuotaStandingWindow')(bad)).toBe(false);
121
+ });
122
+
123
+ it('closes the anonymous nested objects the strict policy reaches', () => {
124
+ const withExtra = { ...VALID_STANDING, llm: { note: 'x', rogue: 1 } };
125
+ expect(compile('QuotaStandingResponse')(withExtra)).toBe(false);
126
+ });
127
+ });
128
+
129
+ describe('gate 4 — the response path checks the same component the SDK types come from', () => {
130
+ it('accepts a conforming response and hands back the component type', () => {
131
+ const result = validateApiResponse('QuotaTierResponse', { tier: 'standard' });
132
+ expect(result.valid).toBe(true);
133
+ if (result.valid) {
134
+ assertType<Equals<typeof result.data, QuotaTierResponse>>(true);
135
+ expect(result.data.tier).toBe('standard');
136
+ }
137
+ });
138
+
139
+ it('reports a violation without mutating the payload', () => {
140
+ // Detection, not repair. Outside local development a response mismatch is logged drift, so
141
+ // this must never silently edit what a caller receives.
142
+ const response: Record<string, unknown> = { tier: 42, legacy_extra: 'still here' };
143
+ const pristine = structuredClone(response);
144
+ expect(validateApiResponse('QuotaTierResponse', response).valid).toBe(false);
145
+ expect(response).toEqual(pristine);
146
+ });
147
+ });
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Runtime API schemas for quota standing and tier endpoints.
5
+ */
6
+
7
+ /**
8
+ * Note the `id`: this is a hoisted component in the document, not an inline string. `z.string()` alone
9
+ * would inline it at every use site and change three published schemas.
10
+ */
11
+ export const QuotaEffectiveTierSchema = z.string().meta({
12
+ id: 'QuotaEffectiveTier',
13
+ description:
14
+ 'Effective quota tier name after account-level overrides and account-type derivation. ' +
15
+ 'Code-defined tier names are currently `QuotaTier`, but this remains a string because deployments ' +
16
+ 'can introduce quota tiers through configuration.',
17
+ });
18
+
19
+ /**
20
+ * Descriptions go in `.meta()`, not in TSDoc comments.
21
+ *
22
+ * Zod does not read comments, so public descriptions belong in schema metadata.
23
+ */
24
+ export const QuotaStandingWindowSchema = z
25
+ .object({
26
+ limit: z.number().meta({
27
+ description: 'Effective limit for this window (after effective account tier + per-tenant override).',
28
+ }),
29
+ used: z.number().meta({ description: 'Requests used in the current window.' }),
30
+ remaining: z.number().meta({ description: 'Requests remaining (max(0, limit - used)).' }),
31
+ window_ms: z.number(),
32
+ })
33
+ .meta({
34
+ id: 'QuotaStandingWindow',
35
+ description:
36
+ 'A caller\'s own quota standing (GET /api/v1/quota/standing) — "where am I". API rate limits are ' +
37
+ 'genuinely per-tenant; workflow admission and the LLM limiter are global/discovered, so they are ' +
38
+ 'reported as posture, not per-tenant numbers.',
39
+ });
40
+
41
+ export const QuotaStandingResourceSchema = z
42
+ .object({
43
+ resource: z.string(),
44
+ name: z.string(),
45
+ burst: QuotaStandingWindowSchema,
46
+ quota: QuotaStandingWindowSchema,
47
+ })
48
+ .meta({ id: 'QuotaStandingResource' });
49
+
50
+ export const QuotaStandingAdmissionClassSchema = z
51
+ .object({
52
+ class: z.string().meta({ description: 'Workflow class (e.g. ExecuteConversationWorkflow).' }),
53
+ tenant_active: z.number().meta({ description: "This tenant's currently active (leased) slots for the class." }),
54
+ })
55
+ .meta({ id: 'QuotaStandingAdmissionClass' });
56
+
57
+ export const QuotaStandingResponseSchema = z
58
+ .object({
59
+ tenant_id: z.string(),
60
+ available: z.boolean().meta({
61
+ description:
62
+ 'False when the limiter store (Redis) was unavailable, so `api`/`admission` are empty because ' +
63
+ 'standing could not be read — NOT because there are no limits. Limiters fail open in this case.',
64
+ }),
65
+ base_tier: z
66
+ .string()
67
+ .meta({ description: 'Deployment base tier (env QUOTA_BASE_TIER); `default` = the static limits stand.' }),
68
+ effective_tier: QuotaEffectiveTierSchema.meta({
69
+ description:
70
+ 'Tier used to compute the API limits below: explicit account `quota_tier`, else account_type ' +
71
+ 'derived tier, else `base_tier` when the account tier could not be resolved.',
72
+ }),
73
+ api: z.array(QuotaStandingResourceSchema).meta({
74
+ description: 'Per-resource API rate-limit standing (effective limits + current usage).',
75
+ }),
76
+ // Anonymous in the interface and anonymous in the document, so it stays inline here rather than
77
+ // becoming a named component — naming it would add a `$ref` the spec does not currently publish.
78
+ admission: z
79
+ .object({
80
+ classes: z.array(QuotaStandingAdmissionClassSchema),
81
+ note: z.string(),
82
+ })
83
+ .meta({
84
+ description:
85
+ 'Workflow admission: per-tenant active slots per probed class. The budget itself is global and ' +
86
+ 'discovered (AIMD), not a per-tenant number — this is occupancy, not a limit.',
87
+ }),
88
+ llm: z.object({ note: z.string() }).meta({
89
+ description: 'The LLM interaction limiter is shared per environment/model, not per tenant.',
90
+ }),
91
+ })
92
+ .meta({ id: 'QuotaStandingResponse' });
93
+
94
+ export const QuotaTierResponseSchema = z
95
+ .object({
96
+ tier: QuotaEffectiveTierSchema,
97
+ })
98
+ .meta({
99
+ id: 'QuotaTierResponse',
100
+ description:
101
+ 'Lightweight per-account quota tier for the calling account — served by `GET /api/v1/quota/tier`. ' +
102
+ "A cheap, cacheable read that lets another service (e.g. zeno-server's API rate limiter) resolve " +
103
+ "the caller's tier through studio-server instead of reaching into the account store directly. " +
104
+ "`tier` is the SAME value {@link QuotaStandingResponse.effective_tier } reports: the account's " +
105
+ 'explicit `quota_tier`, else its account_type-derived tier, else the deployment base tier when the ' +
106
+ 'account tier cannot be resolved.',
107
+ });
108
+
109
+ /**
110
+ * The public quota types, inferred rather than written.
111
+ *
112
+ * Every schema in the closure gets one — not only the two the endpoints return. A hand-written
113
+ * `QuotaStandingWindow` sitting beside an inferred `QuotaStandingResponse` would create two
114
+ * definitions of one contract, only one of which OpenAPI publishes and AJV compiles.
115
+ * `../rate-limiter.ts` re-exports these under their public names.
116
+ */
117
+ export type QuotaEffectiveTierFromSchema = z.infer<typeof QuotaEffectiveTierSchema>;
118
+ export type QuotaStandingWindowFromSchema = z.infer<typeof QuotaStandingWindowSchema>;
119
+ export type QuotaStandingResourceFromSchema = z.infer<typeof QuotaStandingResourceSchema>;
120
+ export type QuotaStandingAdmissionClassFromSchema = z.infer<typeof QuotaStandingAdmissionClassSchema>;
121
+ export type QuotaStandingResponseFromSchema = z.infer<typeof QuotaStandingResponseSchema>;
122
+ export type QuotaTierResponseFromSchema = z.infer<typeof QuotaTierResponseSchema>;
@@ -0,0 +1,91 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { type ApiComponentName, type ApiComponentType, ApiSchemaComponents, mergeComponentGroups } from './registry.js';
4
+
5
+ /**
6
+ * `N` when `ApiComponentType` resolves it, and `never` when it does not.
7
+ *
8
+ * The conditional that maps a name to its inferred type tests the groups one by one and ends in
9
+ * `never`, so a group missing from that chain — the third place a new group has to be listed, after
10
+ * the merge array and the `ApiComponentName` union — makes every name in it resolve to `never`
11
+ * rather than fail. Distributing this over the whole union turns that into an assignment error on
12
+ * the list below, which `typecheck:test` reports.
13
+ */
14
+ type ResolvedName<N extends ApiComponentName> = [ApiComponentType<N>] extends [never] ? never : N;
15
+
16
+ /**
17
+ * Covers the one way the group split can corrupt the registry.
18
+ *
19
+ * The registry is declared in several objects because the compiler cannot serialize it as one, and
20
+ * the two public types are assembled from those objects: `ApiComponentName` is a union of `keyof`,
21
+ * `ApiComponentType` a conditional testing the groups IN ORDER. A plain spread merge would accept a
22
+ * name listed twice and keep the LAST group's schema, while `ApiComponentType` would resolve to the
23
+ * FIRST group's — validation enforcing one shape while every handler is typed against another, with
24
+ * nothing downstream to report it. The grouping is a compiler accommodation, so this failure mode is
25
+ * pure accident: a component moved between groups and left behind, or added to whichever group the
26
+ * author had open.
27
+ *
28
+ * The real groups are covered by the call itself, which runs at module load — a duplicate there
29
+ * throws on import and takes every test in the package with it. What is tested here is that the
30
+ * merge actually refuses, which no import of a correct registry can show.
31
+ */
32
+ describe('mergeComponentGroups', () => {
33
+ const A = z.strictObject({ a: z.string() });
34
+ const B = z.strictObject({ b: z.number() });
35
+
36
+ it('merges disjoint groups into one object', () => {
37
+ const merged = mergeComponentGroups([{ Alpha: A }, { Beta: B }]);
38
+
39
+ expect(Object.keys(merged).sort()).toEqual(['Alpha', 'Beta']);
40
+ expect(merged.Alpha).toBe(A);
41
+ expect(merged.Beta).toBe(B);
42
+ });
43
+
44
+ it('refuses a name registered in two groups', () => {
45
+ expect(() => mergeComponentGroups([{ Alpha: A }, { Alpha: B }])).toThrow(
46
+ /registered in more than one group: Alpha/,
47
+ );
48
+ });
49
+
50
+ it('names every colliding component, not just the first', () => {
51
+ expect(() => mergeComponentGroups([{ Beta: B, Alpha: A }, { Alpha: B }, { Beta: A }])).toThrow(
52
+ /components registered in more than one group: Alpha, Beta/,
53
+ );
54
+ });
55
+
56
+ it('reports a collision across non-adjacent groups', () => {
57
+ // The failure is a name in ANY two groups, not only in two that happen to be listed together.
58
+ expect(() => mergeComponentGroups([{ Alpha: A }, { Beta: B }, { Alpha: B }])).toThrow(
59
+ /registered in more than one group: Alpha/,
60
+ );
61
+ });
62
+
63
+ it('emits a component from every group, and resolves its type', () => {
64
+ // The merge takes a list, so a group can be dropped from it as easily as duplicated in it —
65
+ // and dropping one is silent in a different way: `ApiComponentName` still names those
66
+ // components, so the code compiles and only the emitted document loses them. One known name
67
+ // per group is what notices — the `satisfies` for the type conditional, the loop for the
68
+ // merge.
69
+ const perGroup = [
70
+ 'Account',
71
+ 'ProjectModelDefaults',
72
+ 'OAuthProvider',
73
+ 'ExecutionEnvironment',
74
+ 'JSONValue',
75
+ 'Interaction',
76
+ 'ImprovePromptPayload',
77
+ 'AgentRunnerOptions',
78
+ 'ExecutionRunStatus',
79
+ 'RenderPromptResponse',
80
+ 'AggregatedTool',
81
+ 'OAuthAuthStatus',
82
+ 'AuditTrailResponse',
83
+ 'ViewExperience',
84
+ 'CopyFilePayload',
85
+ ] as const satisfies readonly ResolvedName<ApiComponentName>[];
86
+
87
+ for (const name of perGroup) {
88
+ expect(ApiSchemaComponents).toHaveProperty(name);
89
+ }
90
+ });
91
+ });