@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,296 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { randomUUID } from 'node:crypto';
5
+
6
+ import { Hono } from 'hono';
7
+ import type { Context } from 'hono';
8
+
9
+ import type { Cursor, TenantId, TriggerId } from '@kindgi/types';
10
+
11
+ import { statusFor, toWireError } from '../errors.js';
12
+ import type {
13
+ RegisterWebhookTriggerInput,
14
+ TriggerRegistryBinding,
15
+ UpdateWebhookTriggerInput,
16
+ WebhookTriggerRecord,
17
+ } from '../trigger-binding.js';
18
+ import type { AppEnv } from '../types.js';
19
+ import { clampLimit } from './pagination.js';
20
+
21
+ /**
22
+ * Webhook triggers — fire a flow run when an HMAC-signed request
23
+ * arrives at the receiver URL.
24
+ *
25
+ * Seven admin routes on this file. The unauthenticated external
26
+ * receiver is not part of this router.
27
+ *
28
+ * Admin URLs use `:triggerId` (the row id) for consistency with
29
+ * schedules and event-triggers. Response bodies include `webhookId`
30
+ * (the routable identifier) so clients can compose the receiver URL.
31
+ *
32
+ * HMAC secrets — never plaintext on this row. The register body
33
+ * carries `hmacSecretName`, a handle into the tenant secrets store the
34
+ * caller wrote to first via `POST /v1/secrets`. Rotation flows through
35
+ * `POST /v1/secrets/:name/rotate` — trigger row untouched.
36
+ */
37
+ export function webhooksRouter(binding: TriggerRegistryBinding): Hono<AppEnv> {
38
+ const r = new Hono<AppEnv>();
39
+
40
+ // ---------- POST / (register) ----------
41
+ r.post('/', async (c) => {
42
+ const requestId = c.get('requestId');
43
+ const tenantId = c.get('tenantId') as TenantId;
44
+
45
+ const parsed = await parseJsonObject(c, requestId);
46
+ if (parsed.kind === 'err') return parsed.response;
47
+ const body = parsed.value;
48
+
49
+ const flowId = requireString(body, 'flowId');
50
+ const flowVersion = requireString(body, 'flowVersion');
51
+ const hmacSecretName = requireString(body, 'hmacSecretName');
52
+ if (flowId.kind === 'err') return bad(c, requestId, flowId.message);
53
+ if (flowVersion.kind === 'err') return bad(c, requestId, flowVersion.message);
54
+ if (hmacSecretName.kind === 'err') return bad(c, requestId, hmacSecretName.message);
55
+
56
+ const rawConfig = (body.config ?? {}) as Record<string, unknown>;
57
+ // Route mints the webhookId — a random UUID, returned so the caller
58
+ // learns the receiver URL from the response.
59
+ const webhookId = randomUUID();
60
+
61
+ const registerInput: RegisterWebhookTriggerInput = {
62
+ kind: 'webhook',
63
+ tenantId,
64
+ flowId: flowId.value,
65
+ flowVersion: flowVersion.value,
66
+ config: {
67
+ ...('input' in rawConfig && { input: rawConfig.input }),
68
+ },
69
+ webhookId,
70
+ hmacSecretName: hmacSecretName.value,
71
+ ...(typeof body.label === 'string' && body.label.length > 0 && { label: body.label }),
72
+ };
73
+
74
+ const result = await binding.register(registerInput);
75
+ if (result.kind === 'err') {
76
+ c.status(statusFor(result.error.code) as never);
77
+ return c.json(
78
+ toWireError({ code: result.error.code, message: result.error.message }, requestId),
79
+ );
80
+ }
81
+ c.status(201);
82
+ return c.json(serializeWebhook(result.value as WebhookTriggerRecord));
83
+ });
84
+
85
+ // ---------- GET / (list) ----------
86
+ r.get('/', async (c) => {
87
+ const tenantId = c.get('tenantId') as TenantId;
88
+ const limit = clampLimit(c.req.query('limit'));
89
+ const cursorRaw = c.req.query('cursor');
90
+ const statusRaw = c.req.query('status');
91
+
92
+ let statusFilter: 'active' | 'paused' | undefined;
93
+ if (statusRaw === 'active' || statusRaw === 'paused') statusFilter = statusRaw;
94
+
95
+ const page = await binding.list({
96
+ tenantId,
97
+ kind: 'webhook',
98
+ limit,
99
+ ...(cursorRaw !== undefined && cursorRaw.length > 0 && { cursor: cursorRaw as Cursor }),
100
+ ...(statusFilter !== undefined && { status: statusFilter }),
101
+ });
102
+ return c.json({
103
+ data: page.data.map((row) => serializeWebhook(row as WebhookTriggerRecord)),
104
+ hasMore: page.nextCursor !== undefined,
105
+ ...(page.nextCursor !== undefined && { nextCursor: page.nextCursor as unknown as string }),
106
+ });
107
+ });
108
+
109
+ // ---------- GET /:triggerId (get) ----------
110
+ r.get('/:triggerId', async (c) => {
111
+ const requestId = c.get('requestId');
112
+ const tenantId = c.get('tenantId') as TenantId;
113
+ const triggerId = c.req.param('triggerId') as TriggerId;
114
+
115
+ const rec = await binding.get({ tenantId, triggerId });
116
+ if (rec === null || rec.kind !== 'webhook') return notFound(c, requestId, triggerId);
117
+ return c.json(serializeWebhook(rec));
118
+ });
119
+
120
+ // ---------- PATCH /:triggerId (update) ----------
121
+ r.patch('/:triggerId', async (c) => {
122
+ const requestId = c.get('requestId');
123
+ const tenantId = c.get('tenantId') as TenantId;
124
+ const triggerId = c.req.param('triggerId') as TriggerId;
125
+
126
+ const parsed = await parseJsonObject(c, requestId);
127
+ if (parsed.kind === 'err') return parsed.response;
128
+ const body = parsed.value;
129
+
130
+ const patchConfig = body.config as Record<string, unknown> | undefined;
131
+ const cfg: Partial<{ input: unknown }> = {};
132
+ if (patchConfig !== undefined && 'input' in patchConfig) cfg.input = patchConfig.input;
133
+
134
+ const updateInput: UpdateWebhookTriggerInput = {
135
+ kind: 'webhook',
136
+ tenantId,
137
+ triggerId,
138
+ ...(Object.keys(cfg).length > 0 && { config: cfg }),
139
+ ...('label' in body && { label: body.label === null ? null : (body.label as string) }),
140
+ ...(typeof body.flowVersion === 'string' && { flowVersion: body.flowVersion }),
141
+ };
142
+
143
+ const result = await binding.update(updateInput);
144
+ if (result.kind === 'err') {
145
+ c.status(statusFor(result.error.code) as never);
146
+ return c.json(
147
+ toWireError(
148
+ {
149
+ code: result.error.code,
150
+ message: result.error.message,
151
+ triggerId: triggerId as unknown as string,
152
+ },
153
+ requestId,
154
+ ),
155
+ );
156
+ }
157
+ return c.json(serializeWebhook(result.value as WebhookTriggerRecord));
158
+ });
159
+
160
+ // ---------- POST /:triggerId/pause ----------
161
+ r.post('/:triggerId/pause', async (c) => {
162
+ const requestId = c.get('requestId');
163
+ const tenantId = c.get('tenantId') as TenantId;
164
+ const triggerId = c.req.param('triggerId') as TriggerId;
165
+ const result = await binding.pause({ tenantId, triggerId });
166
+ if (result.kind === 'err') return lifecycleError(c, requestId, result.error, triggerId);
167
+ return c.json(serializeWebhook(result.value as WebhookTriggerRecord));
168
+ });
169
+
170
+ // ---------- POST /:triggerId/resume ----------
171
+ r.post('/:triggerId/resume', async (c) => {
172
+ const requestId = c.get('requestId');
173
+ const tenantId = c.get('tenantId') as TenantId;
174
+ const triggerId = c.req.param('triggerId') as TriggerId;
175
+ const result = await binding.resume({ tenantId, triggerId });
176
+ if (result.kind === 'err') return lifecycleError(c, requestId, result.error, triggerId);
177
+ return c.json(serializeWebhook(result.value as WebhookTriggerRecord));
178
+ });
179
+
180
+ // ---------- POST /:triggerId/unregister (soft delete) ----------
181
+ r.post('/:triggerId/unregister', async (c) => {
182
+ const tenantId = c.get('tenantId') as TenantId;
183
+ const triggerId = c.req.param('triggerId') as TriggerId;
184
+ const outcome = await binding.unregister({ tenantId, triggerId });
185
+ return c.json({
186
+ triggerId: triggerId as unknown as string,
187
+ unregistered: outcome.unregistered,
188
+ });
189
+ });
190
+
191
+ return r;
192
+ }
193
+
194
+ function serializeWebhook(r: WebhookTriggerRecord): Record<string, unknown> {
195
+ return {
196
+ triggerId: r.triggerId as unknown as string,
197
+ webhookId: r.webhookId,
198
+ flowId: r.flowId,
199
+ flowVersion: r.flowVersion,
200
+ ...(r.config.input !== undefined && { input: r.config.input }),
201
+ hmacSecretName: r.hmacSecretName,
202
+ label: r.label,
203
+ status: r.status,
204
+ lastFiredAt: r.lastFiredAt,
205
+ createdAt: r.createdAt,
206
+ updatedAt: r.updatedAt,
207
+ };
208
+ }
209
+
210
+ type ParseOk<T> = { readonly kind: 'ok'; readonly value: T };
211
+ type ParseErr = { readonly kind: 'err'; readonly response: Response };
212
+
213
+ async function parseJsonObject(
214
+ c: Context<AppEnv>,
215
+ requestId: string,
216
+ ): Promise<ParseOk<Record<string, unknown>> | ParseErr> {
217
+ let body: unknown;
218
+ try {
219
+ body = await c.req.json();
220
+ } catch {
221
+ c.status(statusFor('bad-input') as never);
222
+ return {
223
+ kind: 'err',
224
+ response: c.json(
225
+ toWireError({ code: 'bad-input', message: 'Request body must be valid JSON' }, requestId),
226
+ ),
227
+ };
228
+ }
229
+ if (body === null || typeof body !== 'object' || Array.isArray(body)) {
230
+ c.status(statusFor('bad-input') as never);
231
+ return {
232
+ kind: 'err',
233
+ response: c.json(
234
+ toWireError(
235
+ { code: 'bad-input', message: 'Request body must be a JSON object' },
236
+ requestId,
237
+ ),
238
+ ),
239
+ };
240
+ }
241
+ return { kind: 'ok', value: body as Record<string, unknown> };
242
+ }
243
+
244
+ function requireString(
245
+ obj: unknown,
246
+ path: string,
247
+ ):
248
+ | { readonly kind: 'ok'; readonly value: string }
249
+ | { readonly kind: 'err'; readonly message: string } {
250
+ const parts = path.split('.');
251
+ let cur: unknown = obj;
252
+ for (const part of parts) {
253
+ if (cur === null || typeof cur !== 'object') {
254
+ return { kind: 'err', message: `\`${path}\` is required` };
255
+ }
256
+ cur = (cur as Record<string, unknown>)[part];
257
+ }
258
+ if (typeof cur !== 'string' || cur.length === 0) {
259
+ return { kind: 'err', message: `\`${path}\` is required` };
260
+ }
261
+ return { kind: 'ok', value: cur };
262
+ }
263
+
264
+ function bad(c: Context<AppEnv>, requestId: string, message: string): Response {
265
+ c.status(statusFor('bad-input') as never);
266
+ return c.json(toWireError({ code: 'bad-input', message }, requestId));
267
+ }
268
+
269
+ function notFound(c: Context<AppEnv>, requestId: string, triggerId: TriggerId): Response {
270
+ c.status(statusFor('trigger-not-found') as never);
271
+ return c.json(
272
+ toWireError(
273
+ {
274
+ code: 'trigger-not-found',
275
+ message: `No trigger with id "${triggerId as unknown as string}"`,
276
+ triggerId: triggerId as unknown as string,
277
+ },
278
+ requestId,
279
+ ),
280
+ );
281
+ }
282
+
283
+ function lifecycleError(
284
+ c: Context<AppEnv>,
285
+ requestId: string,
286
+ error: { readonly code: string; readonly message: string },
287
+ triggerId: TriggerId,
288
+ ): Response {
289
+ c.status(statusFor(error.code) as never);
290
+ return c.json(
291
+ toWireError(
292
+ { code: error.code, message: error.message, triggerId: triggerId as unknown as string },
293
+ requestId,
294
+ ),
295
+ );
296
+ }
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import type { TenantId } from '@kindgi/types';
5
+
6
+ /**
7
+ * Caller-plugged surface for AWS-style credentials that authenticate
8
+ * against the S3-compat `/s3/*` wire surface. Mirrors the
9
+ * `TokenResolver` shape (auth.ts): resolve an `accessKeyId` to a
10
+ * `S3Credential`, or `null` for missing / expired / revoked.
11
+ *
12
+ * Every deployment owns credential issuance out-of-band (an admin
13
+ * route or an operator console). This binding only resolves; it
14
+ * does not mint. Deployments typically issue credentials paired 1-to-1
15
+ * with a bucket + tenant.
16
+ *
17
+ * The SigV4 middleware calls `resolve(accessKeyId)` on every request,
18
+ * uses `secretKey` to recompute the expected signature, and if the
19
+ * comparison passes, sets `c.set('tenantId', credential.tenantId)` +
20
+ * `c.set('bucket', credential.bucket)` for downstream routes. The
21
+ * caller-supplied bucket in the URL is compared to `credential.bucket`
22
+ * — mismatch → `403 AccessDenied` (bucket-scoped credentials).
23
+ *
24
+ * ## Scope classification
25
+ *
26
+ * S3 credentials are a policy/config-scoped resource. This binding
27
+ * does not carry the uniform `{ scope?: Scope, inherit?: boolean }`
28
+ * filter fields because it exposes only a runtime-bound
29
+ * `resolve(accessKeyId)` entry-point — no `list()` / `*ListInput` /
30
+ * filter surface. The Scope discipline still applies to stored
31
+ * credentials (each carries a tenant / org / project scope, like MCP
32
+ * endpoints), and a `list()` method — if added for an admin plane —
33
+ * must gain the same `{ scope?: Scope, inherit?: boolean }` shape
34
+ * (policy/config semantics: `inherit` load-bearing). There is no admin
35
+ * list surface.
36
+ */
37
+ export type S3CredentialBinding = {
38
+ resolve(accessKeyId: string): Promise<S3Credential | null>;
39
+ };
40
+
41
+ export interface S3Credential {
42
+ /** Long-form secret paired with `accessKeyId`; used to recompute SigV4. */
43
+ readonly secretKey: string;
44
+ /** Which tenant this credential belongs to. */
45
+ readonly tenantId: TenantId;
46
+ /**
47
+ * Which bucket this credential is authorized for. One bucket per
48
+ * credential. Requests for other buckets return `403 AccessDenied`.
49
+ * The `artifacts` bucket is where bespoke uploads conventionally land
50
+ * — credentials granted this bucket see bespoke uploads too.
51
+ */
52
+ readonly bucket: string;
53
+ /**
54
+ * Optional expiration. If set and past, the middleware treats the
55
+ * credential as expired even if this resolver returned it.
56
+ */
57
+ readonly expiresAt?: Date;
58
+ }
@@ -0,0 +1,308 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import type { TupleEnqueueHook } from '@kindgi/authz';
5
+ import type { Scope } from '@kindgi/platform';
6
+ import type { Cursor, EnvName, Result } from '@kindgi/types';
7
+
8
+ /**
9
+ * Secret names starting with this prefix are reserved for framework-internal
10
+ * material (e.g. webhook HMAC keys the runtime manages). `SecretBinding.set` rejects them
11
+ * from callers unless the adapter was constructed to allow reserved names.
12
+ * Every adapter enforces the same prefix — import it, don't redefine it.
13
+ */
14
+ export const RESERVED_SECRET_NAME_PREFIX = 'kindgi.';
15
+
16
+ /**
17
+ * Caller-plugged secret store — the framework consumer's surface for
18
+ * every secret-lifecycle op. Every method is scope + env-scoped, where
19
+ * `scope` is the discriminated primitive from `@kindgi/platform`
20
+ * (Tenant / Org / Project). Writes declare the scope explicitly; reads
21
+ * resolve via most-specific-wins walk across the scope hierarchy.
22
+ *
23
+ * Callers (routes, runtime dispatch, SDK clients) speak this interface
24
+ * ONLY. Concrete storage — envelope-encrypted bytes in a database,
25
+ * delegation to an external secret manager, etc. — is a `SecretBinding`
26
+ * implementation choice.
27
+ *
28
+ * Wire-safety: plaintext is returned only by `resolve`. `SecretRecord`
29
+ * carries no value, and `SecretVersionRecord.value` is always `null`
30
+ * from `getVersion` / `listVersions`. All list / get paths return
31
+ * metadata only. This is a STRUCTURAL guardrail of the interface, not
32
+ * a caller convention.
33
+ *
34
+ * Env-safety: cross-env reads are refused. A caller in `envName:
35
+ * staging` cannot resolve a secret written under `envName: production`
36
+ * — adapter returns `secret-not-found` (indistinguishable from
37
+ * "doesn't exist" by design; refuses to leak the existence of a
38
+ * cross-env sibling).
39
+ */
40
+ export interface SecretBinding {
41
+ // -------------------- read --------------------
42
+
43
+ /** Cursor-paginated list of secret metadata. Never returns `value`. */
44
+ list(input: SecretListInput): Promise<SecretListPage>;
45
+
46
+ /** Fetch metadata for a single secret. `null` when unknown. */
47
+ get(input: SecretGetInput): Promise<SecretRecord | null>;
48
+
49
+ /**
50
+ * Resolve a secret's plaintext value at dispatch time. Distinct
51
+ * method from `get` — different capability gate, different audit
52
+ * event, different rate profile. Called by the runtime (handler
53
+ * dispatch, deploy-time sync, boot — see `ResolveContext.caller`),
54
+ * not by the HTTP routes. Emits a `secret-resolved` compliance-evidence
55
+ * event on every call.
56
+ */
57
+ resolve(input: SecretResolveInput): Promise<Result<SecretResolveOutcome, SecretError>>;
58
+
59
+ /** Metadata for a specific version. */
60
+ getVersion(input: SecretGetVersionInput): Promise<SecretVersionRecord | null>;
61
+
62
+ /** List all versions for a secret. Metadata only. */
63
+ listVersions(input: SecretListVersionsInput): Promise<SecretVersionPage>;
64
+
65
+ // -------------------- write --------------------
66
+
67
+ /**
68
+ * Create a secret OR write a new version. `writeMode` discriminates:
69
+ * - `'create-new'` fails with `already-exists` if the secret exists
70
+ * - `'add-version'` writes a new version, bumps counter atomically
71
+ */
72
+ set(input: SecretSetInput): Promise<SecretSetOutcome>;
73
+
74
+ /**
75
+ * Explicit rotation. Adapters that support caller-driven rotation
76
+ * accept `newValue`; provider-driven rotation (a secret manager's own
77
+ * rotation workflow) ignores it and returns the new version once the
78
+ * provider workflow completes. Emits a `secret-rotated` event.
79
+ */
80
+ rotate(input: SecretRotateInput): Promise<Result<SecretRotateOutcome, SecretError>>;
81
+
82
+ /**
83
+ * Revoke a secret. Retains the record (soft-delete) so audit trails
84
+ * remain resolvable; adapters MUST return `null` from `get` /
85
+ * `resolve` for revoked secrets. `hard: true` performs irreversible
86
+ * destroy for GDPR right-to-erasure. Emits a `secret-revoked` event.
87
+ */
88
+ revoke(input: SecretRevokeInput): Promise<Result<SecretRevokeOutcome, SecretError>>;
89
+ }
90
+
91
+ // -------------------- record types --------------------
92
+
93
+ export interface SecretRecord {
94
+ readonly scope: Scope;
95
+ readonly envName: EnvName;
96
+ readonly name: string;
97
+ readonly currentVersion: number;
98
+ readonly createdAt: string;
99
+ readonly updatedAt: string;
100
+ readonly revokedAt?: string;
101
+ readonly revokeReason?: string;
102
+ readonly tags?: Readonly<Record<string, string>>;
103
+ readonly rotationDueAt?: string;
104
+ }
105
+
106
+ export interface SecretVersionRecord {
107
+ readonly scope: Scope;
108
+ readonly envName: EnvName;
109
+ readonly name: string;
110
+ readonly versionId: number;
111
+ readonly createdAt: string;
112
+ /**
113
+ * Always `null` from `getVersion` / `listVersions`; plaintext comes only
114
+ * from `resolve` (`SecretResolveOutcome.value`).
115
+ */
116
+ readonly value: string | null;
117
+ readonly revokedAt?: string;
118
+ }
119
+
120
+ // -------------------- inputs --------------------
121
+
122
+ export interface SecretListInput {
123
+ readonly scope: Scope;
124
+ readonly envName: EnvName;
125
+ readonly limit: number;
126
+ readonly cursor?: Cursor;
127
+ readonly namePrefix?: string;
128
+ readonly tagFilter?: Readonly<Record<string, string>>;
129
+ readonly includeRevoked?: boolean;
130
+ }
131
+
132
+ export interface SecretListPage {
133
+ readonly data: readonly SecretRecord[];
134
+ readonly nextCursor?: Cursor;
135
+ }
136
+
137
+ export interface SecretGetInput {
138
+ readonly scope: Scope;
139
+ readonly envName: EnvName;
140
+ readonly name: string;
141
+ }
142
+
143
+ export interface SecretResolveInput {
144
+ readonly scope: Scope;
145
+ readonly envName: EnvName;
146
+ readonly name: string;
147
+ readonly version?: number;
148
+ readonly resolveContext: ResolveContext;
149
+ }
150
+
151
+ /**
152
+ * Uniform across `EnvBinding.resolve` + `SecretBinding.resolve`.
153
+ * Names the caller of the resolution for audit-emit attribution.
154
+ *
155
+ * Declared here (rather than in a separate module) because the
156
+ * `SecretBinding` interface is the larger of the two — env-binding.ts
157
+ * imports the type back from this module to keep the ownership flow
158
+ * one-directional (env → secrets, not both).
159
+ */
160
+ export interface ResolveContext {
161
+ readonly runId?: string;
162
+ readonly deploymentId?: string;
163
+ readonly nodeId?: string;
164
+ readonly caller: 'dispatch' | 'deploy-sync' | 'admin-cli' | 'boot-bridge';
165
+ }
166
+
167
+ export interface SecretResolveOutcome {
168
+ readonly name: string;
169
+ readonly versionId: number;
170
+ readonly value: string;
171
+ }
172
+
173
+ export interface SecretGetVersionInput {
174
+ readonly scope: Scope;
175
+ readonly envName: EnvName;
176
+ readonly name: string;
177
+ readonly versionId: number;
178
+ }
179
+
180
+ export interface SecretListVersionsInput {
181
+ readonly scope: Scope;
182
+ readonly envName: EnvName;
183
+ readonly name: string;
184
+ readonly limit: number;
185
+ readonly cursor?: Cursor;
186
+ }
187
+
188
+ export interface SecretVersionPage {
189
+ readonly data: readonly SecretVersionRecord[];
190
+ readonly nextCursor?: Cursor;
191
+ }
192
+
193
+ export interface SecretSetInput {
194
+ readonly scope: Scope;
195
+ readonly envName: EnvName;
196
+ readonly name: string;
197
+ readonly value: string;
198
+ readonly writeMode: 'create-new' | 'add-version';
199
+ readonly tags?: Readonly<Record<string, string>>;
200
+ readonly rotationDueAt?: string;
201
+ readonly ifVersion?: number;
202
+ /**
203
+ * REQUIRED. Called inside the binding's write tx on FRESH insert
204
+ * (writeMode: 'create-new' → new secret identity). Receives the new
205
+ * secret's id as the FGA subject id. Returns tuples for
206
+ * the same tx — typically `tuplesForCreate({kind:'secret', id,
207
+ * tenantId, scope}, creatorUserId?)`. Not invoked on `add-version`
208
+ * (identity already exists in FGA). See `AgentPublishInput.enqueueTuples`
209
+ * for the design rationale.
210
+ */
211
+ readonly enqueueTuples: TupleEnqueueHook;
212
+ }
213
+
214
+ export type SecretSetOutcome =
215
+ | { readonly kind: 'ok'; readonly record: SecretRecord; readonly versionId: number }
216
+ | { readonly kind: 'already-exists'; readonly record: SecretRecord }
217
+ | { readonly kind: 'version-conflict'; readonly currentVersion: number }
218
+ | { readonly kind: 'error'; readonly code: string; readonly message: string };
219
+
220
+ export interface SecretRotateInput {
221
+ readonly scope: Scope;
222
+ readonly envName: EnvName;
223
+ readonly name: string;
224
+ readonly newValue?: string;
225
+ readonly revokeOldAfterMs?: number;
226
+ }
227
+
228
+ /**
229
+ * Discriminated `SecretRotateOutcome`.
230
+ *
231
+ * Sync providers (stores that write the new version immediately)
232
+ * return `{ kind: 'ok', newVersionId, oldVersionId, oldVersionRevokedAt? }`
233
+ * inline. The `/v1/secrets` HTTP route translates this to a 201
234
+ * response.
235
+ *
236
+ * Async providers (a secret manager whose rotation workflow completes
237
+ * later) return `{ kind: 'rotation-pending', resumeToken, provider }`.
238
+ * The HTTP route mints a `rotationId`, records it in the caller-plugged
239
+ * `RotationStatusStore`, and returns 202 with `{ rotationId, statusUrl,
240
+ * eventsUrl }`. `resumeToken` is the provider-native handle a
241
+ * background process uses to poll the async workflow to terminal.
242
+ */
243
+ export type SecretRotateOutcome =
244
+ | {
245
+ readonly kind: 'ok';
246
+ readonly newVersionId: number;
247
+ readonly oldVersionId: number;
248
+ readonly oldVersionRevokedAt?: string;
249
+ }
250
+ | {
251
+ readonly kind: 'rotation-pending';
252
+ readonly resumeToken: string;
253
+ readonly provider: string;
254
+ };
255
+
256
+ export interface SecretRevokeInput {
257
+ readonly scope: Scope;
258
+ readonly envName: EnvName;
259
+ readonly name: string;
260
+ readonly hard?: boolean;
261
+ readonly reason?: string;
262
+ }
263
+
264
+ export interface SecretRevokeOutcome {
265
+ readonly revoked: boolean;
266
+ readonly hard: boolean;
267
+ }
268
+
269
+ export type SecretError =
270
+ | { readonly code: 'secret-not-found'; readonly message: string; readonly name: string }
271
+ | { readonly code: 'secret-revoked'; readonly message: string; readonly name: string }
272
+ | {
273
+ readonly code: 'secret-version-not-found';
274
+ readonly message: string;
275
+ readonly name: string;
276
+ readonly versionId: number;
277
+ }
278
+ | {
279
+ readonly code: 'secret-encryption-failed';
280
+ readonly message: string;
281
+ readonly cause?: unknown;
282
+ }
283
+ | {
284
+ readonly code: 'secret-decryption-failed';
285
+ readonly message: string;
286
+ readonly cause?: unknown;
287
+ }
288
+ | {
289
+ readonly code: 'secret-provider-unavailable';
290
+ readonly message: string;
291
+ readonly cause?: unknown;
292
+ }
293
+ | {
294
+ readonly code: 'secret-provider-unauthorized';
295
+ readonly message: string;
296
+ readonly cause?: unknown;
297
+ }
298
+ | {
299
+ readonly code: 'secret-provider-rate-limited';
300
+ readonly message: string;
301
+ readonly retryAfterMs?: number;
302
+ }
303
+ | {
304
+ readonly code: 'secret-write-conflict';
305
+ readonly message: string;
306
+ readonly currentVersion: number;
307
+ }
308
+ | { readonly code: 'secret-store-error'; readonly message: string; readonly cause?: unknown };