@kindgi/api 0.1.4 → 0.1.5-rc.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 (507) hide show
  1. package/dist/agent-binding.d.ts +13 -0
  2. package/dist/agent-binding.d.ts.map +1 -1
  3. package/dist/agent-pins.d.ts.map +1 -1
  4. package/dist/agent-pins.js +18 -2
  5. package/dist/agent-pins.js.map +1 -1
  6. package/dist/app.d.ts +110 -17
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js +163 -35
  9. package/dist/app.js.map +1 -1
  10. package/dist/block-publish.d.ts +56 -0
  11. package/dist/block-publish.d.ts.map +1 -0
  12. package/dist/block-publish.js +132 -0
  13. package/dist/block-publish.js.map +1 -0
  14. package/dist/caller.d.ts +24 -0
  15. package/dist/caller.d.ts.map +1 -0
  16. package/dist/caller.js +47 -0
  17. package/dist/caller.js.map +1 -0
  18. package/dist/capability-binding.d.ts +11 -0
  19. package/dist/capability-binding.d.ts.map +1 -1
  20. package/dist/derive-agent-version.d.ts +7 -0
  21. package/dist/derive-agent-version.d.ts.map +1 -1
  22. package/dist/derive-agent-version.js +4 -0
  23. package/dist/derive-agent-version.js.map +1 -1
  24. package/dist/errors.d.ts.map +1 -1
  25. package/dist/errors.js +73 -7
  26. package/dist/errors.js.map +1 -1
  27. package/dist/eval-case-binding.d.ts +16 -4
  28. package/dist/eval-case-binding.d.ts.map +1 -1
  29. package/dist/eval-run-binding.d.ts +31 -0
  30. package/dist/eval-run-binding.d.ts.map +1 -1
  31. package/dist/eval-run-dispatcher.d.ts +7 -0
  32. package/dist/eval-run-dispatcher.d.ts.map +1 -1
  33. package/dist/eval-run-dispatcher.js.map +1 -1
  34. package/dist/eval-sample.d.ts +11 -0
  35. package/dist/eval-sample.d.ts.map +1 -0
  36. package/dist/eval-sample.js +34 -0
  37. package/dist/eval-sample.js.map +1 -0
  38. package/dist/eval-suite-binding.d.ts +13 -0
  39. package/dist/eval-suite-binding.d.ts.map +1 -1
  40. package/dist/eval-suite-binding.js.map +1 -1
  41. package/dist/flow-binding.d.ts +18 -0
  42. package/dist/flow-binding.d.ts.map +1 -1
  43. package/dist/flow-pins.d.ts.map +1 -1
  44. package/dist/flow-pins.js +18 -2
  45. package/dist/flow-pins.js.map +1 -1
  46. package/dist/gate.d.ts.map +1 -1
  47. package/dist/gate.js +25 -0
  48. package/dist/gate.js.map +1 -1
  49. package/dist/handler-binding.d.ts +32 -0
  50. package/dist/handler-binding.d.ts.map +1 -1
  51. package/dist/hitl-binding.d.ts +23 -0
  52. package/dist/hitl-binding.d.ts.map +1 -1
  53. package/dist/identity-directory-binding.d.ts +82 -4
  54. package/dist/identity-directory-binding.d.ts.map +1 -1
  55. package/dist/identity-provider-binding.d.ts +197 -17
  56. package/dist/identity-provider-binding.d.ts.map +1 -1
  57. package/dist/improvement-pass-binding.d.ts +196 -0
  58. package/dist/improvement-pass-binding.d.ts.map +1 -0
  59. package/dist/improvement-pass-binding.js +9 -0
  60. package/dist/improvement-pass-binding.js.map +1 -0
  61. package/dist/index.d.ts +35 -17
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +11 -3
  64. package/dist/index.js.map +1 -1
  65. package/dist/judged-dispatcher.d.ts +25 -4
  66. package/dist/judged-dispatcher.d.ts.map +1 -1
  67. package/dist/judged-dispatcher.js +43 -6
  68. package/dist/judged-dispatcher.js.map +1 -1
  69. package/dist/judgment-binding.d.ts +25 -1
  70. package/dist/judgment-binding.d.ts.map +1 -1
  71. package/dist/mcp-endpoint-binding.d.ts +7 -0
  72. package/dist/mcp-endpoint-binding.d.ts.map +1 -1
  73. package/dist/memory-binding.d.ts +124 -17
  74. package/dist/memory-binding.d.ts.map +1 -1
  75. package/dist/memory-erasure-binding.d.ts +145 -0
  76. package/dist/memory-erasure-binding.d.ts.map +1 -0
  77. package/dist/memory-erasure-binding.js +4 -0
  78. package/dist/memory-erasure-binding.js.map +1 -0
  79. package/dist/middleware/auth.d.ts +66 -13
  80. package/dist/middleware/auth.d.ts.map +1 -1
  81. package/dist/middleware/auth.js +150 -50
  82. package/dist/middleware/auth.js.map +1 -1
  83. package/dist/middleware/authorize.d.ts +6 -0
  84. package/dist/middleware/authorize.d.ts.map +1 -1
  85. package/dist/middleware/authorize.js +113 -4
  86. package/dist/middleware/authorize.js.map +1 -1
  87. package/dist/middleware/error-mapper.d.ts +5 -0
  88. package/dist/middleware/error-mapper.d.ts.map +1 -1
  89. package/dist/middleware/error-mapper.js +14 -1
  90. package/dist/middleware/error-mapper.js.map +1 -1
  91. package/dist/middleware/idempotency.d.ts +70 -5
  92. package/dist/middleware/idempotency.d.ts.map +1 -1
  93. package/dist/middleware/idempotency.js +174 -41
  94. package/dist/middleware/idempotency.js.map +1 -1
  95. package/dist/middleware/key-project.d.ts +17 -0
  96. package/dist/middleware/key-project.d.ts.map +1 -0
  97. package/dist/middleware/key-project.js +75 -0
  98. package/dist/middleware/key-project.js.map +1 -0
  99. package/dist/middleware/principal.d.ts.map +1 -1
  100. package/dist/middleware/principal.js +9 -5
  101. package/dist/middleware/principal.js.map +1 -1
  102. package/dist/middleware/project-ref.d.ts.map +1 -1
  103. package/dist/middleware/project-ref.js +3 -0
  104. package/dist/middleware/project-ref.js.map +1 -1
  105. package/dist/openapi/generate.d.ts.map +1 -1
  106. package/dist/openapi/generate.js +5 -2
  107. package/dist/openapi/generate.js.map +1 -1
  108. package/dist/openapi/operations.d.ts.map +1 -1
  109. package/dist/openapi/operations.js +918 -139
  110. package/dist/openapi/operations.js.map +1 -1
  111. package/dist/openapi/schemas.d.ts +90 -13
  112. package/dist/openapi/schemas.d.ts.map +1 -1
  113. package/dist/openapi/schemas.js +2081 -359
  114. package/dist/openapi/schemas.js.map +1 -1
  115. package/dist/person-grants-binding.d.ts +77 -0
  116. package/dist/person-grants-binding.d.ts.map +1 -0
  117. package/dist/person-grants-binding.js +4 -0
  118. package/dist/person-grants-binding.js.map +1 -0
  119. package/dist/proposal-service.d.ts +121 -0
  120. package/dist/proposal-service.d.ts.map +1 -0
  121. package/dist/proposal-service.js +447 -0
  122. package/dist/proposal-service.js.map +1 -0
  123. package/dist/proposal-status.d.ts +60 -0
  124. package/dist/proposal-status.d.ts.map +1 -0
  125. package/dist/proposal-status.js +109 -0
  126. package/dist/proposal-status.js.map +1 -0
  127. package/dist/provider-binding.d.ts +10 -0
  128. package/dist/provider-binding.d.ts.map +1 -1
  129. package/dist/publish-refused.d.ts +18 -3
  130. package/dist/publish-refused.d.ts.map +1 -1
  131. package/dist/publish-refused.js +18 -3
  132. package/dist/publish-refused.js.map +1 -1
  133. package/dist/routes/adapters.d.ts +2 -1
  134. package/dist/routes/adapters.d.ts.map +1 -1
  135. package/dist/routes/adapters.js +3 -1
  136. package/dist/routes/adapters.js.map +1 -1
  137. package/dist/routes/agent-releases.d.ts +55 -3
  138. package/dist/routes/agent-releases.d.ts.map +1 -1
  139. package/dist/routes/agent-releases.js +85 -55
  140. package/dist/routes/agent-releases.js.map +1 -1
  141. package/dist/routes/agents.d.ts +12 -1
  142. package/dist/routes/agents.d.ts.map +1 -1
  143. package/dist/routes/agents.js +100 -2
  144. package/dist/routes/agents.js.map +1 -1
  145. package/dist/routes/approvals.d.ts +15 -3
  146. package/dist/routes/approvals.d.ts.map +1 -1
  147. package/dist/routes/approvals.js +133 -122
  148. package/dist/routes/approvals.js.map +1 -1
  149. package/dist/routes/artifacts.d.ts +25 -3
  150. package/dist/routes/artifacts.d.ts.map +1 -1
  151. package/dist/routes/artifacts.js +116 -7
  152. package/dist/routes/artifacts.js.map +1 -1
  153. package/dist/routes/auth.d.ts +25 -1
  154. package/dist/routes/auth.d.ts.map +1 -1
  155. package/dist/routes/auth.js +655 -281
  156. package/dist/routes/auth.js.map +1 -1
  157. package/dist/routes/blocks.d.ts.map +1 -1
  158. package/dist/routes/blocks.js +2 -42
  159. package/dist/routes/blocks.js.map +1 -1
  160. package/dist/routes/capabilities.d.ts +2 -1
  161. package/dist/routes/capabilities.d.ts.map +1 -1
  162. package/dist/routes/capabilities.js +6 -1
  163. package/dist/routes/capabilities.js.map +1 -1
  164. package/dist/routes/compliance.d.ts +9 -10
  165. package/dist/routes/compliance.d.ts.map +1 -1
  166. package/dist/routes/compliance.js +42 -61
  167. package/dist/routes/compliance.js.map +1 -1
  168. package/dist/routes/conversations.d.ts +8 -1
  169. package/dist/routes/conversations.d.ts.map +1 -1
  170. package/dist/routes/conversations.js +87 -8
  171. package/dist/routes/conversations.js.map +1 -1
  172. package/dist/routes/cost.d.ts +7 -1
  173. package/dist/routes/cost.d.ts.map +1 -1
  174. package/dist/routes/cost.js +22 -3
  175. package/dist/routes/cost.js.map +1 -1
  176. package/dist/routes/denied.d.ts +11 -0
  177. package/dist/routes/denied.d.ts.map +1 -0
  178. package/dist/routes/denied.js +17 -0
  179. package/dist/routes/denied.js.map +1 -0
  180. package/dist/routes/deployments.d.ts +2 -1
  181. package/dist/routes/deployments.d.ts.map +1 -1
  182. package/dist/routes/deployments.js +44 -12
  183. package/dist/routes/deployments.js.map +1 -1
  184. package/dist/routes/eval-comparison.d.ts.map +1 -1
  185. package/dist/routes/eval-comparison.js +69 -1
  186. package/dist/routes/eval-comparison.js.map +1 -1
  187. package/dist/routes/eval-overrides.d.ts +18 -0
  188. package/dist/routes/eval-overrides.d.ts.map +1 -0
  189. package/dist/routes/eval-overrides.js +81 -0
  190. package/dist/routes/eval-overrides.js.map +1 -0
  191. package/dist/routes/eval-runs.d.ts +10 -1
  192. package/dist/routes/eval-runs.d.ts.map +1 -1
  193. package/dist/routes/eval-runs.js +63 -7
  194. package/dist/routes/eval-runs.js.map +1 -1
  195. package/dist/routes/eval-suites.d.ts.map +1 -1
  196. package/dist/routes/eval-suites.js +20 -1
  197. package/dist/routes/eval-suites.js.map +1 -1
  198. package/dist/routes/event-triggers.d.ts +5 -1
  199. package/dist/routes/event-triggers.d.ts.map +1 -1
  200. package/dist/routes/event-triggers.js +26 -3
  201. package/dist/routes/event-triggers.js.map +1 -1
  202. package/dist/routes/export-signing-keys.d.ts +12 -0
  203. package/dist/routes/export-signing-keys.d.ts.map +1 -0
  204. package/dist/routes/export-signing-keys.js +24 -0
  205. package/dist/routes/export-signing-keys.js.map +1 -0
  206. package/dist/routes/flows.d.ts.map +1 -1
  207. package/dist/routes/flows.js +9 -1
  208. package/dist/routes/flows.js.map +1 -1
  209. package/dist/routes/gate-policies.d.ts +4 -1
  210. package/dist/routes/gate-policies.d.ts.map +1 -1
  211. package/dist/routes/gate-policies.js +29 -5
  212. package/dist/routes/gate-policies.js.map +1 -1
  213. package/dist/routes/guardrails.d.ts +16 -14
  214. package/dist/routes/guardrails.d.ts.map +1 -1
  215. package/dist/routes/guardrails.js +39 -3
  216. package/dist/routes/guardrails.js.map +1 -1
  217. package/dist/routes/identity.d.ts +20 -4
  218. package/dist/routes/identity.d.ts.map +1 -1
  219. package/dist/routes/identity.js +246 -6
  220. package/dist/routes/identity.js.map +1 -1
  221. package/dist/routes/improvement-passes.d.ts +52 -0
  222. package/dist/routes/improvement-passes.d.ts.map +1 -0
  223. package/dist/routes/improvement-passes.js +449 -0
  224. package/dist/routes/improvement-passes.js.map +1 -0
  225. package/dist/routes/judged-suites.d.ts +50 -0
  226. package/dist/routes/judged-suites.d.ts.map +1 -1
  227. package/dist/routes/judged-suites.js +66 -27
  228. package/dist/routes/judged-suites.js.map +1 -1
  229. package/dist/routes/judgment-context.d.ts +18 -2
  230. package/dist/routes/judgment-context.d.ts.map +1 -1
  231. package/dist/routes/judgment-context.js +63 -5
  232. package/dist/routes/judgment-context.js.map +1 -1
  233. package/dist/routes/judgment-flow-context.d.ts.map +1 -1
  234. package/dist/routes/judgment-flow-context.js +14 -2
  235. package/dist/routes/judgment-flow-context.js.map +1 -1
  236. package/dist/routes/judgments.d.ts.map +1 -1
  237. package/dist/routes/judgments.js +8 -1
  238. package/dist/routes/judgments.js.map +1 -1
  239. package/dist/routes/mcp.d.ts.map +1 -1
  240. package/dist/routes/mcp.js +26 -1
  241. package/dist/routes/mcp.js.map +1 -1
  242. package/dist/routes/memory-access.d.ts +43 -0
  243. package/dist/routes/memory-access.d.ts.map +1 -0
  244. package/dist/routes/memory-access.js +129 -0
  245. package/dist/routes/memory-access.js.map +1 -0
  246. package/dist/routes/memory-erasures.d.ts +25 -0
  247. package/dist/routes/memory-erasures.d.ts.map +1 -0
  248. package/dist/routes/memory-erasures.js +214 -0
  249. package/dist/routes/memory-erasures.js.map +1 -0
  250. package/dist/routes/memory-parse.d.ts +38 -0
  251. package/dist/routes/memory-parse.d.ts.map +1 -0
  252. package/dist/routes/memory-parse.js +199 -0
  253. package/dist/routes/memory-parse.js.map +1 -0
  254. package/dist/routes/memory.d.ts +9 -4
  255. package/dist/routes/memory.d.ts.map +1 -1
  256. package/dist/routes/memory.js +226 -234
  257. package/dist/routes/memory.js.map +1 -1
  258. package/dist/routes/observations.d.ts +4 -1
  259. package/dist/routes/observations.d.ts.map +1 -1
  260. package/dist/routes/observations.js +8 -2
  261. package/dist/routes/observations.js.map +1 -1
  262. package/dist/routes/pagination.d.ts +7 -0
  263. package/dist/routes/pagination.d.ts.map +1 -1
  264. package/dist/routes/pagination.js +10 -0
  265. package/dist/routes/pagination.js.map +1 -1
  266. package/dist/routes/policies.d.ts +2 -1
  267. package/dist/routes/policies.d.ts.map +1 -1
  268. package/dist/routes/policies.js +3 -1
  269. package/dist/routes/policies.js.map +1 -1
  270. package/dist/routes/project-mismatch.d.ts +22 -0
  271. package/dist/routes/project-mismatch.d.ts.map +1 -0
  272. package/dist/routes/project-mismatch.js +34 -0
  273. package/dist/routes/project-mismatch.js.map +1 -0
  274. package/dist/routes/projects.d.ts +15 -4
  275. package/dist/routes/projects.d.ts.map +1 -1
  276. package/dist/routes/projects.js +100 -9
  277. package/dist/routes/projects.js.map +1 -1
  278. package/dist/routes/proposals.d.ts +25 -17
  279. package/dist/routes/proposals.d.ts.map +1 -1
  280. package/dist/routes/proposals.js +340 -507
  281. package/dist/routes/proposals.js.map +1 -1
  282. package/dist/routes/provenance.d.ts +17 -3
  283. package/dist/routes/provenance.d.ts.map +1 -1
  284. package/dist/routes/provenance.js +79 -103
  285. package/dist/routes/provenance.js.map +1 -1
  286. package/dist/routes/providers.d.ts +17 -1
  287. package/dist/routes/providers.d.ts.map +1 -1
  288. package/dist/routes/providers.js +110 -3
  289. package/dist/routes/providers.js.map +1 -1
  290. package/dist/routes/public-run-tokens.d.ts.map +1 -1
  291. package/dist/routes/public-run-tokens.js +3 -0
  292. package/dist/routes/public-run-tokens.js.map +1 -1
  293. package/dist/routes/runs.d.ts +10 -0
  294. package/dist/routes/runs.d.ts.map +1 -1
  295. package/dist/routes/runs.js +92 -42
  296. package/dist/routes/runs.js.map +1 -1
  297. package/dist/routes/schedules.d.ts +21 -13
  298. package/dist/routes/schedules.d.ts.map +1 -1
  299. package/dist/routes/schedules.js +416 -55
  300. package/dist/routes/schedules.js.map +1 -1
  301. package/dist/routes/segments.d.ts +2 -0
  302. package/dist/routes/segments.d.ts.map +1 -1
  303. package/dist/routes/segments.js +5 -0
  304. package/dist/routes/segments.js.map +1 -1
  305. package/dist/routes/service-accounts.d.ts +17 -0
  306. package/dist/routes/service-accounts.d.ts.map +1 -0
  307. package/dist/routes/service-accounts.js +212 -0
  308. package/dist/routes/service-accounts.js.map +1 -0
  309. package/dist/routes/sign-in-options.d.ts +50 -0
  310. package/dist/routes/sign-in-options.d.ts.map +1 -0
  311. package/dist/routes/sign-in-options.js +98 -0
  312. package/dist/routes/sign-in-options.js.map +1 -0
  313. package/dist/routes/signing-keys.d.ts +2 -1
  314. package/dist/routes/signing-keys.d.ts.map +1 -1
  315. package/dist/routes/signing-keys.js +3 -1
  316. package/dist/routes/signing-keys.js.map +1 -1
  317. package/dist/routes/tenant-access.d.ts +13 -0
  318. package/dist/routes/tenant-access.d.ts.map +1 -0
  319. package/dist/routes/tenant-access.js +26 -0
  320. package/dist/routes/tenant-access.js.map +1 -0
  321. package/dist/routes/tenant.d.ts.map +1 -1
  322. package/dist/routes/tenant.js +4 -0
  323. package/dist/routes/tenant.js.map +1 -1
  324. package/dist/routes/token-sign-in.d.ts +36 -0
  325. package/dist/routes/token-sign-in.d.ts.map +1 -0
  326. package/dist/routes/token-sign-in.js +101 -0
  327. package/dist/routes/token-sign-in.js.map +1 -0
  328. package/dist/routes/tokens.d.ts +15 -5
  329. package/dist/routes/tokens.d.ts.map +1 -1
  330. package/dist/routes/tokens.js +162 -43
  331. package/dist/routes/tokens.js.map +1 -1
  332. package/dist/routes/tools.d.ts.map +1 -1
  333. package/dist/routes/tools.js +9 -1
  334. package/dist/routes/tools.js.map +1 -1
  335. package/dist/routes/trigger-access.d.ts +29 -0
  336. package/dist/routes/trigger-access.d.ts.map +1 -0
  337. package/dist/routes/trigger-access.js +33 -0
  338. package/dist/routes/trigger-access.js.map +1 -0
  339. package/dist/routes/webhook-endpoints.d.ts +2 -1
  340. package/dist/routes/webhook-endpoints.d.ts.map +1 -1
  341. package/dist/routes/webhook-endpoints.js +11 -3
  342. package/dist/routes/webhook-endpoints.js.map +1 -1
  343. package/dist/routes/webhooks.d.ts +5 -1
  344. package/dist/routes/webhooks.d.ts.map +1 -1
  345. package/dist/routes/webhooks.js +25 -2
  346. package/dist/routes/webhooks.js.map +1 -1
  347. package/dist/run-failure.d.ts +21 -0
  348. package/dist/run-failure.d.ts.map +1 -0
  349. package/dist/run-failure.js +29 -0
  350. package/dist/run-failure.js.map +1 -0
  351. package/dist/service-account-binding.d.ts +108 -0
  352. package/dist/service-account-binding.d.ts.map +1 -0
  353. package/dist/service-account-binding.js +4 -0
  354. package/dist/service-account-binding.js.map +1 -0
  355. package/dist/session-store-binding.d.ts +61 -13
  356. package/dist/session-store-binding.d.ts.map +1 -1
  357. package/dist/signed-export.d.ts +89 -0
  358. package/dist/signed-export.d.ts.map +1 -0
  359. package/dist/signed-export.js +149 -0
  360. package/dist/signed-export.js.map +1 -0
  361. package/dist/supervisor-binding.d.ts +186 -413
  362. package/dist/supervisor-binding.d.ts.map +1 -1
  363. package/dist/testing/app-bindings.d.ts +33 -0
  364. package/dist/testing/app-bindings.d.ts.map +1 -0
  365. package/dist/testing/app-bindings.js +112 -0
  366. package/dist/testing/app-bindings.js.map +1 -0
  367. package/dist/testing/index.d.ts +11 -0
  368. package/dist/testing/index.d.ts.map +1 -0
  369. package/dist/testing/index.js +13 -0
  370. package/dist/testing/index.js.map +1 -0
  371. package/dist/testing/stub-binding.d.ts +34 -0
  372. package/dist/testing/stub-binding.d.ts.map +1 -0
  373. package/dist/testing/stub-binding.js +42 -0
  374. package/dist/testing/stub-binding.js.map +1 -0
  375. package/dist/testing/trigger-registry.d.ts +21 -0
  376. package/dist/testing/trigger-registry.d.ts.map +1 -0
  377. package/dist/testing/trigger-registry.js +206 -0
  378. package/dist/testing/trigger-registry.js.map +1 -0
  379. package/dist/token-admin.d.ts +46 -8
  380. package/dist/token-admin.d.ts.map +1 -1
  381. package/dist/token-admin.js.map +1 -1
  382. package/dist/tool-binding.d.ts +13 -0
  383. package/dist/tool-binding.d.ts.map +1 -1
  384. package/dist/trigger-binding.d.ts +2 -2
  385. package/dist/trigger-binding.d.ts.map +1 -1
  386. package/dist/trigger-binding.js +1 -1
  387. package/dist/trigger-binding.js.map +1 -1
  388. package/dist/types.d.ts +16 -0
  389. package/dist/types.d.ts.map +1 -1
  390. package/dist/webhook-endpoint-binding.d.ts +19 -3
  391. package/dist/webhook-endpoint-binding.d.ts.map +1 -1
  392. package/dist/webhook-endpoint-binding.js +1 -1
  393. package/dist/webhook-endpoint-binding.js.map +1 -1
  394. package/openapi.json +15385 -8788
  395. package/package.json +26 -22
  396. package/src/agent-binding.ts +14 -0
  397. package/src/agent-pins.ts +18 -2
  398. package/src/app.ts +366 -80
  399. package/src/block-publish.ts +181 -0
  400. package/src/caller.ts +62 -0
  401. package/src/capability-binding.ts +12 -0
  402. package/src/derive-agent-version.ts +9 -1
  403. package/src/errors.ts +73 -7
  404. package/src/eval-case-binding.ts +17 -1
  405. package/src/eval-run-binding.ts +31 -0
  406. package/src/eval-run-dispatcher.ts +7 -0
  407. package/src/eval-sample.ts +42 -0
  408. package/src/eval-suite-binding.ts +14 -0
  409. package/src/flow-binding.ts +19 -0
  410. package/src/flow-pins.ts +18 -2
  411. package/src/gate.ts +26 -0
  412. package/src/handler-binding.ts +36 -1
  413. package/src/hitl-binding.ts +24 -0
  414. package/src/identity-directory-binding.ts +85 -4
  415. package/src/identity-provider-binding.ts +216 -21
  416. package/src/improvement-pass-binding.ts +193 -0
  417. package/src/index.ts +153 -31
  418. package/src/judged-dispatcher.ts +78 -11
  419. package/src/judgment-binding.ts +25 -1
  420. package/src/mcp-endpoint-binding.ts +7 -0
  421. package/src/memory-binding.ts +121 -17
  422. package/src/memory-erasure-binding.ts +156 -0
  423. package/src/middleware/auth.ts +228 -62
  424. package/src/middleware/authorize.ts +139 -3
  425. package/src/middleware/error-mapper.ts +15 -1
  426. package/src/middleware/idempotency.ts +230 -43
  427. package/src/middleware/key-project.ts +86 -0
  428. package/src/middleware/principal.ts +9 -5
  429. package/src/middleware/project-ref.ts +3 -0
  430. package/src/openapi/generate.ts +11 -2
  431. package/src/openapi/operations.ts +1059 -142
  432. package/src/openapi/schemas.ts +2387 -469
  433. package/src/person-grants-binding.ts +76 -0
  434. package/src/proposal-service.ts +640 -0
  435. package/src/proposal-status.ts +176 -0
  436. package/src/provider-binding.ts +10 -0
  437. package/src/publish-refused.ts +38 -9
  438. package/src/routes/adapters.ts +4 -0
  439. package/src/routes/agent-releases.ts +121 -69
  440. package/src/routes/agents.ts +128 -1
  441. package/src/routes/approvals.ts +164 -154
  442. package/src/routes/artifacts.ts +181 -11
  443. package/src/routes/auth.ts +804 -336
  444. package/src/routes/blocks.ts +2 -53
  445. package/src/routes/capabilities.ts +10 -1
  446. package/src/routes/compliance.ts +60 -99
  447. package/src/routes/conversations.ts +101 -7
  448. package/src/routes/cost.ts +32 -3
  449. package/src/routes/denied.ts +28 -0
  450. package/src/routes/deployments.ts +62 -16
  451. package/src/routes/eval-comparison.ts +81 -2
  452. package/src/routes/eval-overrides.ts +108 -0
  453. package/src/routes/eval-runs.ts +86 -6
  454. package/src/routes/eval-suites.ts +25 -1
  455. package/src/routes/event-triggers.ts +27 -3
  456. package/src/routes/export-signing-keys.ts +31 -0
  457. package/src/routes/flows.ts +12 -1
  458. package/src/routes/gate-policies.ts +37 -6
  459. package/src/routes/guardrails.ts +61 -2
  460. package/src/routes/identity.ts +328 -10
  461. package/src/routes/improvement-passes.ts +541 -0
  462. package/src/routes/judged-suites.ts +113 -43
  463. package/src/routes/judgment-context.ts +76 -5
  464. package/src/routes/judgment-flow-context.ts +16 -2
  465. package/src/routes/judgments.ts +17 -3
  466. package/src/routes/mcp.ts +29 -1
  467. package/src/routes/memory-access.ts +179 -0
  468. package/src/routes/memory-erasures.ts +240 -0
  469. package/src/routes/memory-parse.ts +250 -0
  470. package/src/routes/memory.ts +244 -286
  471. package/src/routes/observations.ts +15 -2
  472. package/src/routes/pagination.ts +12 -0
  473. package/src/routes/policies.ts +7 -1
  474. package/src/routes/project-mismatch.ts +56 -0
  475. package/src/routes/projects.ts +107 -13
  476. package/src/routes/proposals.ts +370 -611
  477. package/src/routes/provenance.ts +99 -133
  478. package/src/routes/providers.ts +142 -3
  479. package/src/routes/public-run-tokens.ts +3 -0
  480. package/src/routes/runs.ts +119 -39
  481. package/src/routes/schedules.ts +472 -60
  482. package/src/routes/segments.ts +11 -0
  483. package/src/routes/service-accounts.ts +262 -0
  484. package/src/routes/sign-in-options.ts +168 -0
  485. package/src/routes/signing-keys.ts +7 -1
  486. package/src/routes/tenant-access.ts +37 -0
  487. package/src/routes/tenant.ts +6 -0
  488. package/src/routes/token-sign-in.ts +161 -0
  489. package/src/routes/tokens.ts +172 -46
  490. package/src/routes/tools.ts +12 -1
  491. package/src/routes/trigger-access.ts +72 -0
  492. package/src/routes/webhook-endpoints.ts +15 -3
  493. package/src/routes/webhooks.ts +26 -2
  494. package/src/run-failure.ts +42 -0
  495. package/src/service-account-binding.ts +113 -0
  496. package/src/session-store-binding.ts +65 -13
  497. package/src/signed-export.ts +250 -0
  498. package/src/supervisor-binding.ts +169 -409
  499. package/src/testing/app-bindings.ts +142 -0
  500. package/src/testing/index.ts +21 -0
  501. package/src/testing/stub-binding.ts +53 -0
  502. package/src/testing/trigger-registry.ts +259 -0
  503. package/src/token-admin.ts +40 -8
  504. package/src/tool-binding.ts +14 -0
  505. package/src/trigger-binding.ts +8 -1
  506. package/src/types.ts +16 -0
  507. package/src/webhook-endpoint-binding.ts +18 -3
