@vertesia/common 1.6.0-dev.20260923.085325Z → 1.6.0-dev.20261004.085740Z

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 (405) hide show
  1. package/lib/access-control-values.d.ts +2 -2
  2. package/lib/access-control-values.d.ts.map +1 -1
  3. package/lib/access-control-values.js +2 -2
  4. package/lib/access-control-values.js.map +1 -1
  5. package/lib/access-control.d.ts +7 -8
  6. package/lib/access-control.d.ts.map +1 -1
  7. package/lib/access-control.js +5 -0
  8. package/lib/access-control.js.map +1 -1
  9. package/lib/analytics.d.ts +6 -7
  10. package/lib/analytics.d.ts.map +1 -1
  11. package/lib/api-contract/components.generated.json +1389 -45
  12. package/lib/api-schemas/access-control.d.ts +33 -10
  13. package/lib/api-schemas/access-control.d.ts.map +1 -1
  14. package/lib/api-schemas/access-control.js +7 -6
  15. package/lib/api-schemas/access-control.js.map +1 -1
  16. package/lib/api-schemas/account.d.ts +5 -4
  17. package/lib/api-schemas/account.d.ts.map +1 -1
  18. package/lib/api-schemas/account.js.map +1 -1
  19. package/lib/api-schemas/agent-budget.d.ts +15 -0
  20. package/lib/api-schemas/agent-budget.d.ts.map +1 -0
  21. package/lib/api-schemas/agent-budget.js +55 -0
  22. package/lib/api-schemas/agent-budget.js.map +1 -0
  23. package/lib/api-schemas/agent-runs.d.ts +1525 -100
  24. package/lib/api-schemas/agent-runs.d.ts.map +1 -1
  25. package/lib/api-schemas/agent-runs.js +60 -28
  26. package/lib/api-schemas/agent-runs.js.map +1 -1
  27. package/lib/api-schemas/apikey.d.ts +11 -10
  28. package/lib/api-schemas/apikey.d.ts.map +1 -1
  29. package/lib/api-schemas/apikey.js.map +1 -1
  30. package/lib/api-schemas/app-lifecycle.d.ts +13 -0
  31. package/lib/api-schemas/app-lifecycle.d.ts.map +1 -1
  32. package/lib/api-schemas/app-lifecycle.js +4 -0
  33. package/lib/api-schemas/app-lifecycle.js.map +1 -1
  34. package/lib/api-schemas/app-runtime.d.ts +1821 -108
  35. package/lib/api-schemas/app-runtime.d.ts.map +1 -1
  36. package/lib/api-schemas/audit-trail.d.ts +20 -0
  37. package/lib/api-schemas/audit-trail.d.ts.map +1 -1
  38. package/lib/api-schemas/audit-trail.js +7 -1
  39. package/lib/api-schemas/audit-trail.js.map +1 -1
  40. package/lib/api-schemas/content.d.ts +665 -30
  41. package/lib/api-schemas/content.d.ts.map +1 -1
  42. package/lib/api-schemas/content.js +47 -0
  43. package/lib/api-schemas/content.js.map +1 -1
  44. package/lib/api-schemas/cost-analytics.d.ts +18 -0
  45. package/lib/api-schemas/cost-analytics.d.ts.map +1 -1
  46. package/lib/api-schemas/cost-analytics.js +31 -2
  47. package/lib/api-schemas/cost-analytics.js.map +1 -1
  48. package/lib/api-schemas/document-processing.d.ts +381 -18
  49. package/lib/api-schemas/document-processing.d.ts.map +1 -1
  50. package/lib/api-schemas/environment.d.ts +0 -5
  51. package/lib/api-schemas/environment.d.ts.map +1 -1
  52. package/lib/api-schemas/environment.js +0 -1
  53. package/lib/api-schemas/environment.js.map +1 -1
  54. package/lib/api-schemas/events.d.ts +1143 -54
  55. package/lib/api-schemas/events.d.ts.map +1 -1
  56. package/lib/api-schemas/group.d.ts +2 -1
  57. package/lib/api-schemas/group.d.ts.map +1 -1
  58. package/lib/api-schemas/group.js.map +1 -1
  59. package/lib/api-schemas/index.d.ts +1 -0
  60. package/lib/api-schemas/index.d.ts.map +1 -1
  61. package/lib/api-schemas/index.js +1 -0
  62. package/lib/api-schemas/index.js.map +1 -1
  63. package/lib/api-schemas/inference-profile.d.ts +5017 -0
  64. package/lib/api-schemas/inference-profile.d.ts.map +1 -0
  65. package/lib/api-schemas/inference-profile.js +135 -0
  66. package/lib/api-schemas/inference-profile.js.map +1 -0
  67. package/lib/api-schemas/integrations.d.ts +6 -6
  68. package/lib/api-schemas/interaction.d.ts +34391 -703
  69. package/lib/api-schemas/interaction.d.ts.map +1 -1
  70. package/lib/api-schemas/interaction.js +34 -1
  71. package/lib/api-schemas/interaction.js.map +1 -1
  72. package/lib/api-schemas/invites.d.ts +10 -9
  73. package/lib/api-schemas/invites.d.ts.map +1 -1
  74. package/lib/api-schemas/invites.js.map +1 -1
  75. package/lib/api-schemas/process.d.ts +653 -34
  76. package/lib/api-schemas/process.d.ts.map +1 -1
  77. package/lib/api-schemas/process.js +66 -0
  78. package/lib/api-schemas/process.js.map +1 -1
  79. package/lib/api-schemas/project-configuration.d.ts +1323 -62
  80. package/lib/api-schemas/project-configuration.d.ts.map +1 -1
  81. package/lib/api-schemas/project-configuration.js +15 -1
  82. package/lib/api-schemas/project-configuration.js.map +1 -1
  83. package/lib/api-schemas/project.d.ts +2031 -116
  84. package/lib/api-schemas/project.d.ts.map +1 -1
  85. package/lib/api-schemas/project.js +9 -1
  86. package/lib/api-schemas/project.js.map +1 -1
  87. package/lib/api-schemas/quota.d.ts +7 -6
  88. package/lib/api-schemas/quota.d.ts.map +1 -1
  89. package/lib/api-schemas/quota.js.map +1 -1
  90. package/lib/api-schemas/registry.d.ts +27820 -35892
  91. package/lib/api-schemas/registry.d.ts.map +1 -1
  92. package/lib/api-schemas/registry.js +55 -5
  93. package/lib/api-schemas/registry.js.map +1 -1
  94. package/lib/api-schemas/run-budget.d.ts +52 -0
  95. package/lib/api-schemas/run-budget.d.ts.map +1 -0
  96. package/lib/api-schemas/run-budget.js +55 -0
  97. package/lib/api-schemas/run-budget.js.map +1 -0
  98. package/lib/api-schemas/store.d.ts +6388 -338
  99. package/lib/api-schemas/store.d.ts.map +1 -1
  100. package/lib/api-schemas/store.js +11 -0
  101. package/lib/api-schemas/store.js.map +1 -1
  102. package/lib/api-schemas/user.d.ts +9 -8
  103. package/lib/api-schemas/user.d.ts.map +1 -1
  104. package/lib/api-schemas/user.js.map +1 -1
  105. package/lib/api-schemas/view-execution.d.ts +8 -0
  106. package/lib/api-schemas/view-execution.d.ts.map +1 -1
  107. package/lib/api-schemas/views.d.ts +14 -0
  108. package/lib/api-schemas/views.d.ts.map +1 -1
  109. package/lib/api-schemas/workflow-runs.d.ts +335 -12
  110. package/lib/api-schemas/workflow-runs.d.ts.map +1 -1
  111. package/lib/api-schemas/workflow-runs.js +2 -0
  112. package/lib/api-schemas/workflow-runs.js.map +1 -1
  113. package/lib/apikey.d.ts +30 -25
  114. package/lib/apikey.d.ts.map +1 -1
  115. package/lib/apikey.js.map +1 -1
  116. package/lib/apps.d.ts +116 -121
  117. package/lib/apps.d.ts.map +1 -1
  118. package/lib/apps.js.map +1 -1
  119. package/lib/audit-trail.d.ts +17 -18
  120. package/lib/audit-trail.d.ts.map +1 -1
  121. package/lib/audit-trail.js +2 -0
  122. package/lib/audit-trail.js.map +1 -1
  123. package/lib/browser-credentials.d.ts +11 -12
  124. package/lib/browser-credentials.d.ts.map +1 -1
  125. package/lib/common.d.ts +17 -24
  126. package/lib/common.d.ts.map +1 -1
  127. package/lib/content-query.d.ts +3 -4
  128. package/lib/content-query.d.ts.map +1 -1
  129. package/lib/cost-analytics.d.ts +13 -21
  130. package/lib/cost-analytics.d.ts.map +1 -1
  131. package/lib/cost-analytics.js +0 -7
  132. package/lib/cost-analytics.js.map +1 -1
  133. package/lib/data-platform.d.ts +79 -88
  134. package/lib/data-platform.d.ts.map +1 -1
  135. package/lib/data-platform.js.map +1 -1
  136. package/lib/delegation.d.ts +4 -5
  137. package/lib/delegation.d.ts.map +1 -1
  138. package/lib/email.d.ts +15 -17
  139. package/lib/email.d.ts.map +1 -1
  140. package/lib/email.js.map +1 -1
  141. package/lib/embeddings.d.ts +25 -26
  142. package/lib/embeddings.d.ts.map +1 -1
  143. package/lib/environment.d.ts +16 -17
  144. package/lib/environment.d.ts.map +1 -1
  145. package/lib/environment.js.map +1 -1
  146. package/lib/facets.d.ts +3 -4
  147. package/lib/facets.d.ts.map +1 -1
  148. package/lib/group.d.ts +6 -7
  149. package/lib/group.d.ts.map +1 -1
  150. package/lib/group.js.map +1 -1
  151. package/lib/index.d.ts +3 -1
  152. package/lib/index.d.ts.map +1 -1
  153. package/lib/index.js.map +1 -1
  154. package/lib/inference-profile.d.ts +17 -0
  155. package/lib/inference-profile.d.ts.map +1 -0
  156. package/lib/inference-profile.js +2 -0
  157. package/lib/inference-profile.js.map +1 -0
  158. package/lib/integrations.d.ts +19 -20
  159. package/lib/integrations.d.ts.map +1 -1
  160. package/lib/integrations.js.map +1 -1
  161. package/lib/interaction.d.ts +68 -73
  162. package/lib/interaction.d.ts.map +1 -1
  163. package/lib/interaction.js.map +1 -1
  164. package/lib/meters.d.ts +4 -5
  165. package/lib/meters.d.ts.map +1 -1
  166. package/lib/oauth-server.d.ts +40 -41
  167. package/lib/oauth-server.d.ts.map +1 -1
  168. package/lib/oauth.d.ts +9 -10
  169. package/lib/oauth.d.ts.map +1 -1
  170. package/lib/payload.d.ts +11 -14
  171. package/lib/payload.d.ts.map +1 -1
  172. package/lib/pending-asks.d.ts +8 -13
  173. package/lib/pending-asks.d.ts.map +1 -1
  174. package/lib/pending-asks.js +0 -4
  175. package/lib/pending-asks.js.map +1 -1
  176. package/lib/platform-event.d.ts +48 -51
  177. package/lib/platform-event.d.ts.map +1 -1
  178. package/lib/platform-event.js.map +1 -1
  179. package/lib/principal-context.d.ts +3 -3
  180. package/lib/principal-context.d.ts.map +1 -1
  181. package/lib/project.d.ts +42 -43
  182. package/lib/project.d.ts.map +1 -1
  183. package/lib/project.js.map +1 -1
  184. package/lib/prompt.d.ts +14 -16
  185. package/lib/prompt.d.ts.map +1 -1
  186. package/lib/prompt.js.map +1 -1
  187. package/lib/query.d.ts +10 -13
  188. package/lib/query.d.ts.map +1 -1
  189. package/lib/rate-limiter.d.ts +7 -11
  190. package/lib/rate-limiter.d.ts.map +1 -1
  191. package/lib/refs.d.ts +2 -3
  192. package/lib/refs.d.ts.map +1 -1
  193. package/lib/refs.js.map +1 -1
  194. package/lib/roles/types.d.ts +5 -6
  195. package/lib/roles/types.d.ts.map +1 -1
  196. package/lib/roles/types.js.map +1 -1
  197. package/lib/run-budget.d.ts +8 -0
  198. package/lib/run-budget.d.ts.map +1 -0
  199. package/lib/run-budget.js +2 -0
  200. package/lib/run-budget.js.map +1 -0
  201. package/lib/runs.d.ts +9 -10
  202. package/lib/runs.d.ts.map +1 -1
  203. package/lib/secrets.d.ts +20 -21
  204. package/lib/secrets.d.ts.map +1 -1
  205. package/lib/store/agent-approval.d.ts +4 -5
  206. package/lib/store/agent-approval.d.ts.map +1 -1
  207. package/lib/store/agent-approval.js.map +1 -1
  208. package/lib/store/agent-run.d.ts +50 -52
  209. package/lib/store/agent-run.d.ts.map +1 -1
  210. package/lib/store/agent-run.js.map +1 -1
  211. package/lib/store/collections.d.ts +11 -12
  212. package/lib/store/collections.d.ts.map +1 -1
  213. package/lib/store/collections.js.map +1 -1
  214. package/lib/store/conversation-state.d.ts +14 -8
  215. package/lib/store/conversation-state.d.ts.map +1 -1
  216. package/lib/store/doc-analyzer.d.ts +7 -8
  217. package/lib/store/doc-analyzer.d.ts.map +1 -1
  218. package/lib/store/dsl-workflow.d.ts +10 -12
  219. package/lib/store/dsl-workflow.d.ts.map +1 -1
  220. package/lib/store/dsl-workflow.js.map +1 -1
  221. package/lib/store/duration.d.ts +12 -0
  222. package/lib/store/duration.d.ts.map +1 -0
  223. package/lib/store/duration.js +2 -0
  224. package/lib/store/duration.js.map +1 -0
  225. package/lib/store/grounded-extraction.d.ts +6 -7
  226. package/lib/store/grounded-extraction.d.ts.map +1 -1
  227. package/lib/store/intake-policy-schema.generated.d.ts.map +1 -1
  228. package/lib/store/intake-policy-schema.generated.js +143 -2
  229. package/lib/store/intake-policy-schema.generated.js.map +1 -1
  230. package/lib/store/process.d.ts +70 -69
  231. package/lib/store/process.d.ts.map +1 -1
  232. package/lib/store/process.js.map +1 -1
  233. package/lib/store/rendering.d.ts +6 -12
  234. package/lib/store/rendering.d.ts.map +1 -1
  235. package/lib/store/rendering.js +0 -5
  236. package/lib/store/rendering.js.map +1 -1
  237. package/lib/store/signals.d.ts +43 -0
  238. package/lib/store/signals.d.ts.map +1 -1
  239. package/lib/store/signals.js +6 -1
  240. package/lib/store/signals.js.map +1 -1
  241. package/lib/store/store.d.ts +92 -91
  242. package/lib/store/store.d.ts.map +1 -1
  243. package/lib/store/store.js.map +1 -1
  244. package/lib/store/task.d.ts +10 -14
  245. package/lib/store/task.d.ts.map +1 -1
  246. package/lib/store/workflow.d.ts +35 -41
  247. package/lib/store/workflow.d.ts.map +1 -1
  248. package/lib/store/workflow.js.map +1 -1
  249. package/lib/sts-token-types.d.ts +14 -19
  250. package/lib/sts-token-types.d.ts.map +1 -1
  251. package/lib/tools.d.ts +12 -13
  252. package/lib/tools.d.ts.map +1 -1
  253. package/lib/transient-tokens.d.ts +3 -3
  254. package/lib/transient-tokens.d.ts.map +1 -1
  255. package/lib/user.d.ts +17 -20
  256. package/lib/user.d.ts.map +1 -1
  257. package/lib/user.js.map +1 -1
  258. package/lib/vertesia-common.js +2 -2
  259. package/lib/vertesia-common.js.map +1 -1
  260. package/lib/views.d.ts +61 -64
  261. package/lib/views.d.ts.map +1 -1
  262. package/lib/views.js.map +1 -1
  263. package/lib/wire-types.generated.d.ts +11231 -0
  264. package/lib/wire-types.generated.d.ts.map +1 -0
  265. package/lib/wire-types.generated.js +4 -0
  266. package/lib/wire-types.generated.js.map +1 -0
  267. package/lib/workflow-analytics.d.ts +21 -19
  268. package/lib/workflow-analytics.d.ts.map +1 -1
  269. package/lib/workflow-analytics.js +2 -2
  270. package/lib/workflow-analytics.js.map +1 -1
  271. package/package.json +15 -10
  272. package/src/access-control-values.ts +2 -2
  273. package/src/access-control.ts +7 -15
  274. package/src/analytics.ts +6 -13
  275. package/src/api-contract/components.generated.json +1389 -45
  276. package/src/api-schemas/access-control.ts +18 -16
  277. package/src/api-schemas/account.ts +5 -4
  278. package/src/api-schemas/agent-budget.ts +60 -0
  279. package/src/api-schemas/agent-runs.ts +63 -27
  280. package/src/api-schemas/apikey.ts +11 -10
  281. package/src/api-schemas/app-lifecycle.ts +5 -0
  282. package/src/api-schemas/audit-trail.ts +7 -1
  283. package/src/api-schemas/content.ts +55 -0
  284. package/src/api-schemas/cost-analytics.ts +34 -2
  285. package/src/api-schemas/environment.ts +0 -1
  286. package/src/api-schemas/group.ts +2 -1
  287. package/src/api-schemas/index.ts +1 -0
  288. package/src/api-schemas/inference-profile.ts +151 -0
  289. package/src/api-schemas/interaction.ts +40 -1
  290. package/src/api-schemas/invites.ts +10 -9
  291. package/src/api-schemas/process.ts +78 -2
  292. package/src/api-schemas/project-configuration.ts +19 -1
  293. package/src/api-schemas/project.ts +19 -10
  294. package/src/api-schemas/quota.ts +7 -6
  295. package/src/api-schemas/registry.ts +131 -33
  296. package/src/api-schemas/run-budget.ts +60 -0
  297. package/src/api-schemas/store.ts +12 -0
  298. package/src/api-schemas/user.ts +9 -8
  299. package/src/api-schemas/workflow-runs.ts +2 -0
  300. package/src/apikey.ts +30 -39
  301. package/src/apps.ts +116 -239
  302. package/src/audit-trail.ts +18 -33
  303. package/src/browser-credentials.ts +11 -23
  304. package/src/common.ts +17 -37
  305. package/src/content-query.ts +3 -4
  306. package/src/cost-analytics.ts +13 -35
  307. package/src/data-platform.ts +79 -168
  308. package/src/delegation.ts +4 -9
  309. package/src/email.ts +15 -29
  310. package/src/embeddings.ts +25 -51
  311. package/src/environment.ts +16 -33
  312. package/src/facets.ts +3 -4
  313. package/src/group.ts +6 -13
  314. package/src/index.ts +27 -0
  315. package/src/inference-profile.ts +20 -0
  316. package/src/integrations.ts +21 -41
  317. package/src/interaction.ts +68 -137
  318. package/src/meters.ts +4 -9
  319. package/src/oauth-server.ts +40 -81
  320. package/src/oauth.ts +9 -19
  321. package/src/payload.ts +11 -25
  322. package/src/pending-asks.ts +8 -22
  323. package/src/platform-event.ts +48 -97
  324. package/src/principal-context.ts +3 -3
  325. package/src/project.ts +43 -86
  326. package/src/prompt.ts +14 -31
  327. package/src/query.ts +10 -20
  328. package/src/rate-limiter.ts +7 -19
  329. package/src/refs.ts +2 -3
  330. package/src/roles/types.ts +5 -11
  331. package/src/run-budget.ts +8 -0
  332. package/src/runs.ts +9 -19
  333. package/src/secrets.ts +20 -41
  334. package/src/store/agent-approval.ts +4 -9
  335. package/src/store/agent-run.ts +53 -99
  336. package/src/store/collections.ts +11 -23
  337. package/src/store/conversation-state.ts +15 -15
  338. package/src/store/doc-analyzer.ts +7 -15
  339. package/src/store/dsl-workflow.ts +10 -23
  340. package/src/store/duration.ts +45 -0
  341. package/src/store/grounded-extraction.ts +6 -13
  342. package/src/store/intake-policy-schema.generated.ts +148 -2
  343. package/src/store/process.ts +70 -140
  344. package/src/store/rendering.ts +6 -19
  345. package/src/store/signals.ts +48 -0
  346. package/src/store/store.ts +92 -181
  347. package/src/store/task.ts +10 -24
  348. package/src/store/workflow.ts +35 -71
  349. package/src/sts-token-types.ts +14 -33
  350. package/src/tools.ts +12 -25
  351. package/src/transient-tokens.ts +3 -3
  352. package/src/user.ts +17 -39
  353. package/src/views.ts +61 -125
  354. package/src/wire-types.generated.ts +11889 -0
  355. package/src/workflow-analytics.ts +21 -19
  356. package/src/agent-resources.test.ts +0 -89
  357. package/src/api-contract/components.contract.test.ts +0 -99
  358. package/src/api-schemas/access-control.contract.test.ts +0 -209
  359. package/src/api-schemas/account-apikey.test.ts +0 -60
  360. package/src/api-schemas/account.contract.test.ts +0 -319
  361. package/src/api-schemas/adapter-edge-cases.test.ts +0 -499
  362. package/src/api-schemas/agent-communication.contract.test.ts +0 -90
  363. package/src/api-schemas/agent-history.contract.test.ts +0 -42
  364. package/src/api-schemas/agent-runs.contract.test.ts +0 -240
  365. package/src/api-schemas/api-discriminators.test.ts +0 -185
  366. package/src/api-schemas/apikey.contract.test.ts +0 -270
  367. package/src/api-schemas/app-delete-summary.contract.test.ts +0 -67
  368. package/src/api-schemas/bulk-operation.contract.test.ts +0 -39
  369. package/src/api-schemas/bundle-isolation.test.ts +0 -44
  370. package/src/api-schemas/commands.contract.test.ts +0 -51
  371. package/src/api-schemas/cost-analytics.contract.test.ts +0 -64
  372. package/src/api-schemas/dashboard.contract.test.ts +0 -138
  373. package/src/api-schemas/data-store.contract.test.ts +0 -97
  374. package/src/api-schemas/document-processing.contract.test.ts +0 -76
  375. package/src/api-schemas/emit-json-schema.test.ts +0 -36
  376. package/src/api-schemas/environment.contract.test.ts +0 -202
  377. package/src/api-schemas/group.contract.test.ts +0 -205
  378. package/src/api-schemas/indexing.contract.test.ts +0 -122
  379. package/src/api-schemas/interaction.contract.test.ts +0 -307
  380. package/src/api-schemas/invites.contract.test.ts +0 -268
  381. package/src/api-schemas/llumiverse.contract.test.ts +0 -179
  382. package/src/api-schemas/mcp-api-key.contract.test.ts +0 -125
  383. package/src/api-schemas/oauth.contract.test.ts +0 -181
  384. package/src/api-schemas/parameters.test.ts +0 -402
  385. package/src/api-schemas/process.contract.test.ts +0 -115
  386. package/src/api-schemas/project.contract.test.ts +0 -472
  387. package/src/api-schemas/pruning-limits.test.ts +0 -189
  388. package/src/api-schemas/quota.contract.test.ts +0 -147
  389. package/src/api-schemas/registry-groups.test.ts +0 -99
  390. package/src/api-schemas/response-pruning.test.ts +0 -260
  391. package/src/api-schemas/store.contract.test.ts +0 -378
  392. package/src/api-schemas/sts.contract.test.ts +0 -112
  393. package/src/api-schemas/user.contract.test.ts +0 -197
  394. package/src/api-schemas/views.contract.test.ts +0 -112
  395. package/src/api-schemas/zeno-response-contracts.test.ts +0 -380
  396. package/src/apps.test.ts +0 -89
  397. package/src/oauth-scopes.test.ts +0 -15
  398. package/src/roles.test.ts +0 -33
  399. package/src/schema-for-extraction.test.ts +0 -191
  400. package/src/store/agent-approval.test.ts +0 -18
  401. package/src/store/content-type-editing.test.ts +0 -17
  402. package/src/store/ms.d.ts +0 -42
  403. package/src/store/schedule.test.ts +0 -59
  404. package/src/store/workflow.test.ts +0 -640
  405. package/src/versions.test.ts +0 -13
