@vertesia/common 1.5.0-dev.20260722.120446Z → 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 (522) 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 +116 -1121
  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 -113
  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 +116 -734
  253. package/lib/interaction.d.ts.map +1 -1
  254. package/lib/interaction.js +56 -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 +63 -342
  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 +63 -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 -693
  346. package/lib/store/store.d.ts.map +1 -1
  347. package/lib/store/store.js +4 -443
  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 +56 -516
  354. package/lib/store/workflow.d.ts.map +1 -1
  355. package/lib/store/workflow.js +28 -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 +14 -5
  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/agent-resources.test.ts +100 -0
  389. package/src/analytics.ts +18 -42
  390. package/src/api-schemas/access-control.contract.test.ts +209 -0
  391. package/src/api-schemas/access-control.ts +208 -0
  392. package/src/api-schemas/account.contract.test.ts +318 -0
  393. package/src/api-schemas/account.ts +150 -0
  394. package/src/api-schemas/adapter-edge-cases.test.ts +480 -0
  395. package/src/api-schemas/adapter.ts +778 -0
  396. package/src/api-schemas/agent-runs.ts +1081 -0
  397. package/src/api-schemas/analytics.ts +65 -0
  398. package/src/api-schemas/apikey.contract.test.ts +270 -0
  399. package/src/api-schemas/apikey.ts +199 -0
  400. package/src/api-schemas/app-lifecycle.ts +841 -0
  401. package/src/api-schemas/app-runtime.ts +919 -0
  402. package/src/api-schemas/apps.ts +415 -0
  403. package/src/api-schemas/audit-trail.ts +243 -0
  404. package/src/api-schemas/bulk-operation.contract.test.ts +39 -0
  405. package/src/api-schemas/bulk-operation.ts +75 -0
  406. package/src/api-schemas/bundle-isolation.test.ts +80 -0
  407. package/src/api-schemas/commands.contract.test.ts +51 -0
  408. package/src/api-schemas/commands.ts +62 -0
  409. package/src/api-schemas/content.ts +939 -0
  410. package/src/api-schemas/cost-analytics.contract.test.ts +64 -0
  411. package/src/api-schemas/cost-analytics.ts +235 -0
  412. package/src/api-schemas/dashboard.contract.test.ts +127 -0
  413. package/src/api-schemas/dashboard.ts +351 -0
  414. package/src/api-schemas/data-store.contract.test.ts +91 -0
  415. package/src/api-schemas/data-store.ts +571 -0
  416. package/src/api-schemas/document-processing.contract.test.ts +76 -0
  417. package/src/api-schemas/document-processing.ts +344 -0
  418. package/src/api-schemas/embeddings.ts +113 -0
  419. package/src/api-schemas/environment.contract.test.ts +184 -0
  420. package/src/api-schemas/environment.ts +190 -0
  421. package/src/api-schemas/events.ts +921 -0
  422. package/src/api-schemas/files.ts +159 -0
  423. package/src/api-schemas/group.contract.test.ts +205 -0
  424. package/src/api-schemas/group.ts +155 -0
  425. package/src/api-schemas/index.ts +35 -0
  426. package/src/api-schemas/indexing.contract.test.ts +83 -0
  427. package/src/api-schemas/indexing.ts +234 -0
  428. package/src/api-schemas/integrations.ts +369 -0
  429. package/src/api-schemas/interaction.ts +2357 -0
  430. package/src/api-schemas/invites.contract.test.ts +268 -0
  431. package/src/api-schemas/invites.ts +127 -0
  432. package/src/api-schemas/llumiverse.contract.test.ts +108 -0
  433. package/src/api-schemas/oauth-server.ts +219 -0
  434. package/src/api-schemas/oauth.contract.test.ts +118 -0
  435. package/src/api-schemas/oauth.ts +166 -0
  436. package/src/api-schemas/parameters.test.ts +402 -0
  437. package/src/api-schemas/parameters.ts +310 -0
  438. package/src/api-schemas/process.ts +929 -0
  439. package/src/api-schemas/project-configuration.ts +478 -0
  440. package/src/api-schemas/project.contract.test.ts +365 -0
  441. package/src/api-schemas/project.ts +214 -0
  442. package/src/api-schemas/prompt.ts +88 -0
  443. package/src/api-schemas/pruning-limits.test.ts +189 -0
  444. package/src/api-schemas/quota.contract.test.ts +147 -0
  445. package/src/api-schemas/quota.ts +122 -0
  446. package/src/api-schemas/registry-groups.test.ts +91 -0
  447. package/src/api-schemas/registry.ts +3487 -0
  448. package/src/api-schemas/response-pruning.test.ts +260 -0
  449. package/src/api-schemas/schema-primitives.ts +12 -0
  450. package/src/api-schemas/secrets.ts +332 -0
  451. package/src/api-schemas/store.contract.test.ts +450 -0
  452. package/src/api-schemas/store.ts +604 -0
  453. package/src/api-schemas/sts.contract.test.ts +80 -0
  454. package/src/api-schemas/sts.ts +110 -0
  455. package/src/api-schemas/task.ts +104 -0
  456. package/src/api-schemas/tools.ts +140 -0
  457. package/src/api-schemas/user.contract.test.ts +191 -0
  458. package/src/api-schemas/user.ts +204 -0
  459. package/src/api-schemas/view-execution.ts +200 -0
  460. package/src/api-schemas/views.ts +437 -0
  461. package/src/api-schemas/workflow-runs.ts +653 -0
  462. package/src/apikey-values.ts +10 -0
  463. package/src/apikey.ts +49 -40
  464. package/src/apps.ts +249 -1179
  465. package/src/ask-user.ts +9 -1
  466. package/src/audit-trail.ts +45 -137
  467. package/src/browser-credentials.ts +21 -106
  468. package/src/common.ts +67 -78
  469. package/src/cost-analytics.ts +37 -176
  470. package/src/data-platform.ts +205 -776
  471. package/src/email.ts +5 -17
  472. package/src/embeddings.ts +22 -60
  473. package/src/environment.ts +52 -124
  474. package/src/facets.ts +4 -7
  475. package/src/group.ts +38 -42
  476. package/src/index.ts +11 -0
  477. package/src/integrations.ts +39 -129
  478. package/src/interaction-values.ts +23 -0
  479. package/src/interaction.ts +231 -841
  480. package/src/meters.ts +11 -7
  481. package/src/oauth-server.ts +58 -127
  482. package/src/oauth.ts +24 -108
  483. package/src/payload.ts +25 -40
  484. package/src/platform-event.ts +98 -484
  485. package/src/principal-context.ts +11 -15
  486. package/src/project-values.ts +41 -0
  487. package/src/project.ts +116 -588
  488. package/src/prompt.ts +34 -61
  489. package/src/query.ts +34 -93
  490. package/src/rate-limiter.ts +27 -75
  491. package/src/refs.ts +4 -11
  492. package/src/roles/types.ts +20 -20
  493. package/src/runs.ts +11 -24
  494. package/src/secrets.ts +38 -117
  495. package/src/store/agent-approval.ts +9 -14
  496. package/src/store/agent-run.ts +106 -434
  497. package/src/store/collections.ts +21 -63
  498. package/src/store/content-type-editing.test.ts +17 -0
  499. package/src/store/conversation-state.ts +78 -64
  500. package/src/store/doc-analyzer.ts +17 -33
  501. package/src/store/dsl-workflow.ts +62 -158
  502. package/src/store/editing-policy-schema.generated.ts +30 -0
  503. package/src/store/grounded-extraction.ts +13 -104
  504. package/src/store/index.ts +3 -0
  505. package/src/store/intake-policy-schema.generated.ts +1442 -0
  506. package/src/store/process-schema.test.ts +43 -0
  507. package/src/store/process-schema.ts +79 -0
  508. package/src/store/process-validation.test.ts +141 -0
  509. package/src/store/process-validation.ts +82 -2
  510. package/src/store/process.ts +70 -146
  511. package/src/store/rendering.ts +15 -64
  512. package/src/store/store.ts +197 -1182
  513. package/src/store/task.ts +25 -59
  514. package/src/store/workflow.ts +103 -554
  515. package/src/sts-token-types.ts +24 -75
  516. package/src/tools.ts +18 -97
  517. package/src/transient-tokens-values.ts +11 -0
  518. package/src/transient-tokens.ts +16 -13
  519. package/src/user.ts +74 -214
  520. package/src/versions.ts +24 -0
  521. package/src/views-schema.test.ts +9 -1
  522. package/src/views.ts +106 -329
