@kindgi/api 0.1.4 → 0.1.5

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 (516) 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/cost-binding.d.ts +19 -0
  21. package/dist/cost-binding.d.ts.map +1 -1
  22. package/dist/cost-binding.js.map +1 -1
  23. package/dist/derive-agent-version.d.ts +7 -0
  24. package/dist/derive-agent-version.d.ts.map +1 -1
  25. package/dist/derive-agent-version.js +4 -0
  26. package/dist/derive-agent-version.js.map +1 -1
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +75 -7
  29. package/dist/errors.js.map +1 -1
  30. package/dist/eval-case-binding.d.ts +16 -4
  31. package/dist/eval-case-binding.d.ts.map +1 -1
  32. package/dist/eval-run-binding.d.ts +31 -0
  33. package/dist/eval-run-binding.d.ts.map +1 -1
  34. package/dist/eval-run-dispatcher.d.ts +7 -0
  35. package/dist/eval-run-dispatcher.d.ts.map +1 -1
  36. package/dist/eval-run-dispatcher.js.map +1 -1
  37. package/dist/eval-sample.d.ts +11 -0
  38. package/dist/eval-sample.d.ts.map +1 -0
  39. package/dist/eval-sample.js +34 -0
  40. package/dist/eval-sample.js.map +1 -0
  41. package/dist/eval-suite-binding.d.ts +13 -0
  42. package/dist/eval-suite-binding.d.ts.map +1 -1
  43. package/dist/eval-suite-binding.js.map +1 -1
  44. package/dist/flow-binding.d.ts +18 -0
  45. package/dist/flow-binding.d.ts.map +1 -1
  46. package/dist/flow-pins.d.ts.map +1 -1
  47. package/dist/flow-pins.js +18 -2
  48. package/dist/flow-pins.js.map +1 -1
  49. package/dist/gate.d.ts.map +1 -1
  50. package/dist/gate.js +25 -0
  51. package/dist/gate.js.map +1 -1
  52. package/dist/handler-binding.d.ts +32 -0
  53. package/dist/handler-binding.d.ts.map +1 -1
  54. package/dist/hitl-binding.d.ts +23 -0
  55. package/dist/hitl-binding.d.ts.map +1 -1
  56. package/dist/identity-directory-binding.d.ts +82 -4
  57. package/dist/identity-directory-binding.d.ts.map +1 -1
  58. package/dist/identity-provider-binding.d.ts +197 -17
  59. package/dist/identity-provider-binding.d.ts.map +1 -1
  60. package/dist/improvement-pass-binding.d.ts +196 -0
  61. package/dist/improvement-pass-binding.d.ts.map +1 -0
  62. package/dist/improvement-pass-binding.js +9 -0
  63. package/dist/improvement-pass-binding.js.map +1 -0
  64. package/dist/index.d.ts +35 -17
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +11 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/judged-dispatcher.d.ts +25 -4
  69. package/dist/judged-dispatcher.d.ts.map +1 -1
  70. package/dist/judged-dispatcher.js +43 -6
  71. package/dist/judged-dispatcher.js.map +1 -1
  72. package/dist/judgment-binding.d.ts +25 -1
  73. package/dist/judgment-binding.d.ts.map +1 -1
  74. package/dist/mcp-endpoint-binding.d.ts +7 -0
  75. package/dist/mcp-endpoint-binding.d.ts.map +1 -1
  76. package/dist/memory-binding.d.ts +124 -17
  77. package/dist/memory-binding.d.ts.map +1 -1
  78. package/dist/memory-erasure-binding.d.ts +145 -0
  79. package/dist/memory-erasure-binding.d.ts.map +1 -0
  80. package/dist/memory-erasure-binding.js +4 -0
  81. package/dist/memory-erasure-binding.js.map +1 -0
  82. package/dist/middleware/auth.d.ts +66 -13
  83. package/dist/middleware/auth.d.ts.map +1 -1
  84. package/dist/middleware/auth.js +150 -50
  85. package/dist/middleware/auth.js.map +1 -1
  86. package/dist/middleware/authorize.d.ts +9 -0
  87. package/dist/middleware/authorize.d.ts.map +1 -1
  88. package/dist/middleware/authorize.js +122 -4
  89. package/dist/middleware/authorize.js.map +1 -1
  90. package/dist/middleware/error-mapper.d.ts +5 -0
  91. package/dist/middleware/error-mapper.d.ts.map +1 -1
  92. package/dist/middleware/error-mapper.js +14 -1
  93. package/dist/middleware/error-mapper.js.map +1 -1
  94. package/dist/middleware/idempotency.d.ts +70 -5
  95. package/dist/middleware/idempotency.d.ts.map +1 -1
  96. package/dist/middleware/idempotency.js +174 -41
  97. package/dist/middleware/idempotency.js.map +1 -1
  98. package/dist/middleware/key-project.d.ts +17 -0
  99. package/dist/middleware/key-project.d.ts.map +1 -0
  100. package/dist/middleware/key-project.js +75 -0
  101. package/dist/middleware/key-project.js.map +1 -0
  102. package/dist/middleware/principal.d.ts.map +1 -1
  103. package/dist/middleware/principal.js +9 -5
  104. package/dist/middleware/principal.js.map +1 -1
  105. package/dist/middleware/project-ref.d.ts.map +1 -1
  106. package/dist/middleware/project-ref.js +3 -0
  107. package/dist/middleware/project-ref.js.map +1 -1
  108. package/dist/openapi/generate.d.ts.map +1 -1
  109. package/dist/openapi/generate.js +5 -2
  110. package/dist/openapi/generate.js.map +1 -1
  111. package/dist/openapi/operations.d.ts.map +1 -1
  112. package/dist/openapi/operations.js +919 -140
  113. package/dist/openapi/operations.js.map +1 -1
  114. package/dist/openapi/schemas.d.ts +90 -13
  115. package/dist/openapi/schemas.d.ts.map +1 -1
  116. package/dist/openapi/schemas.js +2081 -359
  117. package/dist/openapi/schemas.js.map +1 -1
  118. package/dist/person-grants-binding.d.ts +77 -0
  119. package/dist/person-grants-binding.d.ts.map +1 -0
  120. package/dist/person-grants-binding.js +4 -0
  121. package/dist/person-grants-binding.js.map +1 -0
  122. package/dist/proposal-service.d.ts +121 -0
  123. package/dist/proposal-service.d.ts.map +1 -0
  124. package/dist/proposal-service.js +447 -0
  125. package/dist/proposal-service.js.map +1 -0
  126. package/dist/proposal-status.d.ts +60 -0
  127. package/dist/proposal-status.d.ts.map +1 -0
  128. package/dist/proposal-status.js +109 -0
  129. package/dist/proposal-status.js.map +1 -0
  130. package/dist/provider-binding.d.ts +10 -0
  131. package/dist/provider-binding.d.ts.map +1 -1
  132. package/dist/publish-refused.d.ts +28 -3
  133. package/dist/publish-refused.d.ts.map +1 -1
  134. package/dist/publish-refused.js +24 -3
  135. package/dist/publish-refused.js.map +1 -1
  136. package/dist/routes/adapters.d.ts +2 -1
  137. package/dist/routes/adapters.d.ts.map +1 -1
  138. package/dist/routes/adapters.js +3 -1
  139. package/dist/routes/adapters.js.map +1 -1
  140. package/dist/routes/agent-releases.d.ts +55 -3
  141. package/dist/routes/agent-releases.d.ts.map +1 -1
  142. package/dist/routes/agent-releases.js +85 -55
  143. package/dist/routes/agent-releases.js.map +1 -1
  144. package/dist/routes/agents.d.ts +12 -1
  145. package/dist/routes/agents.d.ts.map +1 -1
  146. package/dist/routes/agents.js +100 -2
  147. package/dist/routes/agents.js.map +1 -1
  148. package/dist/routes/approvals.d.ts +15 -3
  149. package/dist/routes/approvals.d.ts.map +1 -1
  150. package/dist/routes/approvals.js +133 -122
  151. package/dist/routes/approvals.js.map +1 -1
  152. package/dist/routes/artifacts.d.ts +25 -3
  153. package/dist/routes/artifacts.d.ts.map +1 -1
  154. package/dist/routes/artifacts.js +116 -7
  155. package/dist/routes/artifacts.js.map +1 -1
  156. package/dist/routes/auth.d.ts +25 -1
  157. package/dist/routes/auth.d.ts.map +1 -1
  158. package/dist/routes/auth.js +655 -281
  159. package/dist/routes/auth.js.map +1 -1
  160. package/dist/routes/blocks.d.ts.map +1 -1
  161. package/dist/routes/blocks.js +2 -42
  162. package/dist/routes/blocks.js.map +1 -1
  163. package/dist/routes/capabilities.d.ts +2 -1
  164. package/dist/routes/capabilities.d.ts.map +1 -1
  165. package/dist/routes/capabilities.js +6 -1
  166. package/dist/routes/capabilities.js.map +1 -1
  167. package/dist/routes/compliance.d.ts +9 -10
  168. package/dist/routes/compliance.d.ts.map +1 -1
  169. package/dist/routes/compliance.js +42 -61
  170. package/dist/routes/compliance.js.map +1 -1
  171. package/dist/routes/conversations.d.ts +8 -1
  172. package/dist/routes/conversations.d.ts.map +1 -1
  173. package/dist/routes/conversations.js +87 -8
  174. package/dist/routes/conversations.js.map +1 -1
  175. package/dist/routes/cost.d.ts +12 -1
  176. package/dist/routes/cost.d.ts.map +1 -1
  177. package/dist/routes/cost.js +74 -3
  178. package/dist/routes/cost.js.map +1 -1
  179. package/dist/routes/denied.d.ts +11 -0
  180. package/dist/routes/denied.d.ts.map +1 -0
  181. package/dist/routes/denied.js +17 -0
  182. package/dist/routes/denied.js.map +1 -0
  183. package/dist/routes/deployments.d.ts +10 -1
  184. package/dist/routes/deployments.d.ts.map +1 -1
  185. package/dist/routes/deployments.js +171 -13
  186. package/dist/routes/deployments.js.map +1 -1
  187. package/dist/routes/eval-comparison.d.ts.map +1 -1
  188. package/dist/routes/eval-comparison.js +69 -1
  189. package/dist/routes/eval-comparison.js.map +1 -1
  190. package/dist/routes/eval-overrides.d.ts +18 -0
  191. package/dist/routes/eval-overrides.d.ts.map +1 -0
  192. package/dist/routes/eval-overrides.js +81 -0
  193. package/dist/routes/eval-overrides.js.map +1 -0
  194. package/dist/routes/eval-runs.d.ts +10 -1
  195. package/dist/routes/eval-runs.d.ts.map +1 -1
  196. package/dist/routes/eval-runs.js +66 -7
  197. package/dist/routes/eval-runs.js.map +1 -1
  198. package/dist/routes/eval-suites.d.ts.map +1 -1
  199. package/dist/routes/eval-suites.js +28 -2
  200. package/dist/routes/eval-suites.js.map +1 -1
  201. package/dist/routes/event-triggers.d.ts +5 -1
  202. package/dist/routes/event-triggers.d.ts.map +1 -1
  203. package/dist/routes/event-triggers.js +26 -3
  204. package/dist/routes/event-triggers.js.map +1 -1
  205. package/dist/routes/export-signing-keys.d.ts +12 -0
  206. package/dist/routes/export-signing-keys.d.ts.map +1 -0
  207. package/dist/routes/export-signing-keys.js +24 -0
  208. package/dist/routes/export-signing-keys.js.map +1 -0
  209. package/dist/routes/flows.d.ts.map +1 -1
  210. package/dist/routes/flows.js +9 -1
  211. package/dist/routes/flows.js.map +1 -1
  212. package/dist/routes/gate-policies.d.ts +4 -1
  213. package/dist/routes/gate-policies.d.ts.map +1 -1
  214. package/dist/routes/gate-policies.js +29 -5
  215. package/dist/routes/gate-policies.js.map +1 -1
  216. package/dist/routes/guardrails.d.ts +16 -14
  217. package/dist/routes/guardrails.d.ts.map +1 -1
  218. package/dist/routes/guardrails.js +39 -3
  219. package/dist/routes/guardrails.js.map +1 -1
  220. package/dist/routes/identity.d.ts +20 -4
  221. package/dist/routes/identity.d.ts.map +1 -1
  222. package/dist/routes/identity.js +246 -6
  223. package/dist/routes/identity.js.map +1 -1
  224. package/dist/routes/improvement-passes.d.ts +52 -0
  225. package/dist/routes/improvement-passes.d.ts.map +1 -0
  226. package/dist/routes/improvement-passes.js +449 -0
  227. package/dist/routes/improvement-passes.js.map +1 -0
  228. package/dist/routes/judged-suites.d.ts +50 -0
  229. package/dist/routes/judged-suites.d.ts.map +1 -1
  230. package/dist/routes/judged-suites.js +66 -27
  231. package/dist/routes/judged-suites.js.map +1 -1
  232. package/dist/routes/judgment-context.d.ts +18 -2
  233. package/dist/routes/judgment-context.d.ts.map +1 -1
  234. package/dist/routes/judgment-context.js +63 -5
  235. package/dist/routes/judgment-context.js.map +1 -1
  236. package/dist/routes/judgment-flow-context.d.ts.map +1 -1
  237. package/dist/routes/judgment-flow-context.js +14 -2
  238. package/dist/routes/judgment-flow-context.js.map +1 -1
  239. package/dist/routes/judgments.d.ts.map +1 -1
  240. package/dist/routes/judgments.js +8 -1
  241. package/dist/routes/judgments.js.map +1 -1
  242. package/dist/routes/mcp.d.ts.map +1 -1
  243. package/dist/routes/mcp.js +26 -1
  244. package/dist/routes/mcp.js.map +1 -1
  245. package/dist/routes/memory-access.d.ts +43 -0
  246. package/dist/routes/memory-access.d.ts.map +1 -0
  247. package/dist/routes/memory-access.js +114 -0
  248. package/dist/routes/memory-access.js.map +1 -0
  249. package/dist/routes/memory-erasures.d.ts +25 -0
  250. package/dist/routes/memory-erasures.d.ts.map +1 -0
  251. package/dist/routes/memory-erasures.js +214 -0
  252. package/dist/routes/memory-erasures.js.map +1 -0
  253. package/dist/routes/memory-parse.d.ts +38 -0
  254. package/dist/routes/memory-parse.d.ts.map +1 -0
  255. package/dist/routes/memory-parse.js +199 -0
  256. package/dist/routes/memory-parse.js.map +1 -0
  257. package/dist/routes/memory.d.ts +9 -4
  258. package/dist/routes/memory.d.ts.map +1 -1
  259. package/dist/routes/memory.js +226 -234
  260. package/dist/routes/memory.js.map +1 -1
  261. package/dist/routes/observations.d.ts +4 -1
  262. package/dist/routes/observations.d.ts.map +1 -1
  263. package/dist/routes/observations.js +8 -2
  264. package/dist/routes/observations.js.map +1 -1
  265. package/dist/routes/pagination.d.ts +7 -0
  266. package/dist/routes/pagination.d.ts.map +1 -1
  267. package/dist/routes/pagination.js +10 -0
  268. package/dist/routes/pagination.js.map +1 -1
  269. package/dist/routes/policies.d.ts +2 -1
  270. package/dist/routes/policies.d.ts.map +1 -1
  271. package/dist/routes/policies.js +3 -1
  272. package/dist/routes/policies.js.map +1 -1
  273. package/dist/routes/project-mismatch.d.ts +22 -0
  274. package/dist/routes/project-mismatch.d.ts.map +1 -0
  275. package/dist/routes/project-mismatch.js +34 -0
  276. package/dist/routes/project-mismatch.js.map +1 -0
  277. package/dist/routes/projects.d.ts +15 -4
  278. package/dist/routes/projects.d.ts.map +1 -1
  279. package/dist/routes/projects.js +100 -9
  280. package/dist/routes/projects.js.map +1 -1
  281. package/dist/routes/proposals.d.ts +25 -17
  282. package/dist/routes/proposals.d.ts.map +1 -1
  283. package/dist/routes/proposals.js +340 -507
  284. package/dist/routes/proposals.js.map +1 -1
  285. package/dist/routes/provenance.d.ts +17 -3
  286. package/dist/routes/provenance.d.ts.map +1 -1
  287. package/dist/routes/provenance.js +79 -103
  288. package/dist/routes/provenance.js.map +1 -1
  289. package/dist/routes/providers.d.ts +17 -1
  290. package/dist/routes/providers.d.ts.map +1 -1
  291. package/dist/routes/providers.js +110 -3
  292. package/dist/routes/providers.js.map +1 -1
  293. package/dist/routes/public-run-tokens.d.ts.map +1 -1
  294. package/dist/routes/public-run-tokens.js +3 -0
  295. package/dist/routes/public-run-tokens.js.map +1 -1
  296. package/dist/routes/readable-projects.d.ts +26 -0
  297. package/dist/routes/readable-projects.d.ts.map +1 -0
  298. package/dist/routes/readable-projects.js +39 -0
  299. package/dist/routes/readable-projects.js.map +1 -0
  300. package/dist/routes/runs.d.ts +10 -0
  301. package/dist/routes/runs.d.ts.map +1 -1
  302. package/dist/routes/runs.js +92 -42
  303. package/dist/routes/runs.js.map +1 -1
  304. package/dist/routes/schedules.d.ts +21 -13
  305. package/dist/routes/schedules.d.ts.map +1 -1
  306. package/dist/routes/schedules.js +416 -55
  307. package/dist/routes/schedules.js.map +1 -1
  308. package/dist/routes/segments.d.ts +2 -0
  309. package/dist/routes/segments.d.ts.map +1 -1
  310. package/dist/routes/segments.js +5 -0
  311. package/dist/routes/segments.js.map +1 -1
  312. package/dist/routes/service-accounts.d.ts +17 -0
  313. package/dist/routes/service-accounts.d.ts.map +1 -0
  314. package/dist/routes/service-accounts.js +212 -0
  315. package/dist/routes/service-accounts.js.map +1 -0
  316. package/dist/routes/sign-in-options.d.ts +50 -0
  317. package/dist/routes/sign-in-options.d.ts.map +1 -0
  318. package/dist/routes/sign-in-options.js +98 -0
  319. package/dist/routes/sign-in-options.js.map +1 -0
  320. package/dist/routes/signing-keys.d.ts +2 -1
  321. package/dist/routes/signing-keys.d.ts.map +1 -1
  322. package/dist/routes/signing-keys.js +3 -1
  323. package/dist/routes/signing-keys.js.map +1 -1
  324. package/dist/routes/tenant-access.d.ts +13 -0
  325. package/dist/routes/tenant-access.d.ts.map +1 -0
  326. package/dist/routes/tenant-access.js +26 -0
  327. package/dist/routes/tenant-access.js.map +1 -0
  328. package/dist/routes/tenant.d.ts.map +1 -1
  329. package/dist/routes/tenant.js +4 -0
  330. package/dist/routes/tenant.js.map +1 -1
  331. package/dist/routes/token-sign-in.d.ts +36 -0
  332. package/dist/routes/token-sign-in.d.ts.map +1 -0
  333. package/dist/routes/token-sign-in.js +101 -0
  334. package/dist/routes/token-sign-in.js.map +1 -0
  335. package/dist/routes/tokens.d.ts +15 -5
  336. package/dist/routes/tokens.d.ts.map +1 -1
  337. package/dist/routes/tokens.js +162 -43
  338. package/dist/routes/tokens.js.map +1 -1
  339. package/dist/routes/tools.d.ts.map +1 -1
  340. package/dist/routes/tools.js +9 -1
  341. package/dist/routes/tools.js.map +1 -1
  342. package/dist/routes/trigger-access.d.ts +29 -0
  343. package/dist/routes/trigger-access.d.ts.map +1 -0
  344. package/dist/routes/trigger-access.js +33 -0
  345. package/dist/routes/trigger-access.js.map +1 -0
  346. package/dist/routes/webhook-endpoints.d.ts +2 -1
  347. package/dist/routes/webhook-endpoints.d.ts.map +1 -1
  348. package/dist/routes/webhook-endpoints.js +11 -3
  349. package/dist/routes/webhook-endpoints.js.map +1 -1
  350. package/dist/routes/webhooks.d.ts +5 -1
  351. package/dist/routes/webhooks.d.ts.map +1 -1
  352. package/dist/routes/webhooks.js +25 -2
  353. package/dist/routes/webhooks.js.map +1 -1
  354. package/dist/run-failure.d.ts +21 -0
  355. package/dist/run-failure.d.ts.map +1 -0
  356. package/dist/run-failure.js +29 -0
  357. package/dist/run-failure.js.map +1 -0
  358. package/dist/service-account-binding.d.ts +108 -0
  359. package/dist/service-account-binding.d.ts.map +1 -0
  360. package/dist/service-account-binding.js +4 -0
  361. package/dist/service-account-binding.js.map +1 -0
  362. package/dist/session-store-binding.d.ts +61 -13
  363. package/dist/session-store-binding.d.ts.map +1 -1
  364. package/dist/signed-export.d.ts +89 -0
  365. package/dist/signed-export.d.ts.map +1 -0
  366. package/dist/signed-export.js +149 -0
  367. package/dist/signed-export.js.map +1 -0
  368. package/dist/supervisor-binding.d.ts +186 -413
  369. package/dist/supervisor-binding.d.ts.map +1 -1
  370. package/dist/testing/app-bindings.d.ts +33 -0
  371. package/dist/testing/app-bindings.d.ts.map +1 -0
  372. package/dist/testing/app-bindings.js +112 -0
  373. package/dist/testing/app-bindings.js.map +1 -0
  374. package/dist/testing/index.d.ts +11 -0
  375. package/dist/testing/index.d.ts.map +1 -0
  376. package/dist/testing/index.js +13 -0
  377. package/dist/testing/index.js.map +1 -0
  378. package/dist/testing/stub-binding.d.ts +34 -0
  379. package/dist/testing/stub-binding.d.ts.map +1 -0
  380. package/dist/testing/stub-binding.js +42 -0
  381. package/dist/testing/stub-binding.js.map +1 -0
  382. package/dist/testing/trigger-registry.d.ts +21 -0
  383. package/dist/testing/trigger-registry.d.ts.map +1 -0
  384. package/dist/testing/trigger-registry.js +206 -0
  385. package/dist/testing/trigger-registry.js.map +1 -0
  386. package/dist/token-admin.d.ts +46 -8
  387. package/dist/token-admin.d.ts.map +1 -1
  388. package/dist/token-admin.js.map +1 -1
  389. package/dist/tool-binding.d.ts +13 -0
  390. package/dist/tool-binding.d.ts.map +1 -1
  391. package/dist/trigger-binding.d.ts +2 -2
  392. package/dist/trigger-binding.d.ts.map +1 -1
  393. package/dist/trigger-binding.js +1 -1
  394. package/dist/trigger-binding.js.map +1 -1
  395. package/dist/types.d.ts +16 -0
  396. package/dist/types.d.ts.map +1 -1
  397. package/dist/webhook-endpoint-binding.d.ts +19 -3
  398. package/dist/webhook-endpoint-binding.d.ts.map +1 -1
  399. package/dist/webhook-endpoint-binding.js +1 -1
  400. package/dist/webhook-endpoint-binding.js.map +1 -1
  401. package/openapi.json +15387 -8789
  402. package/package.json +26 -22
  403. package/src/agent-binding.ts +14 -0
  404. package/src/agent-pins.ts +18 -2
  405. package/src/app.ts +366 -80
  406. package/src/block-publish.ts +181 -0
  407. package/src/caller.ts +62 -0
  408. package/src/capability-binding.ts +12 -0
  409. package/src/cost-binding.ts +19 -0
  410. package/src/derive-agent-version.ts +9 -1
  411. package/src/errors.ts +75 -7
  412. package/src/eval-case-binding.ts +17 -1
  413. package/src/eval-run-binding.ts +31 -0
  414. package/src/eval-run-dispatcher.ts +7 -0
  415. package/src/eval-sample.ts +42 -0
  416. package/src/eval-suite-binding.ts +14 -0
  417. package/src/flow-binding.ts +19 -0
  418. package/src/flow-pins.ts +18 -2
  419. package/src/gate.ts +26 -0
  420. package/src/handler-binding.ts +36 -1
  421. package/src/hitl-binding.ts +24 -0
  422. package/src/identity-directory-binding.ts +85 -4
  423. package/src/identity-provider-binding.ts +216 -21
  424. package/src/improvement-pass-binding.ts +193 -0
  425. package/src/index.ts +153 -31
  426. package/src/judged-dispatcher.ts +78 -11
  427. package/src/judgment-binding.ts +25 -1
  428. package/src/mcp-endpoint-binding.ts +7 -0
  429. package/src/memory-binding.ts +121 -17
  430. package/src/memory-erasure-binding.ts +156 -0
  431. package/src/middleware/auth.ts +228 -62
  432. package/src/middleware/authorize.ts +155 -3
  433. package/src/middleware/error-mapper.ts +15 -1
  434. package/src/middleware/idempotency.ts +230 -43
  435. package/src/middleware/key-project.ts +86 -0
  436. package/src/middleware/principal.ts +9 -5
  437. package/src/middleware/project-ref.ts +3 -0
  438. package/src/openapi/generate.ts +11 -2
  439. package/src/openapi/operations.ts +1060 -143
  440. package/src/openapi/schemas.ts +2387 -469
  441. package/src/person-grants-binding.ts +76 -0
  442. package/src/proposal-service.ts +640 -0
  443. package/src/proposal-status.ts +176 -0
  444. package/src/provider-binding.ts +10 -0
  445. package/src/publish-refused.ts +56 -9
  446. package/src/routes/adapters.ts +4 -0
  447. package/src/routes/agent-releases.ts +121 -69
  448. package/src/routes/agents.ts +128 -1
  449. package/src/routes/approvals.ts +164 -154
  450. package/src/routes/artifacts.ts +181 -11
  451. package/src/routes/auth.ts +804 -336
  452. package/src/routes/blocks.ts +2 -53
  453. package/src/routes/capabilities.ts +10 -1
  454. package/src/routes/compliance.ts +60 -99
  455. package/src/routes/conversations.ts +101 -7
  456. package/src/routes/cost.ts +110 -4
  457. package/src/routes/denied.ts +28 -0
  458. package/src/routes/deployments.ts +210 -17
  459. package/src/routes/eval-comparison.ts +81 -2
  460. package/src/routes/eval-overrides.ts +108 -0
  461. package/src/routes/eval-runs.ts +89 -6
  462. package/src/routes/eval-suites.ts +32 -2
  463. package/src/routes/event-triggers.ts +27 -3
  464. package/src/routes/export-signing-keys.ts +31 -0
  465. package/src/routes/flows.ts +12 -1
  466. package/src/routes/gate-policies.ts +37 -6
  467. package/src/routes/guardrails.ts +61 -2
  468. package/src/routes/identity.ts +328 -10
  469. package/src/routes/improvement-passes.ts +541 -0
  470. package/src/routes/judged-suites.ts +113 -43
  471. package/src/routes/judgment-context.ts +76 -5
  472. package/src/routes/judgment-flow-context.ts +16 -2
  473. package/src/routes/judgments.ts +17 -3
  474. package/src/routes/mcp.ts +29 -1
  475. package/src/routes/memory-access.ts +160 -0
  476. package/src/routes/memory-erasures.ts +240 -0
  477. package/src/routes/memory-parse.ts +250 -0
  478. package/src/routes/memory.ts +244 -286
  479. package/src/routes/observations.ts +15 -2
  480. package/src/routes/pagination.ts +12 -0
  481. package/src/routes/policies.ts +7 -1
  482. package/src/routes/project-mismatch.ts +56 -0
  483. package/src/routes/projects.ts +107 -13
  484. package/src/routes/proposals.ts +370 -611
  485. package/src/routes/provenance.ts +99 -133
  486. package/src/routes/providers.ts +142 -3
  487. package/src/routes/public-run-tokens.ts +3 -0
  488. package/src/routes/readable-projects.ts +66 -0
  489. package/src/routes/runs.ts +119 -39
  490. package/src/routes/schedules.ts +472 -60
  491. package/src/routes/segments.ts +11 -0
  492. package/src/routes/service-accounts.ts +262 -0
  493. package/src/routes/sign-in-options.ts +168 -0
  494. package/src/routes/signing-keys.ts +7 -1
  495. package/src/routes/tenant-access.ts +37 -0
  496. package/src/routes/tenant.ts +6 -0
  497. package/src/routes/token-sign-in.ts +161 -0
  498. package/src/routes/tokens.ts +172 -46
  499. package/src/routes/tools.ts +12 -1
  500. package/src/routes/trigger-access.ts +72 -0
  501. package/src/routes/webhook-endpoints.ts +15 -3
  502. package/src/routes/webhooks.ts +26 -2
  503. package/src/run-failure.ts +42 -0
  504. package/src/service-account-binding.ts +113 -0
  505. package/src/session-store-binding.ts +65 -13
  506. package/src/signed-export.ts +250 -0
  507. package/src/supervisor-binding.ts +169 -409
  508. package/src/testing/app-bindings.ts +142 -0
  509. package/src/testing/index.ts +21 -0
  510. package/src/testing/stub-binding.ts +53 -0
  511. package/src/testing/trigger-registry.ts +259 -0
  512. package/src/token-admin.ts +40 -8
  513. package/src/tool-binding.ts +14 -0
  514. package/src/trigger-binding.ts +8 -1
  515. package/src/types.ts +16 -0
  516. package/src/webhook-endpoint-binding.ts +18 -3