package/src/app.ts CHANGED
@@ -10,7 +10,8 @@ import type { AuditEventBinding } from '@kindgi/audit-events';
10
10
  import type { AuthzCheckBinding } from '@kindgi/authz';
11
11
  import type { AdapterFactoryRegistry } from '@kindgi/capabilities';
12
12
  import type { ComplianceEvidenceGenerator, LoadedClassifier } from '@kindgi/compliance';
13
- import type { SigningKeyBinding } from '@kindgi/crypto';
13
+ import { exportSignerFromSigningKeyBinding } from '@kindgi/crypto';
14
+ import type { ExportSigningBinding, SigningKeyBinding } from '@kindgi/crypto';
14
15
  import type { TenantHierarchyBinding } from '@kindgi/platform';
15
16
  import type {
16
17
  OrgBinding,
@@ -48,11 +49,18 @@ import type {
48
49
  RefreshTokenFn,
49
50
  } from './identity-provider-binding.js';
50
51
  import type { ImageRegistryBinding } from './image-registry-binding.js';
52
+ import type { ImprovementPassBinding } from './improvement-pass-binding.js';
51
53
  import type { JudgmentRegistryBinding } from './judgment-binding.js';
52
54
  import type { AgentReleaseBindings } from './live-version-binding.js';
53
55
  import type { MCPClientProbeBinding, MCPEndpointRegistryBinding } from './mcp-endpoint-binding.js';
54
56
  import type { MemoryBinding } from './memory-binding.js';
55
- import { type TokenResolver, bearerAuthMiddleware } from './middleware/auth.js';
57
+ import type { MemoryErasureBinding } from './memory-erasure-binding.js';
58
+ import {
59
+ SESSION_COOKIE_NAME,
60
+ type SessionCookieOptions,
61
+ type TokenResolver,
62
+ bearerAuthMiddleware,
63
+ } from './middleware/auth.js';
56
64
  import { type Authorizer, createAuthorizer } from './middleware/authorize.js';
57
65
  import { mapThrownError } from './middleware/error-mapper.js';
58
66
  import {
@@ -60,6 +68,7 @@ import {
60
68
  createInMemoryIdempotencyStore,
61
69
  idempotencyMiddleware,
62
70
  } from './middleware/idempotency.js';
71
+ import { refuseOtherProjectForKey } from './middleware/key-project.js';
63
72
  import { principalMiddleware } from './middleware/principal.js';
64
73
  import { PROJECT_REF_ROUTES, refuseBadProjectId } from './middleware/project-ref.js';
65
74
  import { publicRunCorsMiddleware, publicRunRouteMatcher } from './middleware/public-run-routes.js';
@@ -67,6 +76,7 @@ import { requestIdMiddleware } from './middleware/request-id.js';
67
76
  import { requestLogMiddleware } from './middleware/request-log.js';
68
77
  import { sigv4Middleware } from './middleware/sigv4.js';
69
78
  import { type GenerateOptions, generateOpenApiDocument } from './openapi/generate.js';
79
+ import type { PersonGrantsBinding } from './person-grants-binding.js';
70
80
  import type { ProvenanceBinding } from './provenance-binding.js';
71
81
  import type { ProviderRegistryBinding } from './provider-binding.js';
72
82
  import {
@@ -85,7 +95,7 @@ import { agentsRouter } from './routes/agents.js';
85
95
  import { approvalsRouter } from './routes/approvals.js';
86
96
  import { artifactsRouter } from './routes/artifacts.js';
87
97
  import { auditRouter } from './routes/audit.js';
88
- import { authRouters } from './routes/auth.js';
98
+ import { authRouters, logoutHandler } from './routes/auth.js';
89
99
  import { blocksRouter } from './routes/blocks.js';
90
100
  import { capabilitiesRouter } from './routes/capabilities.js';
91
101
  import { complianceRouter } from './routes/compliance.js';
@@ -96,13 +106,16 @@ import { envRouter } from './routes/env.js';
96
106
  import { evalRunsRouters } from './routes/eval-runs.js';
97
107
  import { evalSuitesRouter } from './routes/eval-suites.js';
98
108
  import { eventTriggersRouter } from './routes/event-triggers.js';
109
+ import { exportSigningKeysRouter } from './routes/export-signing-keys.js';
99
110
  import { flowsRouter } from './routes/flows.js';
100
111
  import { gatePoliciesRouter } from './routes/gate-policies.js';
101
112
  import { guardrailsRouter } from './routes/guardrails.js';
102
113
  import { identityRouter } from './routes/identity.js';
114
+ import { improvementPassesRouter, mountImproveRoute } from './routes/improvement-passes.js';
103
115
  import { judgedSuitesRouter } from './routes/judged-suites.js';
104
116
  import { judgeClassesRouter, judgmentsRouter } from './routes/judgments.js';
105
117
  import { mcpRouter } from './routes/mcp.js';
118
+ import { memoryErasuresRouter } from './routes/memory-erasures.js';
106
119
  import { memoryRouter } from './routes/memory.js';
107
120
  import { observationsRouter } from './routes/observations.js';
108
121
  import { orgsRouter } from './routes/orgs.js';
@@ -118,15 +131,19 @@ import { runsRouter } from './routes/runs.js';
118
131
  import { s3Router } from './routes/s3.js';
119
132
  import { schedulesRouter } from './routes/schedules.js';
120
133
  import { secretsRouter } from './routes/secrets.js';
134
+ import { serviceAccountsRouter } from './routes/service-accounts.js';
135
+ import { type SignInOptionsRateLimit, signInOptionsRouter } from './routes/sign-in-options.js';
121
136
  import { signingKeysRouter } from './routes/signing-keys.js';
122
137
  import { teamsRouter } from './routes/teams.js';
123
138
  import { tenantRouter } from './routes/tenant.js';
139
+ import { tokenSignInRouter } from './routes/token-sign-in.js';
124
140
  import { tokensRouter } from './routes/tokens.js';
125
141
  import { toolsRouter } from './routes/tools.js';
126
142
  import { webhookEndpointsRouter } from './routes/webhook-endpoints.js';
127
143
  import { webhooksRouter } from './routes/webhooks.js';
128
144
  import type { S3CredentialBinding } from './s3-credential-binding.js';
129
145
  import type { SecretBinding } from './secrets-binding.js';
146
+ import type { ServiceAccountBinding } from './service-account-binding.js';
130
147
  import type { SessionStoreBinding } from './session-store-binding.js';
131
148
  import type { SigningKeyBinding as SigningKeyRegistryBinding } from './signing-key-binding.js';
132
149
  import { type OauthStateStore, createInMemoryOauthStateStore } from './state-store-binding.js';
@@ -134,7 +151,7 @@ import type { SupervisorBinding } from './supervisor-binding.js';
134
151
  import type { TenantHostAccess } from './tenant-host-access.js';
135
152
  import type { TokenAdmin } from './token-admin.js';
136
153
  import type { ToolRegistryBinding } from './tool-binding.js';
137
- import type { TriggerRegistryBinding } from './trigger-binding.js';
154
+ import { TRIGGER_KINDS, type TriggerKind, type TriggerRegistryBinding } from './trigger-binding.js';
138
155
  import type { AppEnv } from './types.js';
139
156
  import type { WebhookEndpointBinding } from './webhook-endpoint-binding.js';
140
157
 
@@ -285,6 +302,19 @@ export interface CreateAppInput {
285
302
  * keys out-of-band (e.g. via a separate admin console).
286
303
  */
287
304
  readonly tokenAdmin?: TokenAdmin;
305
+ /**
306
+ * Optional. When present, mounts `/v1/service-accounts` (tenant admins):
307
+ * create with grants, list, get, grant, ungrant, unregister. Keys for an
308
+ * account are minted at `POST /v1/tokens` with `for`.
309
+ */
310
+ readonly serviceAccountBinding?: ServiceAccountBinding;
311
+ /**
312
+ * Optional. A person's grants under `/v1/identity/users/:userId`:
313
+ * `GET grants` (tenant admins, or the person) and `POST grant|ungrant`
314
+ * (tenant admin; tenant admins only). Without it they answer
315
+ * `501 person-grants-unsupported`. Needs `identityDirectory`.
316
+ */
317
+ readonly personGrants?: PersonGrantsBinding;
288
318
  /**
289
319
  * Optional. When present, mounts the HITL surface:
290
320
  * - `GET /v1/approvals` (list, role-scoped)
@@ -379,6 +409,13 @@ export interface CreateAppInput {
379
409
  * cache-invalidation concern as `onToolWrite` / `onProviderWrite`.
380
410
  */
381
411
  readonly onGuardrailWrite?: import('./routes/guardrails.js').GuardrailWriteHook;
412
+ /**
413
+ * Checks a guardrail being registered (`POST /v1/guardrails`) against
414
+ * the `configSchema` of the check it names; a problem refuses it with
415
+ * `422 guardrail-config-invalid`. A runtime passes it with the pack
416
+ * checks' schemas from their deployments. Absent: no check.
417
+ */
418
+ readonly checkGuardrailConfig?: import('./routes/guardrails.js').GuardrailConfigCheck;
382
419
  /**
383
420
  * Optional. When present, mounts the retention surface
384
421
  * (`/v1/retention/scheduled`, `/v1/retention/sweep`,
@@ -395,6 +432,13 @@ export interface CreateAppInput {
395
432
  * the memory subsystem runtime + their embedding registry.
396
433
  */
397
434
  readonly memory?: MemoryBinding;
435
+ /**
436
+ * Optional. When present, mounts erasing a person's words
437
+ * (`/v1/memory/erasures`: create, get, list, export, replay), for a
438
+ * tenant admin only. The Kindgi runtime supplies an implementation over
439
+ * its erasure jobs and ledger.
440
+ */
441
+ readonly memoryErasures?: MemoryErasureBinding;
398
442
  /**
399
443
  * Optional. When present, mounts the supervisor proposals surface
400
444
  * (`/v1/proposals` list/get/draft, plus lifecycle actions
@@ -409,17 +453,31 @@ export interface CreateAppInput {
409
453
  */
410
454
  readonly supervisor?: SupervisorBinding;
411
455
  /**
412
- * Optional. Caller-plugged key store for signed provenance exports
413
- * (`POST /v1/provenance/:runId/export`). When omitted, the export
414
- * route responds `404 signing-not-configured` — the read routes
415
- * (`GET /v1/provenance`, `GET /v1/provenance/:runId`) remain mounted
416
- * either way because they read through `provenanceBinding` and do not
417
- * need signing material.
456
+ * Optional. Improvement passes (`POST /v1/proposals/improve`,
457
+ * `/v1/improvement-passes`): the runtime's search for better settings
458
+ * values, written as an improvement proposal. Without it, both answer
459
+ * `501 improve-unsupported`. Mounted with `/v1/proposals`.
460
+ */
461
+ readonly improvementPasses?: ImprovementPassBinding;
462
+ /**
463
+ * Optional. The key the deployment signs its exports with: an
464
+ * approval's audit bundle (`POST /v1/approvals/:approvalId/audit-bundle`),
465
+ * a run's provenance (`POST /v1/provenance/:runId/export`) and
466
+ * compliance evidence (`POST /v1/compliance/evidence/export`). Its
467
+ * public keys are `GET /v1/export-signing-keys`. Each signed export is
468
+ * recorded as an `export-signed` audit event when `auditEvents` is
469
+ * given.
418
470
  *
419
- * Same caller-plugged pattern as the other bindings — the API package
420
- * does NOT own key persistence. Deployments plug in a binding that
421
- * wraps their KMS / HSM / env-var store; see `SigningKeyBinding` in
422
- * `@kindgi/crypto`.
471
+ * Without it (and without `signingKey`), the three exports answer
472
+ * `404 signing-not-configured`; the read routes stay mounted. The API
473
+ * doesn't own key material: a deployment plugs a file key
474
+ * (`createEd25519ExportSigner` in `@kindgi/crypto`) or a KMS-backed
475
+ * binding.
476
+ */
477
+ readonly exportSigning?: ExportSigningBinding;
478
+ /**
479
+ * @deprecated Use `exportSigning`. Still read, as its Ed25519 keys
480
+ * (`exportSignerFromSigningKeyBinding`), when `exportSigning` isn't given.
423
481
  */
424
482
  readonly signingKey?: SigningKeyBinding;
425
483
  /**
@@ -442,6 +500,11 @@ export interface CreateAppInput {
442
500
  * production.
443
501
  */
444
502
  readonly blobStorage?: BlobStorageBinding;
503
+ /**
504
+ * The most bytes one artifact upload may carry (`POST /v1/artifacts`);
505
+ * more is `413 artifact-too-large`. Default 100 MB.
506
+ */
507
+ readonly artifactMaxBytes?: number;
445
508
  /**
446
509
  * Optional. When present, mounts the read-only capabilities catalog
447
510
  * surface (`/v1/capabilities` list, `/v1/capabilities/:capabilityId`
@@ -557,6 +620,13 @@ export interface CreateAppInput {
557
620
  * want bespoke persistence substitute their own binding.
558
621
  */
559
622
  readonly triggerRegistry?: TriggerRegistryBinding;
623
+ /**
624
+ * The trigger kinds whose admin surface mounts with `triggerRegistry`:
625
+ * `cron` → `/v1/schedules`, `event` → `/v1/event-triggers`, `webhook` →
626
+ * `/v1/webhooks`. Absent: all three. A runtime that fires only some kinds
627
+ * lists those, so nobody registers a trigger that would never fire.
628
+ */
629
+ readonly triggerKinds?: readonly TriggerKind[];
560
630
  /**
561
631
  * Optional. When present, mounts the outbound webhook surface at
562
632
  * `/v1/webhook-endpoints/*`: endpoints the platform sends signed
@@ -677,8 +747,10 @@ export interface CreateAppInput {
677
747
  */
678
748
  readonly session?: SessionConfig;
679
749
  /**
680
- * Optional. When present alongside `sessionStore` + `exchangeCode`,
681
- * mounts the identity-provider catalog + auth flow at `/v1/auth/*`.
750
+ * Optional. When present alongside `sessionStore`, mounts the
751
+ * identity-provider catalog, refresh and logout at `/v1/auth/*`; with
752
+ * `exchangeCode` too, also this package's own OAuth flow
753
+ * (`/login/:providerId` and the callback).
682
754
  *
683
755
  * Deployments register their OAuth/OIDC providers at boot (or via
684
756
  * `POST /v1/auth/providers`); the framework does NOT bake in a
@@ -686,8 +758,11 @@ export interface CreateAppInput {
686
758
  */
687
759
  readonly identityProvider?: IdentityProviderBinding;
688
760
  /**
689
- * Required alongside `identityProvider`. Called by
690
- * `POST /v1/auth/callback/:providerId` to exchange the authorization
761
+ * Optional: the deployment's own code exchange. With it (and
762
+ * `identityProvider` + `sessionStore`), `POST /v1/auth/login/:providerId`
763
+ * and `POST /v1/auth/callback/:providerId` mount; a deployment whose
764
+ * sign-in runs elsewhere (a browser flow of its own) leaves it out.
765
+ * Called by `POST /v1/auth/callback/:providerId` to exchange the authorization
691
766
  * code for provider tokens + userinfo. Deployments implementing
692
767
  * `IdentityProviderBinding` typically pair it with their own
693
768
  * `exchangeCode` that speaks OAuth 2.0 + PKCE against the provider's
@@ -711,6 +786,21 @@ export interface CreateAppInput {
711
786
  * login. Mirror of the `idempotencyStore` caller-plugged pattern.
712
787
  */
713
788
  readonly oauthStateStore?: OauthStateStore;
789
+ /**
790
+ * The rate limit on `GET /v1/auth/sign-in-options` (unauthenticated):
791
+ * requests per client per window, and how to tell clients apart.
792
+ * Default: 30 a minute, per nearest (rightmost) `X-Forwarded-For` hop.
793
+ */
794
+ readonly signInOptionsRateLimit?: SignInOptionsRateLimit;
795
+ /**
796
+ * The emailed sign-in link, when the deployment offers it (it serves the
797
+ * link itself): sign-in options say so, with the captcha's site key.
798
+ */
799
+ readonly signInEmailLink?: {
800
+ readonly captchaSiteKey?: string;
801
+ /** Whether the link is offered for an email's domain. Absent: every domain. */
802
+ readonly allowedFor?: (emailDomain: string) => Promise<boolean>;
803
+ };
714
804
  /**
715
805
  * Optional. Signed-deployment ledger — the audit anchor for every
716
806
  * `POST /v1/deployments` landing. Caller-plugged per the pattern
@@ -875,6 +965,21 @@ export interface SessionConfig {
875
965
  * but coarser inactivity enforcement.
876
966
  */
877
967
  readonly touchThrottle?: number;
968
+ /**
969
+ * Browser sessions in a cookie: the middleware reads the session token
970
+ * from it when a request has no `Authorization` header, and refuses a
971
+ * cookie-authenticated unsafe request whose `Origin` isn't allowed
972
+ * (403 `csrf-origin-mismatch`). Absent → session tokens come only in
973
+ * the `Authorization` header.
974
+ */
975
+ readonly cookie?: SessionCookieOptions;
976
+ /**
977
+ * Whether a person may sign in to the console with an API token
978
+ * (`POST /v1/auth/token-sign-in`): a person's full key is exchanged once
979
+ * for a browser session in `cookie`. Needs `cookie` and a session store.
980
+ * Absent or `false`: the route answers 403 `token-sign-in-off`.
981
+ */
982
+ readonly tokenSignIn?: boolean;
878
983
  }
879
984
 
880
985
  /**
@@ -894,10 +999,34 @@ export interface ScalarDocsConfig {
894
999
  readonly theme?: string;
895
1000
  }
896
1001
 
1002
+ /** A token sign-in's session lifetime when `SessionConfig.ttl` is unset: 12 hours. */
1003
+ const DEFAULT_TOKEN_SIGN_IN_TTL_MS = 12 * 60 * 60 * 1000;
1004
+
897
1005
  export function createApp(input: CreateAppInput): Hono<AppEnv> {
1006
+ // A cookie session's value is the token the store minted. A store that
1007
+ // can't resolve its own tokens would put the session id there instead,
1008
+ // and the id is no secret (whoami and the audit trail show it).
1009
+ if (
1010
+ input.session?.cookie !== undefined &&
1011
+ input.sessionStore !== undefined &&
1012
+ input.sessionStore.resolveToken === undefined
1013
+ ) {
1014
+ throw new Error(
1015
+ 'Cookie sessions need a session store that resolves its own tokens (`resolveToken`): without it, the session id would be the credential.',
1016
+ );
1017
+ }
898
1018
  const app = new Hono<AppEnv>();
899
1019
 
900
1020
  const runBinding = input.kernelBinding.run;
1021
+ const exportSigning =
1022
+ input.exportSigning ??
1023
+ (input.signingKey !== undefined
1024
+ ? exportSignerFromSigningKeyBinding(input.signingKey)
1025
+ : undefined);
1026
+ const exportOptions = {
1027
+ ...(exportSigning !== undefined && { exportSigning }),
1028
+ ...(input.auditEvents !== undefined && { auditEvents: input.auditEvents }),
1029
+ };
901
1030
 
902
1031
  // ---------- global middleware ----------
903
1032
  app.use('*', requestIdMiddleware());
@@ -971,6 +1100,7 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
971
1100
  ...(sessionCfg?.touchThrottle !== undefined && {
972
1101
  touchThrottleMs: sessionCfg.touchThrottle,
973
1102
  }),
1103
+ ...(sessionCfg?.cookie !== undefined && { sessionCookie: sessionCfg.cookie }),
974
1104
  }),
975
1105
  );
976
1106
  // Principal construction — runs after bearer so it can read the
@@ -984,6 +1114,8 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
984
1114
  if (tenantId !== undefined) c.set('log', c.get('log').child({ tenantId }));
985
1115
  await next();
986
1116
  });
