@kindgi/api 0.0.0-bootstrap.0 → 0.1.1

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 (505) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +216 -1
  3. package/dist/adapter-binding.d.ts +177 -0
  4. package/dist/adapter-binding.d.ts.map +1 -0
  5. package/dist/adapter-binding.js +12 -0
  6. package/dist/adapter-binding.js.map +1 -0
  7. package/dist/agent-binding.d.ts +207 -0
  8. package/dist/agent-binding.d.ts.map +1 -0
  9. package/dist/agent-binding.js +4 -0
  10. package/dist/agent-binding.js.map +1 -0
  11. package/dist/app.d.ts +770 -0
  12. package/dist/app.d.ts.map +1 -0
  13. package/dist/app.js +397 -0
  14. package/dist/app.js.map +1 -0
  15. package/dist/capability-binding.d.ts +76 -0
  16. package/dist/capability-binding.d.ts.map +1 -0
  17. package/dist/capability-binding.js +4 -0
  18. package/dist/capability-binding.js.map +1 -0
  19. package/dist/cost-binding.d.ts +175 -0
  20. package/dist/cost-binding.d.ts.map +1 -0
  21. package/dist/cost-binding.js +13 -0
  22. package/dist/cost-binding.js.map +1 -0
  23. package/dist/deployment-binding.d.ts +201 -0
  24. package/dist/deployment-binding.d.ts.map +1 -0
  25. package/dist/deployment-binding.js +4 -0
  26. package/dist/deployment-binding.js.map +1 -0
  27. package/dist/env-binding.d.ts +132 -0
  28. package/dist/env-binding.d.ts.map +1 -0
  29. package/dist/env-binding.js +4 -0
  30. package/dist/env-binding.js.map +1 -0
  31. package/dist/errors.d.ts +37 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +268 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/eval-run-binding.d.ts +196 -0
  36. package/dist/eval-run-binding.d.ts.map +1 -0
  37. package/dist/eval-run-binding.js +16 -0
  38. package/dist/eval-run-binding.js.map +1 -0
  39. package/dist/eval-run-dispatcher.d.ts +131 -0
  40. package/dist/eval-run-dispatcher.d.ts.map +1 -0
  41. package/dist/eval-run-dispatcher.js +368 -0
  42. package/dist/eval-run-dispatcher.js.map +1 -0
  43. package/dist/eval-suite-binding.d.ts +227 -0
  44. package/dist/eval-suite-binding.d.ts.map +1 -0
  45. package/dist/eval-suite-binding.js +24 -0
  46. package/dist/eval-suite-binding.js.map +1 -0
  47. package/dist/event-bus-binding.d.ts +107 -0
  48. package/dist/event-bus-binding.d.ts.map +1 -0
  49. package/dist/event-bus-binding.js +5 -0
  50. package/dist/event-bus-binding.js.map +1 -0
  51. package/dist/flow-binding.d.ts +194 -0
  52. package/dist/flow-binding.d.ts.map +1 -0
  53. package/dist/flow-binding.js +4 -0
  54. package/dist/flow-binding.js.map +1 -0
  55. package/dist/guardrail-binding.d.ts +138 -0
  56. package/dist/guardrail-binding.d.ts.map +1 -0
  57. package/dist/guardrail-binding.js +4 -0
  58. package/dist/guardrail-binding.js.map +1 -0
  59. package/dist/handler-binding.d.ts +126 -0
  60. package/dist/handler-binding.d.ts.map +1 -0
  61. package/dist/handler-binding.js +4 -0
  62. package/dist/handler-binding.js.map +1 -0
  63. package/dist/hitl-binding.d.ts +115 -0
  64. package/dist/hitl-binding.d.ts.map +1 -0
  65. package/dist/hitl-binding.js +4 -0
  66. package/dist/hitl-binding.js.map +1 -0
  67. package/dist/identity-directory-binding.d.ts +116 -0
  68. package/dist/identity-directory-binding.d.ts.map +1 -0
  69. package/dist/identity-directory-binding.js +4 -0
  70. package/dist/identity-directory-binding.js.map +1 -0
  71. package/dist/identity-provider-binding.d.ts +184 -0
  72. package/dist/identity-provider-binding.d.ts.map +1 -0
  73. package/dist/identity-provider-binding.js +4 -0
  74. package/dist/identity-provider-binding.js.map +1 -0
  75. package/dist/image-registry-binding.d.ts +165 -0
  76. package/dist/image-registry-binding.d.ts.map +1 -0
  77. package/dist/image-registry-binding.js +4 -0
  78. package/dist/image-registry-binding.js.map +1 -0
  79. package/dist/index.d.ts +72 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +26 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/key-management-binding.d.ts +101 -0
  84. package/dist/key-management-binding.d.ts.map +1 -0
  85. package/dist/key-management-binding.js +4 -0
  86. package/dist/key-management-binding.js.map +1 -0
  87. package/dist/mcp-endpoint-binding.d.ts +312 -0
  88. package/dist/mcp-endpoint-binding.d.ts.map +1 -0
  89. package/dist/mcp-endpoint-binding.js +12 -0
  90. package/dist/mcp-endpoint-binding.js.map +1 -0
  91. package/dist/memory-binding.d.ts +209 -0
  92. package/dist/memory-binding.d.ts.map +1 -0
  93. package/dist/memory-binding.js +4 -0
  94. package/dist/memory-binding.js.map +1 -0
  95. package/dist/middleware/auth.d.ts +168 -0
  96. package/dist/middleware/auth.d.ts.map +1 -0
  97. package/dist/middleware/auth.js +247 -0
  98. package/dist/middleware/auth.js.map +1 -0
  99. package/dist/middleware/authorize.d.ts +26 -0
  100. package/dist/middleware/authorize.d.ts.map +1 -0
  101. package/dist/middleware/authorize.js +65 -0
  102. package/dist/middleware/authorize.js.map +1 -0
  103. package/dist/middleware/error-mapper.d.ts +20 -0
  104. package/dist/middleware/error-mapper.d.ts.map +1 -0
  105. package/dist/middleware/error-mapper.js +34 -0
  106. package/dist/middleware/error-mapper.js.map +1 -0
  107. package/dist/middleware/idempotency.d.ts +43 -0
  108. package/dist/middleware/idempotency.d.ts.map +1 -0
  109. package/dist/middleware/idempotency.js +118 -0
  110. package/dist/middleware/idempotency.js.map +1 -0
  111. package/dist/middleware/principal.d.ts +4 -0
  112. package/dist/middleware/principal.d.ts.map +1 -0
  113. package/dist/middleware/principal.js +42 -0
  114. package/dist/middleware/principal.js.map +1 -0
  115. package/dist/middleware/public-run-routes.d.ts +16 -0
  116. package/dist/middleware/public-run-routes.d.ts.map +1 -0
  117. package/dist/middleware/public-run-routes.js +43 -0
  118. package/dist/middleware/public-run-routes.js.map +1 -0
  119. package/dist/middleware/request-id.d.ts +14 -0
  120. package/dist/middleware/request-id.d.ts.map +1 -0
  121. package/dist/middleware/request-id.js +24 -0
  122. package/dist/middleware/request-id.js.map +1 -0
  123. package/dist/middleware/sigv4-verify.d.ts +64 -0
  124. package/dist/middleware/sigv4-verify.d.ts.map +1 -0
  125. package/dist/middleware/sigv4-verify.js +286 -0
  126. package/dist/middleware/sigv4-verify.js.map +1 -0
  127. package/dist/middleware/sigv4.d.ts +25 -0
  128. package/dist/middleware/sigv4.d.ts.map +1 -0
  129. package/dist/middleware/sigv4.js +120 -0
  130. package/dist/middleware/sigv4.js.map +1 -0
  131. package/dist/openapi/generate.d.ts +15 -0
  132. package/dist/openapi/generate.d.ts.map +1 -0
  133. package/dist/openapi/generate.js +241 -0
  134. package/dist/openapi/generate.js.map +1 -0
  135. package/dist/openapi/operations.d.ts +70 -0
  136. package/dist/openapi/operations.d.ts.map +1 -0
  137. package/dist/openapi/operations.js +5050 -0
  138. package/dist/openapi/operations.js.map +1 -0
  139. package/dist/openapi/schemas.d.ts +590 -0
  140. package/dist/openapi/schemas.d.ts.map +1 -0
  141. package/dist/openapi/schemas.js +5820 -0
  142. package/dist/openapi/schemas.js.map +1 -0
  143. package/dist/provenance-binding.d.ts +116 -0
  144. package/dist/provenance-binding.d.ts.map +1 -0
  145. package/dist/provenance-binding.js +31 -0
  146. package/dist/provenance-binding.js.map +1 -0
  147. package/dist/provider-binding.d.ts +174 -0
  148. package/dist/provider-binding.d.ts.map +1 -0
  149. package/dist/provider-binding.js +4 -0
  150. package/dist/provider-binding.js.map +1 -0
  151. package/dist/public-run-token.d.ts +97 -0
  152. package/dist/public-run-token.d.ts.map +1 -0
  153. package/dist/public-run-token.js +167 -0
  154. package/dist/public-run-token.js.map +1 -0
  155. package/dist/retention-binding.d.ts +69 -0
  156. package/dist/retention-binding.d.ts.map +1 -0
  157. package/dist/retention-binding.js +4 -0
  158. package/dist/retention-binding.js.map +1 -0
  159. package/dist/reviewer-binding.d.ts +84 -0
  160. package/dist/reviewer-binding.d.ts.map +1 -0
  161. package/dist/reviewer-binding.js +4 -0
  162. package/dist/reviewer-binding.js.map +1 -0
  163. package/dist/rotation-status-store.d.ts +96 -0
  164. package/dist/rotation-status-store.d.ts.map +1 -0
  165. package/dist/rotation-status-store.js +106 -0
  166. package/dist/rotation-status-store.js.map +1 -0
  167. package/dist/routes/adapters.d.ts +29 -0
  168. package/dist/routes/adapters.d.ts.map +1 -0
  169. package/dist/routes/adapters.js +230 -0
  170. package/dist/routes/adapters.js.map +1 -0
  171. package/dist/routes/agents.d.ts +17 -0
  172. package/dist/routes/agents.d.ts.map +1 -0
  173. package/dist/routes/agents.js +342 -0
  174. package/dist/routes/agents.js.map +1 -0
  175. package/dist/routes/approvals.d.ts +37 -0
  176. package/dist/routes/approvals.d.ts.map +1 -0
  177. package/dist/routes/approvals.js +551 -0
  178. package/dist/routes/approvals.js.map +1 -0
  179. package/dist/routes/artifacts.d.ts +25 -0
  180. package/dist/routes/artifacts.d.ts.map +1 -0
  181. package/dist/routes/artifacts.js +265 -0
  182. package/dist/routes/artifacts.js.map +1 -0
  183. package/dist/routes/audit.d.ts +6 -0
  184. package/dist/routes/audit.d.ts.map +1 -0
  185. package/dist/routes/audit.js +162 -0
  186. package/dist/routes/audit.js.map +1 -0
  187. package/dist/routes/auth.d.ts +47 -0
  188. package/dist/routes/auth.d.ts.map +1 -0
  189. package/dist/routes/auth.js +630 -0
  190. package/dist/routes/auth.js.map +1 -0
  191. package/dist/routes/capabilities.d.ts +14 -0
  192. package/dist/routes/capabilities.d.ts.map +1 -0
  193. package/dist/routes/capabilities.js +62 -0
  194. package/dist/routes/capabilities.js.map +1 -0
  195. package/dist/routes/compliance.d.ts +37 -0
  196. package/dist/routes/compliance.d.ts.map +1 -0
  197. package/dist/routes/compliance.js +321 -0
  198. package/dist/routes/compliance.js.map +1 -0
  199. package/dist/routes/conversations.d.ts +13 -0
  200. package/dist/routes/conversations.d.ts.map +1 -0
  201. package/dist/routes/conversations.js +295 -0
  202. package/dist/routes/conversations.js.map +1 -0
  203. package/dist/routes/cost.d.ts +24 -0
  204. package/dist/routes/cost.d.ts.map +1 -0
  205. package/dist/routes/cost.js +243 -0
  206. package/dist/routes/cost.js.map +1 -0
  207. package/dist/routes/deployments.d.ts +122 -0
  208. package/dist/routes/deployments.d.ts.map +1 -0
  209. package/dist/routes/deployments.js +1036 -0
  210. package/dist/routes/deployments.js.map +1 -0
  211. package/dist/routes/env.d.ts +62 -0
  212. package/dist/routes/env.d.ts.map +1 -0
  213. package/dist/routes/env.js +311 -0
  214. package/dist/routes/env.js.map +1 -0
  215. package/dist/routes/eval-runs.d.ts +28 -0
  216. package/dist/routes/eval-runs.d.ts.map +1 -0
  217. package/dist/routes/eval-runs.js +479 -0
  218. package/dist/routes/eval-runs.js.map +1 -0
  219. package/dist/routes/eval-suites.d.ts +24 -0
  220. package/dist/routes/eval-suites.d.ts.map +1 -0
  221. package/dist/routes/eval-suites.js +381 -0
  222. package/dist/routes/eval-suites.js.map +1 -0
  223. package/dist/routes/event-triggers.d.ts +12 -0
  224. package/dist/routes/event-triggers.d.ts.map +1 -0
  225. package/dist/routes/event-triggers.js +218 -0
  226. package/dist/routes/event-triggers.js.map +1 -0
  227. package/dist/routes/flows.d.ts +23 -0
  228. package/dist/routes/flows.d.ts.map +1 -0
  229. package/dist/routes/flows.js +344 -0
  230. package/dist/routes/flows.js.map +1 -0
  231. package/dist/routes/guardrails.d.ts +33 -0
  232. package/dist/routes/guardrails.d.ts.map +1 -0
  233. package/dist/routes/guardrails.js +236 -0
  234. package/dist/routes/guardrails.js.map +1 -0
  235. package/dist/routes/identity.d.ts +39 -0
  236. package/dist/routes/identity.d.ts.map +1 -0
  237. package/dist/routes/identity.js +138 -0
  238. package/dist/routes/identity.js.map +1 -0
  239. package/dist/routes/mcp.d.ts +23 -0
  240. package/dist/routes/mcp.d.ts.map +1 -0
  241. package/dist/routes/mcp.js +727 -0
  242. package/dist/routes/mcp.js.map +1 -0
  243. package/dist/routes/memory.d.ts +16 -0
  244. package/dist/routes/memory.d.ts.map +1 -0
  245. package/dist/routes/memory.js +353 -0
  246. package/dist/routes/memory.js.map +1 -0
  247. package/dist/routes/observations.d.ts +19 -0
  248. package/dist/routes/observations.d.ts.map +1 -0
  249. package/dist/routes/observations.js +135 -0
  250. package/dist/routes/observations.js.map +1 -0
  251. package/dist/routes/orgs.d.ts +24 -0
  252. package/dist/routes/orgs.d.ts.map +1 -0
  253. package/dist/routes/orgs.js +208 -0
  254. package/dist/routes/orgs.js.map +1 -0
  255. package/dist/routes/pagination.d.ts +18 -0
  256. package/dist/routes/pagination.d.ts.map +1 -0
  257. package/dist/routes/pagination.js +35 -0
  258. package/dist/routes/pagination.js.map +1 -0
  259. package/dist/routes/policies.d.ts +23 -0
  260. package/dist/routes/policies.d.ts.map +1 -0
  261. package/dist/routes/policies.js +314 -0
  262. package/dist/routes/policies.js.map +1 -0
  263. package/dist/routes/projects.d.ts +45 -0
  264. package/dist/routes/projects.d.ts.map +1 -0
  265. package/dist/routes/projects.js +485 -0
  266. package/dist/routes/projects.js.map +1 -0
  267. package/dist/routes/proposals.d.ts +24 -0
  268. package/dist/routes/proposals.d.ts.map +1 -0
  269. package/dist/routes/proposals.js +581 -0
  270. package/dist/routes/proposals.js.map +1 -0
  271. package/dist/routes/provenance.d.ts +34 -0
  272. package/dist/routes/provenance.d.ts.map +1 -0
  273. package/dist/routes/provenance.js +274 -0
  274. package/dist/routes/provenance.js.map +1 -0
  275. package/dist/routes/providers.d.ts +32 -0
  276. package/dist/routes/providers.d.ts.map +1 -0
  277. package/dist/routes/providers.js +490 -0
  278. package/dist/routes/providers.js.map +1 -0
  279. package/dist/routes/public-run-tokens.d.ts +17 -0
  280. package/dist/routes/public-run-tokens.d.ts.map +1 -0
  281. package/dist/routes/public-run-tokens.js +69 -0
  282. package/dist/routes/public-run-tokens.js.map +1 -0
  283. package/dist/routes/retention.d.ts +19 -0
  284. package/dist/routes/retention.d.ts.map +1 -0
  285. package/dist/routes/retention.js +152 -0
  286. package/dist/routes/retention.js.map +1 -0
  287. package/dist/routes/reviewers.d.ts +5 -0
  288. package/dist/routes/reviewers.d.ts.map +1 -0
  289. package/dist/routes/reviewers.js +161 -0
  290. package/dist/routes/reviewers.js.map +1 -0
  291. package/dist/routes/runs.d.ts +34 -0
  292. package/dist/routes/runs.d.ts.map +1 -0
  293. package/dist/routes/runs.js +705 -0
  294. package/dist/routes/runs.js.map +1 -0
  295. package/dist/routes/s3.d.ts +31 -0
  296. package/dist/routes/s3.d.ts.map +1 -0
  297. package/dist/routes/s3.js +433 -0
  298. package/dist/routes/s3.js.map +1 -0
  299. package/dist/routes/schedules.d.ts +20 -0
  300. package/dist/routes/schedules.d.ts.map +1 -0
  301. package/dist/routes/schedules.js +234 -0
  302. package/dist/routes/schedules.js.map +1 -0
  303. package/dist/routes/scope-params.d.ts +57 -0
  304. package/dist/routes/scope-params.d.ts.map +1 -0
  305. package/dist/routes/scope-params.js +105 -0
  306. package/dist/routes/scope-params.js.map +1 -0
  307. package/dist/routes/secret-ref.d.ts +20 -0
  308. package/dist/routes/secret-ref.d.ts.map +1 -0
  309. package/dist/routes/secret-ref.js +42 -0
  310. package/dist/routes/secret-ref.js.map +1 -0
  311. package/dist/routes/secrets.d.ts +53 -0
  312. package/dist/routes/secrets.d.ts.map +1 -0
  313. package/dist/routes/secrets.js +715 -0
  314. package/dist/routes/secrets.js.map +1 -0
  315. package/dist/routes/signing-keys.d.ts +23 -0
  316. package/dist/routes/signing-keys.d.ts.map +1 -0
  317. package/dist/routes/signing-keys.js +212 -0
  318. package/dist/routes/signing-keys.js.map +1 -0
  319. package/dist/routes/sse.d.ts +58 -0
  320. package/dist/routes/sse.d.ts.map +1 -0
  321. package/dist/routes/sse.js +92 -0
  322. package/dist/routes/sse.js.map +1 -0
  323. package/dist/routes/teams.d.ts +30 -0
  324. package/dist/routes/teams.d.ts.map +1 -0
  325. package/dist/routes/teams.js +443 -0
  326. package/dist/routes/teams.js.map +1 -0
  327. package/dist/routes/tenant.d.ts +57 -0
  328. package/dist/routes/tenant.d.ts.map +1 -0
  329. package/dist/routes/tenant.js +352 -0
  330. package/dist/routes/tenant.js.map +1 -0
  331. package/dist/routes/tokens.d.ts +14 -0
  332. package/dist/routes/tokens.d.ts.map +1 -0
  333. package/dist/routes/tokens.js +231 -0
  334. package/dist/routes/tokens.js.map +1 -0
  335. package/dist/routes/tools.d.ts +33 -0
  336. package/dist/routes/tools.d.ts.map +1 -0
  337. package/dist/routes/tools.js +380 -0
  338. package/dist/routes/tools.js.map +1 -0
  339. package/dist/routes/webhook-endpoints.d.ts +10 -0
  340. package/dist/routes/webhook-endpoints.d.ts.map +1 -0
  341. package/dist/routes/webhook-endpoints.js +407 -0
  342. package/dist/routes/webhook-endpoints.js.map +1 -0
  343. package/dist/routes/webhooks.d.ts +21 -0
  344. package/dist/routes/webhooks.d.ts.map +1 -0
  345. package/dist/routes/webhooks.js +228 -0
  346. package/dist/routes/webhooks.js.map +1 -0
  347. package/dist/s3-credential-binding.d.ts +54 -0
  348. package/dist/s3-credential-binding.d.ts.map +1 -0
  349. package/dist/s3-credential-binding.js +4 -0
  350. package/dist/s3-credential-binding.js.map +1 -0
  351. package/dist/secrets-binding.d.ts +281 -0
  352. package/dist/secrets-binding.d.ts.map +1 -0
  353. package/dist/secrets-binding.js +10 -0
  354. package/dist/secrets-binding.js.map +1 -0
  355. package/dist/secrets-provider-binding.d.ts +164 -0
  356. package/dist/secrets-provider-binding.d.ts.map +1 -0
  357. package/dist/secrets-provider-binding.js +4 -0
  358. package/dist/secrets-provider-binding.js.map +1 -0
  359. package/dist/session-store-binding.d.ts +148 -0
  360. package/dist/session-store-binding.d.ts.map +1 -0
  361. package/dist/session-store-binding.js +4 -0
  362. package/dist/session-store-binding.js.map +1 -0
  363. package/dist/signing-key-binding.d.ts +210 -0
  364. package/dist/signing-key-binding.d.ts.map +1 -0
  365. package/dist/signing-key-binding.js +4 -0
  366. package/dist/signing-key-binding.js.map +1 -0
  367. package/dist/state-store-binding.d.ts +53 -0
  368. package/dist/state-store-binding.d.ts.map +1 -0
  369. package/dist/state-store-binding.js +38 -0
  370. package/dist/state-store-binding.js.map +1 -0
  371. package/dist/supervisor-binding.d.ts +526 -0
  372. package/dist/supervisor-binding.d.ts.map +1 -0
  373. package/dist/supervisor-binding.js +4 -0
  374. package/dist/supervisor-binding.js.map +1 -0
  375. package/dist/tenant-host-access.d.ts +41 -0
  376. package/dist/tenant-host-access.d.ts.map +1 -0
  377. package/dist/tenant-host-access.js +42 -0
  378. package/dist/tenant-host-access.js.map +1 -0
  379. package/dist/token-admin.d.ts +99 -0
  380. package/dist/token-admin.d.ts.map +1 -0
  381. package/dist/token-admin.js +4 -0
  382. package/dist/token-admin.js.map +1 -0
  383. package/dist/tool-binding.d.ts +247 -0
  384. package/dist/tool-binding.d.ts.map +1 -0
  385. package/dist/tool-binding.js +4 -0
  386. package/dist/tool-binding.js.map +1 -0
  387. package/dist/trigger-binding.d.ts +13 -0
  388. package/dist/trigger-binding.d.ts.map +1 -0
  389. package/dist/trigger-binding.js +4 -0
  390. package/dist/trigger-binding.js.map +1 -0
  391. package/dist/types.d.ts +71 -0
  392. package/dist/types.d.ts.map +1 -0
  393. package/dist/types.js +4 -0
  394. package/dist/types.js.map +1 -0
  395. package/dist/webhook-endpoint-binding.d.ts +230 -0
  396. package/dist/webhook-endpoint-binding.d.ts.map +1 -0
  397. package/dist/webhook-endpoint-binding.js +12 -0
  398. package/dist/webhook-endpoint-binding.js.map +1 -0
  399. package/dist/xml.d.ts +79 -0
  400. package/dist/xml.d.ts.map +1 -0
  401. package/dist/xml.js +115 -0
  402. package/dist/xml.js.map +1 -0
  403. package/openapi.json +29649 -0
  404. package/package.json +76 -4
  405. package/scripts/emit-openapi.mjs +44 -0
  406. package/src/adapter-binding.ts +204 -0
  407. package/src/agent-binding.ts +231 -0
  408. package/src/app.ts +1286 -0
  409. package/src/capability-binding.ts +83 -0
  410. package/src/cost-binding.ts +213 -0
  411. package/src/deployment-binding.ts +225 -0
  412. package/src/env-binding.ts +140 -0
  413. package/src/errors.ts +295 -0
  414. package/src/eval-run-binding.ts +209 -0
  415. package/src/eval-run-dispatcher.ts +497 -0
  416. package/src/eval-suite-binding.ts +257 -0
  417. package/src/event-bus-binding.ts +127 -0
  418. package/src/flow-binding.ts +213 -0
  419. package/src/guardrail-binding.ts +151 -0
  420. package/src/handler-binding.ts +132 -0
  421. package/src/hitl-binding.ts +172 -0
  422. package/src/identity-directory-binding.ts +128 -0
  423. package/src/identity-provider-binding.ts +203 -0
  424. package/src/image-registry-binding.ts +193 -0
  425. package/src/index.ts +606 -0
  426. package/src/key-management-binding.ts +91 -0
  427. package/src/mcp-endpoint-binding.ts +311 -0
  428. package/src/memory-binding.ts +239 -0
  429. package/src/middleware/auth.ts +437 -0
  430. package/src/middleware/authorize.ts +125 -0
  431. package/src/middleware/error-mapper.ts +40 -0
  432. package/src/middleware/idempotency.ts +160 -0
  433. package/src/middleware/principal.ts +64 -0
  434. package/src/middleware/public-run-routes.ts +50 -0
  435. package/src/middleware/request-id.ts +28 -0
  436. package/src/middleware/sigv4-verify.ts +374 -0
  437. package/src/middleware/sigv4.ts +165 -0
  438. package/src/openapi/generate.ts +307 -0
  439. package/src/openapi/operations.ts +5444 -0
  440. package/src/openapi/schemas.ts +6363 -0
  441. package/src/provenance-binding.ts +169 -0
  442. package/src/provider-binding.ts +196 -0
  443. package/src/public-run-token.ts +263 -0
  444. package/src/retention-binding.ts +78 -0
  445. package/src/reviewer-binding.ts +99 -0
  446. package/src/rotation-status-store.ts +209 -0
  447. package/src/routes/adapters.ts +319 -0
  448. package/src/routes/agents.ts +424 -0
  449. package/src/routes/approvals.ts +759 -0
  450. package/src/routes/artifacts.ts +317 -0
  451. package/src/routes/audit.ts +219 -0
  452. package/src/routes/auth.ts +806 -0
  453. package/src/routes/capabilities.ts +79 -0
  454. package/src/routes/compliance.ts +482 -0
  455. package/src/routes/conversations.ts +369 -0
  456. package/src/routes/cost.ts +327 -0
  457. package/src/routes/deployments.ts +1493 -0
  458. package/src/routes/env.ts +429 -0
  459. package/src/routes/eval-runs.ts +631 -0
  460. package/src/routes/eval-suites.ts +490 -0
  461. package/src/routes/event-triggers.ts +283 -0
  462. package/src/routes/flows.ts +423 -0
  463. package/src/routes/guardrails.ts +320 -0
  464. package/src/routes/identity.ts +203 -0
  465. package/src/routes/mcp.ts +940 -0
  466. package/src/routes/memory.ts +430 -0
  467. package/src/routes/observations.ts +175 -0
  468. package/src/routes/orgs.ts +273 -0
  469. package/src/routes/pagination.ts +51 -0
  470. package/src/routes/policies.ts +413 -0
  471. package/src/routes/projects.ts +634 -0
  472. package/src/routes/proposals.ts +719 -0
  473. package/src/routes/provenance.ts +406 -0
  474. package/src/routes/providers.ts +624 -0
  475. package/src/routes/public-run-tokens.ts +104 -0
  476. package/src/routes/retention.ts +193 -0
  477. package/src/routes/reviewers.ts +209 -0
  478. package/src/routes/runs.ts +892 -0
  479. package/src/routes/s3.ts +519 -0
  480. package/src/routes/schedules.ts +300 -0
  481. package/src/routes/scope-params.ts +133 -0
  482. package/src/routes/secret-ref.ts +52 -0
  483. package/src/routes/secrets.ts +975 -0
  484. package/src/routes/signing-keys.ts +259 -0
  485. package/src/routes/sse.ts +148 -0
  486. package/src/routes/teams.ts +584 -0
  487. package/src/routes/tenant.ts +530 -0
  488. package/src/routes/tokens.ts +285 -0
  489. package/src/routes/tools.ts +491 -0
  490. package/src/routes/webhook-endpoints.ts +534 -0
  491. package/src/routes/webhooks.ts +296 -0
  492. package/src/s3-credential-binding.ts +58 -0
  493. package/src/secrets-binding.ts +308 -0
  494. package/src/secrets-provider-binding.ts +167 -0
  495. package/src/session-store-binding.ts +163 -0
  496. package/src/signing-key-binding.ts +235 -0
  497. package/src/state-store-binding.ts +84 -0
  498. package/src/supervisor-binding.ts +554 -0
  499. package/src/tenant-host-access.ts +62 -0
  500. package/src/token-admin.ts +104 -0
  501. package/src/tool-binding.ts +274 -0
  502. package/src/trigger-binding.ts +38 -0
  503. package/src/types.ts +74 -0
  504. package/src/webhook-endpoint-binding.ts +246 -0
  505. package/src/xml.ts +196 -0
