@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,631 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { Hono } from 'hono';
5
+
6
+ import type { AgentId } from '@kindgi/agents';
7
+ import type { Cursor, FlowId, ProjectId, RunId, Semver, TenantId, Timestamp } from '@kindgi/types';
8
+
9
+ import { statusFor, toWireError } from '../errors.js';
10
+ import {
11
+ type AgentRef,
12
+ EVAL_RUN_STATUSES,
13
+ type EvalRun,
14
+ type EvalRunBinding,
15
+ type EvalRunFilter,
16
+ type EvalRunStatus,
17
+ type FlowRef,
18
+ } from '../eval-run-binding.js';
19
+ import type { AppEnv } from '../types.js';
20
+ import { clampLimit } from './pagination.js';
21
+ import { parseScopeParams } from './scope-params.js';
22
+ import { formatSseFrame } from './sse.js';
23
+
24
+ /**
25
+ * Eval-run resource routes — data-plane surface for the evaluation
26
+ * harness. Follows `/v1/runs/*` structurally: `start` +
27
+ * `get` + `list` + `cancel` + `events` (SSE). The registry surface
28
+ * (`/v1/eval-suites/*`) resolves suite definitions; this
29
+ * router dispatches runs against them.
30
+ *
31
+ * The `start` route is anchored at `/v1/eval-suites/:suiteId/runs`
32
+ * because the suite is the durable definition and the caller supplies
33
+ * an agent/flow to *evaluate against* — not a run body. Read routes
34
+ * live under a sibling `/v1/eval-runs/*` for uniform pagination /
35
+ * filter shape across the resource.
36
+ *
37
+ * SSE is a lightweight projection over the binding's `get` — per-case
38
+ * progress events + a terminal event carrying the aggregate result.
39
+ * The binding chooses its underlying substrate (the in-process
40
+ * reference keeps runs in memory; a durable binding can back them with
41
+ * runs and their journal); this route only sees the surface.
42
+ */
43
+ export interface EvalRunsRouters {
44
+ readonly start: Hono<AppEnv>;
45
+ readonly readback: Hono<AppEnv>;
46
+ }
47
+
48
+ export function evalRunsRouters(binding: EvalRunBinding): EvalRunsRouters {
49
+ return {
50
+ start: startRouter(binding),
51
+ readback: readbackRouter(binding),
52
+ };
53
+ }
54
+
55
+ // ---------- POST /v1/eval-suites/:suiteId/runs ----------
56
+
57
+ function startRouter(binding: EvalRunBinding): Hono<AppEnv> {
58
+ const r = new Hono<AppEnv>();
59
+
60
+ r.post('/:suiteId/runs', async (c) => {
61
+ const requestId = c.get('requestId');
62
+ const tenantId = c.get('tenantId') as TenantId;
63
+ const suiteId = c.req.param('suiteId');
64
+
65
+ let body: unknown = {};
66
+ const hasBody =
67
+ (c.req.header('content-type') ?? '').includes('json') ||
68
+ (c.req.header('content-length') !== undefined && c.req.header('content-length') !== '0');
69
+ if (hasBody) {
70
+ try {
71
+ const text = await c.req.text();
72
+ body = text.length > 0 ? JSON.parse(text) : {};
73
+ } catch {
74
+ c.status(statusFor('bad-input') as never);
75
+ return c.json(
76
+ toWireError({ code: 'bad-input', message: 'Request body must be valid JSON' }, requestId),
77
+ );
78
+ }
79
+ }
80
+ const parsed = parseStartBody(body);
81
+ if (parsed.kind === 'err') {
82
+ c.status(statusFor(parsed.error.code) as never);
83
+ return c.json(toWireError(parsed.error, requestId));
84
+ }
85
+
86
+ const outcome = await binding.start({
87
+ tenantId,
88
+ projectId: parsed.value.projectId,
89
+ suiteId,
90
+ ...(parsed.value.agentRef !== undefined && { agentRef: parsed.value.agentRef }),
91
+ ...(parsed.value.flowRef !== undefined && { flowRef: parsed.value.flowRef }),
92
+ ...(parsed.value.dryRun !== undefined && { dryRun: parsed.value.dryRun }),
93
+ ...(parsed.value.correlationId !== undefined && {
94
+ correlationId: parsed.value.correlationId,
95
+ }),
96
+ });
97
+ if (outcome.kind === 'suite-not-found') {
98
+ c.status(statusFor('eval-suite-not-found') as never);
99
+ return c.json(
100
+ toWireError(
101
+ {
102
+ code: 'eval-suite-not-found',
103
+ message: `No eval suite registered with id "${outcome.suiteId}"`,
104
+ suiteId: outcome.suiteId,
105
+ },
106
+ requestId,
107
+ ),
108
+ );
109
+ }
110
+ if (outcome.kind === 'dispatcher-not-registered') {
111
+ c.status(statusFor('dispatcher-not-registered') as never);
112
+ return c.json(
113
+ toWireError(
114
+ {
115
+ code: 'dispatcher-not-registered',
116
+ message: `No eval-run dispatcher registered for kind "${outcome.evalKind}". This kind is registry-only today.`,
117
+ evalKind: outcome.evalKind,
118
+ },
119
+ requestId,
120
+ ),
121
+ );
122
+ }
123
+ if (outcome.kind === 'dispatcher-input-invalid') {
124
+ c.status(statusFor('dispatcher-input-invalid') as never);
125
+ return c.json(
126
+ toWireError(
127
+ {
128
+ code: 'dispatcher-input-invalid',
129
+ message: outcome.message,
130
+ },
131
+ requestId,
132
+ ),
133
+ );
134
+ }
135
+ if (outcome.kind === 'project-not-found') {
136
+ // Caller supplied a `projectId` that does not resolve within
137
+ // this tenant. Distinct signal from `dispatcher-input-invalid`
138
+ // so the client can prompt for a valid project rather than
139
+ // assume a dispatcher wiring problem. Answered as `400 bad-input`,
140
+ // like the eval-suites route; the caller learns from the message
141
+ // which field was invalid.
142
+ c.status(statusFor('bad-input') as never);
143
+ return c.json(
144
+ toWireError(
145
+ {
146
+ code: 'bad-input',
147
+ message: `\`projectId\` "${outcome.projectId as unknown as string}" does not resolve to a project in this tenant`,
148
+ },
149
+ requestId,
150
+ ),
151
+ );
152
+ }
153
+
154
+ c.status(201);
155
+ return c.json({
156
+ runId: outcome.runId as unknown as string,
157
+ ...(outcome.dryRunPreview !== undefined && { dryRunPreview: outcome.dryRunPreview }),
158
+ });
159
+ });
160
+
161
+ return r;
162
+ }
163
+
164
+ // ---------- /v1/eval-runs/* (readback + cancel + SSE) ----------
165
+
166
+ function readbackRouter(binding: EvalRunBinding): Hono<AppEnv> {
167
+ const r = new Hono<AppEnv>();
168
+
169
+ // ---------- GET / (list) ----------
170
+ r.get('/', async (c) => {
171
+ const requestId = c.get('requestId');
172
+ const tenantId = c.get('tenantId') as TenantId;
173
+ const limit = clampLimit(c.req.query('limit'));
174
+
175
+ const cursorRaw = c.req.query('cursor');
176
+ const statusRaw = c.req.query('status');
177
+ if (statusRaw !== undefined && statusRaw.length > 0 && !isEvalRunStatus(statusRaw)) {
178
+ c.status(statusFor('bad-input') as never);
179
+ return c.json(
180
+ toWireError(
181
+ {
182
+ code: 'bad-input',
183
+ message: `Unknown status "${statusRaw}". Expected one of: ${EVAL_RUN_STATUSES.join(', ')}.`,
184
+ },
185
+ requestId,
186
+ ),
187
+ );
188
+ }
189
+ const filter: EvalRunFilter = {};
190
+ const suiteIdRaw = c.req.query('suiteId');
191
+ if (suiteIdRaw !== undefined && suiteIdRaw.length > 0) {
192
+ (filter as { suiteId?: string }).suiteId = suiteIdRaw;
193
+ }
194
+ if (statusRaw !== undefined && statusRaw.length > 0) {
195
+ (filter as { status?: EvalRunStatus }).status = statusRaw as EvalRunStatus;
196
+ }
197
+ const agentIdRaw = c.req.query('agentId');
198
+ if (agentIdRaw !== undefined && agentIdRaw.length > 0) {
199
+ (filter as { agentId?: AgentId }).agentId = agentIdRaw as AgentId;
200
+ }
201
+ const flowIdRaw = c.req.query('flowId');
202
+ if (flowIdRaw !== undefined && flowIdRaw.length > 0) {
203
+ (filter as { flowId?: FlowId }).flowId = flowIdRaw as FlowId;
204
+ }
205
+ const fromRaw = c.req.query('from');
206
+ if (fromRaw !== undefined && fromRaw.length > 0) {
207
+ (filter as { from?: Timestamp }).from = fromRaw as Timestamp;
208
+ }
209
+ const toRaw = c.req.query('to');
210
+ if (toRaw !== undefined && toRaw.length > 0) {
211
+ (filter as { to?: Timestamp }).to = toRaw as Timestamp;
212
+ }
213
+
214
+ const scopeParsed = parseScopeParams(c.req.query(), { tenantId });
215
+ if (scopeParsed.kind === 'err') {
216
+ c.status(statusFor('scope-invalid') as never);
217
+ return c.json(
218
+ toWireError({ code: 'scope-invalid', message: scopeParsed.message }, requestId),
219
+ );
220
+ }
221
+
222
+ const page = await binding.list({
223
+ tenantId,
224
+ limit,
225
+ ...(cursorRaw !== undefined && cursorRaw.length > 0 && { cursor: cursorRaw as Cursor }),
226
+ ...(Object.keys(filter).length > 0 && { filter }),
227
+ ...(scopeParsed.scope !== undefined && { scope: scopeParsed.scope }),
228
+ ...(scopeParsed.inherit !== undefined && { inherit: scopeParsed.inherit }),
229
+ });
230
+ return c.json({
231
+ data: page.data.map(serializeEvalRun),
232
+ hasMore: page.nextCursor !== undefined,
233
+ ...(page.nextCursor !== undefined && { nextCursor: page.nextCursor as unknown as string }),
234
+ });
235
+ });
236
+
237
+ // ---------- GET /:runId ----------
238
+ r.get('/:runId', async (c) => {
239
+ const requestId = c.get('requestId');
240
+ const tenantId = c.get('tenantId') as TenantId;
241
+ const runId = c.req.param('runId') as RunId;
242
+
243
+ const run = await binding.get({ tenantId, runId });
244
+ if (run === null) {
245
+ c.status(statusFor('eval-run-not-found') as never);
246
+ return c.json(
247
+ toWireError(
248
+ { code: 'eval-run-not-found', message: `No eval run with id ${runId}`, runId },
249
+ requestId,
250
+ ),
251
+ );
252
+ }
253
+ return c.json(serializeEvalRun(run));
254
+ });
255
+
256
+ // ---------- POST /:runId/cancel ----------
257
+ r.post('/:runId/cancel', async (c) => {
258
+ const requestId = c.get('requestId');
259
+ const tenantId = c.get('tenantId') as TenantId;
260
+ const runId = c.req.param('runId') as RunId;
261
+
262
+ const outcome = await binding.cancel({ tenantId, runId });
263
+ if (outcome.kind === 'not-found') {
264
+ c.status(statusFor('eval-run-not-found') as never);
265
+ return c.json(
266
+ toWireError(
267
+ { code: 'eval-run-not-found', message: `No eval run with id ${runId}`, runId },
268
+ requestId,
269
+ ),
270
+ );
271
+ }
272
+ if (outcome.kind === 'already-terminal') {
273
+ c.status(statusFor('eval-run-already-terminal') as never);
274
+ return c.json(
275
+ toWireError(
276
+ {
277
+ code: 'eval-run-already-terminal',
278
+ message: `Cannot cancel eval run ${runId}: already ${outcome.status}`,
279
+ runId,
280
+ status: outcome.status,
281
+ },
282
+ requestId,
283
+ ),
284
+ );
285
+ }
286
+
287
+ // Re-read to return the freshest wire shape.
288
+ const reloaded = await binding.get({ tenantId, runId });
289
+ if (reloaded === null) {
290
+ // Very unlikely: cancel succeeded but the row vanished. Return
291
+ // a minimal wire shape rather than 500 — the caller has the
292
+ // runId and status intent already.
293
+ return c.json({ runId: runId as unknown as string, cancelled: true });
294
+ }
295
+ return c.json(serializeEvalRun(reloaded));
296
+ });
297
+
298
+ // ---------- GET /:runId/events (SSE) ----------
299
+ r.get('/:runId/events', async (c) => {
300
+ const requestId = c.get('requestId');
301
+ const tenantId = c.get('tenantId') as TenantId;
302
+ const runId = c.req.param('runId') as RunId;
303
+
304
+ const initial = await binding.get({ tenantId, runId });
305
+ if (initial === null) {
306
+ c.status(statusFor('eval-run-not-found') as never);
307
+ return c.json(
308
+ toWireError(
309
+ { code: 'eval-run-not-found', message: `No eval run with id ${runId}`, runId },
310
+ requestId,
311
+ ),
312
+ );
313
+ }
314
+
315
+ const encoder = new TextEncoder();
316
+ const POLL_MS = 100;
317
+ const MAX_WAIT_MS = 5 * 60_000;
318
+
319
+ // Track which per-case events we've already emitted (index within
320
+ // result.perCase). Kept intentionally small — only the accuracy
321
+ // kind's per-case shape is streamed; other kinds would need their
322
+ // own projection.
323
+ const body = new ReadableStream<Uint8Array>({
324
+ async start(controller) {
325
+ const startedAt = Date.now();
326
+ let lastEmittedCaseIndex = -1;
327
+ let terminalEmitted = false;
328
+ const emit = async (): Promise<{ terminal: boolean }> => {
329
+ const snapshot = await binding.get({ tenantId, runId });
330
+ if (snapshot === null) {
331
+ controller.enqueue(
332
+ encoder.encode(
333
+ formatSseFrame({
334
+ id: `${runId}:error`,
335
+ event: 'error',
336
+ data: {
337
+ code: 'eval-run-not-found',
338
+ message: `eval run ${runId} disappeared`,
339
+ requestId,
340
+ },
341
+ }),
342
+ ),
343
+ );
344
+ return { terminal: true };
345
+ }
346
+ const perCase = readPerCase(snapshot.result);
347
+ for (let i = lastEmittedCaseIndex + 1; i < perCase.length; i++) {
348
+ const entry = perCase[i];
349
+ if (entry === undefined) continue;
350
+ controller.enqueue(
351
+ encoder.encode(
352
+ formatSseFrame({
353
+ id: `${runId}:case:${i}`,
354
+ event: entry.pass === false ? 'eval-run.case-failed' : 'eval-run.case-completed',
355
+ data: { runId, caseIndex: i, ...entry },
356
+ }),
357
+ ),
358
+ );
359
+ lastEmittedCaseIndex = i;
360
+ }
361
+ if (isTerminalEvalRun(snapshot.status) && !terminalEmitted) {
362
+ terminalEmitted = true;
363
+ const wireKind =
364
+ snapshot.status === 'completed'
365
+ ? 'eval-run.completed'
366
+ : snapshot.status === 'failed'
367
+ ? 'eval-run.failed'
368
+ : 'eval-run.cancelled';
369
+ controller.enqueue(
370
+ encoder.encode(
371
+ formatSseFrame({
372
+ id: `${runId}:terminal`,
373
+ event: wireKind,
374
+ data: {
375
+ runId,
376
+ status: snapshot.status,
377
+ ...(snapshot.result !== undefined && { result: snapshot.result }),
378
+ ...(snapshot.error !== undefined && { error: snapshot.error }),
379
+ },
380
+ }),
381
+ ),
382
+ );
383
+ return { terminal: true };
384
+ }
385
+ return { terminal: false };
386
+ };
387
+
388
+ let closed = false;
389
+ const close = (): void => {
390
+ if (closed) return;
391
+ closed = true;
392
+ try {
393
+ controller.close();
394
+ } catch {
395
+ /* already closed */
396
+ }
397
+ };
398
+ try {
399
+ const first = await emit();
400
+ if (first.terminal) {
401
+ close();
402
+ return;
403
+ }
404
+ while (Date.now() - startedAt < MAX_WAIT_MS) {
405
+ await new Promise((r2) => setTimeout(r2, POLL_MS));
406
+ const step = await emit();
407
+ if (step.terminal) break;
408
+ }
409
+ } finally {
410
+ close();
411
+ }
412
+ },
413
+ });
414
+
415
+ return new Response(body, {
416
+ status: 200,
417
+ headers: {
418
+ 'Content-Type': 'text/event-stream; charset=utf-8',
419
+ 'Cache-Control': 'no-cache',
420
+ Connection: 'keep-alive',
421
+ 'X-Request-Id': requestId,
422
+ },
423
+ });
424
+ });
425
+
426
+ return r;
427
+ }
428
+
429
+ // ---------- helpers ----------
430
+
431
+ function serializeEvalRun(run: EvalRun): Record<string, unknown> {
432
+ return {
433
+ runId: run.runId as unknown as string,
434
+ tenantId: run.tenantId as unknown as string,
435
+ suiteId: run.suiteId,
436
+ suiteVersion: run.suiteVersion,
437
+ kind: run.kind,
438
+ ...(run.agentRef !== undefined && {
439
+ agentRef: {
440
+ agentId: run.agentRef.agentId as unknown as string,
441
+ ...(run.agentRef.version !== undefined && { version: run.agentRef.version }),
442
+ },
443
+ }),
444
+ ...(run.flowRef !== undefined && {
445
+ flowRef: {
446
+ flowId: run.flowRef.flowId as unknown as string,
447
+ ...(run.flowRef.version !== undefined && { version: run.flowRef.version }),
448
+ },
449
+ }),
450
+ status: run.status,
451
+ dryRun: run.dryRun,
452
+ startedAt: run.startedAt,
453
+ ...(run.completedAt !== undefined && { completedAt: run.completedAt }),
454
+ ...(run.result !== undefined && { result: run.result }),
455
+ ...(run.error !== undefined && { error: run.error }),
456
+ ...(run.correlationId !== undefined && { correlationId: run.correlationId }),
457
+ };
458
+ }
459
+
460
+ function isEvalRunStatus(value: string): value is EvalRunStatus {
461
+ return (EVAL_RUN_STATUSES as readonly string[]).includes(value);
462
+ }
463
+
464
+ function isTerminalEvalRun(status: EvalRunStatus): boolean {
465
+ return status === 'completed' || status === 'failed' || status === 'cancelled';
466
+ }
467
+
468
+ interface PerCaseEntry {
469
+ readonly pass?: boolean;
470
+ readonly score?: number;
471
+ readonly judgeMetadata?: unknown;
472
+ }
473
+
474
+ function readPerCase(
475
+ result: Readonly<Record<string, unknown>> | undefined,
476
+ ): readonly PerCaseEntry[] {
477
+ if (result === undefined) return [];
478
+ const perCase = result.perCase;
479
+ if (!Array.isArray(perCase)) return [];
480
+ return perCase as readonly PerCaseEntry[];
481
+ }
482
+
483
+ interface ParsedStartBody {
484
+ readonly projectId: ProjectId;
485
+ readonly agentRef?: AgentRef;
486
+ readonly flowRef?: FlowRef;
487
+ readonly dryRun?: boolean;
488
+ readonly correlationId?: string;
489
+ }
490
+
491
+ function parseStartBody(
492
+ body: unknown,
493
+ ):
494
+ | { kind: 'ok'; value: ParsedStartBody }
495
+ | { kind: 'err'; error: { code: string; message: string } } {
496
+ if (body === null || typeof body !== 'object') {
497
+ return { kind: 'err', error: { code: 'bad-input', message: 'Request body must be an object' } };
498
+ }
499
+ const b = body as Record<string, unknown>;
500
+
501
+ // `projectId` is REQUIRED on the POST body.
502
+ // Missing / empty / non-string → 400 bad-input. Content-scoped
503
+ // rows anchor to a project; the caller resolves it before dispatch.
504
+ const projectIdRaw = b.projectId;
505
+ if (typeof projectIdRaw !== 'string' || projectIdRaw.length === 0) {
506
+ return {
507
+ kind: 'err',
508
+ error: { code: 'bad-input', message: '`projectId` is required' },
509
+ };
510
+ }
511
+ const projectId = projectIdRaw as ProjectId;
512
+
513
+ const hasAgent = b.agentRef !== undefined && b.agentRef !== null;
514
+ const hasGraph = b.flowRef !== undefined && b.flowRef !== null;
515
+ if (hasAgent && hasGraph) {
516
+ return {
517
+ kind: 'err',
518
+ error: {
519
+ code: 'bad-input',
520
+ message: 'Provide exactly one of `agentRef` or `flowRef`, not both',
521
+ },
522
+ };
523
+ }
524
+ if (!hasAgent && !hasGraph) {
525
+ return {
526
+ kind: 'err',
527
+ error: {
528
+ code: 'bad-input',
529
+ message: 'Request body must include exactly one of `agentRef` or `flowRef`',
530
+ },
531
+ };
532
+ }
533
+
534
+ let agentRef: AgentRef | undefined;
535
+ if (hasAgent) {
536
+ const ar = b.agentRef as Record<string, unknown>;
537
+ if (typeof ar !== 'object' || ar === null) {
538
+ return {
539
+ kind: 'err',
540
+ error: { code: 'bad-input', message: '`agentRef` must be an object' },
541
+ };
542
+ }
543
+ if (typeof ar.agentId !== 'string' || ar.agentId.length === 0) {
544
+ return {
545
+ kind: 'err',
546
+ error: {
547
+ code: 'bad-input',
548
+ message: '`agentRef.agentId` must be a non-empty string',
549
+ },
550
+ };
551
+ }
552
+ if (ar.version !== undefined && typeof ar.version !== 'string') {
553
+ return {
554
+ kind: 'err',
555
+ error: {
556
+ code: 'bad-input',
557
+ message: '`agentRef.version` must be a string when supplied',
558
+ },
559
+ };
560
+ }
561
+ agentRef = {
562
+ agentId: ar.agentId as AgentId,
563
+ ...(typeof ar.version === 'string' && { version: ar.version as Semver }),
564
+ };
565
+ }
566
+
567
+ let flowRef: FlowRef | undefined;
568
+ if (hasGraph) {
569
+ const gr = b.flowRef as Record<string, unknown>;
570
+ if (typeof gr !== 'object' || gr === null) {
571
+ return {
572
+ kind: 'err',
573
+ error: { code: 'bad-input', message: '`flowRef` must be an object' },
574
+ };
575
+ }
576
+ if (typeof gr.flowId !== 'string' || gr.flowId.length === 0) {
577
+ return {
578
+ kind: 'err',
579
+ error: {
580
+ code: 'bad-input',
581
+ message: '`flowRef.flowId` must be a non-empty string',
582
+ },
583
+ };
584
+ }
585
+ if (gr.version !== undefined && typeof gr.version !== 'string') {
586
+ return {
587
+ kind: 'err',
588
+ error: {
589
+ code: 'bad-input',
590
+ message: '`flowRef.version` must be a string when supplied',
591
+ },
592
+ };
593
+ }
594
+ flowRef = {
595
+ flowId: gr.flowId as FlowId,
596
+ ...(typeof gr.version === 'string' && { version: gr.version as Semver }),
597
+ };
598
+ }
599
+
600
+ const dryRun = b.dryRun;
601
+ if (dryRun !== undefined && typeof dryRun !== 'boolean') {
602
+ return {
603
+ kind: 'err',
604
+ error: { code: 'bad-input', message: '`dryRun` must be a boolean when supplied' },
605
+ };
606
+ }
607
+ const correlationId = b.correlationId;
608
+ if (
609
+ correlationId !== undefined &&
610
+ (typeof correlationId !== 'string' || correlationId.length === 0)
611
+ ) {
612
+ return {
613
+ kind: 'err',
614
+ error: {
615
+ code: 'bad-input',
616
+ message: '`correlationId` must be a non-empty string when supplied',
617
+ },
618
+ };
619
+ }
620
+
621
+ return {
622
+ kind: 'ok',
623
+ value: {
624
+ projectId,
625
+ ...(agentRef !== undefined && { agentRef }),
626
+ ...(flowRef !== undefined && { flowRef }),
627
+ ...(dryRun !== undefined && { dryRun }),
628
+ ...(correlationId !== undefined && { correlationId: correlationId as string }),
629
+ },
630
+ };
631
+ }