1117
+ // A key limited to a project names no other one.
1118
+ v1.use('*', refuseOtherProjectForKey());
987
1119
  const authorizer: Authorizer | undefined =
988
1120
  input.authz !== undefined ? createAuthorizer(input.authz.authzCheckBinding) : undefined;
989
1121
 
@@ -1001,6 +1133,15 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1001
1133
  runBinding,
1002
1134
  {
1003
1135
  ...(input.eventBus !== undefined && { eventBus: input.eventBus }),
1136
+ ...(input.agentRegistry !== undefined &&
1137
+ input.flowRegistry !== undefined && {
1138
+ targetExists: async (tenantId, target) =>
1139
+ target.kind === 'agent'
1140
+ ? (await input.agentRegistry?.get({ tenantId, agentId: target.id as never })) !==
1141
+ null
1142
+ : (await input.flowRegistry?.get({ tenantId, flowId: target.id as never })) !==
1143
+ null,
1144
+ }),
1004
1145
  ...(publicRunTokenLimits !== undefined && {
1005
1146
  publicRunTokens: {
1006
1147
  mint: (tenantId, runIds) =>
@@ -1013,7 +1154,7 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1013
1154
  );
1014
1155
  v1.route(
1015
1156
  '/conversations',
1016
- conversationsRouter(input.conversationBinding, runBinding, input.projectBinding),
1157
+ conversationsRouter(input.conversationBinding, runBinding, input.projectBinding, authorizer),
1017
1158
  );
1018
1159
  if (publicRunTokenLimits !== undefined) {
1019
1160
  v1.route(
@@ -1028,6 +1169,9 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1028
1169
  if (input.tokenAdmin !== undefined) {
1029
1170
  v1.route('/tokens', tokensRouter(input.tokenAdmin, authorizer));
1030
1171
  }
1172
+ if (input.serviceAccountBinding !== undefined) {
1173
+ v1.route('/service-accounts', serviceAccountsRouter(input.serviceAccountBinding, authorizer));
1174
+ }
1031
1175
  // Mount the reviewer roster sub-resource BEFORE the approvals router
1032
1176
  // so `/v1/approvals/reviewers/*` resolves here rather than being
1033
1177
  // captured by the `:approvalId` param on the approvals router.
@@ -1043,7 +1187,7 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1043
1187
  input.hitlBinding,
1044
1188
  runBinding,
1045
1189
  {
1046
- ...(input.signingKey !== undefined && { signingKey: input.signingKey }),
1190
+ ...exportOptions,
1047
1191
  // Inline resume after approval-complete drives
1048
1192
  // completeToken. Passing the runHandler here means the route
1049
1193
  // calls `runHandler.resumeRun(...)` synchronously in the same
@@ -1051,11 +1195,12 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1051
1195
  // new state (running / completed / re-suspended).
1052
1196
  runHandler: input.runHandler,
1053
1197
  },
1198
+ authorizer,
1054
1199
  ),
1055
1200
  );
1056
1201
  }
1057
1202
  if (input.enableObservations === true && input.supervisor !== undefined) {
1058
- v1.route('/observations', observationsRouter(input.supervisor));
1203
+ v1.route('/observations', observationsRouter(input.supervisor, authorizer));
1059
1204
  }
1060
1205
  if (input.agentRegistry !== undefined) {
1061
1206
  v1.route(
@@ -1070,6 +1215,17 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1070
1215
  ...(input.evalRunBinding !== undefined && { evalRuns: input.evalRunBinding }),
1071
1216
  ...(input.projectBinding !== undefined && { projects: input.projectBinding }),
1072
1217
  },
1218
+ {
1219
+ ...(input.memory?.semanticSearch !== undefined && {
1220
+ semanticSearch: input.memory.semanticSearch,
1221
+ }),
1222
+ ...(input.memory?.agentRemember !== undefined && {
1223
+ remember: input.memory.agentRemember,
1224
+ }),
1225
+ ...(input.memory?.conversationRecall !== undefined && {
1226
+ conversationRecall: input.memory.conversationRecall,
1227
+ }),
1228
+ },
1073
1229
  ),
1074
1230
  );
1075
1231
  }