@@ -0,0 +1,317 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { Hono } from 'hono';
5
+
6
+ import type { ArtifactId, Cursor, RunId, TenantId } from '@kindgi/types';
7
+
8
+ import type { BlobFilter, BlobMeta, BlobPutInput, BlobStorageBinding } from '@kindgi/blob-binding';
9
+ import { statusFor, toWireError } from '../errors.js';
10
+ import type { AppEnv } from '../types.js';
11
+ import { clampLimit } from './pagination.js';
12
+
13
+ /**
14
+ * Artifacts resource routes over the caller-plugged, tenant-scoped
15
+ * `BlobStorageBinding` (from `@kindgi/blob-binding`). Five routes:
16
+ * multipart upload (POST) / streaming GET / HEAD / LIST / DELETE.
17
+ *
18
+ * Storage implementations (filesystem-backed for dev + tests, object
19
+ * stores in production) plug in through the binding.
20
+ *
21
+ * Multipart is the ONLY upload wire format. JSON-body base64 would blow
22
+ * up memory on large blobs. Presigned upload URLs and chunked /
23
+ * resumable uploads are not supported.
24
+ *
25
+ * Scope filtering — indirect. Artifacts do NOT accept the
26
+ * `?scopeKind + ?scopeId + ?inherit` triplet that content-scoped
27
+ * resources accept. A blob carries its owning run (`ownerRunId`), and
28
+ * that run's project is the authoritative scope anchor, so scope
29
+ * filtering goes through runs rather than a field on the blob metadata.
30
+ * Callers who want scope-narrowed artifacts should first list runs at
31
+ * the desired scope, then list artifacts by `?ownerRunId=`.
32
+ */
33
+ export function artifactsRouter(binding: BlobStorageBinding): Hono<AppEnv> {
34
+ const r = new Hono<AppEnv>();
35
+
36
+ // ---------- GET / (list, cursor-paginated metadata) ----------
37
+ r.get('/', async (c) => {
38
+ const requestId = c.get('requestId');
39
+ const tenantId = c.get('tenantId') as TenantId;
40
+ const limit = clampLimit(c.req.query('limit'));
41
+
42
+ const filter = decodeListFilter(new URL(c.req.url).searchParams);
43
+ if (filter.kind === 'err') {
44
+ c.status(statusFor('bad-input') as never);
45
+ return c.json(toWireError({ code: 'bad-input', message: filter.message }, requestId));
46
+ }
47
+ const cursorRaw = c.req.query('cursor');
48
+
49
+ const page = await binding.list(
50
+ tenantId,
51
+ filter.value,
52
+ cursorRaw !== undefined && cursorRaw.length > 0 ? (cursorRaw as Cursor) : undefined,
53
+ limit,
54
+ );
55
+ if (page.kind === 'err') {
56
+ c.status(statusFor(page.error.code) as never);
57
+ return c.json(toWireError(page.error as never, requestId));
58
+ }
59
+ return c.json({
60
+ data: page.value.data.map(serializeMeta),
61
+ hasMore: page.value.nextCursor !== undefined,
62
+ ...(page.value.nextCursor !== undefined && {
63
+ nextCursor: page.value.nextCursor as unknown as string,
64
+ }),
65
+ });
66
+ });
67
+
68
+ // ---------- POST / (multipart upload) ----------
69
+ r.post('/', async (c) => {
70
+ const requestId = c.get('requestId');
71
+ const tenantId = c.get('tenantId') as TenantId;
72
+
73
+ const contentType = c.req.header('content-type') ?? '';
74
+ if (!contentType.toLowerCase().startsWith('multipart/form-data')) {
75
+ c.status(statusFor('bad-input') as never);
76
+ return c.json(
77
+ toWireError(
78
+ {
79
+ code: 'bad-input',
80
+ message: 'POST /v1/artifacts requires `multipart/form-data`',
81
+ },
82
+ requestId,
83
+ ),
84
+ );
85
+ }
86
+
87
+ let form: FormData;
88
+ try {
89
+ form = await c.req.raw.formData();
90
+ } catch {
91
+ c.status(statusFor('bad-input') as never);
92
+ return c.json(
93
+ toWireError({ code: 'bad-input', message: 'Malformed multipart body' }, requestId),
94
+ );
95
+ }
96
+
97
+ const validated = validateMultipart(form);
98
+ if (validated.kind === 'err') {
99
+ c.status(statusFor('bad-input') as never);
100
+ return c.json(toWireError({ code: 'bad-input', message: validated.message }, requestId));
101
+ }
102
+ const input = validated.value;
103
+
104
+ const outcome = await binding.put(tenantId, input);
105
+ if (outcome.kind === 'err') {
106
+ c.status(statusFor(outcome.error.code) as never);
107
+ return c.json(toWireError(outcome.error as never, requestId));
108
+ }
109
+ c.status(201);
110
+ return c.json(serializeMeta(outcome.value));
111
+ });
112
+
113
+ // ---------- GET /:blobId (stream download) ----------
114
+ r.get('/:blobId', async (c) => {
115
+ const requestId = c.get('requestId');
116
+ const tenantId = c.get('tenantId') as TenantId;
117
+ const blobId = c.req.param('blobId') as ArtifactId;
118
+
119
+ const outcome = await binding.get(tenantId, blobId);
120
+ if (outcome.kind === 'err') {
121
+ c.status(statusFor(outcome.error.code) as never);
122
+ return c.json(toWireError(outcome.error as never, requestId));
123
+ }
124
+ const { meta, stream } = outcome.value;
125
+ return new Response(stream, {
126
+ status: 200,
127
+ headers: downloadHeaders(meta, requestId),
128
+ });
129
+ });
130
+
131
+ // ---------- HEAD /:blobId (metadata-only) ----------
132
+ r.on('HEAD', '/:blobId', async (c) => {
133
+ const requestId = c.get('requestId');
134
+ const tenantId = c.get('tenantId') as TenantId;
135
+ const blobId = c.req.param('blobId') as ArtifactId;
136
+
137
+ const meta = await binding.head(tenantId, blobId);
138
+ if (meta === null) {
139
+ return new Response(null, {
140
+ status: 404,
141
+ headers: { 'X-Request-Id': requestId },
142
+ });
143
+ }
144
+ return new Response(null, {
145
+ status: 200,
146
+ headers: downloadHeaders(meta, requestId),
147
+ });
148
+ });
149
+
150
+ // ---------- DELETE /:blobId ----------
151
+ r.delete('/:blobId', async (c) => {
152
+ const requestId = c.get('requestId');
153
+ const tenantId = c.get('tenantId') as TenantId;
154
+ const blobId = c.req.param('blobId') as ArtifactId;
155
+
156
+ const outcome = await binding.delete(tenantId, blobId);
157
+ if (outcome.kind === 'err') {
158
+ c.status(statusFor(outcome.error.code) as never);
159
+ return c.json(toWireError(outcome.error as never, requestId));
160
+ }
161
+ return c.json({
162
+ blobId: blobId as unknown as string,
163
+ deleted: outcome.value.deleted,
164
+ });
165
+ });
166
+
167
+ return r;
168
+ }
169
+
170
+ // -------------------- serialization --------------------
171
+
172
+ function serializeMeta(m: BlobMeta): Record<string, unknown> {
173
+ return {
174
+ blobId: m.blobId as unknown as string,
175
+ tenantId: m.tenantId as unknown as string,
176
+ name: m.name,
177
+ contentType: m.contentType,
178
+ size: m.size,
179
+ hash: m.hash,
180
+ tags: m.tags,
181
+ ...(m.ownerRunId !== undefined && { ownerRunId: m.ownerRunId as unknown as string }),
182
+ createdAt: m.createdAt as unknown as string,
183
+ ...(m.bucket !== undefined && { bucket: m.bucket }),
184
+ ...(m.key !== undefined && { key: m.key }),
185
+ };
186
+ }
187
+
188
+ function downloadHeaders(meta: BlobMeta, requestId: string): Record<string, string> {
189
+ return {
190
+ 'Content-Type': meta.contentType,
191
+ 'Content-Length': String(meta.size),
192
+ 'X-Kindgi-Blob-Hash': meta.hash,
193
+ 'X-Kindgi-Blob-Name': encodeURIComponent(meta.name),
194
+ 'X-Request-Id': requestId,
195
+ };
196
+ }
197
+
198
+ // -------------------- request parsing --------------------
199
+
200
+ type ValidationResult<T> =
201
+ | { readonly kind: 'ok'; readonly value: T }
202
+ | { readonly kind: 'err'; readonly message: string };
203
+
204
+ /**
205
+ * Parse the multipart form into a `BlobPutInput`. `file` is required —
206
+ * every other field is optional metadata. `tags` is a JSON-encoded
207
+ * object; `ownerRunId` is a plain string; `expectedHash` is
208
+ * `sha256`-hex; `contentType` overrides the file part's own MIME.
209
+ * `name` defaults to the file part's filename.
210
+ */
211
+ function validateMultipart(form: FormData): ValidationResult<BlobPutInput> {
212
+ const file = form.get('file');
213
+ if (file === null) {
214
+ return { kind: 'err', message: 'Multipart form must include a `file` part' };
215
+ }
216
+ if (typeof file === 'string') {
217
+ return { kind: 'err', message: '`file` part must be a file, not a string field' };
218
+ }
219
+
220
+ const nameField = form.get('name');
221
+ const name =
222
+ typeof nameField === 'string' && nameField.length > 0
223
+ ? nameField
224
+ : file.name !== undefined && file.name.length > 0
225
+ ? file.name
226
+ : 'unnamed';
227
+
228
+ const contentTypeField = form.get('contentType');
229
+ const contentType =
230
+ typeof contentTypeField === 'string' && contentTypeField.length > 0
231
+ ? contentTypeField
232
+ : file.type.length > 0
233
+ ? file.type
234
+ : 'application/octet-stream';
235
+
236
+ let tags: Record<string, string> | undefined;
237
+ const tagsField = form.get('tags');
238
+ if (typeof tagsField === 'string' && tagsField.length > 0) {
239
+ try {
240
+ const parsed = JSON.parse(tagsField) as unknown;
241
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
242
+ return { kind: 'err', message: 'Field `tags` must be a JSON object' };
243
+ }
244
+ const flat: Record<string, string> = {};
245
+ for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {
246
+ if (typeof v !== 'string') {
247
+ return { kind: 'err', message: `Field \`tags["${k}"]\` must be a string` };
248
+ }
249
+ flat[k] = v;
250
+ }
251
+ tags = flat;
252
+ } catch {
253
+ return { kind: 'err', message: 'Field `tags` must be valid JSON' };
254
+ }
255
+ }
256
+
257
+ let ownerRunId: RunId | undefined;
258
+ const ownerField = form.get('ownerRunId');
259
+ if (typeof ownerField === 'string' && ownerField.length > 0) {
260
+ ownerRunId = ownerField as RunId;
261
+ }
262
+
263
+ let expectedHash: string | undefined;
264
+ const hashField = form.get('expectedHash');
265
+ if (typeof hashField === 'string' && hashField.length > 0) {
266
+ if (!/^[0-9a-f]{64}$/.test(hashField)) {
267
+ return {
268
+ kind: 'err',
269
+ message: 'Field `expectedHash` must be sha256, hex-encoded, lowercase (64 chars)',
270
+ };
271
+ }
272
+ expectedHash = hashField;
273
+ }
274
+
275
+ return {
276
+ kind: 'ok',
277
+ value: {
278
+ name,
279
+ contentType,
280
+ bytes: file.stream(),
281
+ size: file.size,
282
+ ...(tags !== undefined && { tags }),
283
+ ...(ownerRunId !== undefined && { ownerRunId }),
284
+ ...(expectedHash !== undefined && { expectedHash }),
285
+ },
286
+ };
287
+ }
288
+
289
+ function decodeListFilter(params: URLSearchParams): ValidationResult<BlobFilter> {
290
+ const filter: {
291
+ ownerRunId?: RunId;
292
+ contentType?: string;
293
+ tags?: Record<string, string>;
294
+ } = {};
295
+ const rawTags: Record<string, string> = {};
296
+ for (const [key, value] of params.entries()) {
297
+ if (value.length === 0) continue;
298
+ if (key === 'ownerRunId') {
299
+ filter.ownerRunId = value as RunId;
300
+ continue;
301
+ }
302
+ if (key === 'contentType') {
303
+ filter.contentType = value;
304
+ continue;
305
+ }
306
+ if (key.startsWith('tag.')) {
307
+ const tagKey = key.slice('tag.'.length);
308
+ if (tagKey.length === 0) {
309
+ return { kind: 'err', message: 'Empty `tag.` filter key' };
310
+ }
311
+ rawTags[tagKey] = value;
312
+ }
313
+ // Ignore unrelated keys (limit, cursor, etc.).
314
+ }
315
+ if (Object.keys(rawTags).length > 0) filter.tags = rawTags;
316
+ return { kind: 'ok', value: filter };
317
+ }
@@ -0,0 +1,219 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ //
5
+ // GET /v1/audit/authz — authorization-decision query surface.
6
+ //
7
+ // Reads audit events via `AuditEventBinding`, filtered to
8
+ // `kind='authz-decision'`.
9
+ //
10
+ // PEP: admin@tenant. Audit is sensitive by definition — only tenant
11
+ // admins see it. Authorization checks (`check()`) in the API and the
12
+ // runtime emit authz-decision audit events; this route pages through
13
+ // the results with filters.
14
+ //
15
+ // Filter shape:
16
+ // ?actorSubject=user:xxx
17
+ // ?onBehalfOf=agent:yyy
18
+ // ?action=read|write|admin|...
19
+ // ?resource=agent:zzz
20
+ // ?outcome=allowed|denied
21
+ // ?from=<iso>&to=<iso>
22
+ // ?runId=<id>
23
+ // ?limit=<n>&cursor=<opaque>
24
+ //
25
+
26
+ import { Hono } from 'hono';
27
+
28
+ import type { AuditEvent, AuditEventBinding } from '@kindgi/audit-events';
29
+ import { ref } from '@kindgi/authz';
30
+ import type { TenantId } from '@kindgi/types';
31
+
32
+ import { statusFor, toWireError } from '../errors.js';
33
+ import type { Authorizer } from '../middleware/authorize.js';
34
+ import type { AppEnv } from '../types.js';
35
+ import { clampLimit } from './pagination.js';
36
+
37
+ /**
38
+ * Wire projection for the `/v1/audit/authz` route. Denormalizes the
39
+ * kind-specific `payload.doc` fields (action, resource, reason,
40
+ * failing, evidence, latencyMs) onto the top level so clients can
41
+ * render without decoding the versioned envelope.
42
+ */
43
+ interface WireAuthzDecision {
44
+ readonly id: string;
45
+ readonly tenantId: string;
46
+ readonly timestamp: string;
47
+ readonly actorSubject: string;
48
+ readonly onBehalfSubject?: string;
49
+ readonly action: string;
50
+ readonly resource: string;
51
+ readonly outcome: 'allowed' | 'denied';
52
+ readonly reason: string;
53
+ readonly failing?: string;
54
+ readonly evidence?: Readonly<Record<string, unknown>>;
55
+ readonly correlationId?: string;
56
+ readonly runId?: string;
57
+ readonly latencyMs?: number;
58
+ }
59
+
60
+ export function auditRouter(binding: AuditEventBinding, authorizer?: Authorizer): Hono<AppEnv> {
61
+ const r = new Hono<AppEnv>();
62
+
63
+ // PEP — admin@tenant on every route.
64
+ if (authorizer !== undefined) {
65
+ r.use('*', async (c, next) => {
66
+ const tenantId = c.get('tenantId') as TenantId;
67
+ const mw = authorizer.authorize('admin', () => ref('tenant', tenantId as unknown as string));
68
+ return mw(c, next);
69
+ });
70
+ }
71
+
72
+ r.get('/authz', async (c) => {
73
+ const requestId = c.get('requestId');
74
+ const tenantId = c.get('tenantId') as TenantId;
75
+ const limit = clampLimit(c.req.query('limit'));
76
+
77
+ const cursor = c.req.query('cursor');
78
+ const actor = c.req.query('actorSubject');
79
+ const onBehalf = c.req.query('onBehalfOf');
80
+ const action = c.req.query('action');
81
+ const resource = c.req.query('resource');
82
+ const outcomeRaw = c.req.query('outcome');
83
+ const from = c.req.query('from');
84
+ const to = c.req.query('to');
85
+ const runId = c.req.query('runId');
86
+
87
+ let outcome: 'allowed' | 'denied' | undefined;
88
+ if (outcomeRaw === 'allowed' || outcomeRaw === 'denied') outcome = outcomeRaw;
89
+ else if (outcomeRaw !== undefined) {
90
+ c.status(statusFor('bad-input') as never);
91
+ return c.json(
92
+ toWireError(
93
+ { code: 'bad-input', message: '`outcome` must be "allowed" or "denied"' },
94
+ requestId,
95
+ ),
96
+ );
97
+ }
98
+
99
+ if (from !== undefined && Number.isNaN(new Date(from).getTime())) {
100
+ c.status(statusFor('bad-input') as never);
101
+ return c.json(
102
+ toWireError({ code: 'bad-input', message: '`from` must be an ISO timestamp' }, requestId),
103
+ );
104
+ }
105
+ if (to !== undefined && Number.isNaN(new Date(to).getTime())) {
106
+ c.status(statusFor('bad-input') as never);
107
+ return c.json(
108
+ toWireError({ code: 'bad-input', message: '`to` must be an ISO timestamp' }, requestId),
109
+ );
110
+ }
111
+
112
+ // Every filter goes into the binding query — including `onBehalfOf`
113
+ // and the `payload.doc` fields `action` / `resource` — so the binding
114
+ // pages over matching events only: pages are full while matches
115
+ // remain, and `nextCursor` resumes exactly after the last one.
116
+ const docFilter: Record<string, string> = {
117
+ ...(action !== undefined && action.length > 0 && { action }),
118
+ ...(resource !== undefined && resource.length > 0 && { resource }),
119
+ };
120
+ const page = await binding.query({
121
+ tenantId,
122
+ filter: {
123
+ kind: 'authz-decision',
124
+ ...(actor !== undefined && actor.length > 0 && { actor }),
125
+ ...(onBehalf !== undefined && onBehalf.length > 0 && { onBehalfOf: onBehalf }),
126
+ ...(Object.keys(docFilter).length > 0 && { payloadDoc: docFilter }),
127
+ ...(runId !== undefined && runId.length > 0 && { runId }),
128
+ ...(outcome !== undefined && { outcome }),
129
+ ...(from !== undefined && from.length > 0 && { from }),
130
+ ...(to !== undefined && to.length > 0 && { to }),
131
+ },
132
+ ...(cursor !== undefined && cursor.length > 0 && { cursor }),
133
+ limit,
134
+ });
135
+
136
+ if (page.kind === 'err') {
137
+ if (page.error.code === 'invalid-cursor') {
138
+ c.status(statusFor('bad-input') as never);
139
+ return c.json(
140
+ toWireError(
141
+ { code: 'bad-input', message: `Malformed cursor: ${page.error.message}` },
142
+ requestId,
143
+ ),
144
+ );
145
+ }
146
+ c.status(statusFor('persistence-error') as never);
147
+ return c.json(
148
+ toWireError(
149
+ { code: 'persistence-error', message: `Audit query failed: ${page.error.message}` },
150
+ requestId,
151
+ ),
152
+ );
153
+ }
154
+
155
+ // Re-check the same three filters on the returned page. A binding
156
+ // that implements them (the contract) makes this a no-op; one that
157
+ // predates `onBehalfOf` / `payloadDoc` still can't return
158
+ // non-matching events (its pages are then short).
159
+ const data = page.value.data
160
+ .filter((event) => {
161
+ if (onBehalf !== undefined && onBehalf.length > 0) {
162
+ if (event.onBehalfOf !== onBehalf) return false;
163
+ }
164
+ if (action !== undefined && action.length > 0) {
165
+ const doc = extractDoc(event.payload);
166
+ if (doc?.action !== action) return false;
167
+ }
168
+ if (resource !== undefined && resource.length > 0) {
169
+ const doc = extractDoc(event.payload);
170
+ if (doc?.resource !== resource) return false;
171
+ }
172
+ return true;
173
+ })
174
+ .map(rowToWire);
175
+
176
+ return c.json({
177
+ data,
178
+ hasMore: page.value.nextCursor !== undefined,
179
+ ...(page.value.nextCursor !== undefined && { nextCursor: page.value.nextCursor }),
180
+ });
181
+ });
182
+
183
+ return r;
184
+ }
185
+
186
+ function extractDoc(
187
+ payload: Readonly<Record<string, unknown>>,
188
+ ): Readonly<Record<string, unknown>> | undefined {
189
+ const inner = payload.doc;
190
+ if (inner !== null && typeof inner === 'object' && !Array.isArray(inner)) {
191
+ return inner as Readonly<Record<string, unknown>>;
192
+ }
193
+ return undefined;
194
+ }
195
+
196
+ function rowToWire(event: AuditEvent): WireAuthzDecision {
197
+ const doc = extractDoc(event.payload) ?? {};
198
+ const out: {
199
+ -readonly [K in keyof WireAuthzDecision]: WireAuthzDecision[K];
200
+ } = {
201
+ id: event.id,
202
+ tenantId: event.tenantId as unknown as string,
203
+ timestamp: event.timestamp as unknown as string,
204
+ actorSubject: event.actor,
205
+ action: typeof doc.action === 'string' ? doc.action : '',
206
+ resource: typeof doc.resource === 'string' ? doc.resource : '',
207
+ outcome: event.outcome === 'denied' ? 'denied' : 'allowed',
208
+ reason: typeof doc.reason === 'string' ? doc.reason : '',
209
+ };
210
+ if (event.onBehalfOf !== undefined) out.onBehalfSubject = event.onBehalfOf;
211
+ if (typeof doc.failing === 'string') out.failing = doc.failing;
212
+ if (doc.evidence !== undefined && typeof doc.evidence === 'object' && doc.evidence !== null) {
213
+ out.evidence = doc.evidence as Readonly<Record<string, unknown>>;
214
+ }
215
+ if (event.correlationId !== undefined) out.correlationId = event.correlationId;
216
+ if (event.runId !== undefined) out.runId = event.runId;
217
+ if (typeof doc.latencyMs === 'number') out.latencyMs = doc.latencyMs;
218
+ return out as WireAuthzDecision;
219
+ }