@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,286 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * AWS Signature Version 4 verification for the `/s3/*` surface — pure
5
+ * functions, no HTTP framework.
6
+ *
7
+ * Verification re-derives the signature from exactly what the client
8
+ * signed:
9
+ *
10
+ * - the timestamp the client signed with (`x-amz-date` header, or the
11
+ * `X-Amz-Date` query parameter of a presigned URL) — never the
12
+ * server's clock. The server's clock only bounds it: requests more
13
+ * than {@link MAX_CLOCK_SKEW_SECONDS} away are rejected
14
+ * (`RequestTimeTooSkewed`), presigned URLs past `X-Amz-Expires` are
15
+ * rejected (`AccessDenied`);
16
+ * - only the headers the client listed in `SignedHeaders`. Anything a
17
+ * proxy or HTTP stack adds after signing is ignored;
18
+ * - the canonical URI / query exactly as S3 defines them (path
19
+ * segments not normalized; query keys sorted, first value only).
20
+ *
21
+ * The signature comparison is constant-time.
22
+ */
23
+ import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
24
+ /** S3's allowed clock skew for signed requests (15 minutes). */
25
+ export const MAX_CLOCK_SKEW_SECONDS = 15 * 60;
26
+ /** S3's maximum presigned-URL lifetime (7 days). */
27
+ export const MAX_PRESIGN_EXPIRES_SECONDS = 7 * 24 * 60 * 60;
28
+ const ALGORITHM = 'AWS4-HMAC-SHA256';
29
+ const AMZ_DATE = /^(\d{8})T\d{6}Z$/;
30
+ const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD';
31
+ function err(code, message, status) {
32
+ return { kind: 'err', error: { code, message, status } };
33
+ }
34
+ /**
35
+ * Parse the signature claim from the `Authorization` header or the
36
+ * presigned-URL query parameters. Does not verify anything.
37
+ */
38
+ export function parseSigV4(request) {
39
+ const query = request.url.searchParams;
40
+ const presignedAlgorithm = query.get('X-Amz-Algorithm');
41
+ if (presignedAlgorithm !== null) {
42
+ if (presignedAlgorithm !== ALGORITHM) {
43
+ return err('InvalidRequest', `Unsupported presign algorithm "${presignedAlgorithm}"`, 403);
44
+ }
45
+ const credential = query.get('X-Amz-Credential');
46
+ const signature = query.get('X-Amz-Signature');
47
+ const amzDate = query.get('X-Amz-Date');
48
+ const signedHeaders = query.get('X-Amz-SignedHeaders');
49
+ const expires = query.get('X-Amz-Expires');
50
+ if (credential === null || signature === null || amzDate === null || signedHeaders === null) {
51
+ return err('AuthorizationQueryParametersError', 'Presigned URL must carry X-Amz-Credential, X-Amz-Date, X-Amz-SignedHeaders and X-Amz-Signature', 400);
52
+ }
53
+ const scope = parseCredentialScope(credential);
54
+ if (scope === null)
55
+ return err('InvalidRequest', 'Malformed X-Amz-Credential', 403);
56
+ const expiresSeconds = expires === null ? MAX_PRESIGN_EXPIRES_SECONDS : Number(expires);
57
+ if (!Number.isInteger(expiresSeconds) ||
58
+ expiresSeconds < 1 ||
59
+ expiresSeconds > MAX_PRESIGN_EXPIRES_SECONDS) {
60
+ return err('AuthorizationQueryParametersError', `X-Amz-Expires must be an integer between 1 and ${MAX_PRESIGN_EXPIRES_SECONDS}`, 400);
61
+ }
62
+ return {
63
+ kind: 'ok',
64
+ value: {
65
+ kind: 'presigned',
66
+ ...scope,
67
+ signedHeaders: signedHeaders.split(';'),
68
+ signature,
69
+ amzDate,
70
+ expiresSeconds,
71
+ },
72
+ };
73
+ }
74
+ const authorization = request.headers.get('authorization') ?? '';
75
+ if (authorization.length === 0)
76
+ return err('AccessDenied', 'Missing Authorization header', 403);
77
+ const match = /^AWS4-HMAC-SHA256\s+(.+)$/i.exec(authorization);
78
+ if (match === null) {
79
+ return err('InvalidRequest', 'Only AWS4-HMAC-SHA256 signatures are supported', 403);
80
+ }
81
+ const fields = new Map();
82
+ for (const part of match[1].split(',')) {
83
+ const eq = part.indexOf('=');
84
+ if (eq > 0)
85
+ fields.set(part.slice(0, eq).trim(), part.slice(eq + 1).trim());
86
+ }
87
+ const credential = fields.get('Credential');
88
+ const signedHeaders = fields.get('SignedHeaders');
89
+ const signature = fields.get('Signature');
90
+ if (credential === undefined || signedHeaders === undefined || signature === undefined) {
91
+ return err('InvalidRequest', 'Malformed Authorization header (needs Credential, SignedHeaders, Signature)', 403);
92
+ }
93
+ const scope = parseCredentialScope(credential);
94
+ if (scope === null)
95
+ return err('InvalidRequest', 'Malformed credential scope', 403);
96
+ const amzDate = request.headers.get('x-amz-date');
97
+ if (amzDate === null) {
98
+ return err('AccessDenied', 'Signed requests must carry an x-amz-date header', 403);
99
+ }
100
+ return {
101
+ kind: 'ok',
102
+ value: {
103
+ kind: 'header',
104
+ ...scope,
105
+ signedHeaders: signedHeaders.split(';'),
106
+ signature,
107
+ amzDate,
108
+ },
109
+ };
110
+ }
111
+ /**
112
+ * Check the claim's timestamp and shape against the server clock:
113
+ * `X-Amz-Date` well-formed and consistent with the credential scope,
114
+ * within {@link MAX_CLOCK_SKEW_SECONDS} (header auth / presigned not
115
+ * dated in the future), and — presigned — not expired. Also checks the
116
+ * signed-header list is sorted, lowercase, and covers what must be
117
+ * signed.
118
+ */
119
+ export function checkSigV4Claim(claim, now) {
120
+ const dateMatch = AMZ_DATE.exec(claim.amzDate);
121
+ if (dateMatch === null) {
122
+ return err('AccessDenied', 'X-Amz-Date must be formatted as YYYYMMDDTHHMMSSZ', 403);
123
+ }
124
+ if (dateMatch[1] !== claim.scopeDate) {
125
+ return err('SignatureDoesNotMatch', 'The credential scope date does not match X-Amz-Date', 403);
126
+ }
127
+ const signedAt = parseAmzDate(claim.amzDate);
128
+ const skewSeconds = (now.getTime() - signedAt.getTime()) / 1000;
129
+ if (skewSeconds < -MAX_CLOCK_SKEW_SECONDS) {
130
+ return err('RequestTimeTooSkewed', "The difference between the request time and the server's time is too large.", 403);
131
+ }
132
+ if (claim.kind === 'header' && skewSeconds > MAX_CLOCK_SKEW_SECONDS) {
133
+ return err('RequestTimeTooSkewed', "The difference between the request time and the server's time is too large.", 403);
134
+ }
135
+ if (claim.kind === 'presigned' && skewSeconds > (claim.expiresSeconds ?? 0)) {
136
+ return err('AccessDenied', 'Request has expired', 403);
137
+ }
138
+ const sorted = [...claim.signedHeaders].sort();
139
+ if (claim.signedHeaders.some((h, i) => h !== h.toLowerCase() || h !== sorted[i] || h === '') ||
140
+ new Set(claim.signedHeaders).size !== claim.signedHeaders.length) {
141
+ return err('InvalidRequest', 'SignedHeaders must be lowercase, sorted and unique', 403);
142
+ }
143
+ const required = claim.kind === 'header' ? ['host', 'x-amz-content-sha256', 'x-amz-date'] : ['host'];
144
+ const missing = required.filter((h) => !claim.signedHeaders.includes(h));
145
+ if (missing.length > 0) {
146
+ return err('AccessDenied', `SignedHeaders must include: ${missing.join(', ')}`, 403);
147
+ }
148
+ return { kind: 'ok', value: undefined };
149
+ }
150
+ /**
151
+ * Re-derive the signature from exactly what the client signed and compare
152
+ * it (constant-time) with the claimed one. `payloadHash` is the header
153
+ * `x-amz-content-sha256` for header auth (the caller verifies it against
154
+ * the body); presigned requests always sign `UNSIGNED-PAYLOAD`.
155
+ */
156
+ export function verifySigV4Signature(request, claim, secretKey) {
157
+ const canonical = canonicalRequest(request, claim);
158
+ if (canonical.kind === 'err')
159
+ return canonical;
160
+ const scope = `${claim.scopeDate}/${claim.region}/${claim.service}/aws4_request`;
161
+ const stringToSign = [ALGORITHM, claim.amzDate, scope, sha256Hex(canonical.value)].join('\n');
162
+ const kDate = hmac(`AWS4${secretKey}`, claim.scopeDate);
163
+ const kRegion = hmac(kDate, claim.region);
164
+ const kService = hmac(kRegion, claim.service);
165
+ const kSigning = hmac(kService, 'aws4_request');
166
+ const expected = createHmac('sha256', kSigning).update(stringToSign, 'utf8').digest('hex');
167
+ if (!constantTimeEqual(expected, claim.signature.toLowerCase())) {
168
+ return err('SignatureDoesNotMatch', 'The request signature we calculated does not match the signature you provided.', 403);
169
+ }
170
+ return { kind: 'ok', value: undefined };
171
+ }
172
+ /** The SigV4 canonical request (exported for tests). */
173
+ export function canonicalRequest(request, claim) {
174
+ const headerLines = [];
175
+ for (const name of claim.signedHeaders) {
176
+ const value = name === 'host'
177
+ ? (request.headers.get('host') ?? request.url.host)
178
+ : request.headers.get(name);
179
+ if (value === null) {
180
+ return err('SignatureDoesNotMatch', `Signed header "${name}" is missing from the request`, 403);
181
+ }
182
+ headerLines.push(`${name}:${value.trim().replace(/\s+/g, ' ')}`);
183
+ }
184
+ const payloadHash = claim.kind === 'presigned'
185
+ ? UNSIGNED_PAYLOAD
186
+ : (request.headers.get('x-amz-content-sha256') ?? UNSIGNED_PAYLOAD);
187
+ return {
188
+ kind: 'ok',
189
+ value: [
190
+ request.method.toUpperCase(),
191
+ canonicalUri(request.url.pathname),
192
+ canonicalQuery(request.url.search, claim.kind === 'presigned'),
193
+ `${headerLines.join('\n')}\n`,
194
+ claim.signedHeaders.join(';'),
195
+ payloadHash,
196
+ ].join('\n'),
197
+ };
198
+ }
199
+ // -------------------- canonicalization (S3 rules) --------------------
200
+ /** RFC 3986 encoding: everything but unreserved characters. */
201
+ function encodeRfc3986(value) {
202
+ return encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
203
+ }
204
+ /** Decode, tolerating stray `%` that is not a valid escape. */
205
+ function safeDecode(value) {
206
+ try {
207
+ return decodeURIComponent(value);
208
+ }
209
+ catch {
210
+ return value;
211
+ }
212
+ }
213
+ /**
214
+ * S3 canonical URI: each path segment decoded, then RFC 3986-encoded;
215
+ * segments are not normalized (`.` / `..` / `//` are significant for S3
216
+ * keys) and an encoded slash stays a slash. `+` in the path is read as a
217
+ * space, matching the common S3 signers.
218
+ */
219
+ function canonicalUri(rawPath) {
220
+ if (rawPath === '' || rawPath === '/')
221
+ return '/';
222
+ const encoded = rawPath
223
+ .split('/')
224
+ .map((segment) => encodeRfc3986(safeDecode(segment.replace(/\+/g, ' '))))
225
+ .join('/')
226
+ .replace(/%2F/g, '/');
227
+ return encoded.startsWith('/') ? encoded : `/${encoded}`;
228
+ }
229
+ /**
230
+ * S3 canonical query: parameters decoded, re-encoded (RFC 3986), sorted
231
+ * by key; for a repeated key only its first value counts. A presigned
232
+ * URL's `X-Amz-Signature` is not part of what was signed.
233
+ */
234
+ function canonicalQuery(rawSearch, presigned) {
235
+ const search = rawSearch.startsWith('?') ? rawSearch.slice(1) : rawSearch;
236
+ if (search === '')
237
+ return '';
238
+ const first = new Map();
239
+ for (const pair of search.split('&')) {
240
+ if (pair === '')
241
+ continue;
242
+ const eq = pair.indexOf('=');
243
+ const rawKey = eq < 0 ? pair : pair.slice(0, eq);
244
+ const rawValue = eq < 0 ? '' : pair.slice(eq + 1);
245
+ const key = safeDecode(rawKey.replace(/\+/g, ' '));
246
+ if (key === '' || (presigned && key === 'X-Amz-Signature'))
247
+ continue;
248
+ const encodedKey = encodeRfc3986(key);
249
+ if (!first.has(encodedKey)) {
250
+ first.set(encodedKey, encodeRfc3986(safeDecode(rawValue.replace(/\+/g, ' '))));
251
+ }
252
+ }
253
+ return [...first.keys()]
254
+ .sort()
255
+ .map((key) => `${key}=${first.get(key)}`)
256
+ .join('&');
257
+ }
258
+ // -------------------- helpers --------------------
259
+ function parseCredentialScope(raw) {
260
+ // <accessKeyId>/<YYYYMMDD>/<region>/<service>/aws4_request
261
+ const parts = raw.split('/');
262
+ if (parts.length !== 5 || parts[4] !== 'aws4_request')
263
+ return null;
264
+ const [accessKeyId, scopeDate, region, service] = parts;
265
+ if (accessKeyId === '' || !/^\d{8}$/.test(scopeDate) || region === '' || service === '')
266
+ return null;
267
+ return { accessKeyId, scopeDate, region, service };
268
+ }
269
+ function parseAmzDate(amzDate) {
270
+ const iso = `${amzDate.slice(0, 4)}-${amzDate.slice(4, 6)}-${amzDate.slice(6, 8)}T${amzDate.slice(9, 11)}:${amzDate.slice(11, 13)}:${amzDate.slice(13, 15)}Z`;
271
+ return new Date(iso);
272
+ }
273
+ function hmac(key, data) {
274
+ return createHmac('sha256', key).update(data, 'utf8').digest();
275
+ }
276
+ function sha256Hex(data) {
277
+ return createHash('sha256').update(data, 'utf8').digest('hex');
278
+ }
279
+ export function constantTimeEqual(a, b) {
280
+ const aBuf = Buffer.from(a, 'utf8');
281
+ const bBuf = Buffer.from(b, 'utf8');
282
+ if (aBuf.length !== bBuf.length)
283
+ return false;
284
+ return timingSafeEqual(aBuf, bBuf);
285
+ }
286
+ //# sourceMappingURL=sigv4-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sigv4-verify.js","sourceRoot":"","sources":["../../src/middleware/sigv4-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { S3CredentialBinding } from '../s3-credential-binding.js';
3
+ import type { AppEnv } from '../types.js';
4
+ /**
5
+ * AWS SigV4 verification middleware for the `/s3/*` wire surface.
6
+ * Verifies both header-based auth (`Authorization: AWS4-HMAC-SHA256 ...`)
7
+ * and presigned URLs (`?X-Amz-Algorithm=...&X-Amz-Signature=...`). On
8
+ * success sets `tenantId`, `bucket` and `s3AccessKeyId` on the context for
9
+ * downstream route handlers.
10
+ *
11
+ * The signature is re-derived from exactly what the client signed — its
12
+ * own timestamp and only its `SignedHeaders` (see `./sigv4-verify.ts`);
13
+ * the server clock only bounds the timestamp (±15 minutes; presigned URLs
14
+ * until `X-Amz-Expires`). Order: parse → timestamp/scope → credential →
15
+ * payload hash → signature → bucket.
16
+ *
17
+ * ## S3-style errors
18
+ *
19
+ * Failures return S3 error XML (not JSON): `AccessDenied`,
20
+ * `InvalidAccessKeyId`, `SignatureDoesNotMatch`, `RequestTimeTooSkewed`,
21
+ * `XAmzContentSHA256Mismatch`, `AuthorizationQueryParametersError`,
22
+ * `InvalidRequest`.
23
+ */
24
+ export declare function sigv4Middleware(binding: S3CredentialBinding): MiddlewareHandler<AppEnv>;
25
+ //# sourceMappingURL=sigv4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sigv4.d.ts","sourceRoot":"","sources":["../../src/middleware/sigv4.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAS1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CA4FvF"}
@@ -0,0 +1,120 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { createHash } from 'node:crypto';
4
+ import { errorXml } from '../xml.js';
5
+ import { checkSigV4Claim, constantTimeEqual, parseSigV4, verifySigV4Signature, } from './sigv4-verify.js';
6
+ /**
7
+ * AWS SigV4 verification middleware for the `/s3/*` wire surface.
8
+ * Verifies both header-based auth (`Authorization: AWS4-HMAC-SHA256 ...`)
9
+ * and presigned URLs (`?X-Amz-Algorithm=...&X-Amz-Signature=...`). On
10
+ * success sets `tenantId`, `bucket` and `s3AccessKeyId` on the context for
11
+ * downstream route handlers.
12
+ *
13
+ * The signature is re-derived from exactly what the client signed — its
14
+ * own timestamp and only its `SignedHeaders` (see `./sigv4-verify.ts`);
15
+ * the server clock only bounds the timestamp (±15 minutes; presigned URLs
16
+ * until `X-Amz-Expires`). Order: parse → timestamp/scope → credential →
17
+ * payload hash → signature → bucket.
18
+ *
19
+ * ## S3-style errors
20
+ *
21
+ * Failures return S3 error XML (not JSON): `AccessDenied`,
22
+ * `InvalidAccessKeyId`, `SignatureDoesNotMatch`, `RequestTimeTooSkewed`,
23
+ * `XAmzContentSHA256Mismatch`, `AuthorizationQueryParametersError`,
24
+ * `InvalidRequest`.
25
+ */
26
+ export function sigv4Middleware(binding) {
27
+ return async (c, next) => {
28
+ const req = c.req.raw;
29
+ const method = req.method;
30
+ // Read body once so both hash + downstream reads can access it.
31
+ // The whole body is buffered — a limitation for large uploads; true
32
+ // streaming would need to pass the raw stream through after a
33
+ // header-only signature check.
34
+ const bodyBytes = method === 'GET' || method === 'HEAD' || method === 'DELETE'
35
+ ? Buffer.alloc(0)
36
+ : Buffer.from(await req.arrayBuffer());
37
+ const url = new URL(req.url);
38
+ const request = { method, url, headers: req.headers };
39
+ const claim = parseSigV4(request);
40
+ if (claim.kind === 'err') {
41
+ return xmlError(c, claim.error.code, claim.error.message, claim.error.status);
42
+ }
43
+ const info = claim.value;
44
+ const checked = checkSigV4Claim(info, new Date());
45
+ if (checked.kind === 'err') {
46
+ return xmlError(c, checked.error.code, checked.error.message, checked.error.status);
47
+ }
48
+ const credential = await binding.resolve(info.accessKeyId);
49
+ if (credential === null) {
50
+ return xmlError(c, 'InvalidAccessKeyId', `The AWS Access Key Id you provided does not exist: ${info.accessKeyId}`, 403);
51
+ }
52
+ if (credential.expiresAt !== undefined && credential.expiresAt.getTime() < Date.now()) {
53
+ return xmlError(c, 'AccessDenied', 'Credential has expired', 403);
54
+ }
55
+ // ------------ payload hash verification ------------
56
+ // Header auth signs `x-amz-content-sha256`. Cross-check it against
57
+ // the actual body bytes, or an attacker could swap the body after
58
+ // signing and the signature would still verify. (Presigned URLs sign
59
+ // `UNSIGNED-PAYLOAD` by design.)
60
+ if (info.kind === 'header' && bodyBytes.length > 0) {
61
+ const declared = c.req.header('x-amz-content-sha256') ?? '';
62
+ if (declared !== 'UNSIGNED-PAYLOAD' && declared.length > 0) {
63
+ const actual = createHash('sha256').update(bodyBytes).digest('hex');
64
+ if (!constantTimeEqual(actual, declared)) {
65
+ return xmlError(c, 'XAmzContentSHA256Mismatch', 'The provided x-amz-content-sha256 header does not match the SHA256 of the request body.', 400);
66
+ }
67
+ }
68
+ }
69
+ // ------------ signature ------------
70
+ const verified = verifySigV4Signature(request, info, credential.secretKey);
71
+ if (verified.kind === 'err') {
72
+ return xmlError(c, verified.error.code, verified.error.message, verified.error.status);
73
+ }
74
+ // ------------ bucket authorization ------------
75
+ // Extract bucket from URL. /s3/<bucket>/<key>. The router mounts
76
+ // this middleware under /s3, so the first path segment after
77
+ // stripping the mount is the bucket.
78
+ const requestedBucket = extractBucket(url.pathname);
79
+ if (requestedBucket === null) {
80
+ return xmlError(c, 'InvalidRequest', 'Bucket path segment missing', 400);
81
+ }
82
+ if (requestedBucket !== credential.bucket) {
83
+ return xmlError(c, 'AccessDenied', `Credential is not authorized for bucket "${requestedBucket}"`, 403);
84
+ }
85
+ // Buffer the body onto the request for downstream handlers to
86
+ // re-consume. Hono's Context re-reads req.raw for each parse.
87
+ rebindBody(c, bodyBytes);
88
+ c.set('tenantId', credential.tenantId);
89
+ c.set('bucket', credential.bucket);
90
+ c.set('s3AccessKeyId', info.accessKeyId);
91
+ await next();
92
+ return;
93
+ };
94
+ }
95
+ function extractBucket(pathname) {
96
+ // pathname like /s3/<bucket>/<key/with/slashes>. Middleware is
97
+ // mounted at /s3, so req.url still shows the full pathname.
98
+ const match = /^\/s3\/([^/?]+)/.exec(pathname);
99
+ return match === null ? null : match[1];
100
+ }
101
+ // -------------------- comparison + rebind helpers --------------------
102
+ function rebindBody(c, body) {
103
+ const original = c.req.raw;
104
+ const rebuilt = new Request(original.url, {
105
+ method: original.method,
106
+ headers: original.headers,
107
+ body: body.length > 0 ? new Uint8Array(body) : undefined,
108
+ // `duplex: 'half'` is required by undici when a body is present.
109
+ ...(body.length > 0 && { duplex: 'half' }),
110
+ });
111
+ Object.defineProperty(c.req, 'raw', { value: rebuilt, configurable: true });
112
+ }
113
+ // -------------------- XML error response --------------------
114
+ async function xmlError(c, code, message, status) {
115
+ const xml = errorXml(code, message);
116
+ return c.body(xml, status, {
117
+ 'Content-Type': 'application/xml',
118
+ });
119
+ }
120
+ //# sourceMappingURL=sigv4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sigv4.js","sourceRoot":"","sources":["../../src/middleware/sigv4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface OpenApiInfo {
2
+ readonly title?: string;
3
+ readonly version?: string;
4
+ readonly description?: string;
5
+ }
6
+ export interface OpenApiServer {
7
+ readonly url: string;
8
+ readonly description?: string;
9
+ }
10
+ export interface GenerateOptions {
11
+ readonly info?: OpenApiInfo;
12
+ readonly servers?: readonly OpenApiServer[];
13
+ }
14
+ export declare function generateOpenApiDocument(opts?: GenerateOptions): Record<string, unknown>;
15
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/openapi/generate.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AA0ED,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqC3F"}