@@ -1098,24 +1254,72 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1098
1254
  if (input.guardrailRegistry !== undefined) {
1099
1255
  v1.route(
1100
1256
  '/guardrails',
1101
- guardrailsRouter(input.guardrailRegistry, authorizer, input.onGuardrailWrite),
1257
+ guardrailsRouter(
1258
+ input.guardrailRegistry,
1259
+ authorizer,
1260
+ input.onGuardrailWrite,
1261
+ input.checkGuardrailConfig,
1262
+ ),
1102
1263
  );
1103
1264
  }
1104
1265
  if (input.retention !== undefined) {
1105
1266
  v1.route('/retention', retentionRouter(input.retention, authorizer));
1106
1267
  }
1268
+ // Before `/memory`, so its routes answer first.
1269
+ if (input.memoryErasures !== undefined) {
1270
+ v1.route('/memory/erasures', memoryErasuresRouter(input.memoryErasures, authorizer));
1271
+ }
1107
1272
  if (input.memory !== undefined) {
1108
- v1.route('/memory', memoryRouter(input.memory));
1273
+ v1.route(
1274
+ '/memory',
1275
+ memoryRouter(input.memory, {
1276
+ ...(authorizer !== undefined && { authorizer }),
1277
+ ...(input.projectBinding !== undefined && { projects: input.projectBinding }),
1278
+ }),
1279
+ );
1109
1280
  }
