@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,534 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { Hono } from 'hono';
5
+ import type { Context } from 'hono';
6
+
7
+ import { generateWebhookSecret } from '@kindgi/crypto';
8
+ import type {
9
+ Cursor,
10
+ ProjectId,
11
+ TenantId,
12
+ WebhookDeliveryId,
13
+ WebhookEndpointId,
14
+ } from '@kindgi/types';
15
+
16
+ import { statusFor, toWireError } from '../errors.js';
17
+ import type { AppEnv } from '../types.js';
18
+ import {
19
+ WEBHOOK_DELIVERY_STATUSES,
20
+ WEBHOOK_EVENT_TYPES,
21
+ type WebhookDelivery,
22
+ type WebhookDeliveryOutcome,
23
+ type WebhookDeliveryStatus,
24
+ type WebhookEndpoint,
25
+ type WebhookEndpointBinding,
26
+ type WebhookEndpointFilter,
27
+ type WebhookEndpointRefusal,
28
+ type WebhookEventType,
29
+ type WebhookSecretRef,
30
+ } from '../webhook-endpoint-binding.js';
31
+ import { clampLimit } from './pagination.js';
32
+ import { parseSecretRef } from './secret-ref.js';
33
+
34
+ const MAX_URL_LENGTH = 2048;
35
+ const MAX_DESCRIPTION_LENGTH = 500;
36
+ const MAX_FLOW_IDS = 100;
37
+ const MAX_FLOW_ID_LENGTH = 200;
38
+
39
+ /**
40
+ * Outbound webhook endpoints (`/v1/webhook-endpoints`): register the URLs
41
+ * the platform sends signed events to, read their delivery log, redeliver
42
+ * and send a test event. See `WebhookEndpointBinding`.
43
+ */
44
+ export function webhookEndpointsRouter(binding: WebhookEndpointBinding): Hono<AppEnv> {
45
+ const r = new Hono<AppEnv>();
46
+
47
+ // ---------- POST / (create) ----------
48
+ r.post('/', async (c) => {
49
+ const requestId = c.get('requestId');
50
+ const tenantId = c.get('tenantId') as TenantId;
51
+ const body = await readJsonObject(c);
52
+ if (body.kind === 'err') return badInput(c, requestId, body.message);
53
+ const parsed = parseEndpointBody(body.value, 'create');
54
+ if (parsed.kind === 'err') return wireError(c, requestId, parsed.code, parsed.message);
55
+ const { url, events, filter, secretRef, description } = parsed.value;
56
+ if (url === undefined || events === undefined || secretRef === undefined) {
57
+ return badInput(c, requestId, '`url`, `events` and `secretRef` are required');
58
+ }
59
+
60
+ const outcome = await binding.create({
61
+ tenantId,
62
+ url,
63
+ events,
64
+ filter: filter ?? {},
65
+ secretRef,
66
+ ...(typeof description === 'string' && { description }),
67
+ });
68
+ if (outcome.kind !== 'ok') return refused(c, requestId, outcome);
69
+ c.status(201);
70
+ return c.json(serializeEndpoint(outcome.endpoint));
71
+ });
72
+
73
+ // ---------- POST /generate-secret ----------
74
+ // A strong signing secret to store before registering; nothing is kept.
75
+ r.post('/generate-secret', (c) => c.json({ secret: generateWebhookSecret() }));
76
+
77
+ // ---------- GET / (list) ----------
78
+ r.get('/', async (c) => {
79
+ const tenantId = c.get('tenantId') as TenantId;
80
+ const cursor = c.req.query('cursor');
81
+ const page = await binding.list({
82
+ tenantId,
83
+ limit: clampLimit(c.req.query('limit')),
84
+ ...(cursor !== undefined && cursor.length > 0 && { cursor: cursor as Cursor }),
85
+ });
86
+ return c.json({
87
+ data: page.data.map(serializeEndpoint),
88
+ hasMore: page.nextCursor !== undefined,
89
+ ...(page.nextCursor !== undefined && { nextCursor: page.nextCursor as unknown as string }),
90
+ });
91
+ });
92
+
93
+ // ---------- GET /:endpointId ----------
94
+ r.get('/:endpointId', async (c) => {
95
+ const requestId = c.get('requestId');
96
+ const tenantId = c.get('tenantId') as TenantId;
97
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
98
+ const endpoint = await binding.get({ tenantId, endpointId });
99
+ if (endpoint === null) return endpointNotFound(c, requestId, endpointId);
100
+ return c.json(serializeEndpoint(endpoint));
101
+ });
102
+
103
+ // ---------- PATCH /:endpointId ----------
104
+ r.patch('/:endpointId', async (c) => {
105
+ const requestId = c.get('requestId');
106
+ const tenantId = c.get('tenantId') as TenantId;
107
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
108
+ const body = await readJsonObject(c);
109
+ if (body.kind === 'err') return badInput(c, requestId, body.message);
110
+ const parsed = parseEndpointBody(body.value, 'update');
111
+ if (parsed.kind === 'err') return wireError(c, requestId, parsed.code, parsed.message);
112
+ const { url, events, filter, secretRef, description } = parsed.value;
113
+
114
+ const outcome = await binding.update({
115
+ tenantId,
116
+ endpointId,
117
+ ...(url !== undefined && { url }),
118
+ ...(events !== undefined && { events }),
119
+ ...(filter !== undefined && { filter }),
120
+ ...(secretRef !== undefined && { secretRef }),
121
+ ...(description !== undefined && { description }),
122
+ });
123
+ if (outcome.kind === 'ok') return c.json(serializeEndpoint(outcome.endpoint));
124
+ if (outcome.kind === 'not-found') return endpointNotFound(c, requestId, endpointId);
125
+ return refused(c, requestId, outcome);
126
+ });
127
+
128
+ // ---------- POST /:endpointId/unregister (soft delete) ----------
129
+ r.post('/:endpointId/unregister', async (c) => {
130
+ const tenantId = c.get('tenantId') as TenantId;
131
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
132
+ const outcome = await binding.unregister({ tenantId, endpointId });
133
+ return c.json({
134
+ endpointId: endpointId as unknown as string,
135
+ unregistered: outcome.unregistered,
136
+ });
137
+ });
138
+
139
+ // ---------- GET /:endpointId/deliveries ----------
140
+ r.get('/:endpointId/deliveries', async (c) => {
141
+ const requestId = c.get('requestId');
142
+ const tenantId = c.get('tenantId') as TenantId;
143
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
144
+ const statusRaw = c.req.query('status');
145
+ if (statusRaw !== undefined && !isDeliveryStatus(statusRaw)) {
146
+ return badInput(
147
+ c,
148
+ requestId,
149
+ `\`status\` must be one of ${WEBHOOK_DELIVERY_STATUSES.join(', ')}`,
150
+ );
151
+ }
152
+ const cursor = c.req.query('cursor');
153
+ const outcome = await binding.listDeliveries({
154
+ tenantId,
155
+ endpointId,
156
+ limit: clampLimit(c.req.query('limit')),
157
+ ...(cursor !== undefined && cursor.length > 0 && { cursor: cursor as Cursor }),
158
+ ...(statusRaw !== undefined && { status: statusRaw }),
159
+ });
160
+ if (outcome.kind === 'not-found') return endpointNotFound(c, requestId, endpointId);
161
+ return c.json({
162
+ data: outcome.data.map(serializeDelivery),
163
+ hasMore: outcome.nextCursor !== undefined,
164
+ ...(outcome.nextCursor !== undefined && {
165
+ nextCursor: outcome.nextCursor as unknown as string,
166
+ }),
167
+ });
168
+ });
169
+
170
+ // ---------- POST /:endpointId/deliveries/:deliveryId/redeliver ----------
171
+ r.post('/:endpointId/deliveries/:deliveryId/redeliver', async (c) => {
172
+ const requestId = c.get('requestId');
173
+ const tenantId = c.get('tenantId') as TenantId;
174
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
175
+ const deliveryId = c.req.param('deliveryId') as WebhookDeliveryId;
176
+ const outcome = await binding.redeliver({ tenantId, endpointId, deliveryId });
177
+ return deliveryResponse(c, requestId, outcome, endpointId, deliveryId);
178
+ });
179
+
180
+ // ---------- POST /:endpointId/test ----------
181
+ r.post('/:endpointId/test', async (c) => {
182
+ const requestId = c.get('requestId');
183
+ const tenantId = c.get('tenantId') as TenantId;
184
+ const endpointId = c.req.param('endpointId') as WebhookEndpointId;
185
+ const outcome = await binding.sendTest({ tenantId, endpointId });
186
+ return deliveryResponse(c, requestId, outcome, endpointId);
187
+ });
188
+
189
+ return r;
190
+ }
191
+
192
+ // ---------- body parsing ----------
193
+
194
+ interface EndpointBody {
195
+ readonly url?: string;
196
+ readonly events?: readonly WebhookEventType[];
197
+ readonly filter?: WebhookEndpointFilter;
198
+ readonly secretRef?: WebhookSecretRef;
199
+ /** `null` (update only) clears it. */
200
+ readonly description?: string | null;
201
+ }
202
+
203
+ type Parsed<T> =
204
+ | { readonly kind: 'ok'; readonly value: T }
205
+ | {
206
+ readonly kind: 'err';
207
+ readonly code: 'bad-input' | 'unknown-field';
208
+ readonly message: string;
209
+ };
210
+
211
+ const BODY_FIELDS = new Set(['url', 'events', 'filter', 'secretRef', 'description']);
212
+ const FILTER_FIELDS = new Set(['projectId', 'flowIds', 'includeDryRuns']);
213
+
214
+ function parseEndpointBody(
215
+ body: Record<string, unknown>,
216
+ mode: 'create' | 'update',
217
+ ): Parsed<EndpointBody> {
218
+ const unknown = Object.keys(body).find((key) => !BODY_FIELDS.has(key));
219
+ if (unknown !== undefined) return unknownField(unknown);
220
+
221
+ const url = optional(body.url, parseUrl);
222
+ if (url.kind === 'err') return url;
223
+ const events = optional(body.events, parseEvents);
224
+ if (events.kind === 'err') return events;
225
+ const filter = optional(body.filter, parseFilter);
226
+ if (filter.kind === 'err') return filter;
227
+ const secretRef = optional(body.secretRef, parseWebhookSecretRef);
228
+ if (secretRef.kind === 'err') return secretRef;
229
+ const description = optional(body.description, (raw) => parseDescription(raw, mode));
230
+ if (description.kind === 'err') return description;
231
+
232
+ return {
233
+ kind: 'ok',
234
+ value: {
235
+ ...(url.value !== undefined && { url: url.value }),
236
+ ...(events.value !== undefined && { events: events.value }),
237
+ ...(filter.value !== undefined && { filter: filter.value }),
238
+ ...(secretRef.value !== undefined && { secretRef: secretRef.value }),
239
+ ...(description.value !== undefined && { description: description.value }),
240
+ },
241
+ };
242
+ }
243
+
244
+ /** Parses a field only when present; an absent field parses to `undefined`. */
245
+ function optional<T>(raw: unknown, parse: (raw: unknown) => Parsed<T>): Parsed<T | undefined> {
246
+ return raw === undefined ? { kind: 'ok', value: undefined } : parse(raw);
247
+ }
248
+
249
+ function parseUrl(raw: unknown): Parsed<string> {
250
+ if (typeof raw !== 'string' || raw.length === 0) return bad('`url` must be a non-empty string');
251
+ if (raw.length > MAX_URL_LENGTH) return bad(`\`url\` is limited to ${MAX_URL_LENGTH} characters`);
252
+ let url: URL;
253
+ try {
254
+ url = new URL(raw);
255
+ } catch {
256
+ return bad('`url` must be an absolute URL');
257
+ }
258
+ if (url.protocol !== 'https:' && url.protocol !== 'http:') {
259
+ return bad('`url` must use https (or http where the deployment allows it)');
260
+ }
261
+ if (url.username !== '' || url.password !== '') {
262
+ return bad('`url` must not contain credentials');
263
+ }
264
+ return { kind: 'ok', value: raw };
265
+ }
266
+
267
+ function parseEvents(raw: unknown): Parsed<readonly WebhookEventType[]> {
268
+ if (!Array.isArray(raw) || raw.length === 0) {
269
+ return bad('`events` must be a non-empty array');
270
+ }
271
+ const known: readonly string[] = WEBHOOK_EVENT_TYPES;
272
+ const events: WebhookEventType[] = [];
273
+ for (const event of raw) {
274
+ if (typeof event !== 'string' || !known.includes(event)) {
275
+ return bad(`\`events\` entries must be one of ${WEBHOOK_EVENT_TYPES.join(', ')}`);
276
+ }
277
+ if (!events.includes(event as WebhookEventType)) events.push(event as WebhookEventType);
278
+ }
279
+ return { kind: 'ok', value: events };
280
+ }
281
+
282
+ function parseWebhookSecretRef(raw: unknown): Parsed<WebhookSecretRef> {
283
+ const parsed = parseSecretRef(raw);
284
+ if (parsed.kind === 'ok') return parsed;
285
+ return parsed.unknownField !== undefined
286
+ ? unknownField(parsed.unknownField)
287
+ : bad(parsed.message);
288
+ }
289
+
290
+ function parseDescription(raw: unknown, mode: 'create' | 'update'): Parsed<string | null> {
291
+ if (raw === null && mode === 'update') return { kind: 'ok', value: null };
292
+ if (typeof raw !== 'string') {
293
+ return bad(
294
+ mode === 'update'
295
+ ? '`description` must be a string or null'
296
+ : '`description` must be a string',
297
+ );
298
+ }
299
+ if (raw.length > MAX_DESCRIPTION_LENGTH) {
300
+ return bad(`\`description\` is limited to ${MAX_DESCRIPTION_LENGTH} characters`);
301
+ }
302
+ return { kind: 'ok', value: raw };
303
+ }
304
+
305
+ function parseFilter(raw: unknown): Parsed<WebhookEndpointFilter> {
306
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
307
+ return bad('`filter` must be an object');
308
+ }
309
+ const filter = raw as Record<string, unknown>;
310
+ const unknown = Object.keys(filter).find((key) => !FILTER_FIELDS.has(key));
311
+ if (unknown !== undefined) return unknownField(`filter.${unknown}`);
312
+
313
+ const projectId = optional(filter.projectId, parseProjectId);
314
+ if (projectId.kind === 'err') return projectId;
315
+ const flowIds = optional(filter.flowIds, parseFlowIds);
316
+ if (flowIds.kind === 'err') return flowIds;
317
+ const includeDryRuns = optional(filter.includeDryRuns, parseIncludeDryRuns);
318
+ if (includeDryRuns.kind === 'err') return includeDryRuns;
319
+
320
+ return {
321
+ kind: 'ok',
322
+ value: {
323
+ ...(projectId.value !== undefined && { projectId: projectId.value }),
324
+ ...(flowIds.value !== undefined && { flowIds: flowIds.value }),
325
+ ...(includeDryRuns.value !== undefined && { includeDryRuns: includeDryRuns.value }),
326
+ },
327
+ };
328
+ }
329
+
330
+ function parseProjectId(raw: unknown): Parsed<ProjectId> {
331
+ if (typeof raw !== 'string' || raw.length === 0) {
332
+ return bad('`filter.projectId` must be a non-empty string');
333
+ }
334
+ return { kind: 'ok', value: raw as ProjectId };
335
+ }
336
+
337
+ function parseFlowIds(raw: unknown): Parsed<readonly string[]> {
338
+ if (!Array.isArray(raw) || raw.length === 0) {
339
+ return bad('`filter.flowIds` must be a non-empty array');
340
+ }
341
+ if (raw.length > MAX_FLOW_IDS) {
342
+ return bad(`\`filter.flowIds\` is limited to ${MAX_FLOW_IDS} entries`);
343
+ }
344
+ const flowIds: string[] = [];
345
+ for (const flowId of raw) {
346
+ if (typeof flowId !== 'string' || flowId.length === 0 || flowId.length > MAX_FLOW_ID_LENGTH) {
347
+ return bad(
348
+ `\`filter.flowIds\` entries must be non-empty strings of at most ${MAX_FLOW_ID_LENGTH} characters`,
349
+ );
350
+ }
351
+ if (!flowIds.includes(flowId)) flowIds.push(flowId);
352
+ }
353
+ return { kind: 'ok', value: flowIds };
354
+ }
355
+
356
+ function parseIncludeDryRuns(raw: unknown): Parsed<boolean> {
357
+ if (typeof raw !== 'boolean') return bad('`filter.includeDryRuns` must be a boolean');
358
+ return { kind: 'ok', value: raw };
359
+ }
360
+
361
+ function bad(message: string): Parsed<never> {
362
+ return { kind: 'err', code: 'bad-input', message };
363
+ }
364
+
365
+ function unknownField(field: string): Parsed<never> {
366
+ return { kind: 'err', code: 'unknown-field', message: `Unknown field \`${field}\`` };
367
+ }
368
+
369
+ function isDeliveryStatus(value: string): value is WebhookDeliveryStatus {
370
+ return (WEBHOOK_DELIVERY_STATUSES as readonly string[]).includes(value);
371
+ }
372
+
373
+ async function readJsonObject(
374
+ c: Context<AppEnv>,
375
+ ): Promise<
376
+ | { readonly kind: 'ok'; readonly value: Record<string, unknown> }
377
+ | { readonly kind: 'err'; readonly message: string }
378
+ > {
379
+ let body: unknown;
380
+ try {
381
+ body = await c.req.json();
382
+ } catch {
383
+ return { kind: 'err', message: 'Request body must be valid JSON' };
384
+ }
385
+ if (body === null || typeof body !== 'object' || Array.isArray(body)) {
386
+ return { kind: 'err', message: 'Request body must be a JSON object' };
387
+ }
388
+ return { kind: 'ok', value: body as Record<string, unknown> };
389
+ }
390
+
391
+ // ---------- serialization ----------
392
+
393
+ function serializeEndpoint(endpoint: WebhookEndpoint): Record<string, unknown> {
394
+ return {
395
+ endpointId: endpoint.endpointId as unknown as string,
396
+ url: endpoint.url,
397
+ events: [...endpoint.events],
398
+ filter: serializeFilter(endpoint.filter),
399
+ description: endpoint.description,
400
+ secretRef: {
401
+ envName: endpoint.secretRef.envName as unknown as string,
402
+ name: endpoint.secretRef.name,
403
+ },
404
+ createdAt: endpoint.createdAt,
405
+ updatedAt: endpoint.updatedAt,
406
+ };
407
+ }
408
+
409
+ function serializeFilter(filter: WebhookEndpointFilter): Record<string, unknown> {
410
+ return {
411
+ ...(filter.projectId !== undefined && { projectId: filter.projectId as unknown as string }),
412
+ ...(filter.flowIds !== undefined && { flowIds: [...filter.flowIds] }),
413
+ ...(filter.includeDryRuns !== undefined && { includeDryRuns: filter.includeDryRuns }),
414
+ };
415
+ }
416
+
417
+ function serializeDelivery(delivery: WebhookDelivery): Record<string, unknown> {
418
+ return {
419
+ deliveryId: delivery.deliveryId as unknown as string,
420
+ endpointId: delivery.endpointId as unknown as string,
421
+ event: delivery.event,
422
+ status: delivery.status,
423
+ attempts: delivery.attempts,
424
+ nextAttemptAt: delivery.nextAttemptAt,
425
+ lastAttemptAt: delivery.lastAttemptAt,
426
+ lastResponseStatus: delivery.lastResponseStatus,
427
+ lastError: delivery.lastError,
428
+ createdAt: delivery.createdAt,
429
+ deliveredAt: delivery.deliveredAt,
430
+ };
431
+ }
432
+
433
+ // ---------- responses ----------
434
+
435
+ function deliveryResponse(
436
+ c: Context<AppEnv>,
437
+ requestId: string,
438
+ outcome: WebhookDeliveryOutcome,
439
+ endpointId: WebhookEndpointId,
440
+ deliveryId?: WebhookDeliveryId,
441
+ ): Response {
442
+ switch (outcome.kind) {
443
+ case 'ok':
444
+ c.status(202);
445
+ return c.json(serializeDelivery(outcome.delivery));
446
+ case 'not-found':
447
+ return endpointNotFound(c, requestId, endpointId);
448
+ case 'delivery-not-found':
449
+ return wireError(
450
+ c,
451
+ requestId,
452
+ 'webhook-delivery-not-found',
453
+ `No delivery with id "${String(deliveryId)}" for this endpoint`,
454
+ { deliveryId: String(deliveryId) },
455
+ );
456
+ }
457
+ }
458
+
459
+ function wireError(
460
+ c: Context<AppEnv>,
461
+ requestId: string,
462
+ code: string,
463
+ message: string,
464
+ details: Readonly<Record<string, unknown>> = {},
465
+ ): Response {
466
+ c.status(statusFor(code) as never);
467
+ return c.json(toWireError({ code, message, ...details }, requestId));
468
+ }
469
+
470
+ function badInput(c: Context<AppEnv>, requestId: string, message: string): Response {
471
+ return wireError(c, requestId, 'bad-input', message);
472
+ }
473
+
474
+ function endpointNotFound(
475
+ c: Context<AppEnv>,
476
+ requestId: string,
477
+ endpointId: WebhookEndpointId,
478
+ ): Response {
479
+ return wireError(
480
+ c,
481
+ requestId,
482
+ 'webhook-endpoint-not-found',
483
+ `No webhook endpoint with id "${endpointId as unknown as string}"`,
484
+ { endpointId: endpointId as unknown as string },
485
+ );
486
+ }
487
+
488
+ /** The binding refused to save the endpoint as asked. */
489
+ function refused(c: Context<AppEnv>, requestId: string, refusal: WebhookEndpointRefusal): Response {
490
+ switch (refusal.kind) {
491
+ case 'url-refused':
492
+ return urlRefused(c, requestId, refusal.reason);
493
+ case 'project-not-found':
494
+ return projectNotFound(c, requestId, refusal.projectId);
495
+ case 'secret-not-found':
496
+ return wireError(
497
+ c,
498
+ requestId,
499
+ 'webhook-secret-not-found',
500
+ `No secret "${refusal.secretRef.name}" in "${refusal.secretRef.envName as unknown as string}": store it first, then register the endpoint`,
501
+ { secretRef: refusal.secretRef },
502
+ );
503
+ case 'secret-too-weak':
504
+ return wireError(
505
+ c,
506
+ requestId,
507
+ 'webhook-secret-too-weak',
508
+ `Secret "${refusal.secretRef.name}" must be \`whsec_\` + base64 of at least 24 random bytes (POST /v1/webhook-endpoints/generate-secret makes one)`,
509
+ { secretRef: refusal.secretRef },
510
+ );
511
+ }
512
+ }
513
+
514
+ function urlRefused(c: Context<AppEnv>, requestId: string, reason: string): Response {
515
+ return wireError(
516
+ c,
517
+ requestId,
518
+ 'webhook-url-refused',
519
+ `The deployment refuses this URL: ${reason}`,
520
+ {
521
+ reason,
522
+ },
523
+ );
524
+ }
525
+
526
+ function projectNotFound(c: Context<AppEnv>, requestId: string, projectId: ProjectId): Response {
527
+ return wireError(
528
+ c,
529
+ requestId,
530
+ 'project-not-found',
531
+ `No project with id "${projectId as unknown as string}"`,
532
+ { projectId: projectId as unknown as string },
533
+ );
534
+ }