@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,365 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ import { describe, expect, it } from 'vitest';
3
+ import type { ProjectToolInfo, RenderingTemplateDefinitionRef } from '../apps.js';
4
+ import {
5
+ type AskUserWebhookConfigurationInput,
6
+ type AwsConfiguration,
7
+ type ExaConfigurationInput,
8
+ type GithubConfigurationInput,
9
+ type GladiaConfigurationInput,
10
+ type LinkupConfigurationInput,
11
+ type MagicPdfConfiguration,
12
+ type ResendConfigurationInput,
13
+ type SerperConfigurationInput,
14
+ SupportedIntegrations,
15
+ } from '../integrations.js';
16
+ import type {
17
+ ICreateProjectPayload,
18
+ ModelDefault,
19
+ Project,
20
+ ProjectPluginsUpdatePayload,
21
+ SystemDefaults,
22
+ SystemInteractionCategory,
23
+ } from '../project.js';
24
+ import type { JsonObject } from './adapter.js';
25
+ import type { CreateProjectPayloadFromSchema, ProjectToolInfoArrayFromSchema } from './project.js';
26
+ import { ApiSchemaComponents, apiComponentRef, validateApiRequest, validateApiResponse } from './registry.js';
27
+
28
+ /** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
29
+ type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
30
+ function assertType<T extends true>(_ok: T): void {}
31
+
32
+ function compile(name: string) {
33
+ const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
34
+ ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: ApiSchemaComponents } });
35
+ return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
36
+ }
37
+
38
+ const VALID_TOOL = {
39
+ tool_name: 'web_search',
40
+ app_name: 'Search',
41
+ app_install_id: '68b1779130afe5403a1589bc',
42
+ };
43
+
44
+ describe('gate 1 — the schema is the single source of truth for the converted Projects types', () => {
45
+ it('publishes the exact schema-derived type, not a hand-written twin', () => {
46
+ assertType<Equals<ICreateProjectPayload, CreateProjectPayloadFromSchema>>(true);
47
+ assertType<Equals<ProjectToolInfoArrayFromSchema, ProjectToolInfo[]>>(true);
48
+ expect(true).toBe(true);
49
+ });
50
+
51
+ it('types the plugin list as strings, which is what the collection has always held', () => {
52
+ // The wire type always said `string[]`; `IProject` in @dglabs/server-common said
53
+ // `Types.ObjectId[]`, and the Mongoose schema says `{ type: [String] }`. Validating the
54
+ // payload is what forced the three to agree.
55
+ assertType<Equals<ProjectPluginsUpdatePayload['plugins'], string[]>>(true);
56
+ expect(true).toBe(true);
57
+ });
58
+
59
+ it('preserves enum-member discriminator types in inferred integration configurations', () => {
60
+ assertType<Equals<AskUserWebhookConfigurationInput['integration'], SupportedIntegrations.ask_user_webhook>>(
61
+ true,
62
+ );
63
+ assertType<Equals<AwsConfiguration['integration'], SupportedIntegrations.aws>>(true);
64
+ assertType<Equals<ExaConfigurationInput['integration'], SupportedIntegrations.exa>>(true);
65
+ assertType<Equals<GithubConfigurationInput['integration'], SupportedIntegrations.github>>(true);
66
+ assertType<Equals<GladiaConfigurationInput['integration'], SupportedIntegrations.gladia>>(true);
67
+ assertType<Equals<LinkupConfigurationInput['integration'], SupportedIntegrations.linkup>>(true);
68
+ assertType<Equals<MagicPdfConfiguration['integration'], SupportedIntegrations.magic_pdf>>(true);
69
+ assertType<Equals<ResendConfigurationInput['integration'], SupportedIntegrations.resend>>(true);
70
+ assertType<Equals<SerperConfigurationInput['integration'], SupportedIntegrations.serper>>(true);
71
+ expect(true).toBe(true);
72
+ });
73
+ });
74
+
75
+ /**
76
+ * The batch is deliberately partial, and these two tests pin WHY — so the boundary is a checked fact
77
+ * rather than a claim in a comment that quietly stops being true.
78
+ */
79
+ describe('gate 2 — the closure is closed, bottom-up', () => {
80
+ it('converts Project only after everything it reaches', () => {
81
+ // The order was forced, not chosen. `ProjectConfiguration` reaches
82
+ // `InteractionExecutionConfiguration.model_options`, which is `ModelOptions` — the union of
83
+ // every llumiverse driver's options — and a canonical component may not `$ref` a
84
+ // TypeScript-derived one. So `ModelOptions` converted first, then the intake policy tree,
85
+ // The registry owns the whole reference closure. Asserting the chain prevents a schema
86
+ // group edit from leaving a published `$ref` without its component.
87
+ for (const name of [
88
+ 'ModelOptions',
89
+ 'InteractionExecutionConfiguration',
90
+ 'ContentTypeIntakePolicy',
91
+ 'ProjectIntakeConfiguration',
92
+ 'ProjectConfiguration',
93
+ 'Project',
94
+ ]) {
95
+ expect(Object.keys(ApiSchemaComponents), name).toContain(name);
96
+ }
97
+ });
98
+
99
+ it('publishes dedicated, optional update projections', () => {
100
+ for (const name of ['UpdateProjectPayload', 'UpdateProjectConfigurationPayload']) {
101
+ expect(Object.keys(ApiSchemaComponents), name).toContain(name);
102
+ }
103
+ // `.partial()` of the root, not a restatement: same properties, none required.
104
+ const project = ApiSchemaComponents.Project as JsonObject;
105
+ const partial = ApiSchemaComponents.UpdateProjectPayload as JsonObject;
106
+ expect(Object.keys(partial.properties as JsonObject)).toEqual(Object.keys(project.properties as JsonObject));
107
+ expect(partial.required).toBeUndefined();
108
+ expect(partial.additionalProperties).toBe(false);
109
+ });
110
+
111
+ it('says what JSON can carry, which the TypeScript declaration did not', () => {
112
+ // `integrations` was `Map<string, unknown>` and the timestamps `Date`. No HTTP response has
113
+ // ever contained either — Mongoose flattens maps in `toJSON` and `JSON.stringify` turns a
114
+ // Date into a string — so a caller writing `.get(id)` or `.getTime()` got a TypeError. The
115
+ // published document is unchanged; only the TypeScript was wrong.
116
+ assertType<Equals<Project['integrations'], Record<string, unknown> | undefined>>(true);
117
+ assertType<Equals<Project['created_at'], string>>(true);
118
+
119
+ const properties = (ApiSchemaComponents.Project as JsonObject).properties as Record<string, JsonObject>;
120
+ // Still `format: date-time`, which is what makes the generated clients emit
121
+ // `OffsetDateTime` / `time.Time` rather than a bare string. A plain `z.string()` here would
122
+ // have dropped it silently.
123
+ expect(properties.created_at).toEqual({ type: 'string', format: 'date-time' });
124
+ expect(properties.updated_at).toEqual({ type: 'string', format: 'date-time' });
125
+ // The same open-map emission as Account.feature_flags and User.properties, normalized to the
126
+ // spelling the document has always used — `z.record`'s `{}` and `propertyNames` say the same
127
+ // thing but generate a different Go map type. `tenant_id` is absent, as it always was — the
128
+ // model computes it and the handler used to ship it anyway, which is what the response mapper
129
+ // now stops.
130
+ expect(properties.integrations).toEqual({ type: 'object', additionalProperties: true });
131
+ expect(properties).not.toHaveProperty('tenant_id');
132
+ });
133
+
134
+ it('converts the vision-profile map, because a canonical alias cannot be a mapped-type key', () => {
135
+ // `vision_profiles` was `Partial<Record<IntakeVisionDetail, …>>`. Once `IntakeVisionDetail`
136
+ // became a canonical alias the schema generator could no longer enumerate the mapped type's
137
+ // keys — it failed with `Unexpected key type "def-canonical-alias-IntakeVisionDetail"`, and
138
+ // `Project` then fell back to a source-text inference that silently dropped `configuration`
139
+ // and `integrations` from the published document. Converting the map is what removed the
140
+ // mapped type; this asserts the components it produces still exist under their old names.
141
+ expect(Object.keys(ApiSchemaComponents)).toContain('ProjectIntakeConfiguration');
142
+ const intake = ApiSchemaComponents.ProjectIntakeConfiguration as JsonObject;
143
+ const properties = intake.properties as Record<string, JsonObject>;
144
+ expect(properties.vision_profiles.$ref).toBe(apiComponentRef('IntakeVisionProfileSettingsMap' as never));
145
+ const map = ApiSchemaComponents.IntakeVisionProfileSettingsMap as JsonObject;
146
+ // The three keys are restated in the schema rather than derived from the enum, so this is
147
+ // what fails if a detail name is added to `IntakeVisionDetail` and not to the map.
148
+ expect(Object.keys(map.properties as JsonObject).sort()).toEqual(['high', 'low', 'standard']);
149
+ });
150
+
151
+ it('converts every configuration leaf that depends on nothing outside this module', () => {
152
+ // Sixteen components, none of them named by an endpoint — they are hoisted by
153
+ // `ProjectConfiguration`, which is still derived. Converting them changes no slot; it makes
154
+ // the `$ref`s that the two remaining configuration components have to satisfy canonical, so
155
+ // the closure rule stops applying to them one level at a time.
156
+ for (const name of [
157
+ 'ModelDefault',
158
+ 'ModalityDefaults',
159
+ 'SystemDefaults',
160
+ 'ProjectModelDefaults',
161
+ 'ResourceVisibility',
162
+ 'ProjectSearchTier',
163
+ 'ElasticsearchBackend',
164
+ 'ProjectSearchPropertyType',
165
+ 'ProjectSearchPropertyMapping',
166
+ 'ProjectSearchPropertyMappingMap',
167
+ 'ProjectIndexingConfiguration',
168
+ 'ProjectConfigurationEmbedding',
169
+ 'BrowserUseRiskPolicy',
170
+ 'BrowserUseScreenshotCapture',
171
+ 'BrowserUseProjectConfiguration',
172
+ 'ProjectIntakeSniffConfiguration',
173
+ ]) {
174
+ expect(Object.keys(ApiSchemaComponents), name).toContain(name);
175
+ }
176
+ });
177
+
178
+ it('keeps SystemDefaults covering every system interaction category', () => {
179
+ // The interface was `{ [K in SystemInteractionCategory]?: ModelDefault }`, so a new category
180
+ // widened it for free. A Zod object cannot map over an enum and still infer useful keys, so
181
+ // the categories are written out — and this is what makes forgetting one a compile error
182
+ // rather than a silently unpublishable default. The template literal turns the enum's member
183
+ // union into its string values, which is what the schema's keys are.
184
+ assertType<Equals<keyof SystemDefaults, `${SystemInteractionCategory}`>>(true);
185
+ assertType<Equals<SystemDefaults['intake'], ModelDefault | undefined>>(true);
186
+ expect(true).toBe(true);
187
+ });
188
+
189
+ it('publishes the property-mapping map without the propertyNames z.record adds', () => {
190
+ // `Record<string, ProjectSearchPropertyMapping>` is inline in the interface and has no
191
+ // TypeScript name, so it never becomes a canonical alias — it stays canonical AND derived,
192
+ // and the two have to agree forever. `z.record` emits a `propertyNames: {type: 'string'}`
193
+ // that the scanner never did, which is why the schema is a catchall-only object instead.
194
+ expect(ApiSchemaComponents.ProjectSearchPropertyMappingMap).toEqual({
195
+ type: 'object',
196
+ additionalProperties: { $ref: '#/components/schemas/ProjectSearchPropertyMapping' },
197
+ });
198
+ });
199
+
200
+ it('enforces the browser-use configuration the deleted AJV schema only described', () => {
201
+ // A `JSONSchemaType<BrowserUseProjectConfiguration>` used to sit beside the interface with
202
+ // descriptions that had already drifted from the TSDoc, and nothing compiled it. This is the
203
+ // same shape, and it is enforced.
204
+ expect(validateApiRequest('BrowserUseProjectConfiguration', { max_policy: 'low_write' }).valid).toBe(true);
205
+ expect(validateApiRequest('BrowserUseProjectConfiguration', { max_policy: 'god_mode' }).valid).toBe(false);
206
+ expect(validateApiRequest('BrowserUseProjectConfiguration', { capture_screenshots: 'always' }).valid).toBe(
207
+ false,
208
+ );
209
+ expect(validateApiRequest('BrowserUseProjectConfiguration', { unknown_switch: true }).valid).toBe(false);
210
+ });
211
+
212
+ it('converts the rendering templates ahead of the AppManifest that embeds them', () => {
213
+ // This pair was previously held back because the Ref is an `Omit<>`, which the scanner emits
214
+ // with `additionalProperties` before `properties` — an ordering Zod cannot reproduce. The
215
+ // canonical/derived comparison is no longer spelling-sensitive: `schemasAgree` compares
216
+ // objects key-order-insensitively and arrays index-by-index, so only the `required` ARRAY
217
+ // order still has to match, and the schema declares its fields to produce it.
218
+ expect(Object.keys(ApiSchemaComponents)).toContain('RenderingTemplateDefinition');
219
+ expect(Object.keys(ApiSchemaComponents)).toContain('RenderingTemplateDefinitionRef');
220
+ expect(ApiSchemaComponents.RenderingTemplateDefinitionRef.required).toEqual([
221
+ 'assets',
222
+ 'description',
223
+ 'id',
224
+ 'name',
225
+ 'path',
226
+ 'type',
227
+ ]);
228
+ // `AppManifestData.templates` stays derived and now `$ref`s the canonical Ref — the closure
229
+ // rule only forbids the other direction.
230
+ expect(Object.keys(ApiSchemaComponents)).toContain('AppManifest');
231
+ const ref: RenderingTemplateDefinitionRef = {
232
+ path: '/api/v1/projects/p/apps/templates/deck',
233
+ id: 'acme:deck',
234
+ name: 'deck',
235
+ description: 'A deck',
236
+ type: 'presentation',
237
+ assets: [],
238
+ };
239
+ expect(validateApiResponse('RenderingTemplateDefinitionRef', ref).valid).toBe(true);
240
+ // The instructions body belongs to the full definition, not the listing entry.
241
+ expect(validateApiResponse('RenderingTemplateDefinitionRef', { ...ref, instructions: '# Deck' }).valid).toBe(
242
+ false,
243
+ );
244
+ });
245
+ });
246
+
247
+ describe('gate 3 — the published components match the closure the types come from', () => {
248
+ it('keeps SupportedIntegrations as the shared enum component it already was', () => {
249
+ const props = ApiSchemaComponents.ProjectIntegrationListEntry.properties as Record<string, JsonObject>;
250
+ expect(props.id).toEqual({ $ref: '#/components/schemas/SupportedIntegrations' });
251
+ // Still referenced by the unconverted integration-config union, which is only safe because
252
+ // the emitted enum is byte-identical to what the scanner derives.
253
+ expect(ApiSchemaComponents.SupportedIntegrations.enum).toEqual(Object.values(SupportedIntegrations));
254
+ });
255
+
256
+ it('publishes the tool settings as the open map the earlier batches established', () => {
257
+ const props = ApiSchemaComponents.ProjectToolInfo.properties as Record<string, JsonObject>;
258
+ expect(props.settings).toEqual({
259
+ type: 'object',
260
+ additionalProperties: true,
261
+ description: expect.stringContaining('may contain API keys'),
262
+ });
263
+ // Same emission as Account.feature_flags and User.properties, which have shipped since the
264
+ // first two batches. `z.record` writes this as `{}` plus a `propertyNames` that constrains
265
+ // nothing; both are normalized away so the document keeps one spelling for an open map.
266
+ expect((ApiSchemaComponents.Account.properties as Record<string, JsonObject>).feature_flags).toMatchObject({
267
+ additionalProperties: true,
268
+ });
269
+ });
270
+
271
+ it('closes every component in the batch', () => {
272
+ for (const name of [
273
+ 'ListProjectsQuery',
274
+ 'ProjectTagQuery',
275
+ 'ICreateProjectPayload',
276
+ 'ProjectPluginsUpdatePayload',
277
+ 'CountResult',
278
+ 'ProjectIntegrationListResponse',
279
+ 'ProjectIntegrationListEntry',
280
+ 'ProjectToolInfo',
281
+ ] as const) {
282
+ expect([name, ApiSchemaComponents[name].additionalProperties]).toEqual([name, false]);
283
+ }
284
+ });
285
+ });
286
+
287
+ describe('gate 4 — AJV validates the same canonical objects that are published', () => {
288
+ it('requires name and namespace on a create payload and rejects anything else', () => {
289
+ const validate = compile('ICreateProjectPayload');
290
+ expect(validate({ name: 'Acme', namespace: 'acme' })).toBe(true);
291
+ expect(validate({ name: 'Acme', namespace: 'acme', description: 'x', auto_config: true })).toBe(true);
292
+ // The two hand-written presence checks the handler used to run, now enforced before it does.
293
+ expect(validate({ name: 'Acme' })).toBe(false);
294
+ expect(validate({ namespace: 'acme' })).toBe(false);
295
+ expect(validate({ name: 'Acme', namespace: 'acme', rogue_field: 1 })).toBe(false);
296
+ });
297
+
298
+ it('rejects a plugin list that is not an array of strings', () => {
299
+ const validate = compile('ProjectPluginsUpdatePayload');
300
+ expect(validate({ plugins: [] })).toBe(true);
301
+ expect(validate({ plugins: ['data-platform'] })).toBe(true);
302
+ // All three were accepted by `payload.plugins || []` off an `any` and written to the document.
303
+ expect(validate({ plugins: 'data-platform' })).toBe(false);
304
+ expect(validate({ plugins: [1, 2] })).toBe(false);
305
+ expect(validate({})).toBe(false);
306
+ });
307
+
308
+ it('validates the two query components the scanner expands into parameters', () => {
309
+ expect(compile('ListProjectsQuery')({})).toBe(true);
310
+ expect(compile('ListProjectsQuery')({ account: '68b1779130afe5403a1589ba' })).toBe(true);
311
+ // A repeated `?account=` reaches Koa as an array; the handler used to cast it to string.
312
+ expect(compile('ListProjectsQuery')({ account: ['a', 'b'] })).toBe(false);
313
+ expect(compile('ProjectTagQuery')({ tag: 'release' })).toBe(true);
314
+ expect(compile('ProjectTagQuery')({})).toBe(true);
315
+ });
316
+
317
+ it('accepts a minimal tool and rejects a missing required field', () => {
318
+ const validate = compile('ProjectToolInfo');
319
+ expect(validate(VALID_TOOL)).toBe(true);
320
+ expect(validate({ ...VALID_TOOL, tool_description: 'Searches the web' })).toBe(true);
321
+ expect(validate({ ...VALID_TOOL, settings: { api_key: 'sk-x', nested: { a: [1] } } })).toBe(true);
322
+ const { app_install_id: _dropped, ...incomplete } = VALID_TOOL;
323
+ expect(validate(incomplete)).toBe(false);
324
+ expect(validate({ ...VALID_TOOL, rogue_field: 1 })).toBe(false);
325
+ });
326
+
327
+ it('constrains the integration id to the supported catalog', () => {
328
+ const validate = compile('ProjectIntegrationListResponse');
329
+ expect(validate({ integrations: [{ id: SupportedIntegrations.github, enabled: true }] })).toBe(true);
330
+ expect(validate({ integrations: [] })).toBe(true);
331
+ expect(validate({ integrations: [{ id: 'dropbox', enabled: true }] })).toBe(false);
332
+ // An envelope, not a bare array — which is what the document already published.
333
+ expect(validate([{ id: SupportedIntegrations.github, enabled: true }])).toBe(false);
334
+ });
335
+ });
336
+
337
+ describe('gate 5 — runtime enforcement uses the published components', () => {
338
+ it('checks the shared count response the same way for every service that returns it', () => {
339
+ // Four slots across three resources and two servers, so this component had to move as a unit.
340
+ expect(validateApiResponse('CountResult', { count: 0 }).valid).toBe(true);
341
+ expect(validateApiResponse('CountResult', { count: 3, ids: ['a'] }).valid).toBe(false);
342
+ expect(validateApiResponse('CountResult', {}).valid).toBe(false);
343
+ });
344
+
345
+ it('checks every member of the tool listing against the same component', () => {
346
+ expect(validateApiResponse('ProjectToolInfoArray', [VALID_TOOL, VALID_TOOL]).valid).toBe(true);
347
+ expect(validateApiResponse('ProjectToolInfoArray', []).valid).toBe(true);
348
+ expect(validateApiResponse('ProjectToolInfoArray', [VALID_TOOL, { tool_name: 'x' }]).valid).toBe(false);
349
+ });
350
+
351
+ it('rejects an undeclared create field without removing it', () => {
352
+ const payload: Record<string, unknown> = { name: 'Acme', namespace: 'acme', rogue_field: 42 };
353
+ const result = validateApiRequest('ICreateProjectPayload', payload);
354
+ expect(result.valid).toBe(false);
355
+ expect(payload.rogue_field).toBe(42);
356
+ });
357
+
358
+ it('hands back the component type on the valid branch', () => {
359
+ const result = validateApiResponse('ProjectToolInfo', VALID_TOOL);
360
+ expect(result.valid).toBe(true);
361
+ if (result.valid) {
362
+ assertType<Equals<typeof result.data, ProjectToolInfo>>(true);
363
+ }
364
+ });
365
+ });
@@ -0,0 +1,214 @@
1
+ import { z } from 'zod';
2
+ // From the values module, for the reason `./apikey.js` gives.
3
+ import { SupportedIntegrations } from '../integrations.js';
4
+ import { ProjectConfigurationSchema } from './project-configuration.js';
5
+
6
+ /**
7
+ * Runtime API schemas for projects and project-scoped definitions.
8
+ */
9
+
10
+ /**
11
+ * `ListProjects` and the four app-asset listings expand these into `in: query` parameters rather
12
+ * than referencing them, so what has to survive is the optionality, not the component identity.
13
+ */
14
+ export const ListProjectsQuerySchema = z
15
+ .object({
16
+ account: z.string().optional(),
17
+ })
18
+ .meta({ id: 'ListProjectsQuery' });
19
+
20
+ export const ProjectTagQuerySchema = z
21
+ .object({
22
+ tag: z.string().optional(),
23
+ })
24
+ .meta({ id: 'ProjectTagQuery' });
25
+
26
+ export const CreateProjectPayloadSchema = z
27
+ .object({
28
+ name: z.string(),
29
+ namespace: z.string(),
30
+ description: z.string().optional(),
31
+ auto_config: z.boolean().optional(),
32
+ })
33
+ .meta({ id: 'ICreateProjectPayload' });
34
+
35
+ export const ProjectPluginsUpdatePayloadSchema = z
36
+ .object({
37
+ plugins: z.array(z.string()),
38
+ })
39
+ .meta({ id: 'ProjectPluginsUpdatePayload' });
40
+
41
+ /**
42
+ * The shared "how many rows did that touch" response.
43
+ *
44
+ * Four slots across three resources and TWO services — `UpdateProjectPlugins`, `DeleteApp` and
45
+ * `UninstallApp` on studio, `CountObjects` on zeno — so like `DeleteByIdResult` it has to move as a
46
+ * unit or the generator sees a canonical and a derived component under one name.
47
+ *
48
+ * `count` stays `type: number` rather than `integer`, because that is what the derived component
49
+ * said. Reproducing the contract, not renegotiating it.
50
+ */
51
+ export const CountResultSchema = z
52
+ .object({
53
+ count: z.number(),
54
+ })
55
+ .meta({ id: 'CountResult' });
56
+
57
+ export const SupportedIntegrationsSchema = z.enum(SupportedIntegrations).meta({ id: 'SupportedIntegrations' });
58
+
59
+ export const ProjectIntegrationListEntrySchema = z
60
+ .object({
61
+ id: SupportedIntegrationsSchema,
62
+ enabled: z.boolean(),
63
+ })
64
+ .meta({ id: 'ProjectIntegrationListEntry' });
65
+
66
+ /** An envelope rather than a bare array, which is what the document already publishes. */
67
+ export const ProjectIntegrationListResponseSchema = z
68
+ .object({
69
+ integrations: z.array(ProjectIntegrationListEntrySchema),
70
+ })
71
+ .meta({ id: 'ProjectIntegrationListResponse' });
72
+
73
+ /**
74
+ * A tool and the app installation that provides it.
75
+ *
76
+ * `settings` is the reason this one is worth converting on its own: it holds the installation's
77
+ * configuration, which can contain provider API keys, and the handler includes it only for agent
78
+ * tokens. The component declares it optional and unconstrained — publishing it is a decision the
79
+ * handler makes per request, so the schema cannot express the rule, but it can at least stop the
80
+ * shape drifting while the rule is enforced elsewhere.
81
+ */
82
+ export const ProjectToolInfoSchema = z
83
+ .object({
84
+ tool_name: z.string().meta({ description: 'The tool name' }),
85
+ tool_description: z.string().optional().meta({ description: 'Optional tool description' }),
86
+ app_name: z.string().meta({ description: 'The app name that provides this tool' }),
87
+ app_install_id: z.string().meta({ description: 'The app installation ID' }),
88
+ settings: z
89
+ .record(z.string(), z.unknown())
90
+ .optional()
91
+ .meta({
92
+ description:
93
+ 'The app installation settings. Only included for agent tokens, not user tokens ' +
94
+ '(security: may contain API keys).',
95
+ }),
96
+ })
97
+ .meta({
98
+ id: 'ProjectToolInfo',
99
+ description:
100
+ 'Information about a tool and its associated app installation. Used to look up which app ' +
101
+ 'provides a specific tool.',
102
+ });
103
+
104
+ export const ProjectToolInfoArraySchema = z.array(ProjectToolInfoSchema).meta({ id: 'ProjectToolInfoArray' });
105
+
106
+ export type ListProjectsQueryFromSchema = z.infer<typeof ListProjectsQuerySchema>;
107
+ export type ProjectTagQueryFromSchema = z.infer<typeof ProjectTagQuerySchema>;
108
+ export type CreateProjectPayloadFromSchema = z.infer<typeof CreateProjectPayloadSchema>;
109
+ export type ProjectPluginsUpdatePayloadFromSchema = z.infer<typeof ProjectPluginsUpdatePayloadSchema>;
110
+ export type CountResultFromSchema = z.infer<typeof CountResultSchema>;
111
+ export type ProjectIntegrationListEntryFromSchema = z.infer<typeof ProjectIntegrationListEntrySchema>;
112
+ export type ProjectIntegrationListResponseFromSchema = z.infer<typeof ProjectIntegrationListResponseSchema>;
113
+ export type ProjectToolInfoFromSchema = z.infer<typeof ProjectToolInfoSchema>;
114
+ export type ProjectToolInfoArrayFromSchema = z.infer<typeof ProjectToolInfoArraySchema>;
115
+
116
+ /**
117
+ * The rendering templates an app ships, and the reference form the manifest embeds.
118
+ *
119
+ * These were deferred once for a reason that no longer holds. `RenderingTemplateDefinitionRef` is an
120
+ * `Omit<>`, and the scanner emits an `Omit<>` with `additionalProperties` ahead of `properties` and
121
+ * an alphabetized `required` — an ordering Zod does not reproduce. The conflict check compares
122
+ * OBJECTS order-insensitively now, so the property order no longer matters; `required` is an array
123
+ * and is still compared in order, which is why the shape below is declared alphabetically while
124
+ * {@link RenderingTemplateDefinitionSchema} is declared in its interface's order. Neither ordering
125
+ * carries meaning in JSON Schema — they exist so a canonical component and the one the scanner still
126
+ * derives for `AppManifestData.templates` agree exactly.
127
+ */
128
+ const RenderingTemplateTypeSchema = z.enum(['presentation', 'document']).meta({ description: 'Template type' });
129
+
130
+ const renderingTemplateFields = {
131
+ id: z.string().meta({ description: 'Unique template id: "collection:name"' }),
132
+ name: z.string().meta({ description: 'Unique template name (kebab-case)' }),
133
+ title: z.string().optional().meta({ description: 'Display title' }),
134
+ description: z.string().meta({ description: 'Short description' }),
135
+ type: RenderingTemplateTypeSchema,
136
+ tags: z.array(z.string()).optional().meta({ description: 'Tags for categorization' }),
137
+ assets: z.array(z.string()).meta({ description: 'Absolute paths to asset files' }),
138
+ };
139
+
140
+ export const RenderingTemplateDefinitionSchema = z
141
+ .object({
142
+ ...renderingTemplateFields,
143
+ instructions: z.string().meta({ description: 'The template instructions (markdown)' }),
144
+ })
145
+ .meta({ id: 'RenderingTemplateDefinition' });
146
+
147
+ export const RenderingTemplateDefinitionRefSchema = z
148
+ .object({
149
+ assets: renderingTemplateFields.assets,
150
+ description: renderingTemplateFields.description,
151
+ id: renderingTemplateFields.id,
152
+ name: renderingTemplateFields.name,
153
+ path: z.string().meta({ description: 'Absolute API path to fetch the full template definition' }),
154
+ type: renderingTemplateFields.type,
155
+ title: renderingTemplateFields.title,
156
+ tags: renderingTemplateFields.tags,
157
+ })
158
+ .meta({ id: 'RenderingTemplateDefinitionRef' });
159
+
160
+ /**
161
+ * The project itself — the component `GetProject`, `UpdateProject` and `CreateProject` all return.
162
+ *
163
+ * This schema corrects two declarations that no HTTP response ever matched. `integrations` was
164
+ * `Map<string, unknown>` and the timestamps were `Date`; JSON carries neither, so a caller writing
165
+ * `project.integrations.get(id)` or `project.created_at.getTime()` got a `TypeError` against a shape
166
+ * TypeScript had promised. Both are source-breaking corrections for SDK consumers and wire-neutral —
167
+ * proved by `apps/studio-server/src/api/projects/project-wire-shape.test.ts`, which serializes a real
168
+ * `ProjectModel` document the way the handler does. Operation 24 of the 1.5 deployment runbook.
169
+ *
170
+ * The published wire shape remains the same. `Map<string, unknown>` was already emitted
171
+ * as an open object, and the timestamps as `format: date-time` strings — which is why they carry
172
+ * `.meta({ format: 'date-time' })`: a bare `z.string()` would silently drop the format and narrow
173
+ * `OffsetDateTime`/`time.Time` to `String` in the generated clients. `z.iso.datetime()` would keep
174
+ * the format but also publish its validation regex as a `pattern`, which is a new constraint on a
175
+ * component that never had one — the same class of change as the intake bounds, and not one to make
176
+ * accidentally.
177
+ *
178
+ * `integrations` stays an open `z.record()` on purpose. Its values are per-integration configuration
179
+ * objects with no common shape, and `SupportedIntegrations` is not a closed key set for stored data —
180
+ * a project can hold configuration for an integration this build no longer knows about.
181
+ *
182
+ * The persistence type is NOT this: `IProject` in `@dglabs/server-common` keeps the `Map` and the
183
+ * `Date`s, because that is what Mongo really holds, and `toProjectResponse()` in studio-server is the
184
+ * single place that converts — and the single place `tenant_id` is dropped, which the model computes
185
+ * and this component has never declared.
186
+ */
187
+ export const ProjectSchema = z
188
+ .strictObject({
189
+ id: z.string(),
190
+ name: z.string(),
191
+ namespace: z.string(),
192
+ description: z.string().optional(),
193
+ account: z.string(),
194
+ configuration: ProjectConfigurationSchema,
195
+ integrations: z.record(z.string(), z.unknown()).optional(),
196
+ plugins: z.array(z.string()),
197
+ created_by: z.string(),
198
+ updated_by: z.string(),
199
+ created_at: z.string().meta({ format: 'date-time' }),
200
+ updated_at: z.string().meta({ format: 'date-time' }),
201
+ })
202
+ .meta({ id: 'Project' });
203
+
204
+ /**
205
+ * The `UpdateProject` and `UpdateProjectConfiguration` request bodies.
206
+ *
207
+ * `.partial()` keeps both update contracts tied to the corresponding response contract, so a field
208
+ * added to either source schema is available to its update payload without a hand-written twin.
209
+ */
210
+ export const UpdateProjectPayloadSchema = ProjectSchema.partial().meta({ id: 'UpdateProjectPayload' });
211
+
212
+ export const UpdateProjectConfigurationPayloadSchema = ProjectConfigurationSchema.partial().meta({
213
+ id: 'UpdateProjectConfigurationPayload',
214
+ });
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { FacetSpecSchema, PromptTemplateRefSchema } from './interaction.js';
3
+
4
+ // The prompt-authoring contracts: what a fork, a render and a prompt search publish, and how a
5
+ // prompt's interaction usages are reported. `PromptTemplate` itself and its two write payloads live
6
+ // in `./interaction.js`, which is where the prompt tree the interactions reference is defined.
7
+ //
8
+ // `//` rather than `/** */` throughout: a JSDoc block immediately preceding an exported declaration
9
+ // is picked up by the OpenAPI scanner and published as that component's `description`, which would
10
+ // double up with the `description` stated in `.meta()`.
11
+
12
+ export const RenderPromptPayloadSchema = z
13
+ .record(z.string(), z.unknown())
14
+ // Preserve the explicit free-form spelling OpenAPI Generator needs to emit a request-body
15
+ // setter. An empty additionalProperties schema is validator-equivalent but generates a
16
+ // different Go API, and the adapter intentionally normalizes component roots conservatively.
17
+ .meta({ id: 'RenderPromptPayload', additionalProperties: true });
18
+
19
+ export const RenderPromptResponseSchema = z
20
+ .strictObject({
21
+ id: z.string(),
22
+ name: z.string(),
23
+ role: z.string(),
24
+ content_type: z.string(),
25
+ rendered: z.string(),
26
+ })
27
+ .meta({ id: 'RenderPromptResponse' });
28
+
29
+ export const PromptTemplateInteractionVersionSchema = z
30
+ .strictObject({
31
+ version: z.number(),
32
+ })
33
+ .meta({ id: 'PromptTemplateInteractionVersion' });
34
+
35
+ export const PromptTemplateForkPayloadSchema = z
36
+ .strictObject({
37
+ keepTags: z.boolean().optional(),
38
+ targetProject: z.string().optional(),
39
+ })
40
+ .meta({ id: 'PromptTemplateForkPayload' });
41
+
42
+ export const PromptSearchQuerySchema = z
43
+ .strictObject({
44
+ name: z.string().meta({ description: 'Case-insensitive substring match on the prompt name.' }).optional(),
45
+ status: z
46
+ .array(z.string())
47
+ .meta({
48
+ description:
49
+ 'Accepted and ignored. `GET /prompts` and `POST /prompts/facets` list drafts only, and always have.',
50
+ })
51
+ .optional(),
52
+ limit: z.number().meta({ description: 'Maximum number of prompts to return. Defaults to 100.' }).optional(),
53
+ offset: z.number().meta({ description: 'Number of prompts to skip.' }).optional(),
54
+ role: z.string().meta({ description: 'Exact match on the prompt role.' }).optional(),
55
+ tags: z.array(z.string()).meta({ description: 'Match prompts carrying any of these tags.' }).optional(),
56
+ matchInteractions: z
57
+ .boolean()
58
+ .meta({
59
+ description:
60
+ 'Accepted and ignored. It used to attach the interactions referencing each prompt, in a shape no response component ever declared; nothing consumed it.',
61
+ })
62
+ .optional(),
63
+ })
64
+ .meta({ id: 'PromptSearchQuery' });
65
+
66
+ export const PromptTemplateInteractionUsageSchema = z
67
+ .strictObject({
68
+ id: z.string(),
69
+ name: z.string(),
70
+ versions: z.array(PromptTemplateInteractionVersionSchema),
71
+ })
72
+ .meta({ id: 'PromptTemplateInteractionUsage' });
73
+
74
+ export const ComputePromptFacetPayloadSchema = z
75
+ .strictObject({
76
+ facets: z.array(FacetSpecSchema),
77
+ query: PromptSearchQuerySchema.optional(),
78
+ })
79
+ .meta({ id: 'ComputePromptFacetPayload' });
80
+
81
+ export const PromptTemplateInteractionsResponseSchema = z
82
+ .strictObject({
83
+ prompt: z.string(),
84
+ interactions: z.array(PromptTemplateInteractionUsageSchema),
85
+ })
86
+ .meta({ id: 'PromptTemplateInteractionsResponse' });
87
+
88
+ export const PromptTemplateRefArraySchema = z.array(PromptTemplateRefSchema).meta({ id: 'PromptTemplateRefArray' });