1110
- if (input.supervisor !== undefined) {
1111
- v1.route('/proposals', proposalsRouter(input.supervisor));
1281
+ if (
1282
+ input.supervisor !== undefined &&
1283
+ input.agentRegistry !== undefined &&
1284
+ input.blockRegistry !== undefined &&
1285
+ input.evalRunBinding !== undefined &&
1286
+ input.agentReleases !== undefined
1287
+ ) {
1288
+ const improveDeps = {
1289
+ ...(input.improvementPasses !== undefined && { passes: input.improvementPasses }),
1290
+ agents: input.agentRegistry,
1291
+ blocks: input.blockRegistry,
1292
+ releases: input.agentReleases,
1293
+ };
1294
+ v1.route(
1295
+ '/proposals',
1296
+ proposalsRouter(
1297
+ input.supervisor,
1298
+ {
1299
+ agents: input.agentRegistry,
1300
+ blocks: input.blockRegistry,
1301
+ evalRuns: input.evalRunBinding,
1302
+ releases: input.agentReleases,
1303
+ ...(input.projectBinding !== undefined && { projects: input.projectBinding }),
1304
+ },
1305
+ authorizer,
1306
+ (r) => mountImproveRoute(r, improveDeps, authorizer),
1307
+ ),
1308
+ );
1309
+ v1.route('/improvement-passes', improvementPassesRouter(input.improvementPasses, authorizer));
1112
1310
  }
1311
+ v1.route('/export-signing-keys', exportSigningKeysRouter(exportSigning));
1113
1312
  v1.route(
1114
1313
  '/provenance',
1115
- provenanceRouter(input.provenanceBinding, {
1116
- conversationBinding: input.conversationBinding,
1117
- ...(input.signingKey !== undefined && { signingKey: input.signingKey }),
1118
- }),
1314
+ provenanceRouter(
1315
+ input.provenanceBinding,
1316
+ {
1317
+ conversationBinding: input.conversationBinding,
1318
+ runBinding,
1319
+ ...exportOptions,
1320
+ },
1321
+ authorizer,
1322
+ ),
1119
1323
  );
1120
1324
  if (
1121
1325
  input.auditEvents !== undefined &&
@@ -1124,22 +1328,40 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1124
1328
  ) {
1125
1329
  v1.route(
1126
1330
  '/compliance',
1127
- complianceRouter({
1128
- auditEvents: input.auditEvents,
1129
- classifier: input.complianceClassifier,
1130
- complianceGenerator: input.complianceGenerator,
1131
- ...(input.signingKey !== undefined && { signingKey: input.signingKey }),
1132
- }),
1331
+ complianceRouter(
1332
+ {
1333
+ auditEvents: input.auditEvents,
1334
+ classifier: input.complianceClassifier,
1335
+ ...(exportSigning !== undefined && { exportSigning }),
1336
+ },
1337
+ authorizer,
1338
+ ),
1133
1339
  );
1134
1340
  }
1135
1341
  if (input.blobStorage !== undefined) {
1136
- v1.route('/artifacts', artifactsRouter(input.blobStorage));
1342
+ v1.route(
1343
+ '/artifacts',
1344
+ artifactsRouter(input.blobStorage, {
1345
+ runBinding,
1346
+ ...(input.projectBinding !== undefined && { projectBinding: input.projectBinding }),
1347
+ ...(authorizer !== undefined && { authorizer }),
1348
+ ...(input.artifactMaxBytes !== undefined && { maxBytes: input.artifactMaxBytes }),
1349
+ }),
1350
+ );
1137
1351
  }
1138
1352
  if (input.capabilityRegistry !== undefined) {
1139
- v1.route('/capabilities', capabilitiesRouter(input.capabilityRegistry));
1353
+ v1.route('/capabilities', capabilitiesRouter(input.capabilityRegistry, authorizer));
1140
1354
  }
1141
1355
  if (input.providerRegistry !== undefined) {
1142
- v1.route('/providers', providersRouter(input.providerRegistry, input.onProviderWrite));
1356
+ v1.route(
1357
+ '/providers',
1358
+ providersRouter(
1359
+ input.providerRegistry,
1360
+ input.onProviderWrite,
1361
+ input.adapterFactories,
1362
+ authorizer,
1363
+ ),
1364
+ );
1143
1365
  }
1144
1366
  if (input.mcpEndpointRegistry !== undefined) {
1145
1367
  v1.route(
@@ -1159,28 +1381,43 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1159
1381
  ...(input.identityDirectory !== undefined && { directory: input.identityDirectory }),
1160
1382
  ...(input.sessionStore !== undefined && { sessionStore: input.sessionStore }),
1161
1383
  ...(input.reviewerBinding !== undefined && { reviewerBinding: input.reviewerBinding }),
1384
+ ...(authorizer !== undefined && { authorizer }),
1385
+ ...(input.personGrants !== undefined && { personGrants: input.personGrants }),
1162
1386
  }),
1163
1387
  );
