@kindgi/api 0.0.0-bootstrap.0 → 0.1.0

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 +396 -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 +264 -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 +13 -0
  104. package/dist/middleware/error-mapper.d.ts.map +1 -0
  105. package/dist/middleware/error-mapper.js +32 -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 +5051 -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 +773 -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 +29659 -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 +1285 -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 +291 -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 +37 -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 +5445 -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 +981 -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,300 @@
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 type { Cursor, TenantId, TriggerId } from '@kindgi/types';
8
+
9
+ import { statusFor, toWireError } from '../errors.js';
10
+ import type {
11
+ CronTriggerRecord,
12
+ RegisterCronTriggerInput,
13
+ TriggerRegistryBinding,
14
+ UpdateCronTriggerInput,
15
+ } from '../trigger-binding.js';
16
+ import type { AppEnv } from '../types.js';
17
+ import { clampLimit } from './pagination.js';
18
+
19
+ /**
20
+ * Schedules — cron-kind triggers.
21
+ *
22
+ * Seven routes, all soft-delete-shaped per framework convention:
23
+ * - POST /v1/schedules (register)
24
+ * - GET /v1/schedules (list, cursor-paginated)
25
+ * - GET /v1/schedules/:triggerId (get)
26
+ * - PATCH /v1/schedules/:triggerId (update cron/label/flowVersion)
27
+ * - POST /v1/schedules/:triggerId/pause
28
+ * - POST /v1/schedules/:triggerId/resume
29
+ * - POST /v1/schedules/:triggerId/unregister (tombstone — GC per policy)
30
+ *
31
+ * The `triggerId` URL param is the trigger's id; the response body
32
+ * aliases it as `scheduleId` for a friendlier client surface.
33
+ */
34
+ export function schedulesRouter(binding: TriggerRegistryBinding): Hono<AppEnv> {
35
+ const r = new Hono<AppEnv>();
36
+
37
+ // ---------- POST / (register) ----------
38
+ r.post('/', async (c) => {
39
+ const requestId = c.get('requestId');
40
+ const tenantId = c.get('tenantId') as TenantId;
41
+
42
+ const parsed = await parseJsonObject(c, requestId);
43
+ if (parsed.kind === 'err') return parsed.response;
44
+ const body = parsed.value;
45
+
46
+ const flowId = requireString(body, 'flowId');
47
+ const flowVersion = requireString(body, 'flowVersion');
48
+ const cronExpression = requireString(body.config, 'config.cronExpression');
49
+ if (flowId.kind === 'err') return bad(c, requestId, flowId.message);
50
+ if (flowVersion.kind === 'err') return bad(c, requestId, flowVersion.message);
51
+ if (cronExpression.kind === 'err') return bad(c, requestId, cronExpression.message);
52
+
53
+ const rawConfig = (body.config ?? {}) as Record<string, unknown>;
54
+ const registerInput: RegisterCronTriggerInput = {
55
+ kind: 'cron',
56
+ tenantId,
57
+ flowId: flowId.value,
58
+ flowVersion: flowVersion.value,
59
+ config: {
60
+ cronExpression: cronExpression.value,
61
+ ...(typeof rawConfig.timezone === 'string' && { timezone: rawConfig.timezone }),
62
+ ...('input' in rawConfig && { input: rawConfig.input }),
63
+ },
64
+ ...(typeof body.label === 'string' && body.label.length > 0 && { label: body.label }),
65
+ };
66
+
67
+ const result = await binding.register(registerInput);
68
+ if (result.kind === 'err') {
69
+ c.status(statusFor(result.error.code) as never);
70
+ return c.json(
71
+ toWireError({ code: result.error.code, message: result.error.message }, requestId),
72
+ );
73
+ }
74
+ c.status(201);
75
+ return c.json(serializeSchedule(result.value as CronTriggerRecord));
76
+ });
77
+
78
+ // ---------- GET / (list) ----------
79
+ r.get('/', async (c) => {
80
+ const tenantId = c.get('tenantId') as TenantId;
81
+ const limit = clampLimit(c.req.query('limit'));
82
+ const cursorRaw = c.req.query('cursor');
83
+ const statusRaw = c.req.query('status');
84
+
85
+ let statusFilter: 'active' | 'paused' | undefined;
86
+ if (statusRaw === 'active' || statusRaw === 'paused') statusFilter = statusRaw;
87
+
88
+ const page = await binding.list({
89
+ tenantId,
90
+ kind: 'cron',
91
+ limit,
92
+ ...(cursorRaw !== undefined && cursorRaw.length > 0 && { cursor: cursorRaw as Cursor }),
93
+ ...(statusFilter !== undefined && { status: statusFilter }),
94
+ });
95
+ return c.json({
96
+ data: page.data.map((row) => serializeSchedule(row as CronTriggerRecord)),
97
+ hasMore: page.nextCursor !== undefined,
98
+ ...(page.nextCursor !== undefined && { nextCursor: page.nextCursor as unknown as string }),
99
+ });
100
+ });
101
+
102
+ // ---------- GET /:triggerId (get) ----------
103
+ r.get('/:triggerId', async (c) => {
104
+ const requestId = c.get('requestId');
105
+ const tenantId = c.get('tenantId') as TenantId;
106
+ const triggerId = c.req.param('triggerId') as TriggerId;
107
+
108
+ const rec = await binding.get({ tenantId, triggerId });
109
+ if (rec === null || rec.kind !== 'cron') return notFound(c, requestId, triggerId);
110
+ return c.json(serializeSchedule(rec));
111
+ });
112
+
113
+ // ---------- PATCH /:triggerId (update) ----------
114
+ r.patch('/:triggerId', async (c) => {
115
+ const requestId = c.get('requestId');
116
+ const tenantId = c.get('tenantId') as TenantId;
117
+ const triggerId = c.req.param('triggerId') as TriggerId;
118
+
119
+ const parsed = await parseJsonObject(c, requestId);
120
+ if (parsed.kind === 'err') return parsed.response;
121
+ const body = parsed.value;
122
+
123
+ const patchConfig = body.config as Record<string, unknown> | undefined;
124
+ const cfg: Partial<{ cronExpression: string; timezone: string; input: unknown }> = {};
125
+ if (patchConfig !== undefined) {
126
+ if (typeof patchConfig.cronExpression === 'string')
127
+ cfg.cronExpression = patchConfig.cronExpression;
128
+ if (typeof patchConfig.timezone === 'string') cfg.timezone = patchConfig.timezone;
129
+ if ('input' in patchConfig) cfg.input = patchConfig.input;
130
+ }
131
+
132
+ const updateInput: UpdateCronTriggerInput = {
133
+ kind: 'cron',
134
+ tenantId,
135
+ triggerId,
136
+ ...(Object.keys(cfg).length > 0 && { config: cfg }),
137
+ ...('label' in body && { label: body.label === null ? null : (body.label as string) }),
138
+ ...(typeof body.flowVersion === 'string' && { flowVersion: body.flowVersion }),
139
+ };
140
+
141
+ const result = await binding.update(updateInput);
142
+ if (result.kind === 'err') {
143
+ c.status(statusFor(result.error.code) as never);
144
+ return c.json(
145
+ toWireError(
146
+ {
147
+ code: result.error.code,
148
+ message: result.error.message,
149
+ triggerId: triggerId as unknown as string,
150
+ },
151
+ requestId,
152
+ ),
153
+ );
154
+ }
155
+ return c.json(serializeSchedule(result.value as CronTriggerRecord));
156
+ });
157
+
158
+ // ---------- POST /:triggerId/pause ----------
159
+ r.post('/:triggerId/pause', async (c) => {
160
+ const requestId = c.get('requestId');
161
+ const tenantId = c.get('tenantId') as TenantId;
162
+ const triggerId = c.req.param('triggerId') as TriggerId;
163
+ const result = await binding.pause({ tenantId, triggerId });
164
+ if (result.kind === 'err') return lifecycleError(c, requestId, result.error, triggerId);
165
+ return c.json(serializeSchedule(result.value as CronTriggerRecord));
166
+ });
167
+
168
+ // ---------- POST /:triggerId/resume ----------
169
+ r.post('/:triggerId/resume', async (c) => {
170
+ const requestId = c.get('requestId');
171
+ const tenantId = c.get('tenantId') as TenantId;
172
+ const triggerId = c.req.param('triggerId') as TriggerId;
173
+ const result = await binding.resume({ tenantId, triggerId });
174
+ if (result.kind === 'err') return lifecycleError(c, requestId, result.error, triggerId);
175
+ return c.json(serializeSchedule(result.value as CronTriggerRecord));
176
+ });
177
+
178
+ // ---------- POST /:triggerId/unregister (soft delete) ----------
179
+ r.post('/:triggerId/unregister', async (c) => {
180
+ const tenantId = c.get('tenantId') as TenantId;
181
+ const triggerId = c.req.param('triggerId') as TriggerId;
182
+ const outcome = await binding.unregister({ tenantId, triggerId });
183
+ return c.json({
184
+ scheduleId: triggerId as unknown as string,
185
+ unregistered: outcome.unregistered,
186
+ });
187
+ });
188
+
189
+ return r;
190
+ }
191
+
192
+ // -----------------------------------------------------------------------
193
+ // Shared helpers (co-located to keep each router self-contained).
194
+ // -----------------------------------------------------------------------
195
+
196
+ function serializeSchedule(r: CronTriggerRecord): Record<string, unknown> {
197
+ return {
198
+ scheduleId: r.triggerId as unknown as string,
199
+ triggerId: r.triggerId as unknown as string,
200
+ flowId: r.flowId,
201
+ flowVersion: r.flowVersion,
202
+ cronExpression: r.config.cronExpression,
203
+ ...(r.config.timezone !== undefined && { timezone: r.config.timezone }),
204
+ ...(r.config.input !== undefined && { input: r.config.input }),
205
+ label: r.label,
206
+ status: r.status,
207
+ nextFireAt: r.nextFireAt,
208
+ lastFiredAt: r.lastFiredAt,
209
+ createdAt: r.createdAt,
210
+ updatedAt: r.updatedAt,
211
+ };
212
+ }
213
+
214
+ type ParseOk<T> = { readonly kind: 'ok'; readonly value: T };
215
+ type ParseErr = { readonly kind: 'err'; readonly response: Response };
216
+
217
+ async function parseJsonObject(
218
+ c: Context<AppEnv>,
219
+ requestId: string,
220
+ ): Promise<ParseOk<Record<string, unknown>> | ParseErr> {
221
+ let body: unknown;
222
+ try {
223
+ body = await c.req.json();
224
+ } catch {
225
+ c.status(statusFor('bad-input') as never);
226
+ return {
227
+ kind: 'err',
228
+ response: c.json(
229
+ toWireError({ code: 'bad-input', message: 'Request body must be valid JSON' }, requestId),
230
+ ),
231
+ };
232
+ }
233
+ if (body === null || typeof body !== 'object' || Array.isArray(body)) {
234
+ c.status(statusFor('bad-input') as never);
235
+ return {
236
+ kind: 'err',
237
+ response: c.json(
238
+ toWireError(
239
+ { code: 'bad-input', message: 'Request body must be a JSON object' },
240
+ requestId,
241
+ ),
242
+ ),
243
+ };
244
+ }
245
+ return { kind: 'ok', value: body as Record<string, unknown> };
246
+ }
247
+
248
+ function requireString(
249
+ obj: unknown,
250
+ path: string,
251
+ ):
252
+ | { readonly kind: 'ok'; readonly value: string }
253
+ | { readonly kind: 'err'; readonly message: string } {
254
+ const parts = path.split('.');
255
+ let cur: unknown = obj;
256
+ for (const part of parts) {
257
+ if (cur === null || typeof cur !== 'object') {
258
+ return { kind: 'err', message: `\`${path}\` is required` };
259
+ }
260
+ cur = (cur as Record<string, unknown>)[part];
261
+ }
262
+ if (typeof cur !== 'string' || cur.length === 0) {
263
+ return { kind: 'err', message: `\`${path}\` is required` };
264
+ }
265
+ return { kind: 'ok', value: cur };
266
+ }
267
+
268
+ function bad(c: Context<AppEnv>, requestId: string, message: string): Response {
269
+ c.status(statusFor('bad-input') as never);
270
+ return c.json(toWireError({ code: 'bad-input', message }, requestId));
271
+ }
272
+
273
+ function notFound(c: Context<AppEnv>, requestId: string, triggerId: TriggerId): Response {
274
+ c.status(statusFor('trigger-not-found') as never);
275
+ return c.json(
276
+ toWireError(
277
+ {
278
+ code: 'trigger-not-found',
279
+ message: `No trigger with id "${triggerId as unknown as string}"`,
280
+ triggerId: triggerId as unknown as string,
281
+ },
282
+ requestId,
283
+ ),
284
+ );
285
+ }
286
+
287
+ function lifecycleError(
288
+ c: Context<AppEnv>,
289
+ requestId: string,
290
+ error: { readonly code: string; readonly message: string },
291
+ triggerId: TriggerId,
292
+ ): Response {
293
+ c.status(statusFor(error.code) as never);
294
+ return c.json(
295
+ toWireError(
296
+ { code: error.code, message: error.message, triggerId: triggerId as unknown as string },
297
+ requestId,
298
+ ),
299
+ );
300
+ }
@@ -0,0 +1,133 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { type ResourceRef, ref } from '@kindgi/authz';
5
+ import type { Scope } from '@kindgi/platform';
6
+ import type { OrgId, ProjectId, TenantId } from '@kindgi/types';
7
+
8
+ /**
9
+ * The authorization resource for a request scope: the project or org it
10
+ * names, else the tenant. A route's authorization middleware derives the
11
+ * scope with the same parser as its handler and passes the result here, so
12
+ * the scope that is checked is the scope that is acted on. An absent or
13
+ * unparseable scope checks the tenant, the strictest resource; the handler
14
+ * then rejects the request.
15
+ */
16
+ export function scopeResourceRef(scope: Scope | undefined, tenantId: TenantId): ResourceRef {
17
+ if (scope?.kind === 'project') return ref('project', scope.projectId as unknown as string);
18
+ if (scope?.kind === 'org') return ref('org', scope.orgId as unknown as string);
19
+ return ref('tenant', tenantId as unknown as string);
20
+ }
21
+
22
+ /** {@link scopeResourceRef} for the `?scopeKind` + `?scopeId` query parameters. */
23
+ export function queryScopeResourceRef(
24
+ query: QuerySource,
25
+ session: { readonly tenantId: TenantId },
26
+ ): ResourceRef {
27
+ const parsed = parseScopeParams(query, session);
28
+ return scopeResourceRef(parsed.kind === 'ok' ? parsed.scope : undefined, session.tenantId);
29
+ }
30
+
31
+ /**
32
+ * Outcome of parsing the `?scopeKind + ?scopeId + ?inherit` triplet.
33
+ * `ok` carries the decoded `Scope` (undefined if no scope params were
34
+ * supplied) plus the parsed `inherit` boolean (undefined if elided —
35
+ * caller leaves the binding to apply its own default).
36
+ */
37
+ export type ParseScopeParamsOutcome =
38
+ | { readonly kind: 'ok'; readonly scope?: Scope; readonly inherit?: boolean }
39
+ | { readonly kind: 'err'; readonly message: string };
40
+
41
+ type QuerySource = Record<string, string> | ((name: string) => string | undefined);
42
+
43
+ /**
44
+ * Parse the `?scopeKind + ?scopeId + ?inherit` triplet. The wire shape
45
+ * is a discriminated triplet by design — human-readable, curl / browser
46
+ * / access-log auditable for regulated verticals.
47
+ *
48
+ * Cross-field validation (all return 400 `scope-invalid`):
49
+ * - `scopeKind === 'tenant' && scopeId !== undefined` → err (tenant carries no id).
50
+ * - `scopeKind in {'org','project'} && scopeId === undefined` → err (missing id).
51
+ * - `scopeKind === undefined && scopeId !== undefined` → err (orphan id).
52
+ * - `inherit` — accepts literal 'true' / 'false' strings; anything else → err.
53
+ *
54
+ * `tenantId` for the decoded Scope always comes from the session —
55
+ * cross-tenant scopes are denied by policy.
56
+ *
57
+ * `inherit` is load-bearing for policy/config-scoped bindings
58
+ * (e.g. MCP endpoints, secrets, env values) — controls the
59
+ * upward-hierarchy walk. For content-scoped bindings the flag is a
60
+ * documented no-op; the route passes it through so the binding-side
61
+ * field-passthrough shape stays uniform across the scope-aware
62
+ * bindings.
63
+ */
64
+ export function parseScopeParams(
65
+ query: QuerySource,
66
+ session: { readonly tenantId: TenantId },
67
+ ): ParseScopeParamsOutcome {
68
+ const get: (n: string) => string | undefined =
69
+ typeof query === 'function' ? query : (n: string) => query[n];
70
+ const scopeKindRaw = get('scopeKind');
71
+ const scopeIdRaw = get('scopeId');
72
+ const inheritRaw = get('inherit');
73
+
74
+ // ---- inherit ----
75
+ let inherit: boolean | undefined;
76
+ if (inheritRaw !== undefined && inheritRaw.length > 0) {
77
+ if (inheritRaw === 'true') inherit = true;
78
+ else if (inheritRaw === 'false') inherit = false;
79
+ else {
80
+ return {
81
+ kind: 'err',
82
+ message: `scope query parameters malformed: inherit must be 'true' or 'false', got "${inheritRaw}"`,
83
+ };
84
+ }
85
+ }
86
+
87
+ // ---- scope triplet ----
88
+ if (scopeKindRaw === undefined || scopeKindRaw.length === 0) {
89
+ if (scopeIdRaw !== undefined && scopeIdRaw.length > 0) {
90
+ return {
91
+ kind: 'err',
92
+ message: `scope query parameters malformed: scopeId="${scopeIdRaw}" requires scopeKind`,
93
+ };
94
+ }
95
+ return { kind: 'ok', ...(inherit !== undefined && { inherit }) };
96
+ }
97
+
98
+ if (scopeKindRaw !== 'tenant' && scopeKindRaw !== 'org' && scopeKindRaw !== 'project') {
99
+ return {
100
+ kind: 'err',
101
+ message: `scope query parameters malformed: scopeKind must be one of 'tenant' | 'org' | 'project', got "${scopeKindRaw}"`,
102
+ };
103
+ }
104
+
105
+ if (scopeKindRaw === 'tenant') {
106
+ if (scopeIdRaw !== undefined && scopeIdRaw.length > 0) {
107
+ return {
108
+ kind: 'err',
109
+ message: `scope query parameters malformed: scopeKind='tenant' takes no scopeId (tenant is implicit from the session)`,
110
+ };
111
+ }
112
+ return {
113
+ kind: 'ok',
114
+ scope: { kind: 'tenant', tenantId: session.tenantId },
115
+ ...(inherit !== undefined && { inherit }),
116
+ };
117
+ }
118
+
119
+ // 'org' | 'project' — both require scopeId
120
+ if (scopeIdRaw === undefined || scopeIdRaw.length === 0) {
121
+ return {
122
+ kind: 'err',
123
+ message: `scope query parameters malformed: scopeKind='${scopeKindRaw}' requires scopeId`,
124
+ };
125
+ }
126
+
127
+ const scope: Scope =
128
+ scopeKindRaw === 'org'
129
+ ? { kind: 'org', tenantId: session.tenantId, orgId: scopeIdRaw as OrgId }
130
+ : { kind: 'project', tenantId: session.tenantId, projectId: scopeIdRaw as ProjectId };
131
+
132
+ return { kind: 'ok', scope, ...(inherit !== undefined && { inherit }) };
133
+ }
@@ -0,0 +1,52 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { type EnvName, makeEnvName } from '@kindgi/types';
5
+
6
+ /** The longest secret name a `secretRef` can carry. */
7
+ export const MAX_SECRET_NAME_LENGTH = 256;
8
+
9
+ const SECRET_REF_FIELDS = new Set(['envName', 'name']);
10
+
11
+ /**
12
+ * `{ envName, name }`: a secret by name in the deployment's secrets
13
+ * store, resolved at the owner's scope. The shape webhooks, MCP
14
+ * endpoints and providers share. `field` names it in messages.
15
+ */
16
+ export function parseSecretRef(
17
+ raw: unknown,
18
+ field = 'secretRef',
19
+ ):
20
+ | { readonly kind: 'ok'; readonly value: { readonly envName: EnvName; readonly name: string } }
21
+ | { readonly kind: 'err'; readonly message: string; readonly unknownField?: string } {
22
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
23
+ return { kind: 'err', message: `\`${field}\` must be an object \`{ envName, name }\`` };
24
+ }
25
+ const ref = raw as Record<string, unknown>;
26
+ const unknown = Object.keys(ref).find((key) => !SECRET_REF_FIELDS.has(key));
27
+ if (unknown !== undefined) {
28
+ return {
29
+ kind: 'err',
30
+ message: `Unknown field \`${field}.${unknown}\``,
31
+ unknownField: `${field}.${unknown}`,
32
+ };
33
+ }
34
+ const envName = typeof ref.envName === 'string' ? makeEnvName(ref.envName) : null;
35
+ if (envName === null) {
36
+ return {
37
+ kind: 'err',
38
+ message: `\`${field}.envName\` must be a lowercase name (letters, digits, hyphens)`,
39
+ };
40
+ }
41
+ if (
42
+ typeof ref.name !== 'string' ||
43
+ ref.name.length === 0 ||
44
+ ref.name.length > MAX_SECRET_NAME_LENGTH
45
+ ) {
46
+ return {
47
+ kind: 'err',
48
+ message: `\`${field}.name\` must be a non-empty string of at most ${MAX_SECRET_NAME_LENGTH} characters`,
49
+ };
50
+ }
51
+ return { kind: 'ok', value: { envName, name: ref.name } };
52
+ }