@@ -0,0 +1,541 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+
4
+ import { type Context, Hono } from 'hono';
5
+
6
+ import { type AgentId, tunableKeys } from '@kindgi/agents';
7
+ import { type Action, ref } from '@kindgi/authz';
8
+ import type { Cursor, Semver, TenantId } from '@kindgi/types';
9
+
10
+ import type { AgentRegistryBinding, AgentVersionRecord } from '../agent-binding.js';
11
+ import type { BlockRegistryBinding } from '../block-binding.js';
12
+ import { statusFor, toWireError } from '../errors.js';
13
+ import type { EvalClassWeights } from '../eval-run-binding.js';
14
+ import {
15
+ IMPROVE_SCHEDULE_DEFAULTS,
16
+ type ImproveScheduleInput,
17
+ type ImproveThreshold,
18
+ type ImprovementBudget,
19
+ type ImprovementModel,
20
+ type ImprovementPass,
21
+ type ImprovementPassBinding,
22
+ type ImprovementTier,
23
+ } from '../improvement-pass-binding.js';
24
+ import type { AgentReleaseBindings } from '../live-version-binding.js';
25
+ import type { Authorizer } from '../middleware/authorize.js';
26
+ import type { ProposalObjective } from '../supervisor-binding.js';
27
+ import type { AppEnv } from '../types.js';
28
+ import { actorOf, coordinatesOf } from './agent-releases.js';
29
+ import { liveScopeToWire, parseLiveScopeBody } from './live-scope-wire.js';
30
+ import { clampLimit } from './pagination.js';
31
+
32
+ type Ctx = Context<AppEnv>;
33
+
34
+ /** What `improve` checks a pass against before it starts. */
35
+ export interface ImproveDeps {
36
+ readonly passes?: ImprovementPassBinding;
37
+ readonly agents: AgentRegistryBinding;
38
+ readonly blocks: BlockRegistryBinding;
39
+ readonly releases: AgentReleaseBindings;
40
+ }
41
+
42
+ export const DEFAULT_BUDGET: ImprovementBudget = { maxCostUsd: 5, maxCandidates: 30 };
43
+ const MAX_COST_USD = 100;
44
+ const MAX_CANDIDATES = 200;
45
+ const OBJECTIVES: readonly ProposalObjective[] = ['weightedYesShare', 'weightedPrecisionAtK'];
46
+
47
+ /**
48
+ * `POST /improve` (under `/v1/proposals`): start an improvement pass for
49
+ * an agent version and a live scope. It answers 202 with the pass; the
50
+ * pass carries on in the background (`GET /v1/improvement-passes/:id`).
51
+ *
52
+ * Checked first, as evaluating its proposal would be: the version must be
53
+ * active and pinned, it must pin a settings block with tunable keys, the
54
+ * agent registry must take writes, and the agent must have a live version
55
+ * for the whole tenant. Needs `publish` on the agent.
56
+ */
57
+ export function mountImproveRoute(r: Hono<AppEnv>, deps: ImproveDeps, authorizer?: Authorizer) {
58
+ r.post('/improve', async (c) => {
59
+ const tenantId = c.get('tenantId') as TenantId;
60
+ const body = await readBody(c);
61
+ if (body === undefined) return badInput(c, 'Request body must be a JSON object');
62
+ const parsed = parseImproveBody(body);
63
+ if (typeof parsed === 'string') return badInput(c, parsed);
64
+ const denied = await deny(c, authorizer, 'publish', parsed.agentId);
65
+ if (denied !== undefined) return denied;
66
+ if (deps.passes === undefined) return unsupported(c);
67
+ if (deps.agents.readOnly !== undefined) {
68
+ return fail(c, 'registry-read-only', {
69
+ code: 'registry-read-only',
70
+ message: deps.agents.readOnly.reason,
71
+ });
72
+ }
73
+ const fromVersion =
74
+ parsed.fromVersion ?? (await servingVersion(deps, tenantId, parsed.agentId, parsed.scope));
75
+ const from =
76
+ fromVersion === undefined
77
+ ? null
78
+ : await deps.agents.getVersion({
79
+ tenantId,
80
+ agentId: parsed.agentId as AgentId,
81
+ version: fromVersion as Semver,
82
+ });
83
+ if (from === null || from.unregisteredAt !== undefined) {
84
+ return fail(c, 'agent-version-not-found', {
85
+ code: 'agent-version-not-found',
86
+ message: `${parsed.agentId} has no active version ${fromVersion ?? '(none is registered)'}`,
87
+ });
88
+ }
89
+ const nothing = await nothingToTune(deps.blocks, tenantId, from, parsed.tiers[0]);
90
+ if (nothing !== undefined) {
91
+ return fail(c, 'validation-failed', {
92
+ code: 'validation-failed',
93
+ message: nothing,
94
+ issues: [],
95
+ });
96
+ }
97
+ if ((await deps.releases.live.resolve({ tenantId, agentId: parsed.agentId })) === null) {
98
+ return fail(c, 'proposal-needs-pin', {
99
+ code: 'proposal-needs-pin',
100
+ message: `${parsed.agentId} has no live version for the whole tenant, so the version a pass proposes would serve every scope nothing is pinned for. Promote its current version for the tenant first (scope { "kind": "tenant" }), then start the pass.`,
101
+ });
102
+ }
103
+ const pass = await deps.passes.start({
104
+ tenantId,
105
+ ...(from.projectId !== undefined && { projectId: from.projectId }),
106
+ agentId: parsed.agentId,
107
+ fromVersion: from.version as unknown as string,
108
+ scope: parsed.scope,
109
+ suiteId: parsed.suiteId,
110
+ tiers: parsed.tiers,
111
+ objective: parsed.objective,
112
+ classWeights: parsed.classWeights,
113
+ ...(parsed.model !== undefined && { model: parsed.model }),
114
+ ...(parsed.candidates !== undefined && { candidates: parsed.candidates }),
115
+ budget: parsed.budget,
116
+ requestedBy: actorOf(c),
117
+ });
118
+ c.status(202);
119
+ return c.json(serializePass(pass));
120
+ });
121
+ }
122
+
123
+ /**
124
+ * `/v1/improvement-passes`: read passes back, and cancel one.
125
+ *
126
+ * GET / newest first; `?agentId=` narrows
127
+ * GET /:passId one
128
+ * POST /:passId/cancel stop a running pass (it writes no proposal)
129
+ *
130
+ * Authorized on the pass's agent: `read`, and `publish` to cancel. A pass
131
+ * the caller can't read answers 404.
132
+ */
133
+ export function improvementPassesRouter(
134
+ passes: ImprovementPassBinding | undefined,
135
+ authorizer?: Authorizer,
136
+ ): Hono<AppEnv> {
137
+ const r = new Hono<AppEnv>();
138
+
139
+ async function load(c: Ctx): Promise<ImprovementPass | Response> {
140
+ if (passes === undefined) return unsupported(c);
141
+ const passId = c.req.param('passId') ?? '';
142
+ const pass = await passes.get({ tenantId: c.get('tenantId') as TenantId, passId });
143
+ const hidden =
144
+ pass !== null &&
145
+ authorizer !== undefined &&
146
+ !(await authorizer.can(c, 'read', ref('agent', pass.agentId)));
147
+ if (pass === null || hidden) {
148
+ return fail(c, 'improvement-pass-not-found', {
149
+ code: 'improvement-pass-not-found',
150
+ message: `No improvement pass ${passId}`,
151
+ passId,
152
+ });
153
+ }
154
+ return pass;
155
+ }
156
+
157
+ r.get('/', async (c) => {
158
+ if (passes === undefined) return unsupported(c);
159
+ const agentId = c.req.query('agentId');
160
+ const cursor = c.req.query('cursor');
161
+ const page = await passes.list({
162
+ tenantId: c.get('tenantId') as TenantId,
163
+ limit: clampLimit(c.req.query('limit')),
164
+ ...(agentId !== undefined && agentId !== '' && { agentId }),
165
+ ...(cursor !== undefined && cursor !== '' && { cursor: cursor as Cursor }),
166
+ });
167
+ const readable =
168
+ authorizer === undefined
169
+ ? page.data
170
+ : await authorizer.filterByCan(c, 'read', page.data, (p) => ref('agent', p.agentId));
171
+ return c.json({
172
+ data: readable.map(serializePass),
173
+ hasMore: page.nextCursor !== undefined,
174
+ ...(page.nextCursor !== undefined && { nextCursor: page.nextCursor as unknown as string }),
175
+ });
176
+ });
177
+
178
+ r.get('/:passId', async (c) => {
179
+ const pass = await load(c);
180
+ if (pass instanceof Response) return pass;
181
+ return c.json(serializePass(pass));
182
+ });
183
+
184
+ r.post('/:passId/cancel', async (c) => {
185
+ const pass = await load(c);
186
+ if (pass instanceof Response) return pass;
187
+ const denied = await deny(c, authorizer, 'publish', pass.agentId);
188
+ if (denied !== undefined) return denied;
189
+ const actor = actorOf(c);
190
+ const outcome = await (passes as ImprovementPassBinding).cancel({
191
+ tenantId: c.get('tenantId') as TenantId,
192
+ passId: pass.id,
193
+ by: `${actor.kind}:${actor.id}`,
194
+ });
195
+ if (outcome.kind === 'not-found') {
196
+ return fail(c, 'improvement-pass-not-found', {
197
+ code: 'improvement-pass-not-found',
198
+ message: `No improvement pass ${pass.id}`,
199
+ passId: pass.id,
200
+ });
201
+ }
202
+ if (outcome.kind === 'finished') {
203
+ return fail(c, 'improvement-pass-finished', {
204
+ code: 'improvement-pass-finished',
205
+ message: `Improvement pass ${pass.id} has ended (${outcome.pass.status}): there's nothing to cancel`,
206
+ passId: pass.id,
207
+ status: outcome.pass.status,
208
+ });
209
+ }
210
+ return c.json(serializePass(outcome.pass));
211
+ });
212
+
213
+ return r;
214
+ }
215
+
216
+ /** What serves the scope now: its live version, else the agent's latest. */
217
+ async function servingVersion(
218
+ deps: ImproveDeps,
219
+ tenantId: TenantId,
220
+ agentId: string,
221
+ scope: ImprovementPass['scope'],
222
+ ): Promise<string | undefined> {
223
+ const live = await deps.releases.live.resolve({ tenantId, agentId, ...coordinatesOf(scope) });
224
+ if (live !== null) return live.version as unknown as string;
225
+ const latest = await deps.agents.get({ tenantId, agentId: agentId as AgentId });
226
+ return latest?.version as unknown as string | undefined;
227
+ }
228
+
229
+ /** Why a pass of this tier has nothing to work on in this version; `undefined` when it has. */
230
+ async function nothingToTune(
231
+ blocks: BlockRegistryBinding,
232
+ tenantId: TenantId,
233
+ version: AgentVersionRecord,
234
+ tier: ImprovementTier | undefined,
235
+ ): Promise<string | undefined> {
236
+ const named = `${version.id as unknown as string} ${version.version as unknown as string}`;
237
+ if (tier === 'prompt') {
238
+ const prompt =
239
+ typeof version.instructions === 'object' ? version.instructions.prompt : undefined;
240
+ return prompt !== undefined && version.pins?.prompts[prompt] !== undefined
241
+ ? undefined
242
+ : `${named} doesn't take its instructions from a pinned prompt block: there's no template for a prompt pass to draft. Move the instructions into a prompt block and publish the agent again.`;
243
+ }
244
+ for (const [blockId, pinned] of Object.entries(version.pins?.settings ?? {})) {
245
+ if (version.modelSettings?.id === blockId) continue;
246
+ const block = await blocks.getVersion({ tenantId, blockId, version: pinned });
247
+ if (block?.kind === 'settings' && tunableKeys(block.content.schema).length > 0) {
248
+ return undefined;
249
+ }
250
+ }
251
+ return `${named} pins no settings block with keys marked "x-kindgi-tunable": there's nothing for a pass to tune. Mark the keys it may tune in the block's schema (a number or integer with a minimum and maximum, or an enum) and publish it.`;
252
+ }
253
+
254
+ export function serializePass(p: ImprovementPass): Record<string, unknown> {
255
+ return {
256
+ id: p.id,
257
+ agentId: p.agentId,
258
+ fromVersion: p.fromVersion,
259
+ scope: liveScopeToWire(p.scope),
260
+ suiteId: p.suiteId,
261
+ tiers: p.tiers,
262
+ objective: p.objective,
263
+ classWeights: p.classWeights,
264
+ ...(p.model !== undefined && { model: p.model }),
265
+ ...(p.candidates !== undefined && { candidates: p.candidates }),
266
+ budget: p.budget,
267
+ requestedBy: p.requestedBy,
268
+ status: p.status,
269
+ candidatesEvaluated: p.candidatesEvaluated,
270
+ costUsd: p.costUsd,
271
+ ...(p.outcome !== undefined && { outcome: p.outcome }),
272
+ ...(p.comparisons !== undefined && { comparisons: p.comparisons }),
273
+ ...(p.trigger !== undefined && { trigger: p.trigger }),
274
+ createdAt: p.createdAt,
275
+ updatedAt: p.updatedAt,
276
+ ...(p.finishedAt !== undefined && { finishedAt: p.finishedAt }),
277
+ };
278
+ }
279
+
280
+ // ---------- parsing ----------
281
+
282
+ interface ImproveBody {
283
+ readonly agentId: string;
284
+ readonly fromVersion?: string;
285
+ readonly scope: ImprovementPass['scope'];
286
+ readonly suiteId: string;
287
+ readonly tiers: readonly ImprovementTier[];
288
+ readonly objective: ProposalObjective;
289
+ readonly classWeights: EvalClassWeights;
290
+ readonly model?: ImprovementModel;
291
+ readonly candidates?: number;
292
+ readonly budget: ImprovementBudget;
293
+ }
294
+
295
+ const MAX_DRAFTED = 5;
296
+
297
+ /** `model` and `candidates`, for a prompt pass only; an error message otherwise. */
298
+ function parsePromptOptions(
299
+ b: Record<string, unknown>,
300
+ tier: ImprovementTier,
301
+ ): { model?: ImprovementModel; candidates?: number } | string {
302
+ if (tier !== 'prompt') {
303
+ return b.model !== undefined || b.candidates !== undefined
304
+ ? "`model` and `candidates` are for a prompt pass (`tiers: ['prompt']`)"
305
+ : {};
306
+ }
307
+ const m = b.model as Record<string, unknown> | undefined;
308
+ if (
309
+ typeof m !== 'object' ||
310
+ m === null ||
311
+ !nonEmpty(m.providerId) ||
312
+ !nonEmpty(m.model) ||
313
+ Object.keys(m).length !== 2
314
+ ) {
315
+ return "`model` is required for a prompt pass: { providerId, model }, the tenant's provider and model that drafts the templates";
316
+ }
317
+ const candidates = b.candidates ?? 3;
318
+ if (
319
+ typeof candidates !== 'number' ||
320
+ !Number.isInteger(candidates) ||
321
+ candidates < 1 ||
322
+ candidates > MAX_DRAFTED
323
+ ) {
324
+ return `\`candidates\` is how many templates to draft: 1 to ${MAX_DRAFTED}`;
325
+ }
326
+ return { model: { providerId: m.providerId, model: m.model }, candidates };
327
+ }
328
+
329
+ function nonEmpty(value: unknown): value is string {
330
+ return typeof value === 'string' && value.trim() !== '' && value.length <= 200;
331
+ }
332
+
333
+ function parseBudget(raw: unknown): ImprovementBudget | string {
334
+ if (raw === undefined) return DEFAULT_BUDGET;
335
+ const b = typeof raw === 'object' && raw !== null && !Array.isArray(raw) ? raw : undefined;
336
+ const o = b as Record<string, unknown> | undefined;
337
+ const cost = o?.maxCostUsd ?? DEFAULT_BUDGET.maxCostUsd;
338
+ const count = o?.maxCandidates ?? DEFAULT_BUDGET.maxCandidates;
339
+ if (
340
+ o === undefined ||
341
+ Object.keys(o).some((k) => k !== 'maxCostUsd' && k !== 'maxCandidates') ||
342
+ typeof cost !== 'number' ||
343
+ !(cost > 0 && cost <= MAX_COST_USD) ||
344
+ typeof count !== 'number' ||
345
+ !Number.isInteger(count) ||
346
+ count < 1 ||
347
+ count > MAX_CANDIDATES
348
+ ) {
349
+ return `\`budget\` is { maxCostUsd?: up to ${MAX_COST_USD}, maxCandidates?: 1 to ${MAX_CANDIDATES} }`;
350
+ }
351
+ return { maxCostUsd: cost, maxCandidates: count };
352
+ }
353
+
354
+ function parseImproveBody(b: Record<string, unknown>): ImproveBody | string {
355
+ const known = [
356
+ 'agentId',
357
+ 'fromVersion',
358
+ 'scope',
359
+ 'suiteId',
360
+ 'tiers',
361
+ 'objective',
362
+ 'classWeights',
363
+ 'model',
364
+ 'candidates',
365
+ 'budget',
366
+ ];
367
+ const extra = Object.keys(b).find((k) => !known.includes(k));
368
+ if (extra !== undefined) return `\`${extra}\` isn't a field of improve: { ${known.join(', ')} }`;
369
+ if (!nonEmpty(b.agentId)) return '`agentId` is required';
370
+ if (b.fromVersion !== undefined && !nonEmpty(b.fromVersion)) {
371
+ return '`fromVersion` must be a version when given (default: the one serving the scope)';
372
+ }
373
+ const scope = parseLiveScopeBody(b.scope);
374
+ if (scope.kind === 'err') return scope.message;
375
+ if (!nonEmpty(b.suiteId)) return '`suiteId` is required: the test set to search and prove on';
376
+ const options = parsePassOptions(b);
377
+ if (typeof options === 'string') return options;
378
+ return {
379
+ agentId: b.agentId,
380
+ ...(typeof b.fromVersion === 'string' && { fromVersion: b.fromVersion }),
381
+ scope: scope.scope,
382
+ suiteId: b.suiteId,
383
+ ...options,
384
+ };
385
+ }
386
+
387
+ type PassOptions = Pick<
388
+ ImproveBody,
389
+ 'tiers' | 'objective' | 'classWeights' | 'model' | 'candidates' | 'budget'
390
+ >;
391
+
392
+ /** A pass's options (`tiers`, `objective`, `classWeights`, `model`, `candidates`, `budget`), defaults applied. */
393
+ function parsePassOptions(b: Record<string, unknown>): PassOptions | string {
394
+ const tiers = b.tiers ?? ['settings'];
395
+ if (
396
+ !Array.isArray(tiers) ||
397
+ tiers.length !== 1 ||
398
+ (tiers[0] !== 'settings' && tiers[0] !== 'prompt')
399
+ ) {
400
+ return "`tiers` is ['settings'] (tunable settings values) or ['prompt'] (a drafted prompt template)";
401
+ }
402
+ const tier = tiers[0] as ImprovementTier;
403
+ if (b.objective !== undefined && !OBJECTIVES.includes(b.objective as ProposalObjective)) {
404
+ return `\`objective\` must be one of ${OBJECTIVES.join(', ')}`;
405
+ }
406
+ const classWeights = b.classWeights ?? 'restricted-only';
407
+ if (classWeights !== 'restricted-only' && classWeights !== 'as-recorded') {
408
+ return "`classWeights` is 'restricted-only' (trusted judgments, the default) or 'as-recorded'";
409
+ }
410
+ const prompt = parsePromptOptions(b, tier);
411
+ if (typeof prompt === 'string') return prompt;
412
+ const budget = parseBudget(b.budget);
413
+ if (typeof budget === 'string') return budget;
414
+ return {
415
+ tiers: [tier],
416
+ objective: (b.objective as ProposalObjective | undefined) ?? 'weightedYesShare',
417
+ classWeights,
418
+ ...prompt,
419
+ budget,
420
+ };
421
+ }
422
+
423
+ const MAX_MONTHLY_CAP_USD = 1000;
424
+ const MAX_THRESHOLD = 1000;
425
+
426
+ /**
427
+ * An `improve` schedule's input (`config.input`), defaults applied: the
428
+ * pass options `improve` takes (no agent, scope or test set: the schedule
429
+ * names those, and each pass builds its test set), plus `threshold` and
430
+ * `monthlyCapUsd`.
431
+ */
432
+ export function parseImproveScheduleInput(
433
+ raw: unknown,
434
+ ): { kind: 'ok'; input: ImproveScheduleInput } | { kind: 'err'; message: string } {
435
+ const err = (message: string) => ({ kind: 'err' as const, message });
436
+ const b = raw ?? {};
437
+ if (typeof b !== 'object' || Array.isArray(b)) {
438
+ return err("An improve schedule's `config.input` is an object of pass options");
439
+ }
440
+ const o = b as Record<string, unknown>;
441
+ const known = [
442
+ 'tiers',
443
+ 'objective',
444
+ 'classWeights',
445
+ 'model',
446
+ 'candidates',
447
+ 'budget',
448
+ 'threshold',
449
+ 'monthlyCapUsd',
450
+ ];
451
+ const extra = Object.keys(o).find((k) => !known.includes(k));
452
+ if (extra !== undefined) {
453
+ return err(
454
+ `\`${extra}\` isn't an option of an improve schedule's \`config.input\`: { ${known.join(', ')} }`,
455
+ );
456
+ }
457
+ const options = parsePassOptions(o);
458
+ if (typeof options === 'string') return err(options);
459
+ const threshold = parseThreshold(o.threshold);
460
+ if (typeof threshold === 'string') return err(threshold);
461
+ const cap = o.monthlyCapUsd ?? IMPROVE_SCHEDULE_DEFAULTS.monthlyCapUsd;
462
+ if (typeof cap !== 'number' || !(cap > 0 && cap <= MAX_MONTHLY_CAP_USD)) {
463
+ return err(
464
+ `\`monthlyCapUsd\` is the most its passes may cost a month: more than 0, up to ${MAX_MONTHLY_CAP_USD}`,
465
+ );
466
+ }
467
+ return { kind: 'ok', input: { ...options, threshold, monthlyCapUsd: cap } };
468
+ }
469
+
470
+ function parseThreshold(raw: unknown): ImproveThreshold | string {
471
+ const d = IMPROVE_SCHEDULE_DEFAULTS.threshold;
472
+ if (raw === undefined) return d;
473
+ const o =
474
+ typeof raw === 'object' && raw !== null && !Array.isArray(raw)
475
+ ? (raw as Record<string, unknown>)
476
+ : undefined;
477
+ const t = {
478
+ judgments: o?.judgments ?? d.judgments,
479
+ runs: o?.runs ?? d.runs,
480
+ judges: o?.judges ?? d.judges,
481
+ };
482
+ const whole = (v: unknown): v is number =>
483
+ typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= MAX_THRESHOLD;
484
+ if (
485
+ o === undefined ||
486
+ Object.keys(o).some((k) => !['judgments', 'runs', 'judges'].includes(k)) ||
487
+ !whole(t.judgments) ||
488
+ !whole(t.runs) ||
489
+ !whole(t.judges) ||
490
+ t.runs > t.judgments ||
491
+ t.judges > t.judgments
492
+ ) {
493
+ return `\`threshold\` is { judgments?, runs?, judges? }: how many trusted "no" judgments since the last pass (default ${d.judgments}), across how many runs (${d.runs}) and from how many judges (${d.judges}); runs and judges at most judgments`;
494
+ }
495
+ return t as ImproveThreshold;
496
+ }
497
+
498
+ async function readBody(c: Ctx): Promise<Record<string, unknown> | undefined> {
499
+ const text = await c.req.text();
500
+ if (text.trim() === '') return {};
501
+ try {
502
+ const value: unknown = JSON.parse(text);
503
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
504
+ ? (value as Record<string, unknown>)
505
+ : undefined;
506
+ } catch {
507
+ return undefined;
508
+ }
509
+ }
510
+
511
+ // ---------- helpers ----------
512
+
513
+ async function deny(c: Ctx, authorizer: Authorizer | undefined, action: Action, agentId: string) {
514
+ if (authorizer === undefined) return undefined;
515
+ const decision = await authorizer.check(c, action, ref('agent', agentId));
516
+ if (decision.allowed) return undefined;
517
+ return fail(c, 'permission-denied', {
518
+ code: 'permission-denied',
519
+ message: `Permission denied: this needs ${action} on agent "${agentId}" (${decision.reason})`,
520
+ });
521
+ }
522
+
523
+ function unsupported(c: Ctx) {
524
+ return fail(c, 'improve-unsupported', {
525
+ code: 'improve-unsupported',
526
+ message: "This runtime doesn't run improvement passes.",
527
+ });
528
+ }
529
+
530
+ function fail(
531
+ c: Ctx,
532
+ code: string,
533
+ error: { code: string; message: string } & Record<string, unknown>,
534
+ ) {
535
+ c.status(statusFor(code) as never);
536
+ return c.json(toWireError(error, c.get('requestId')));
537
+ }
538
+
539
+ function badInput(c: Ctx, message: string) {
540
+ return fail(c, 'bad-input', { code: 'bad-input', message });
541
+ }