1164
1388
  if (input.cost !== undefined) {
1165
- v1.route('/cost', costRouter(input.cost));
1389
+ v1.route('/cost', costRouter(input.cost, authorizer));
1166
1390
  }
1167
1391
  if (input.adapterRegistry !== undefined) {
1168
- v1.route('/adapters', adaptersRouter(input.adapterRegistry, input.adapterFactories));
1392
+ v1.route(
1393
+ '/adapters',
1394
+ adaptersRouter(input.adapterRegistry, input.adapterFactories, authorizer),
1395
+ );
1169
1396
  }
1170
1397
  // Trigger admin surfaces. Three sibling routers over the same
1171
1398
  // `TriggerRegistryBinding` — each pins its own kind. There is no
1172
1399
  // external webhook receiver route here (it would need
1173
1400
  // unauthenticated tenant resolution).
1174
1401
  if (input.triggerRegistry !== undefined) {
1175
- v1.route('/schedules', schedulesRouter(input.triggerRegistry));
1176
- v1.route('/event-triggers', eventTriggersRouter(input.triggerRegistry));
1177
- v1.route('/webhooks', webhooksRouter(input.triggerRegistry));
1402
+ const kinds = new Set<TriggerKind>(input.triggerKinds ?? TRIGGER_KINDS);
1403
+ if (kinds.has('cron')) {
1404
+ v1.route(
1405
+ '/schedules',
1406
+ schedulesRouter(input.triggerRegistry, authorizer, input.projectBinding),
1407
+ );
1408
+ }
1409
+ if (kinds.has('event')) {
1410
+ v1.route('/event-triggers', eventTriggersRouter(input.triggerRegistry, authorizer));
1411
+ }
1412
+ if (kinds.has('webhook')) {
1413
+ v1.route('/webhooks', webhooksRouter(input.triggerRegistry, authorizer));
1414
+ }
1178
1415
  }