@@ -0,0 +1,450 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { Ajv } from 'ajv';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { ContentTypeIntakePolicySchema as GeneratedIntakePolicySchema } from '../store/intake-policy-schema.generated.js';
6
+ import type { ContentObjectTypeRef, ContentTypeIntakePolicy, IntakePageRanges } from '../store/store.js';
7
+ import type { JsonObject } from './adapter.js';
8
+ import { ApiSchemaComponents, bundleCanonicalComponent, validateApiResponse } from './registry.js';
9
+ import { ContentTypeIntakePolicySchema } from './store.js';
10
+
11
+ /** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
12
+ type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
13
+ function assertType<T extends true>(_ok: T): void {}
14
+
15
+ /**
16
+ * The intake policy is now stated once, in Zod, and reaches its consumers three ways: as the
17
+ * published OpenAPI component, as the checked-in JSON artifact that zeno-server / the workflow tool /
18
+ * the web editor compiles, and as the TypeScript type. This file is the gate that keeps all three
19
+ * the same statement.
20
+ *
21
+ * It also pins the behaviour changes the conversion makes, because the schema it replaced was
22
+ * hand-written and disagreed with the contract in both directions. Each is asserted rather than
23
+ * described: the whole point of the migration is that a disagreement fails a build instead of
24
+ * shipping.
25
+ */
26
+ const ajv = new Ajv({ strict: false, allErrors: true });
27
+ const validate = ajv.compile<ContentTypeIntakePolicy>(GeneratedIntakePolicySchema);
28
+
29
+ function errors(): string {
30
+ return ajv.errorsText(validate.errors, { separator: '\n' });
31
+ }
32
+
33
+ /**
34
+ * Reads a file from the studio repository this package is a submodule of.
35
+ *
36
+ * `undefined` when it is not there, which is the normal state in this repository's own CI: it clones
37
+ * composableai alone, so nothing above the submodule root exists. Two of the gates below compare
38
+ * against the published document and the generated-client fixture, both of which live up there — so
39
+ * they are skipped when they cannot be read rather than failing the whole file at import time, which
40
+ * is what used to happen and what left this suite red on every commit.
41
+ *
42
+ * They still run where they are the actual gate: a checkout of the parent repository, which is what
43
+ * the migration's own verification and the studio CI use.
44
+ */
45
+ function readFromStudioRepo(relativePath: string): unknown {
46
+ try {
47
+ return JSON.parse(readFileSync(fileURLToPath(new URL(relativePath, import.meta.url)), 'utf8'));
48
+ } catch (error) {
49
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;
50
+ throw error;
51
+ }
52
+ }
53
+
54
+ const publishedDocument = readFromStudioRepo('../../../../../packages/api-specs/vertesia-openapi.json') as
55
+ | { components: { schemas: Record<string, Record<string, unknown>> } }
56
+ | undefined;
57
+ const published = publishedDocument?.components.schemas ?? {};
58
+
59
+ /**
60
+ * The published component minus the OpenAPI-only discriminator hint the bundler drops.
61
+ *
62
+ * Written out here rather than imported from the registry on purpose: reusing the production
63
+ * function to check the production function would make the comparison below pass by construction.
64
+ * The rule is small enough to state twice, and stating it twice is what makes it a gate.
65
+ */
66
+ function withoutDiscriminatorHints(value: unknown): unknown {
67
+ if (Array.isArray(value)) return value.map(withoutDiscriminatorHints);
68
+ if (!value || typeof value !== 'object') return value;
69
+ const node = value as Record<string, unknown>;
70
+ const restated = node.discriminator !== undefined && node.properties === undefined;
71
+ return Object.fromEntries(
72
+ Object.entries(node)
73
+ .filter(([key]) => key !== 'discriminator' && !(restated && (key === 'type' || key === 'required')))
74
+ .map(([key, item]) => [key, withoutDiscriminatorHints(item)]),
75
+ );
76
+ }
77
+
78
+ function $defsOf(schema: unknown): unknown {
79
+ return (schema as { $defs: unknown }).$defs;
80
+ }
81
+
82
+ describe.skipIf(!publishedDocument)('gate — generated artifact = canonical component = published component', () => {
83
+ it('is the exact bundle the registry emits, so the artifact is compiled output', () => {
84
+ // Deep equality, not a spot check: the file is generated by `pnpm run gen:schemas` from this
85
+ // same function, so any difference means someone hand-edited it or forgot to regenerate.
86
+ expect(GeneratedIntakePolicySchema).toEqual(bundleCanonicalComponent('ContentTypeIntakePolicy'));
87
+ });
88
+
89
+ it('describes the same shape as the component the OpenAPI document publishes', () => {
90
+ // The artifact re-roots `#/components/schemas/X` to `#/$defs/X` so AJV and Monaco can compile
91
+ // it standalone. Undoing that is what makes the two directly comparable.
92
+ const { $defs, ...body } = GeneratedIntakePolicySchema as { $defs: Record<string, unknown> };
93
+ const rerooted = JSON.parse(JSON.stringify(body).replaceAll('#/$defs/', '#/components/schemas/'));
94
+ expect(rerooted).toEqual(withoutDiscriminatorHints(published.ContentTypeIntakePolicy));
95
+
96
+ // ...and every definition it carries is the published component of that name, so the bundle
97
+ // cannot describe a private variant of a shared type.
98
+ for (const [name, definition] of Object.entries($defs)) {
99
+ const asComponent = JSON.parse(JSON.stringify(definition).replaceAll('#/$defs/', '#/components/schemas/'));
100
+ expect(asComponent, `$defs.${name} disagrees with the published component`).toEqual(
101
+ withoutDiscriminatorHints(published[name]),
102
+ );
103
+ }
104
+ });
105
+
106
+ it('drops the discriminator hint the published component keeps, and only that', () => {
107
+ // The one place the artifact and the component are allowed to differ, pinned from both sides
108
+ // so neither can move alone. `synthesizeDiscriminator` restates `type` and `required` on the
109
+ // union node for the generated Java/Go clients; the node has no `properties`, and Gemini
110
+ // rejects the whole tool schema over it ("requires unspecified property '_option_id'") when
111
+ // the artifact reaches Vertex inside `create_or_update_type`'s input schema.
112
+ expect(published.ModelOptions).toMatchObject({
113
+ discriminator: { propertyName: '_option_id' },
114
+ type: 'object',
115
+ required: ['_option_id'],
116
+ });
117
+
118
+ const bundled = ($defsOf(GeneratedIntakePolicySchema) as Record<string, Record<string, unknown>>).ModelOptions;
119
+ expect(bundled.discriminator).toBeUndefined();
120
+ expect(bundled.required).toBeUndefined();
121
+ expect(bundled.type).toBeUndefined();
122
+ // The branches are what carried the contract all along, so nothing was validated away.
123
+ expect((bundled.oneOf as unknown[]).length).toBe(
124
+ ((published.ModelOptions as { oneOf: unknown[] }).oneOf ?? []).length,
125
+ );
126
+ });
127
+
128
+ it('registers the component the alias claims, under the id the alias name requires', () => {
129
+ expect(Object.keys(ApiSchemaComponents)).toContain('ContentTypeIntakePolicy');
130
+ assertType<Equals<ContentTypeIntakePolicy, (typeof ContentTypeIntakePolicySchema)['_zod']['output']>>(true);
131
+ });
132
+ });
133
+
134
+ /**
135
+ * Bodies that probe where the two validators could disagree.
136
+ *
137
+ * The gate above compares the artifact to the component, and both are produced by the SAME adapter
138
+ * from the SAME Zod schema — so any transform applied on the way out is invisible to it. That blind
139
+ * spot shipped once: an adapter pass stripped the bounds `z.int()` attaches for the JavaScript
140
+ * safe-integer range, on the reasoning that no JSON value could fall outside them. `1e20` does, and
141
+ * the Zod schema rejected it while the generated schema accepted it. Nothing in a
142
+ * schema-versus-schema comparison can see that; only running both validators over the same value can.
143
+ */
144
+ const PROBES: unknown[] = [
145
+ // Numeric range, including the values that made the sentinel-stripping bug observable.
146
+ {},
147
+ { extraction: { max_pages: 1 } },
148
+ { extraction: { max_pages: 0 } },
149
+ { extraction: { max_pages: 2.5 } },
150
+ { extraction: { max_pages: 1e20 } },
151
+ { extraction: { max_pages: 2147483647 } },
152
+ { extraction: { max_pages: 2147483648 } },
153
+ { extraction: { max_pages: Number.MAX_SAFE_INTEGER + 1 } },
154
+ { extraction: { max_pages: -1 } },
155
+ { locate: { instructions: 'x', min_pages: 0 } },
156
+ { locate: { instructions: 'x', min_pages: -1 } },
157
+ { locate: { instructions: 'x', min_pages: 1e20 } },
158
+ { locate: { detail: 8 } },
159
+ { text_conversion: { render_dpi: 72 } },
160
+ { text_conversion: { render_dpi: 71 } },
161
+ { text_conversion: { render_dpi: 1e20 } },
162
+ { extraction: { verification: { threshold: 0 } } },
163
+ { extraction: { verification: { threshold: 1 } } },
164
+ { extraction: { verification: { threshold: 1.000001 } } },
165
+ { extraction: { verification: { max_retries: 1e20 } } },
166
+ { extraction: { vision: { max_image_tokens: 1e20, max_payload_mb: 1e20 } } },
167
+ { extraction: { grounding: { window_pages: 1e20, grid_cell_pt: 1e20 } } },
168
+ { extraction: { grounding: { hardness_threshold: 1e20 } } },
169
+ // Page ranges: length, element type, and element magnitude.
170
+ { extraction: { page_ranges: [[1, 2]] } },
171
+ { extraction: { page_ranges: [[-1, -1]] } },
172
+ { extraction: { page_ranges: [[1]] } },
173
+ { extraction: { page_ranges: [[1, 2, 3]] } },
174
+ { extraction: { page_ranges: [[1.5, 2]] } },
175
+ { extraction: { page_ranges: [[1e20, 2]] } },
176
+ // Nullability, unknown keys, and the enums.
177
+ { generate_toc: null },
178
+ { extraction: null },
179
+ { extraction: { max_pages: null } },
180
+ { grounded_extraction: { enabled: true } },
181
+ { locate: { instructions: 'x', dpi: 300 } },
182
+ { extraction: { scope: 'first-two' } },
183
+ { extraction: { vision: { default_detail: 'ultra' } } },
184
+ { default_view: 'pdf' },
185
+ { mode: 'agentic' },
186
+ // The execution config: closedness, the option union, the two enums.
187
+ { extraction: { config: { model: 'm' } } },
188
+ { extraction: { config: { temperature: 0.5 } } },
189
+ { extraction: { config: { http_timeout: { bodyTimeout: 1000 } } } },
190
+ { extraction: { config: { http_timeout: { socketTimeout: 1000 } } } },
191
+ { extraction: { config: { model_options: { _option_id: 'openai-text', temperature: 0.5 } } } },
192
+ { extraction: { config: { model_options: { temperature: 0.5 } } } },
193
+ { extraction: { config: { model_options: { _option_id: 'not-a-driver' } } } },
194
+ { extraction: { config: { run_data: 'STANDARD' } } },
195
+ { extraction: { config: { run_data: 'WHATEVER' } } },
196
+ { extraction: { config: { configMode: 'RUN_CONFIG_ONLY' } } },
197
+ // Wrong types where a shape is expected.
198
+ { extraction: 'nope' },
199
+ { embeddings: { text: 'yes' } },
200
+ { identification: { examples: 'not-a-list' } },
201
+ ];
202
+
203
+ describe('gate — the artifact accepts exactly what the Zod schema accepts', () => {
204
+ it.each(PROBES.map((probe) => [JSON.stringify(probe), probe] as const))('agrees on %s', (_label, probe) => {
205
+ // The point of the migration is that ONE schema is enforced. Two validators built from it
206
+ // that disagree on a value means one of the consumers is enforcing something the source
207
+ // never said, which is the drift this whole exercise removes.
208
+ expect(validate(probe)).toBe(ContentTypeIntakePolicySchema.safeParse(probe).success);
209
+ });
210
+ });
211
+
212
+ describe.skipIf(!publishedDocument)('the fixture the generated Java and Go clients deserialize', () => {
213
+ // `openapi/fixtures/content-type-intake-policy.json` is read by
214
+ // `openapi/java/src/test/.../ContentTypeIntakePolicyDeserializationTest.java` and by
215
+ // `openapi/go/tests/intake_policy_deserialization_test.go`. Asserting it HERE is what stops it
216
+ // going stale: a schema change that the fixture no longer satisfies fails in this package,
217
+ // beside the schema, rather than in a client harness that only CI runs.
218
+ const fixture = readFromStudioRepo('../../../../../openapi/fixtures/content-type-intake-policy.json') ?? {};
219
+
220
+ it('is a policy the canonical schema and the generated artifact both accept', () => {
221
+ expect(ContentTypeIntakePolicySchema.safeParse(fixture).success).toBe(true);
222
+ expect(validate(fixture), errors()).toBe(true);
223
+ });
224
+
225
+ it('exercises the shapes the number -> integer correction changed', () => {
226
+ // The fields whose generated Java type moved from Double to Integer and whose Go type moved
227
+ // from float32 to int32. A fixture that omitted them would let the clients compile and
228
+ // deserialize while proving nothing about the change this batch makes.
229
+ const policy = fixture as ContentTypeIntakePolicy;
230
+ expect(policy.extraction?.max_pages).toBe(6);
231
+ expect(policy.extraction?.page_ranges).toEqual([
232
+ [1, 2],
233
+ [-1, -1],
234
+ ]);
235
+ expect(policy.text_conversion?.render_dpi).toBe(150);
236
+ expect(policy.extraction?.vision?.max_image_tokens).toBe(9000);
237
+ expect(policy.extraction?.grounding?.window_pages).toBe(4);
238
+ // ...and the discriminated union, which is what a Go oneOf decoder gets wrong when the
239
+ // discriminator is missing from the document.
240
+ expect(policy.extraction?.config?.model_options?._option_id).toBe('vertexai-claude');
241
+ });
242
+ });
243
+
244
+ describe('the TypeScript type says what the schema says', () => {
245
+ it('widens page ranges to number[][], which is what the component has always described', () => {
246
+ // `[number, number][]` is what the interface used to claim. The published component is
247
+ // `items: {type: integer}` with `minItems`/`maxItems` — a two-element ARRAY, not a tuple —
248
+ // because a Zod tuple emits `prefixItems`, which generated Java and Go clients read
249
+ // differently. The wire shape is unchanged; the SDK type is corrected to match it.
250
+ assertType<Equals<IntakePageRanges, number[][]>>(true);
251
+ expect(validate({ extraction: { page_ranges: [[1, 2]] } }), errors()).toBe(true);
252
+ });
253
+
254
+ it('keeps the two type refs’ default_view in step with the policy', () => {
255
+ // Those refs spell the union out rather than writing `ContentTypeIntakePolicy['default_view']`,
256
+ // because indexing into a canonical alias makes the generator DROP the property instead of
257
+ // failing. This is what stops the restatement from drifting.
258
+ assertType<
259
+ Equals<
260
+ NonNullable<ContentObjectTypeRef['default_view']>,
261
+ NonNullable<ContentTypeIntakePolicy['default_view']>
262
+ >
263
+ >(true);
264
+ });
265
+ });
266
+
267
+ describe('parity with the hand-written AJV schema it replaces', () => {
268
+ it('still accepts a full policy across every block', () => {
269
+ const policy: ContentTypeIntakePolicy = {
270
+ mode: 'programmatic',
271
+ identification: { guidance: 'Investor reports' },
272
+ locate: { instructions: 'allocation tables', detail: 8, min_pages: 10 },
273
+ text_conversion: { method: 'llm', scope: 'located', render_dpi: 150 },
274
+ extraction: {
275
+ source: 'vision',
276
+ page_ranges: [
277
+ [1, 2],
278
+ [-1, -1],
279
+ ],
280
+ max_pages: 6,
281
+ vision: { default_detail: 'high', max_image_tokens: 9000, max_payload_mb: 12 },
282
+ verification: { threshold: 0.7, max_retries: 2 },
283
+ grounding: {
284
+ enabled: true,
285
+ max_pages: 12,
286
+ hardness_threshold: 0.5,
287
+ config: { model: 'claude-sonnet-4-5' },
288
+ review: { threshold: 0.7, coverage_threshold: 0.2 },
289
+ },
290
+ },
291
+ embeddings: { text: true, properties: true },
292
+ default_view: 'pdf',
293
+ };
294
+ expect(validate(policy), errors()).toBe(true);
295
+ });
296
+
297
+ it('keeps every numeric bound the hand-written schema enforced', () => {
298
+ // These were NOT in the published component — the interface carried no `@minimum` tags — so
299
+ // converting to Zod dropped all eighteen of them until this test caught it. They are restored
300
+ // in the schema, which means the document now publishes constraints the server has enforced
301
+ // all along.
302
+ expect(validate({ locate: { instructions: 'x', min_pages: -1 } })).toBe(false);
303
+ expect(validate({ text_conversion: { render_dpi: 71 } })).toBe(false);
304
+ expect(validate({ extraction: { max_pages: 0 } })).toBe(false);
305
+ expect(validate({ extraction: { verification: { threshold: 1.2 } } })).toBe(false);
306
+ expect(validate({ extraction: { verification: { max_retries: -1 } } })).toBe(false);
307
+ expect(validate({ extraction: { vision: { max_image_tokens: 0 } } })).toBe(false);
308
+ expect(validate({ extraction: { vision: { max_payload_mb: 0 } } })).toBe(false);
309
+ expect(validate({ extraction: { vision: { max_pages_per_call: 0 } } })).toBe(false);
310
+ expect(validate({ extraction: { grounding: { max_pages: 0 } } })).toBe(false);
311
+ expect(validate({ extraction: { grounding: { window_pages: 0 } } })).toBe(false);
312
+ expect(validate({ extraction: { grounding: { grid_cell_pt: 0 } } })).toBe(false);
313
+ expect(validate({ extraction: { grounding: { hardness_threshold: -0.1 } } })).toBe(false);
314
+ expect(validate({ extraction: { grounding: { min_citation_density: 1.1 } } })).toBe(false);
315
+ expect(validate({ extraction: { grounding: { review: { threshold: 1.1 } } } })).toBe(false);
316
+ expect(validate({ extraction: { grounding: { review: { coverage_threshold: -0.1 } } } })).toBe(false);
317
+ });
318
+
319
+ it('keeps the page and DPI counters integral', () => {
320
+ // `type: 'integer'`, which the published component also never stated. A fractional page cap
321
+ // was rejected before this conversion and is rejected after it.
322
+ expect(validate({ extraction: { max_pages: 2.5 } })).toBe(false);
323
+ expect(validate({ text_conversion: { render_dpi: 150.5 } })).toBe(false);
324
+ expect(validate({ extraction: { page_ranges: [[1.5, 2]] } })).toBe(false);
325
+ expect(validate({ extraction: { page_ranges: [[1]] } })).toBe(false);
326
+ expect(validate({ locate: { instructions: 'x', min_pages: 8.5 } })).toBe(false);
327
+ });
328
+
329
+ it('keeps rejecting unknown keys and the obsolete root block', () => {
330
+ expect(validate({ grounded_extraction: { enabled: true } })).toBe(false);
331
+ expect(validate({ locate: { instructions: 'x', dpi: 300 } })).toBe(false);
332
+ expect(validate({ extraction: { vision: { default_detail: 'ultra' } } })).toBe(false);
333
+ });
334
+ });
335
+
336
+ describe('runtime tightenings — recorded as operation 25 of the 1.5 runbook', () => {
337
+ it('rejects an explicit null where the hand-written schema accepted one', () => {
338
+ // The replaced schema carried `nullable: true` on 112 subschemas and AJV honours that keyword
339
+ // for OpenAPI compatibility, so 101 of them accepted `null` — which neither the TypeScript
340
+ // type nor the published component has ever allowed. The fields are optional, not nullable.
341
+ expect(validate({ generate_toc: null })).toBe(false);
342
+ expect(validate({ rendering_template: null })).toBe(false);
343
+ expect(validate({ extraction: { max_pages: null } })).toBe(false);
344
+ expect(validate({ extraction: null })).toBe(false);
345
+ // Omission is still how you say "inherit", which is what every one of those fields meant.
346
+ expect(validate({}), errors()).toBe(true);
347
+ expect(validate({ extraction: {} }), errors()).toBe(true);
348
+ });
349
+
350
+ it('closes the execution config, which the published component already described closed', () => {
351
+ // `config` was `additionalProperties: true` in the hand-written schema while
352
+ // `InteractionExecutionConfiguration` has always been published closed. A stored policy
353
+ // carrying an undeclared key there is now rejected at write time.
354
+ expect(ApiSchemaComponents.InteractionExecutionConfiguration.additionalProperties).toBe(false);
355
+ expect(validate({ extraction: { config: { model: 'claude-sonnet-4-5' } } }), errors()).toBe(true);
356
+ expect(validate({ extraction: { config: { temperature: 0.5 } } })).toBe(false);
357
+ expect(validate({ extraction: { config: { http_timeout: { socketTimeout: 1000 } } } })).toBe(false);
358
+ });
359
+
360
+ it('validates model_options against the union instead of accepting any object', () => {
361
+ // Same class: `model_options` was `{type: object, additionalProperties: true}` in the
362
+ // hand-written schema and `$ref: ModelOptions` in the published component. It now has to name
363
+ // a driver through `_option_id`, which is the discriminator generated clients already use.
364
+ expect(ApiSchemaComponents.ContentTypeIntakePolicy).toBeDefined();
365
+ expect(
366
+ validate({
367
+ extraction: { config: { model_options: { _option_id: 'openai-text', temperature: 0.5 } } },
368
+ }),
369
+ errors(),
370
+ ).toBe(true);
371
+ expect(validate({ extraction: { config: { model_options: { temperature: 0.5 } } } })).toBe(false);
372
+ expect(validate({ extraction: { config: { model_options: { _option_id: 'not-a-driver' } } } })).toBe(false);
373
+ // The empty object is rejected for the same reason, which is why nothing may PUT it on the
374
+ // wire — see `normalizeModelOptions`, which drops an options bag with no options in it.
375
+ expect(validate({ extraction: { config: { model_options: {} } } })).toBe(false);
376
+ });
377
+
378
+ it('constrains the two config enums that were unconstrained strings', () => {
379
+ expect(validate({ extraction: { config: { run_data: 'STANDARD' } } }), errors()).toBe(true);
380
+ expect(validate({ extraction: { config: { run_data: 'WHATEVER' } } })).toBe(false);
381
+ expect(validate({ extraction: { config: { configMode: 'RUN_CONFIG_ONLY' } } }), errors()).toBe(true);
382
+ expect(validate({ extraction: { config: { configMode: 'WHATEVER' } } })).toBe(false);
383
+ });
384
+ });
385
+
386
+ describe('the five content-type shapes are composed, not repeated', () => {
387
+ const properties = (name: string) =>
388
+ Object.keys((ApiSchemaComponents[name] as { properties: Record<string, unknown> }).properties);
389
+ const property = (name: string, key: string) =>
390
+ (ApiSchemaComponents[name] as { properties: Record<string, JsonObject> }).properties[key];
391
+
392
+ it('gives every shape the same definition for a shared field', () => {
393
+ // The drift this guards: five hand-transcribed copies of `table_layout` could disagree about
394
+ // its item type or its description and nothing would notice. They come from one dictionary now.
395
+ const shapes = [
396
+ 'ContentObjectTypeItem',
397
+ 'ContentObjectType',
398
+ 'ContentObjectTypeCatalogEntry',
399
+ 'InCodeTypeDefinition',
400
+ 'CreateContentObjectTypePayload',
401
+ ];
402
+ for (const field of ['table_layout', 'object_schema', 'strict_mode', 'intake', 'editing', 'status']) {
403
+ const rendered = shapes.map((shape) => JSON.stringify(property(shape, field)));
404
+ expect(new Set(rendered).size, `${field} differs across the content-type shapes`).toBe(1);
405
+ }
406
+ });
407
+
408
+ it('keeps the published property order, which composition must not reshuffle', () => {
409
+ // Order is contract: it decides the order of the generated clients' constructor arguments and
410
+ // model fields. The five orders differ because they were derived from five different types.
411
+ expect(properties('ContentObjectTypeItem')).toEqual(properties('ContentObjectType'));
412
+ expect(properties('ContentObjectTypeCatalogEntry').slice(0, 11)).toEqual(properties('InCodeTypeDefinition'));
413
+ expect(properties('CreateContentObjectTypePayload')).toEqual([
414
+ 'status',
415
+ 'is_chunkable',
416
+ 'intake',
417
+ 'editing',
418
+ 'table_layout',
419
+ 'object_schema',
420
+ 'strict_mode',
421
+ 'name',
422
+ 'description',
423
+ 'tags',
424
+ ]);
425
+ });
426
+
427
+ it('keeps the audit fields required on a stored type and optional in the catalog', () => {
428
+ // Not a detail: a catalog entry may be an in-code type contributed by a plugin, which nobody
429
+ // created and nobody has modified. Requiring the four there would reject a legitimate entry.
430
+ const audit = ['updated_by', 'created_by', 'created_at', 'updated_at'];
431
+ const required = (name: string) => (ApiSchemaComponents[name] as { required?: string[] }).required ?? [];
432
+
433
+ expect(required('ContentObjectTypeItem')).toEqual(expect.arrayContaining(audit));
434
+ expect(required('ContentObjectType')).toEqual(expect.arrayContaining(audit));
435
+ for (const field of audit) {
436
+ expect(required('ContentObjectTypeCatalogEntry')).not.toContain(field);
437
+ expect(property('ContentObjectTypeCatalogEntry', field)).toEqual({ type: 'string' });
438
+ }
439
+ });
440
+
441
+ it('accepts a catalog entry for an in-code type that has no audit trail', () => {
442
+ expect(
443
+ validateApiResponse('ContentObjectTypeCatalogEntry', {
444
+ id: 'sys:Invoice',
445
+ name: 'Invoice',
446
+ is_chunkable: false,
447
+ }).valid,
448
+ ).toBe(true);
449
+ });
450
+ });