@@ -1,189 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { findUnprunablePaths, pruneToSchema, toOpenApiComponents } from './adapter.js';
3
- import { findUnprunableApiPaths } from './registry.js';
4
-
5
- /**
6
- * Pins the shapes where pruning declines to narrow.
7
- *
8
- * These are limitations, not bugs: guessing which branch of an ambiguous schema applies risks
9
- * deleting legitimate data. They are pinned here so the boundary is explicit and cannot be
10
- * mistaken for a secret-removal guarantee — anything sensitive needs an explicit response mapper
11
- * or a request/response type split.
12
- */
13
- describe('shapes where pruning passes values through untouched', () => {
14
- const SENSITIVE = { a: 'x', stripe_secret: 'sk_live_leak' };
15
-
16
- it('an allOf intersection is not pruned', () => {
17
- const components = toOpenApiComponents({
18
- Merged: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
19
- });
20
- expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Merged' }, components)).toEqual(SENSITIVE);
21
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Merged' }, components)).toEqual([' (allOf)']);
22
- });
23
-
24
- it('a union without a discriminator is not pruned', () => {
25
- const components = toOpenApiComponents({
26
- Loose: {
27
- anyOf: [
28
- { type: 'object', properties: { a: { type: 'string' } } },
29
- { type: 'object', properties: { b: { type: 'string' } } },
30
- ],
31
- },
32
- });
33
- expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Loose' }, components)).toEqual(SENSITIVE);
34
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Loose' }, components)).toEqual([
35
- ' (union without discriminator)',
36
- ]);
37
- });
38
-
39
- it('a discriminator value with no mapping entry is not pruned', () => {
40
- const components = toOpenApiComponents({
41
- Union: {
42
- anyOf: [{ $ref: '#/$defs/A' }, { $ref: '#/$defs/B' }],
43
- $defs: {
44
- A: { type: 'object', properties: { kind: { const: 'a' } }, required: ['kind'] },
45
- B: { type: 'object', properties: { kind: { const: 'b' } }, required: ['kind'] },
46
- },
47
- },
48
- });
49
- const unknownBranch = { kind: 'c', stripe_secret: 'sk_live_leak' };
50
- expect(pruneToSchema(unknownBranch, { $ref: '#/components/schemas/Union' }, components)).toEqual(unknownBranch);
51
- });
52
-
53
- it('an unresolvable reference is not pruned', () => {
54
- expect(pruneToSchema(SENSITIVE, { $ref: '#/components/schemas/Absent' }, {})).toEqual(SENSITIVE);
55
- });
56
-
57
- it('patternProperties is not pruned — its keys are declared but absent from `properties`', () => {
58
- const components = toOpenApiComponents({
59
- Headers: {
60
- type: 'object',
61
- properties: { a: { type: 'string' } },
62
- patternProperties: { '^x-': { type: 'string' } },
63
- },
64
- });
65
- const payload = { a: 'x', 'x-trace': 'declared-by-pattern', stripe_secret: 'sk_live_leak' };
66
- expect(pruneToSchema(payload, { $ref: '#/components/schemas/Headers' }, components)).toEqual(payload);
67
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Headers' }, components)).toEqual([
68
- ' (patternProperties)',
69
- ]);
70
- });
71
-
72
- it('prefixItems is not pruned — tuple positions have their own schemas', () => {
73
- const components = toOpenApiComponents({
74
- Pair: { type: 'array', prefixItems: [{ type: 'string' }, { type: 'object' }] },
75
- });
76
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Pair' }, components)).toEqual([' (prefixItems)']);
77
- });
78
-
79
- it('a non-composable sibling further down a reference chain is not pruned', () => {
80
- // The sibling sits on the alias, not on the node being pruned, so it is only visible once
81
- // the chain is followed. Reporting it as an unresolved reference would send someone
82
- // looking for a missing component that exists.
83
- const components = toOpenApiComponents({
84
- Alias: { $ref: '#/components/schemas/Closed', additionalProperties: true },
85
- Closed: { type: 'object', properties: { a: { type: 'string' } }, additionalProperties: false },
86
- });
87
- const ref = { $ref: '#/components/schemas/Alias' };
88
- expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
89
- expect(findUnprunablePaths(ref, components)).toEqual([
90
- ' ($ref with unsupported sibling: additionalProperties)',
91
- ]);
92
- });
93
-
94
- it('a reference chain that cycles is not pruned', () => {
95
- // Mutual aliases never reach a schema describing an object, so there is nothing to narrow
96
- // against. Following them would loop forever.
97
- const components = toOpenApiComponents({
98
- Ping: { $ref: '#/components/schemas/Pong' },
99
- Pong: { $ref: '#/components/schemas/Ping' },
100
- });
101
- const ref = { $ref: '#/components/schemas/Ping' };
102
- expect(pruneToSchema(SENSITIVE, ref, components)).toEqual(SENSITIVE);
103
- expect(findUnprunablePaths(ref, components)).toEqual([' (circular $ref)']);
104
- });
105
-
106
- it('a $ref with a non-composable sibling is not pruned', () => {
107
- // Siblings apply conjunctively, so a sibling `additionalProperties: true` does NOT reopen
108
- // a closed target. Composing that correctly is not something to guess at.
109
- const components = toOpenApiComponents({
110
- Wrapper: {
111
- type: 'object',
112
- properties: { inner: { $ref: '#/$defs/Closed', additionalProperties: true } },
113
- $defs: {
114
- Closed: {
115
- type: 'object',
116
- properties: { a: { type: 'string' } },
117
- additionalProperties: false,
118
- },
119
- },
120
- },
121
- });
122
- const payload = { inner: { a: 'x', stripe_secret: 'sk_live_leak' } };
123
- expect(pruneToSchema(payload, { $ref: '#/components/schemas/Wrapper' }, components)).toEqual(payload);
124
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Wrapper' }, components)).toEqual([
125
- '/inner ($ref with unsupported sibling: additionalProperties)',
126
- ]);
127
- });
128
- });
129
-
130
- describe('findUnprunablePaths reports where a component is not closed', () => {
131
- it('returns nothing for the fully prunable Account component', () => {
132
- expect(findUnprunableApiPaths('Account')).toEqual([]);
133
- });
134
-
135
- it('returns nothing for the discriminated Stripe union', () => {
136
- // A discriminated union IS prunable — the discriminator selects the branch.
137
- expect(findUnprunableApiPaths('StripeBillingStatusResponse')).toEqual([]);
138
- });
139
-
140
- it('reports the path of a nested ambiguous schema', () => {
141
- const components = toOpenApiComponents({
142
- Outer: {
143
- type: 'object',
144
- properties: {
145
- payload: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
146
- rows: {
147
- type: 'array',
148
- items: { anyOf: [{ type: 'object' }, { type: 'object', properties: {} }] },
149
- },
150
- },
151
- },
152
- });
153
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Outer' }, components).sort()).toEqual([
154
- '/payload (allOf)',
155
- '/rows[] (union without discriminator)',
156
- ]);
157
- });
158
-
159
- it('reports an ambiguous schema reached through a map value', () => {
160
- // additionalProperties is the path every value in a Record<string, T> takes, so its
161
- // limitations are the map's limitations.
162
- const components = toOpenApiComponents({
163
- Registry: {
164
- type: 'object',
165
- additionalProperties: { allOf: [{ type: 'object', properties: { a: { type: 'string' } } }] },
166
- },
167
- });
168
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Registry' }, components)).toEqual(['{} (allOf)']);
169
- });
170
-
171
- it('does not flag a scalar union expressed through references', () => {
172
- // Every branch resolves to an enum, so there are no properties to narrow and the missing
173
- // discriminator is irrelevant.
174
- const components = toOpenApiComponents({
175
- Choice: {
176
- anyOf: [{ $ref: '#/$defs/Colour' }, { type: 'null' }],
177
- $defs: { Colour: { type: 'string', enum: ['red', 'green'] } },
178
- },
179
- });
180
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Choice' }, components)).toEqual([]);
181
- });
182
-
183
- it('terminates on a recursive component', () => {
184
- const components = toOpenApiComponents({
185
- Node: { type: 'object', properties: { children: { type: 'array', items: { $ref: '#' } } } },
186
- });
187
- expect(findUnprunablePaths({ $ref: '#/components/schemas/Node' }, components)).toEqual([]);
188
- });
189
- });
@@ -1,147 +0,0 @@
1
- import { Ajv2020 } from 'ajv/dist/2020.js';
2
- import { describe, expect, it } from 'vitest';
3
- import type {
4
- QuotaEffectiveTier,
5
- QuotaStandingAdmissionClass,
6
- QuotaStandingResource,
7
- QuotaStandingResponse,
8
- QuotaStandingWindow,
9
- QuotaTierResponse,
10
- } from '../rate-limiter.js';
11
- import type { JsonObject } from './adapter.js';
12
- import { ApiSchemaComponents, apiComponentRef, validateApiResponse } from './registry.js';
13
-
14
- /** Exact type identity — `extends` in both directions is too weak (any/unknown slip through). */
15
- type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
16
- function assertType<T extends true>(_ok: T): void {}
17
-
18
- function compile(name: string, components: Readonly<Record<string, JsonObject>> = ApiSchemaComponents) {
19
- const ajv = new Ajv2020({ strictSchema: false, allErrors: true });
20
- ajv.addSchema({ $id: 'vertesia://openapi', components: { schemas: components } });
21
- return ajv.compile({ $ref: `vertesia://openapi${apiComponentRef(name as never)}` });
22
- }
23
-
24
- const VALID_WINDOW = { limit: 600, used: 12, remaining: 588, window_ms: 60_000 };
25
-
26
- const VALID_STANDING = {
27
- tenant_id: '1589ba_149d0b',
28
- available: true,
29
- base_tier: 'default',
30
- effective_tier: 'enterprise',
31
- api: [{ resource: 'objects', name: 'Content objects', burst: VALID_WINDOW, quota: VALID_WINDOW }],
32
- admission: {
33
- classes: [{ class: 'ExecuteConversationWorkflow', tenant_active: 3 }],
34
- note: 'Budget is global and discovered.',
35
- },
36
- llm: { note: 'Shared per environment/model.' },
37
- };
38
-
39
- describe('gate 1 — the schema is the single source of truth for the public quota types', () => {
40
- it('publishes the exact schema-derived type, not a hand-written twin', () => {
41
- // The whole closure, not only the two types the endpoints return. A hand-written
42
- // QuotaStandingWindow beside an inferred QuotaStandingResponse would leave the drift path
43
- // open one level down, where it is harder to see.
44
- expect(true).toBe(true);
45
- });
46
-
47
- it('resolves nested component references to concrete property types', () => {
48
- // Schema-first only pays off if a $ref survives inference as the referenced type rather
49
- // than degrading to `unknown` — that is what makes the SDK usable.
50
- assertType<Equals<QuotaStandingResponse['api'], QuotaStandingResource[]>>(true);
51
- assertType<Equals<QuotaStandingResource['burst'], QuotaStandingWindow>>(true);
52
- assertType<Equals<QuotaStandingResponse['admission']['classes'], QuotaStandingAdmissionClass[]>>(true);
53
- assertType<Equals<QuotaStandingResponse['effective_tier'], QuotaEffectiveTier>>(true);
54
- assertType<Equals<QuotaTierResponse['tier'], QuotaEffectiveTier>>(true);
55
- expect(true).toBe(true);
56
- });
57
-
58
- it('keeps every quota field required, as the published document declares', () => {
59
- // `?:` on an inferred field is invisible at the call site until a consumer hits undefined.
60
- // Identity above would catch a change here, but only by failing somewhere less obvious.
61
- assertType<Equals<QuotaStandingResponse['available'], boolean>>(true);
62
- assertType<Equals<QuotaStandingWindow['remaining'], number>>(true);
63
- assertType<Equals<QuotaStandingResponse['llm'], { note: string }>>(true);
64
- expect(true).toBe(true);
65
- });
66
- });
67
-
68
- describe('gate 2 — the published components match the closure the types come from', () => {
69
- it('hoists every id-bearing quota schema into its own component', () => {
70
- // Six components for two endpoints: the registry must be self-contained, so a canonical
71
- // component may not reference a TypeScript-derived one.
72
- const quota = Object.keys(ApiSchemaComponents)
73
- .filter((name) => name.startsWith('Quota'))
74
- .sort();
75
- expect(quota).toEqual([
76
- 'QuotaEffectiveTier',
77
- 'QuotaStandingAdmissionClass',
78
- 'QuotaStandingResource',
79
- 'QuotaStandingResponse',
80
- 'QuotaStandingWindow',
81
- // QuotaTier is the account tier enum, converted with the account slice.
82
- 'QuotaTier',
83
- 'QuotaTierResponse',
84
- ]);
85
- });
86
-
87
- it('shares one QuotaStandingWindow component across both referencing properties', () => {
88
- // The literal pointer, not apiComponentRef: that helper only accepts registry entry names,
89
- // and QuotaStandingWindow is a hoisted sub-component rather than a slot's contract.
90
- const props = ApiSchemaComponents.QuotaStandingResource.properties as Record<string, JsonObject>;
91
- expect(props.burst).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
92
- expect(props.quota).toEqual({ $ref: '#/components/schemas/QuotaStandingWindow' });
93
- });
94
-
95
- it('keeps admission and llm anonymous, as the document publishes them', () => {
96
- // Naming them would add a $ref the spec does not carry, changing the generated clients.
97
- const props = ApiSchemaComponents.QuotaStandingResponse.properties as Record<string, JsonObject>;
98
- expect(props.admission.$ref).toBeUndefined();
99
- expect(props.admission.type).toBe('object');
100
- expect(props.llm.$ref).toBeUndefined();
101
- expect(Object.keys(ApiSchemaComponents)).not.toContain('QuotaStandingAdmission');
102
- });
103
- });
104
-
105
- describe('gate 3 — AJV validates the same canonical objects that are published', () => {
106
- it('accepts a full standing payload', () => {
107
- expect(compile('QuotaStandingResponse')(VALID_STANDING)).toBe(true);
108
- expect(compile('QuotaTierResponse')({ tier: 'enterprise' })).toBe(true);
109
- });
110
-
111
- it('rejects a missing required field', () => {
112
- const { available: _dropped, ...incomplete } = VALID_STANDING;
113
- expect(compile('QuotaStandingResponse')(incomplete)).toBe(false);
114
- });
115
-
116
- it('rejects a numeric window value sent as a string', () => {
117
- // No coerceTypes: one AJV configuration serves bodies and responses, so a JSON number that
118
- // arrives as text is a contract violation rather than something quietly repaired.
119
- const bad = { ...VALID_WINDOW, used: '12' };
120
- expect(compile('QuotaStandingWindow')(bad)).toBe(false);
121
- });
122
-
123
- it('closes the anonymous nested objects the strict policy reaches', () => {
124
- const withExtra = { ...VALID_STANDING, llm: { note: 'x', rogue: 1 } };
125
- expect(compile('QuotaStandingResponse')(withExtra)).toBe(false);
126
- });
127
- });
128
-
129
- describe('gate 4 — the response path checks the same component the SDK types come from', () => {
130
- it('accepts a conforming response and hands back the component type', () => {
131
- const result = validateApiResponse('QuotaTierResponse', { tier: 'standard' });
132
- expect(result.valid).toBe(true);
133
- if (result.valid) {
134
- assertType<Equals<typeof result.data, QuotaTierResponse>>(true);
135
- expect(result.data.tier).toBe('standard');
136
- }
137
- });
138
-
139
- it('reports a violation without mutating the payload', () => {
140
- // Detection, not repair. Outside local development a response mismatch is logged drift, so
141
- // this must never silently edit what a caller receives.
142
- const response: Record<string, unknown> = { tier: 42, legacy_extra: 'still here' };
143
- const pristine = structuredClone(response);
144
- expect(validateApiResponse('QuotaTierResponse', response).valid).toBe(false);
145
- expect(response).toEqual(pristine);
146
- });
147
- });
@@ -1,99 +0,0 @@
1
- import { describe, expect, expectTypeOf, it } from 'vitest';
2
- import { z } from 'zod';
3
- import type { NamedInteractionExecutionPayloadSchema } from './interaction.js';
4
- import { type ApiComponentName, type ApiComponentType, ApiSchemaComponents, mergeComponentGroups } from './registry.js';
5
-
6
- /**
7
- * `N` when `ApiComponentType` resolves it, and `never` when it does not.
8
- *
9
- * The conditional that maps a name to its inferred type tests the groups one by one and ends in
10
- * `never`, so a group missing from that chain — the third place a new group has to be listed, after
11
- * the merge array and the `ApiComponentName` union — makes every name in it resolve to `never`
12
- * rather than fail. Distributing this over the whole union turns that into an assignment error on
13
- * the list below, which `typecheck:test` reports.
14
- */
15
- type ResolvedName<N extends ApiComponentName> = [ApiComponentType<N>] extends [never] ? never : N;
16
-
17
- /**
18
- * Covers the one way the group split can corrupt the registry.
19
- *
20
- * The registry is declared in several objects because the compiler cannot serialize it as one, and
21
- * the two public types are assembled from those objects: `ApiComponentName` is a union of `keyof`,
22
- * `ApiComponentType` a conditional testing the groups IN ORDER. A plain spread merge would accept a
23
- * name listed twice and keep the LAST group's schema, while `ApiComponentType` would resolve to the
24
- * FIRST group's — validation enforcing one shape while every handler is typed against another, with
25
- * nothing downstream to report it. The grouping is a compiler accommodation, so this failure mode is
26
- * pure accident: a component moved between groups and left behind, or added to whichever group the
27
- * author had open.
28
- *
29
- * The real groups are covered by the call itself, which runs at module load — a duplicate there
30
- * throws on import and takes every test in the package with it. What is tested here is that the
31
- * merge actually refuses, which no import of a correct registry can show.
32
- */
33
- describe('mergeComponentGroups', () => {
34
- it('preserves execution payload types and rejects unregistered component names', () => {
35
- expectTypeOf<ApiComponentType<'NamedInteractionExecutionPayload'>>().toEqualTypeOf<
36
- z.infer<typeof NamedInteractionExecutionPayloadSchema>
37
- >();
38
- expectTypeOf<'UnregisteredExecutionComponent'>().not.toMatchTypeOf<ApiComponentName>();
39
- });
40
-
41
- const A = z.strictObject({ a: z.string() });
42
- const B = z.strictObject({ b: z.number() });
43
-
44
- it('merges disjoint groups into one object', () => {
45
- const merged = mergeComponentGroups([{ Alpha: A }, { Beta: B }]);
46
-
47
- expect(Object.keys(merged).sort()).toEqual(['Alpha', 'Beta']);
48
- expect(merged.Alpha).toBe(A);
49
- expect(merged.Beta).toBe(B);
50
- });
51
-
52
- it('refuses a name registered in two groups', () => {
53
- expect(() => mergeComponentGroups([{ Alpha: A }, { Alpha: B }])).toThrow(
54
- /registered in more than one group: Alpha/,
55
- );
56
- });
57
-
58
- it('names every colliding component, not just the first', () => {
59
- expect(() => mergeComponentGroups([{ Beta: B, Alpha: A }, { Alpha: B }, { Beta: A }])).toThrow(
60
- /components registered in more than one group: Alpha, Beta/,
61
- );
62
- });
63
-
64
- it('reports a collision across non-adjacent groups', () => {
65
- // The failure is a name in ANY two groups, not only in two that happen to be listed together.
66
- expect(() => mergeComponentGroups([{ Alpha: A }, { Beta: B }, { Alpha: B }])).toThrow(
67
- /registered in more than one group: Alpha/,
68
- );
69
- });
70
-
71
- it('emits a component from every group, and resolves its type', () => {
72
- // The merge takes a list, so a group can be dropped from it as easily as duplicated in it —
73
- // and dropping one is silent in a different way: `ApiComponentName` still names those
74
- // components, so the code compiles and only the emitted document loses them. One known name
75
- // per group is what notices — the `satisfies` for the type conditional, the loop for the
76
- // merge.
77
- const perGroup = [
78
- 'Account',
79
- 'ProjectModelDefaults',
80
- 'OAuthProvider',
81
- 'ExecutionEnvironment',
82
- 'JSONValue',
83
- 'Interaction',
84
- 'ImprovePromptPayload',
85
- 'AgentRunnerOptions',
86
- 'ExecutionRunStatus',
87
- 'RenderPromptResponse',
88
- 'AggregatedTool',
89
- 'OAuthAuthStatus',
90
- 'AuditTrailResponse',
91
- 'ViewExperience',
92
- 'CopyFilePayload',
93
- ] as const satisfies readonly ResolvedName<ApiComponentName>[];
94
-
95
- for (const name of perGroup) {
96
- expect(ApiSchemaComponents).toHaveProperty(name);
97
- }
98
- });
99
- });