1179
1416
  if (input.webhookEndpoints !== undefined) {
1180
- v1.route('/webhook-endpoints', webhookEndpointsRouter(input.webhookEndpoints));
1417
+ v1.route('/webhook-endpoints', webhookEndpointsRouter(input.webhookEndpoints, authorizer));
1181
1418
  }
1182
1419
  if (input.policyRegistry !== undefined) {
1183
- v1.route('/policies', policiesRouter(input.policyRegistry));
1420
+ v1.route('/policies', policiesRouter(input.policyRegistry, authorizer));
1184
1421
  }
1185
1422
  if (input.evalSuiteRegistry !== undefined) {
1186
1423
  v1.route('/eval-suites', evalSuitesRouter(input.evalSuiteRegistry, authorizer));
@@ -1243,6 +1480,7 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1243
1480
  input.projectMembershipBinding,
1244
1481
  tenantHierarchyBinding,
1245
1482
  authorizer,
1483
+ input.identityDirectory,
1246
1484
  ),
1247
1485
  );
1248
1486
  }
@@ -1294,7 +1532,7 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1294
1532
  // Mounted on its own: a deployment can trust keys before it accepts
1295
1533
  // deployments.
1296
1534
  if (input.signingKeyRegistry !== undefined) {
1297
- v1.route('/signing-keys', signingKeysRouter(input.signingKeyRegistry));
1535
+ v1.route('/signing-keys', signingKeysRouter(input.signingKeyRegistry, authorizer));
1298
1536
  }
1299
1537
  if (
1300
1538
  input.deploymentRegistry !== undefined &&
@@ -1303,33 +1541,36 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1303
1541
  ) {
1304
1542
  v1.route(
1305
1543
  '/deployments',
1306
- deploymentsRouter({
1307
- deploymentRegistry: input.deploymentRegistry,
1308
- signingKeyRegistry: input.signingKeyRegistry,
1309
- imageRegistry: input.imageRegistry,
1310
- ...(input.toolRegistry !== undefined && { toolRegistry: input.toolRegistry }),
1311
- ...(input.blockRegistry !== undefined && { blockRegistry: input.blockRegistry }),
1312
- ...(input.guardrailRegistry !== undefined && {
1313
- guardrailRegistry: input.guardrailRegistry,
1314
- }),
1315
- ...(input.agentRegistry !== undefined && { agentRegistry: input.agentRegistry }),
1316
- ...(input.flowRegistry !== undefined && { flowRegistry: input.flowRegistry }),
1317
- ...(input.agentReleases !== undefined && { liveVersions: input.agentReleases.live }),
1318
- // The deployments router's agents publish loop resolves the
1319
- // Default project through this binding. Optional at wiring so
1320
- // app compositions without a project binding still boot; the loop
1321
- // fails fast at runtime if agents are in the deployment index
1322
- // but the binding is absent.
1323
- ...(input.projectBinding !== undefined && { projectBinding: input.projectBinding }),
1324
- // POST /v1/deployments/:deploymentId/secrets needs the
1325
- // secretsBinding. Absent binding → the route answers 500 with an
1326
- // operator-actionable message.
1327
- ...(input.secretsBinding !== undefined && { secretsBinding: input.secretsBinding }),
1328
- // A deploy registers tools and guardrails: the same cache hooks
1329
- // `POST /v1/tools` / `POST /v1/guardrails` call.
1330
- ...(input.onToolWrite !== undefined && { onToolWrite: input.onToolWrite }),
1331
- ...(input.onGuardrailWrite !== undefined && { onGuardrailWrite: input.onGuardrailWrite }),
1332
- }),
1544
+ deploymentsRouter(
1545
+ {
1546
+ deploymentRegistry: input.deploymentRegistry,
1547
+ signingKeyRegistry: input.signingKeyRegistry,
1548
+ imageRegistry: input.imageRegistry,
1549
+ ...(input.toolRegistry !== undefined && { toolRegistry: input.toolRegistry }),
1550
+ ...(input.blockRegistry !== undefined && { blockRegistry: input.blockRegistry }),
1551
+ ...(input.guardrailRegistry !== undefined && {
1552
+ guardrailRegistry: input.guardrailRegistry,
1553
+ }),
1554
+ ...(input.agentRegistry !== undefined && { agentRegistry: input.agentRegistry }),
1555
+ ...(input.flowRegistry !== undefined && { flowRegistry: input.flowRegistry }),
1556
+ ...(input.agentReleases !== undefined && { liveVersions: input.agentReleases.live }),
1557
+ // The deployments router's agents publish loop resolves the
1558
+ // Default project through this binding. Optional at wiring so
1559
+ // app compositions without a project binding still boot; the loop
1560
+ // fails fast at runtime if agents are in the deployment index
1561
+ // but the binding is absent.
1562
+ ...(input.projectBinding !== undefined && { projectBinding: input.projectBinding }),
1563
+ // POST /v1/deployments/:deploymentId/secrets needs the
1564
+ // secretsBinding. Absent binding → the route answers 500 with an
1565
+ // operator-actionable message.
1566
+ ...(input.secretsBinding !== undefined && { secretsBinding: input.secretsBinding }),
1567
+ // A deploy registers tools and guardrails: the same cache hooks
1568
+ // `POST /v1/tools` / `POST /v1/guardrails` call.
1569
+ ...(input.onToolWrite !== undefined && { onToolWrite: input.onToolWrite }),
1570
+ ...(input.onGuardrailWrite !== undefined && { onGuardrailWrite: input.onGuardrailWrite }),
1571
+ },
1572
+ authorizer,
1573
+ ),
1333
1574
  );
1334
1575
  }
1335
1576
  if (input.evalRunBinding !== undefined) {
@@ -1348,6 +1589,10 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1348
1589
  ...(input.toolRegistry !== undefined && { tools: input.toolRegistry }),
1349
1590
  }
1350
1591
  : undefined,
1592
+ input.agentRegistry !== undefined && input.blockRegistry !== undefined
1593
+ ? { agents: input.agentRegistry, blocks: input.blockRegistry }
1594
+ : undefined,
1595
+ authorizer,
1351
1596
  );
1352
1597
  v1.route('/eval-suites', evalRuns.start);
1353
1598
  v1.route('/eval-runs', evalRuns.readback);
@@ -1360,24 +1605,65 @@ export function createApp(input: CreateAppInput): Hono<AppEnv> {
1360
1605
  // reach it), and the callback sub-router mounts OUTSIDE the bearer
1361
1606
  // chain at `/v1/auth/callback/*` because the redirect from the
1362
1607
  // provider carries no framework token yet.
1363
- if (
1364
- input.sessionStore !== undefined &&
1365
- input.identityProvider !== undefined &&
1366
- input.exchangeCode !== undefined
1367
- ) {
1608
+ if (input.sessionStore !== undefined && input.identityProvider !== undefined) {
1368
1609
  const routers = authRouters({
1369
1610
  sessionStore: input.sessionStore,
1370
1611
  identityProvider: input.identityProvider,
1371
- exchangeCode: input.exchangeCode,
1612
+ ...(input.exchangeCode !== undefined && { exchangeCode: input.exchangeCode }),
1372
1613
  ...(input.refreshToken !== undefined && { refreshToken: input.refreshToken }),
1373
1614
  stateStore: input.oauthStateStore ?? createInMemoryOauthStateStore(),
1615
+ ...(authorizer !== undefined && { authorizer }),
1616
+ ...(input.auditEvents !== undefined && { auditEvents: input.auditEvents }),
1374
1617
  });
1375
1618
  v1.route('/auth', routers.authed);
1376
1619
  // Callback mounts on the parent `app` under /v1/auth/callback so it
1377
1620
  // bypasses the bearer chain. The v1 router's use('*', bearer) has
1378
1621
  // already been installed above, so we mount at the parent scope.
1379
- app.route('/v1/auth/callback', routers.callback);
1622
+ // Only the deployment's own code exchange serves it.
1623
+ if (input.exchangeCode !== undefined) app.route('/v1/auth/callback', routers.callback);
1624
+ }
1625
+ // How a person can sign in, before anyone is: outside the bearer chain
1626
+ // too (mounted ahead of `/v1`, like the callback). Always mounted, so the
1627
+ // console and `kindgi doctor` get a definite answer even when there is no
1628
+ // way in at all: the case an operator most needs to hear about.
1629
+ const cookieSessions = input.sessionStore !== undefined && input.session?.cookie !== undefined;
1630
+ const tokenSignIn = cookieSessions && input.session?.tokenSignIn === true;
1631
+ app.route(
1632
+ '/v1/auth/sign-in-options',
1633
+ signInOptionsRouter({
1634
+ ...(input.identityProvider !== undefined && { identityProvider: input.identityProvider }),
1635
+ tokenSignIn,
1636
+ ...(input.signInOptionsRateLimit !== undefined && {
1637
+ rateLimit: input.signInOptionsRateLimit,
1638
+ }),
1639
+ ...(input.signInEmailLink !== undefined && { emailLink: input.signInEmailLink }),
1640
+ }),
1641
+ );
1642
+ // Browser sessions need a way out even without identity providers
1643
+ // (which bring their own `/auth` routes, logout included).
1644
+ if (cookieSessions && input.identityProvider === undefined && input.sessionStore !== undefined) {
1645
+ v1.post('/auth/logout', logoutHandler(input.sessionStore, input.auditEvents));
1380
1646
  }
1647
+ // A person signs in to the console with an API token: inside the bearer
1648
+ // chain (the token arrives in `Authorization`). Always mounted: without
1649
+ // browser sessions, or unless the deployment allows it, it refuses with
1650
+ // 403 token-sign-in-off.
1651
+ v1.route(
1652
+ '/auth/token-sign-in',
1653
+ tokenSignInRouter(
1654
+ input.sessionStore !== undefined &&
1655
+ input.session?.cookie !== undefined &&
1656
+ input.session.tokenSignIn === true
1657
+ ? {
1658
+ enabled: true,
1659
+ sessionStore: input.sessionStore,
1660
+ ttlMs: input.session.ttl ?? DEFAULT_TOKEN_SIGN_IN_TTL_MS,
1661
+ cookieName: input.session.cookie.name ?? SESSION_COOKIE_NAME,
1662
+ ...(input.auditEvents !== undefined && { auditEvents: input.auditEvents }),
1663
+ }
1664
+ : { enabled: false },
1665
+ ),
1666
+ );
1381
1667
  app.route('/v1', v1);
1382
1668
 
1383
1669
  // ---------- S3-compat surface (/s3/*, SigV4 auth) ----------