@nylorun/runtime 0.26.0-beta → 0.28.0-beta

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 (379) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +18 -14
  3. package/dist/adapters/execution/restate.d.ts +15 -18
  4. package/dist/adapters/execution/restate.js +31 -27
  5. package/dist/adapters/replication/pgoutput.d.ts +1 -1
  6. package/dist/adapters/replication/pgoutput.js +3 -2
  7. package/dist/adapters/sandbox/local.js +8 -5
  8. package/dist/adapters/sandbox/virtual.js +2 -2
  9. package/dist/adapters/streams/s2.d.ts +1 -1
  10. package/dist/adapters/streams/s2.js +18 -14
  11. package/dist/api/a2a/card.d.ts +4 -3
  12. package/dist/api/a2a/card.js +4 -4
  13. package/dist/api/a2a/endpoint.js +3 -4
  14. package/dist/api/a2a/protocol.js +4 -0
  15. package/dist/api/a2a/routes.d.ts +2 -6
  16. package/dist/api/a2a/routes.js +30 -25
  17. package/dist/api/ag-ui/endpoint.js +2 -3
  18. package/dist/api/ag-ui/routes.js +8 -11
  19. package/dist/api/components.d.ts +6789 -3405
  20. package/dist/api/components.js +43 -30
  21. package/dist/api/gate/keys.js +7 -4
  22. package/dist/api/gate/routes.d.ts +6 -2
  23. package/dist/api/gate/routes.js +15 -11
  24. package/dist/api/http/app.js +9 -4
  25. package/dist/api/http/body.d.ts +17 -3
  26. package/dist/api/http/body.js +35 -7
  27. package/dist/api/http/respond.js +6 -2
  28. package/dist/api/http/routes/access.js +5 -4
  29. package/dist/api/http/routes/agent-manifests.d.ts +10 -0
  30. package/dist/api/http/routes/agent-manifests.js +135 -0
  31. package/dist/api/http/routes/agents.d.ts +11 -0
  32. package/dist/api/http/routes/agents.js +418 -0
  33. package/dist/api/http/routes/artifacts.js +21 -9
  34. package/dist/api/http/routes/coverage.d.ts +4 -4
  35. package/dist/api/http/routes/coverage.js +13 -7
  36. package/dist/api/http/routes/files.d.ts +2 -1
  37. package/dist/api/http/routes/files.js +31 -5
  38. package/dist/api/http/routes/mcp.js +3 -3
  39. package/dist/api/http/routes/me.d.ts +1 -1
  40. package/dist/api/http/routes/me.js +1 -2
  41. package/dist/api/http/routes/memories.d.ts +9 -0
  42. package/dist/api/http/routes/memories.js +152 -0
  43. package/dist/api/http/routes/reads.d.ts +10 -111
  44. package/dist/api/http/routes/reads.js +51 -29
  45. package/dist/api/http/routes/sessions.js +26 -54
  46. package/dist/api/http/routes/tenant.d.ts +2 -2
  47. package/dist/api/http/routes/tenant.js +77 -24
  48. package/dist/api/http/routes/triggers.d.ts +10 -0
  49. package/dist/api/http/routes/triggers.js +180 -0
  50. package/dist/api/inbound-files.d.ts +3 -9
  51. package/dist/api/inbound-files.js +18 -24
  52. package/dist/api/openapi.js +73 -47
  53. package/dist/artifacts/disk.d.ts +10 -14
  54. package/dist/artifacts/disk.js +99 -95
  55. package/dist/artifacts/files.d.ts +13 -4
  56. package/dist/artifacts/files.js +27 -9
  57. package/dist/artifacts/folder-upload.d.ts +75 -0
  58. package/dist/artifacts/folder-upload.js +263 -0
  59. package/dist/artifacts/folders.d.ts +14 -8
  60. package/dist/artifacts/folders.js +19 -11
  61. package/dist/artifacts/links.js +7 -6
  62. package/dist/artifacts/parts.d.ts +9 -14
  63. package/dist/artifacts/parts.js +11 -9
  64. package/dist/artifacts/pipe.d.ts +15 -0
  65. package/dist/artifacts/pipe.js +71 -0
  66. package/dist/artifacts/quota.d.ts +36 -0
  67. package/dist/artifacts/quota.js +44 -0
  68. package/dist/artifacts/service.d.ts +25 -1
  69. package/dist/artifacts/service.js +72 -27
  70. package/dist/blob/fs.js +2 -1
  71. package/dist/blob/s3.d.ts +6 -2
  72. package/dist/blob/s3.js +9 -7
  73. package/dist/blob/types.d.ts +1 -1
  74. package/dist/blob/types.js +1 -1
  75. package/dist/core/flow-host.d.ts +0 -1
  76. package/dist/core/limits.d.ts +11 -35
  77. package/dist/core/limits.js +5 -73
  78. package/dist/core/sandbox-routes.js +0 -1
  79. package/dist/core/turn-manifest.d.ts +1 -2
  80. package/dist/core/turn-manifest.js +4 -28
  81. package/dist/execution/memory.d.ts +8 -5
  82. package/dist/execution/memory.js +8 -6
  83. package/dist/execution/types.d.ts +1 -6
  84. package/dist/execution/types.js +0 -5
  85. package/dist/gates/contract.d.ts +3 -2
  86. package/dist/gates/contract.js +1 -1
  87. package/dist/gates/egress-credentials.js +5 -4
  88. package/dist/gates/egress.d.ts +13 -13
  89. package/dist/gates/egress.js +19 -21
  90. package/dist/gates/fixture-model.js +13 -2
  91. package/dist/gates/handler.d.ts +1 -3
  92. package/dist/gates/handler.js +4 -3
  93. package/dist/gates/http-client.d.ts +4 -3
  94. package/dist/gates/http-client.js +5 -7
  95. package/dist/gates/http-tool.d.ts +24 -4
  96. package/dist/gates/http-tool.js +41 -13
  97. package/dist/gates/in-process.d.ts +2 -1
  98. package/dist/gates/in-process.js +17 -9
  99. package/dist/gates/inflight.d.ts +2 -2
  100. package/dist/gates/inflight.js +3 -2
  101. package/dist/gates/journal.js +5 -7
  102. package/dist/gates/mcp-handler.d.ts +4 -3
  103. package/dist/gates/mcp-handler.js +15 -5
  104. package/dist/gates/meter.js +6 -5
  105. package/dist/gates/model-gate.d.ts +11 -2
  106. package/dist/gates/policy.d.ts +34 -6
  107. package/dist/gates/policy.js +66 -18
  108. package/dist/gates/provider-gate.d.ts +22 -0
  109. package/dist/gates/provider-gate.js +30 -0
  110. package/dist/gates/tool-calls.d.ts +1 -3
  111. package/dist/gates/tool-calls.js +2 -3
  112. package/dist/gates/tool-client.d.ts +1 -1
  113. package/dist/gates/tool-client.js +5 -6
  114. package/dist/gates/tool-contract.d.ts +8 -5
  115. package/dist/gates/tool-contract.js +1 -1
  116. package/dist/gates/tool-gate.d.ts +18 -7
  117. package/dist/gates/tool-gate.js +49 -7
  118. package/dist/harness/calls.d.ts +27 -25
  119. package/dist/harness/calls.js +40 -46
  120. package/dist/harness/executors.d.ts +10 -3
  121. package/dist/harness/executors.js +53 -23
  122. package/dist/harness/main.js +2 -2
  123. package/dist/harness/pod.d.ts +2 -2
  124. package/dist/harness/pod.js +7 -6
  125. package/dist/harness/run-tokens.d.ts +4 -1
  126. package/dist/harness/run-tokens.js +6 -2
  127. package/dist/harness/service.d.ts +17 -14
  128. package/dist/harness/service.js +21 -35
  129. package/dist/harness/setup.d.ts +0 -2
  130. package/dist/harness/setup.js +21 -15
  131. package/dist/harness/ws-client.d.ts +2 -2
  132. package/dist/harness/ws-client.js +7 -5
  133. package/dist/harness/ws-port.d.ts +3 -4
  134. package/dist/harness/ws-port.js +3 -4
  135. package/dist/harness-api/artifacts.d.ts +20 -0
  136. package/dist/harness-api/artifacts.js +478 -0
  137. package/dist/harness-api/in-process.d.ts +2 -2
  138. package/dist/harness-api/in-process.js +18 -16
  139. package/dist/harness-api/record.d.ts +10 -9
  140. package/dist/harness-api/record.js +113 -157
  141. package/dist/harness-api/renew.d.ts +1 -1
  142. package/dist/harness-api/renew.js +2 -2
  143. package/dist/harness-api/server.d.ts +1 -16
  144. package/dist/harness-api/server.js +86 -73
  145. package/dist/harness-api/start.d.ts +27 -5
  146. package/dist/harness-api/start.js +102 -19
  147. package/dist/harness-api/tool-journal.d.ts +15 -10
  148. package/dist/harness-api/tool-journal.js +26 -24
  149. package/dist/harness-api/workspace.d.ts +0 -4
  150. package/dist/harness-api/workspace.js +4 -47
  151. package/dist/harness-api/ws-server.js +10 -10
  152. package/dist/host/create-host.js +2 -3
  153. package/dist/host/execution.js +2 -3
  154. package/dist/host/gates.d.ts +2 -9
  155. package/dist/host/gates.js +15 -12
  156. package/dist/host/http.d.ts +2 -4
  157. package/dist/host/http.js +5 -29
  158. package/dist/host/main.js +10 -3
  159. package/dist/host/operate.js +12 -3
  160. package/dist/host/stack-config.d.ts +11 -0
  161. package/dist/host/stack-config.js +21 -1
  162. package/dist/index.d.ts +0 -1
  163. package/dist/index.js +0 -1
  164. package/dist/infra/index.js +2 -1
  165. package/dist/infra/readiness.d.ts +0 -2
  166. package/dist/infra/readiness.js +4 -3
  167. package/dist/keys/client.d.ts +1 -0
  168. package/dist/keys/client.js +2 -3
  169. package/dist/keys/contract.d.ts +0 -2
  170. package/dist/keys/contract.js +0 -2
  171. package/dist/keys/egress-ca.d.ts +0 -2
  172. package/dist/keys/egress-ca.js +2 -3
  173. package/dist/keys/keys.d.ts +15 -4
  174. package/dist/keys/keys.js +22 -1
  175. package/dist/keys/webhooks.d.ts +25 -0
  176. package/dist/keys/webhooks.js +62 -0
  177. package/dist/keys/x509.d.ts +8 -4
  178. package/dist/keys/x509.js +14 -5
  179. package/dist/management-openapi.json +3043 -1954
  180. package/dist/mcp/connect.d.ts +35 -26
  181. package/dist/mcp/connect.js +112 -141
  182. package/dist/mcp/pool.d.ts +27 -22
  183. package/dist/mcp/pool.js +34 -48
  184. package/dist/mcp/preview.d.ts +12 -5
  185. package/dist/mcp/preview.js +43 -26
  186. package/dist/mcp/snapshot.d.ts +35 -86
  187. package/dist/mcp/snapshot.js +93 -135
  188. package/dist/memory/service.d.ts +97 -0
  189. package/dist/memory/service.js +335 -0
  190. package/dist/memory/tool.d.ts +36 -0
  191. package/dist/memory/tool.js +84 -0
  192. package/dist/model/auth-store.js +5 -3
  193. package/dist/model/capabilities.d.ts +1 -1
  194. package/dist/model/catalog.d.ts +9 -36
  195. package/dist/model/catalog.js +6 -33
  196. package/dist/model/descriptor.d.ts +51 -0
  197. package/dist/model/descriptor.js +83 -0
  198. package/dist/model/models.d.ts +0 -3
  199. package/dist/model/models.js +3 -5
  200. package/dist/model/native-blocks.js +1 -1
  201. package/dist/model/pi-model.d.ts +16 -5
  202. package/dist/model/pi-model.js +86 -105
  203. package/dist/openapi.json +13653 -9986
  204. package/dist/reads/cursor.js +3 -1
  205. package/dist/reads/types.d.ts +3 -3
  206. package/dist/record/agent.d.ts +27 -0
  207. package/dist/record/agent.js +46 -0
  208. package/dist/record/append.d.ts +34 -2
  209. package/dist/record/append.js +50 -1
  210. package/dist/record/index.d.ts +2 -2
  211. package/dist/record/index.js +2 -2
  212. package/dist/redact.d.ts +1 -1
  213. package/dist/redact.js +3 -2
  214. package/dist/sandbox/egress-token.d.ts +3 -3
  215. package/dist/sandbox/egress-token.js +3 -3
  216. package/dist/sandbox/join.js +8 -7
  217. package/dist/sandbox/manager.d.ts +41 -41
  218. package/dist/sandbox/manager.js +112 -44
  219. package/dist/sandbox/placement.d.ts +2 -2
  220. package/dist/sandbox/placement.js +7 -10
  221. package/dist/sandbox/pods/client.d.ts +1 -10
  222. package/dist/sandbox/pods/client.js +8 -4
  223. package/dist/sandbox/pods/lifecycle.d.ts +25 -17
  224. package/dist/sandbox/pods/lifecycle.js +51 -29
  225. package/dist/sandbox/pods/network-gate.d.ts +4 -5
  226. package/dist/sandbox/pods/network-gate.js +7 -7
  227. package/dist/sandbox/pods/reconcile.js +14 -3
  228. package/dist/sandbox/pods/spec.js +8 -5
  229. package/dist/sandbox/policy.d.ts +7 -1
  230. package/dist/sandbox/policy.js +10 -3
  231. package/dist/sandbox/resolve.d.ts +11 -6
  232. package/dist/sandbox/resolve.js +19 -9
  233. package/dist/sandbox/setup.d.ts +6 -2
  234. package/dist/sandbox/setup.js +47 -14
  235. package/dist/sandbox/share.d.ts +5 -14
  236. package/dist/sandbox/share.js +5 -34
  237. package/dist/sandbox/skills.d.ts +7 -13
  238. package/dist/sandbox/skills.js +16 -31
  239. package/dist/sandbox/tenant-config.d.ts +2 -2
  240. package/dist/sandbox/tenant-config.js +4 -3
  241. package/dist/sandbox/tools.d.ts +7 -1
  242. package/dist/sandbox/tools.js +26 -26
  243. package/dist/sandbox/types.d.ts +10 -3
  244. package/dist/sandbox/types.js +9 -0
  245. package/dist/store/postgres/connect.d.ts +6 -5
  246. package/dist/store/postgres/connect.js +14 -11
  247. package/dist/store/postgres/control.js +13 -13
  248. package/dist/store/postgres/drizzle/0028_artifact_write_keys.sql +2 -0
  249. package/dist/store/postgres/drizzle/0029_protocol_15.sql +11 -0
  250. package/dist/store/postgres/drizzle/0030_protocol_15_runtime_block.sql +11 -0
  251. package/dist/store/postgres/drizzle/0031_protocol_15_mcp_snapshot.sql +8 -0
  252. package/dist/store/postgres/drizzle/0032_agents.sql +54 -0
  253. package/dist/store/postgres/drizzle/0033_agent_versions.sql +7 -0
  254. package/dist/store/postgres/drizzle/0034_protocol_17_session_queue.sql +13 -0
  255. package/dist/store/postgres/drizzle/0035_t4_triggers.sql +41 -0
  256. package/dist/store/postgres/drizzle/0036_t5_memories.sql +30 -0
  257. package/dist/store/postgres/drizzle/meta/_journal.json +63 -0
  258. package/dist/store/postgres/reads.js +17 -82
  259. package/dist/store/postgres/record-writer.d.ts +4 -4
  260. package/dist/store/postgres/record-writer.js +9 -9
  261. package/dist/store/postgres/schema.d.ts +1382 -151
  262. package/dist/store/postgres/schema.js +191 -37
  263. package/dist/store/postgres/store.js +384 -105
  264. package/dist/store/postgres/tenant.js +1 -2
  265. package/dist/store/types.d.ts +172 -57
  266. package/dist/store/types.js +0 -1
  267. package/dist/streams/relay/core.d.ts +3 -3
  268. package/dist/streams/relay/core.js +9 -10
  269. package/dist/tenant/advance.js +41 -39
  270. package/dist/tenant/agent-manifests.d.ts +72 -0
  271. package/dist/tenant/agent-manifests.js +359 -0
  272. package/dist/tenant/agent-versions.d.ts +126 -0
  273. package/dist/tenant/agent-versions.js +389 -0
  274. package/dist/tenant/agents.d.ts +230 -0
  275. package/dist/tenant/{environments.js → agents.js} +493 -328
  276. package/dist/tenant/auth.d.ts +1 -1
  277. package/dist/tenant/auth.js +3 -3
  278. package/dist/tenant/commands.d.ts +63 -2
  279. package/dist/tenant/commands.js +240 -90
  280. package/dist/tenant/context.d.ts +57 -33
  281. package/dist/tenant/context.js +6 -2
  282. package/dist/tenant/definition-files.d.ts +25 -4
  283. package/dist/tenant/definition-files.js +85 -47
  284. package/dist/tenant/effects.js +15 -51
  285. package/dist/tenant/ephemeral.js +2 -1
  286. package/dist/tenant/history.d.ts +1 -1
  287. package/dist/tenant/history.js +1 -1
  288. package/dist/tenant/host-token.d.ts +3 -3
  289. package/dist/tenant/host-token.js +11 -10
  290. package/dist/tenant/http.d.ts +5 -8
  291. package/dist/tenant/http.js +9 -0
  292. package/dist/tenant/identity-file.d.ts +29 -6
  293. package/dist/tenant/identity-file.js +45 -15
  294. package/dist/tenant/issuers.d.ts +5 -5
  295. package/dist/tenant/issuers.js +34 -26
  296. package/dist/tenant/jwt.d.ts +8 -2
  297. package/dist/tenant/jwt.js +10 -2
  298. package/dist/tenant/limits.d.ts +87 -0
  299. package/dist/tenant/limits.js +172 -0
  300. package/dist/tenant/memories.d.ts +38 -0
  301. package/dist/tenant/memories.js +119 -0
  302. package/dist/tenant/module.d.ts +4 -1
  303. package/dist/tenant/module.js +9 -8
  304. package/dist/tenant/outbound.d.ts +11 -14
  305. package/dist/tenant/outbound.js +10 -15
  306. package/dist/tenant/reset.js +2 -2
  307. package/dist/tenant/run-grants.d.ts +6 -0
  308. package/dist/tenant/run-grants.js +7 -2
  309. package/dist/tenant/run-token.d.ts +0 -4
  310. package/dist/tenant/run-token.js +6 -11
  311. package/dist/tenant/runtime-limits.d.ts +24 -0
  312. package/dist/tenant/runtime-limits.js +27 -0
  313. package/dist/tenant/runtime.d.ts +1 -1
  314. package/dist/tenant/runtime.js +38 -43
  315. package/dist/tenant/session-streams.js +7 -6
  316. package/dist/tenant/session.d.ts +1 -1
  317. package/dist/tenant/session.js +1 -1
  318. package/dist/tenant/sessions.d.ts +28 -45
  319. package/dist/tenant/sessions.js +89 -209
  320. package/dist/tenant/signing-keys.d.ts +1 -1
  321. package/dist/tenant/signing-keys.js +5 -6
  322. package/dist/tenant/status.js +10 -10
  323. package/dist/tenant/streams.js +18 -20
  324. package/dist/tenant/sweep.d.ts +1 -21
  325. package/dist/tenant/sweep.js +51 -51
  326. package/dist/tenant/transcript.d.ts +70 -23
  327. package/dist/tenant/transcript.js +28 -22
  328. package/dist/tenant/triggers.d.ts +143 -0
  329. package/dist/tenant/triggers.js +715 -0
  330. package/dist/tenant/turn-timing.d.ts +11 -1
  331. package/dist/tenant/turn-timing.js +3 -1
  332. package/dist/tenant/types.d.ts +9 -14
  333. package/dist/tenant/worker.d.ts +4 -10
  334. package/dist/tenant/worker.js +10 -14
  335. package/dist/traces/ids.js +5 -1
  336. package/dist/traces/map.d.ts +10 -7
  337. package/dist/traces/map.js +16 -12
  338. package/dist/traces/otlp.d.ts +3 -3
  339. package/dist/traces/otlp.js +5 -3
  340. package/dist/traces/projector.d.ts +9 -4
  341. package/dist/traces/projector.js +13 -7
  342. package/dist/traces/read.js +6 -1
  343. package/dist/tuning.d.ts +390 -0
  344. package/dist/tuning.js +677 -0
  345. package/dist/vault/headers.js +4 -2
  346. package/dist/vault/service.d.ts +13 -8
  347. package/dist/vault/service.js +61 -17
  348. package/dist/version.d.ts +1 -1
  349. package/dist/version.js +1 -1
  350. package/package.json +13 -12
  351. package/dist/api/http/routes/environment-manifests.d.ts +0 -9
  352. package/dist/api/http/routes/environment-manifests.js +0 -118
  353. package/dist/api/http/routes/environments.d.ts +0 -11
  354. package/dist/api/http/routes/environments.js +0 -332
  355. package/dist/artifacts/export.d.ts +0 -8
  356. package/dist/artifacts/export.js +0 -204
  357. package/dist/artifacts/media-types.d.ts +0 -30
  358. package/dist/artifacts/media-types.js +0 -137
  359. package/dist/artifacts/workspace.d.ts +0 -60
  360. package/dist/artifacts/workspace.js +0 -45
  361. package/dist/media.d.ts +0 -10
  362. package/dist/media.js +0 -58
  363. package/dist/record/environment.d.ts +0 -25
  364. package/dist/record/environment.js +0 -44
  365. package/dist/sandbox/runtime-tools.d.ts +0 -9
  366. package/dist/sandbox/runtime-tools.js +0 -16
  367. package/dist/sandbox/session-sandbox.d.ts +0 -16
  368. package/dist/sandbox/session-sandbox.js +0 -77
  369. package/dist/tenant/artifact-tool.d.ts +0 -13
  370. package/dist/tenant/artifact-tool.js +0 -243
  371. package/dist/tenant/environment-manifests.d.ts +0 -57
  372. package/dist/tenant/environment-manifests.js +0 -200
  373. package/dist/tenant/environments.d.ts +0 -174
  374. package/dist/tenant/skill-tool.d.ts +0 -20
  375. package/dist/tenant/skill-tool.js +0 -67
  376. package/dist/tenant/tool-results.d.ts +0 -57
  377. package/dist/tenant/tool-results.js +0 -298
  378. package/dist/tenant/tool-search.d.ts +0 -39
  379. package/dist/tenant/tool-search.js +0 -103
@@ -5,7 +5,7 @@
5
5
  * global registry.
6
6
  */
7
7
  import { z } from "zod";
8
- import { EnvironmentManifestSchema, EnvironmentSecretSlotsSchema, DeleteEnvironmentManifestResponseSchema, EnvironmentManifestPlanSchema, EnvironmentManifestVersionsSchema, EnvironmentManifestViewSchema, ListEnvironmentManifestsResponseSchema, PutEnvironmentManifestRequestSchema, PutEnvironmentSecretValueRequestSchema, SaveEnvironmentManifestResponseSchema, SessionListItemSchema, ModelCallSchema, SessionPageSchema, SessionManifestViewSchema, HistoryPageSchema, SessionUsageTotalsSchema, ModelCallsPageSchema, ModelCallExportPageSchema, EnvironmentPageSchema, ToolCallSchema, ToolCallsPageSchema, TurnTraceSchema, JwksSchema, SigningKeyListSchema, SigningKeyViewSchema, RotateSigningKeysRequestSchema, RevokeSigningKeyRequestSchema, MeResponseSchema, TenantStatusSchema, ResetTenantRequestSchema, ResetTenantResponseSchema, SeedTenantConfigRequestSchema, SeedTenantConfigResponseSchema, HostModelCatalogSchema, TenantSandboxViewSchema, ModelUsageTotalsSchema, ModelBudgetsSchema, PutModelBudgetsRequestSchema, ToolPolicySchema, PutToolPolicyRequestSchema, PutModelInputsRequestSchema, ModelInputsViewSchema, PutTenantEnvironmentsRequestSchema, ListProvidersResponseSchema, HostModelViewSchema, PutHostModelRequestSchema, SelectHostModelRequestSchema, PutEnvironmentSecretRequestSchema, EnvironmentSecretViewSchema, ListEnvironmentSecretsResponseSchema, McpPreviewRequestSchema, McpPreviewSchema, CredentialCoverageRequestSchema, CredentialCoverageSchema, DeletedResponseSchema, ListAgentsResponseSchema, ListPublicAgentsResponseSchema, ListSessionsResponseSchema, LiveEventSchema, PutAgentRequestSchema, PutAgentResponseSchema, PutSessionRequestSchema, SessionItemsResponseSchema, SessionViewSchema, StreamClosedFrameSchema, AcceptedResponseSchema, SandboxToolOutcomeSchema, PutEnvironmentRequestSchema, EnvironmentViewSchema, EnvironmentSnapshotSchema, RestoreEnvironmentRequestSchema, ForkEnvironmentRequestSchema, EnvironmentForkPlanSchema, ForkEnvironmentResponseSchema, EnvironmentRestoreSchema, EnvironmentVersionsSchema, ListEnvironmentsResponseSchema, DeleteEnvironmentResponseSchema, ListEnvironmentEventsResponseSchema, ArtifactViewSchema, ArtifactListItemSchema, ArtifactPageSchema, ArtifactVersionViewSchema, ListArtifactsResponseSchema, UploadArtifactResponseSchema, DefinitionFileViewSchema, DeleteArtifactResponseSchema, CreateArtifactLinkRequestSchema, ArtifactLinkSchema, PutTenantArtifactsRequestSchema, TenantArtifactsViewSchema, ArtifactTreeSchema, ArtifactDiffSchema, SessionCommandSchema, ListOperatorKeysResponseSchema, PutOperatorKeyResponseSchema, DeleteOperatorKeyResponseSchema, OperatorKeySchema, ProtocolRejectedResponseSchema, RejectedResponseSchema, EVENT_SCHEMAS, EVENT_TYPES, } from "@nylorun/core/contracts";
8
+ import { QueuedResponseSchema, TriggerListSchema, MemoryListSchema, MemorySchema, PutMemoryRequestSchema, MemoryVersionPageSchema, MemoryVersionDetailSchema, TriggerRunPageSchema, RunTriggerResponseSchema, WebhookSecretResponseSchema, WebhookAcceptedResponseSchema, AgentManifestV8Schema, EnvironmentSecretSlotsSchema, DeleteAgentManifestResponseSchema, AgentManifestPlanSchema, AgentManifestVersionsSchema, AgentManifestViewSchema, ListAgentManifestsResponseSchema, PutAgentManifestRequestSchema, PutAgentSecretValueRequestSchema, SaveAgentManifestResponseSchema, SessionListItemSchema, ModelCallSchema, SessionPageSchema, SessionManifestViewSchema, HistoryPageSchema, SessionUsageTotalsSchema, ModelCallsPageSchema, ModelCallExportPageSchema, AgentPageSchema, ToolCallSchema, ToolCallsPageSchema, TurnTraceSchema, JwksSchema, SigningKeyListSchema, SigningKeyViewSchema, RotateSigningKeysRequestSchema, RevokeSigningKeyRequestSchema, MeResponseSchema, TenantStatusSchema, ResetTenantRequestSchema, ResetTenantResponseSchema, SeedTenantConfigRequestSchema, SeedTenantConfigResponseSchema, HostModelCatalogSchema, TenantSandboxViewSchema, ModelUsageTotalsSchema, ModelBudgetsSchema, PutModelBudgetsRequestSchema, ToolPolicySchema, PutToolPolicyRequestSchema, PutModelInputsRequestSchema, ModelInputsViewSchema, PutTenantEnvironmentsRequestSchema, ListProvidersResponseSchema, HostModelViewSchema, PutHostModelRequestSchema, SelectHostModelRequestSchema, PutAgentSecretRequestSchema, AgentSecretViewSchema, ListAgentSecretsResponseSchema, McpPreviewRequestSchema, McpPreviewSchema, CredentialCoverageRequestSchema, CredentialCoverageSchema, DeletedResponseSchema, ListSessionsResponseSchema, LiveEventSchema, PutAgentRequestSchema, PutSessionRequestSchema, SessionItemsResponseSchema, SessionViewSchema, StreamClosedFrameSchema, AcceptedResponseSchema, SandboxToolOutcomeSchema, AgentViewSchema, AgentSnapshotSchema, RestoreAgentRequestSchema, ForkAgentRequestSchema, AgentForkPlanSchema, ForkAgentResponseSchema, PutAgentDryRunResponseSchema, RestartAgentRequestSchema, AgentRestoreSchema, AgentDiskVersionsSchema, ListAgentsResponseSchema, DeleteAgentResponseSchema, ListAgentEventsResponseSchema, ArtifactViewSchema, ArtifactListItemSchema, ArtifactPageSchema, ArtifactVersionViewSchema, ListArtifactsResponseSchema, UploadArtifactResponseSchema, DefinitionFileViewSchema, DeleteArtifactResponseSchema, CreateArtifactLinkRequestSchema, ArtifactLinkSchema, PutTenantArtifactsRequestSchema, PutTenantSkillsRequestSchema, PutTenantLimitsRequestSchema, TenantLimitsViewSchema, TenantArtifactsViewSchema, TenantSkillsViewSchema, ArtifactTreeSchema, ArtifactDiffSchema, SessionCommandSchema, ListOperatorKeysResponseSchema, PutOperatorKeyResponseSchema, DeleteOperatorKeyResponseSchema, OperatorKeySchema, ProtocolRejectedResponseSchema, RejectedResponseSchema, EVENT_SCHEMAS, EVENT_TYPES, } from "@nylorun/core/contracts";
9
9
  function named(id, schema) {
10
10
  return schema.meta({ id });
11
11
  }
@@ -16,28 +16,30 @@ export const ListOperatorKeysResponse = named("ListOperatorKeysResponse", ListOp
16
16
  export const PutOperatorKeyResponse = named("PutOperatorKeyResponse", PutOperatorKeyResponseSchema);
17
17
  export const DeleteOperatorKeyResponse = named("DeleteOperatorKeyResponse", DeleteOperatorKeyResponseSchema);
18
18
  export const SandboxToolOutcome = named("SandboxToolOutcome", SandboxToolOutcomeSchema);
19
- export const PutEnvironmentRequest = named("PutEnvironmentRequest", PutEnvironmentRequestSchema);
20
- export const EnvironmentView = named("EnvironmentView", EnvironmentViewSchema);
19
+ export const PutAgentRequest = named("PutAgentRequest", PutAgentRequestSchema);
20
+ export const AgentView = named("AgentView", AgentViewSchema);
21
21
  export const EnvironmentSecretSlots = named("EnvironmentSecretSlots", EnvironmentSecretSlotsSchema);
22
- export const EnvironmentManifest = named("EnvironmentManifest", EnvironmentManifestSchema);
23
- export const PutEnvironmentManifestRequest = named("PutEnvironmentManifestRequest", PutEnvironmentManifestRequestSchema);
24
- export const EnvironmentManifestView = named("EnvironmentManifestView", EnvironmentManifestViewSchema);
25
- export const EnvironmentManifestPlan = named("EnvironmentManifestPlan", EnvironmentManifestPlanSchema);
26
- export const SaveEnvironmentManifestResponse = named("SaveEnvironmentManifestResponse", SaveEnvironmentManifestResponseSchema);
27
- export const ListEnvironmentManifestsResponse = named("ListEnvironmentManifestsResponse", ListEnvironmentManifestsResponseSchema);
28
- export const EnvironmentManifestVersions = named("EnvironmentManifestVersions", EnvironmentManifestVersionsSchema);
29
- export const DeleteEnvironmentManifestResponse = named("DeleteEnvironmentManifestResponse", DeleteEnvironmentManifestResponseSchema);
30
- export const PutEnvironmentSecretValueRequest = named("PutEnvironmentSecretValueRequest", PutEnvironmentSecretValueRequestSchema);
31
- export const EnvironmentSnapshot = named("EnvironmentSnapshot", EnvironmentSnapshotSchema);
32
- export const RestoreEnvironmentRequest = named("RestoreEnvironmentRequest", RestoreEnvironmentRequestSchema);
33
- export const EnvironmentRestore = named("EnvironmentRestore", EnvironmentRestoreSchema);
34
- export const ForkEnvironmentRequest = named("ForkEnvironmentRequest", ForkEnvironmentRequestSchema);
35
- export const EnvironmentForkPlan = named("EnvironmentForkPlan", EnvironmentForkPlanSchema);
36
- export const ForkEnvironmentResponse = named("ForkEnvironmentResponse", ForkEnvironmentResponseSchema);
37
- export const EnvironmentVersions = named("EnvironmentVersions", EnvironmentVersionsSchema);
38
- export const ListEnvironmentsResponse = named("ListEnvironmentsResponse", ListEnvironmentsResponseSchema);
39
- export const DeleteEnvironmentResponse = named("DeleteEnvironmentResponse", DeleteEnvironmentResponseSchema);
40
- export const ListEnvironmentEventsResponse = named("ListEnvironmentEventsResponse", ListEnvironmentEventsResponseSchema);
22
+ export const AgentManifest = named("AgentManifest", AgentManifestV8Schema);
23
+ export const PutAgentManifestRequest = named("PutAgentManifestRequest", PutAgentManifestRequestSchema);
24
+ export const AgentManifestView = named("AgentManifestView", AgentManifestViewSchema);
25
+ export const AgentManifestPlan = named("AgentManifestPlan", AgentManifestPlanSchema);
26
+ export const SaveAgentManifestResponse = named("SaveAgentManifestResponse", SaveAgentManifestResponseSchema);
27
+ export const ListAgentManifestsResponse = named("ListAgentManifestsResponse", ListAgentManifestsResponseSchema);
28
+ export const AgentManifestVersions = named("AgentManifestVersions", AgentManifestVersionsSchema);
29
+ export const DeleteAgentManifestResponse = named("DeleteAgentManifestResponse", DeleteAgentManifestResponseSchema);
30
+ export const PutAgentSecretValueRequest = named("PutAgentSecretValueRequest", PutAgentSecretValueRequestSchema);
31
+ export const AgentSnapshot = named("AgentSnapshot", AgentSnapshotSchema);
32
+ export const RestoreAgentRequest = named("RestoreAgentRequest", RestoreAgentRequestSchema);
33
+ export const AgentRestore = named("AgentRestore", AgentRestoreSchema);
34
+ export const ForkAgentRequest = named("ForkAgentRequest", ForkAgentRequestSchema);
35
+ export const AgentForkPlan = named("AgentForkPlan", AgentForkPlanSchema);
36
+ export const ForkAgentResponse = named("ForkAgentResponse", ForkAgentResponseSchema);
37
+ export const PutAgentDryRunResponse = named("PutAgentDryRunResponse", PutAgentDryRunResponseSchema);
38
+ export const RestartAgentRequest = named("RestartAgentRequest", RestartAgentRequestSchema);
39
+ export const AgentDiskVersions = named("AgentDiskVersions", AgentDiskVersionsSchema);
40
+ export const ListAgentsResponse = named("ListAgentsResponse", ListAgentsResponseSchema);
41
+ export const DeleteAgentResponse = named("DeleteAgentResponse", DeleteAgentResponseSchema);
42
+ export const ListAgentEventsResponse = named("ListAgentEventsResponse", ListAgentEventsResponseSchema);
41
43
  export const ArtifactVersionView = named("ArtifactVersionView", ArtifactVersionViewSchema);
42
44
  export const ArtifactView = named("ArtifactView", ArtifactViewSchema);
43
45
  export const ArtifactListItem = named("ArtifactListItem", ArtifactListItemSchema);
@@ -50,14 +52,25 @@ export const CreateArtifactLinkRequest = named("CreateArtifactLinkRequest", Crea
50
52
  export const ArtifactLink = named("ArtifactLink", ArtifactLinkSchema);
51
53
  export const PutTenantArtifactsRequest = named("PutTenantArtifactsRequest", PutTenantArtifactsRequestSchema);
52
54
  export const TenantArtifactsView = named("TenantArtifactsView", TenantArtifactsViewSchema);
55
+ export const PutTenantSkillsRequest = named("PutTenantSkillsRequest", PutTenantSkillsRequestSchema);
56
+ export const TenantSkillsView = named("TenantSkillsView", TenantSkillsViewSchema);
57
+ export const PutTenantLimitsRequest = named("PutTenantLimitsRequest", PutTenantLimitsRequestSchema);
58
+ export const TenantLimitsView = named("TenantLimitsView", TenantLimitsViewSchema);
53
59
  export const ArtifactTree = named("ArtifactTree", ArtifactTreeSchema);
54
60
  export const ArtifactDiff = named("ArtifactDiff", ArtifactDiffSchema);
55
61
  export const SessionCommand = named("SessionCommand", SessionCommandSchema);
56
62
  export const AcceptedResponse = named("AcceptedResponse", AcceptedResponseSchema);
57
- export const ListAgentsResponse = named("ListAgentsResponse", ListAgentsResponseSchema);
58
- export const ListPublicAgentsResponse = named("ListPublicAgentsResponse", ListPublicAgentsResponseSchema);
59
- export const PutAgentRequest = named("PutAgentRequest", PutAgentRequestSchema);
60
- export const PutAgentResponse = named("PutAgentResponse", PutAgentResponseSchema);
63
+ export const QueuedResponse = named("QueuedResponse", QueuedResponseSchema);
64
+ export const TriggerList = named("TriggerList", TriggerListSchema);
65
+ export const MemoryList = named("MemoryList", MemoryListSchema);
66
+ export const MemoryView = named("Memory", MemorySchema);
67
+ export const PutMemoryRequest = named("PutMemoryRequest", PutMemoryRequestSchema);
68
+ export const MemoryVersionPage = named("MemoryVersionPage", MemoryVersionPageSchema);
69
+ export const MemoryVersionDetail = named("MemoryVersionDetail", MemoryVersionDetailSchema);
70
+ export const TriggerRunPage = named("TriggerRunPage", TriggerRunPageSchema);
71
+ export const RunTriggerResponse = named("RunTriggerResponse", RunTriggerResponseSchema);
72
+ export const WebhookSecretResponse = named("WebhookSecretResponse", WebhookSecretResponseSchema);
73
+ export const WebhookAcceptedResponse = named("WebhookAcceptedResponse", WebhookAcceptedResponseSchema);
61
74
  export const ListSessionsResponse = named("ListSessionsResponse", ListSessionsResponseSchema);
62
75
  export const PutSessionRequest = named("PutSessionRequest", PutSessionRequestSchema);
63
76
  export const SessionView = named("SessionView", SessionViewSchema);
@@ -92,9 +105,9 @@ export const ListProvidersResponse = named("ListProvidersResponse", ListProvider
92
105
  export const HostModelView = named("HostModelView", HostModelViewSchema);
93
106
  export const PutHostModelRequest = named("PutHostModelRequest", PutHostModelRequestSchema);
94
107
  export const SelectHostModelRequest = named("SelectHostModelRequest", SelectHostModelRequestSchema);
95
- export const PutEnvironmentSecretRequest = named("PutEnvironmentSecretRequest", PutEnvironmentSecretRequestSchema);
96
- export const EnvironmentSecretView = named("EnvironmentSecretView", EnvironmentSecretViewSchema);
97
- export const ListEnvironmentSecretsResponse = named("ListEnvironmentSecretsResponse", ListEnvironmentSecretsResponseSchema);
108
+ export const PutAgentSecretRequest = named("PutAgentSecretRequest", PutAgentSecretRequestSchema);
109
+ export const AgentSecretView = named("AgentSecretView", AgentSecretViewSchema);
110
+ export const ListAgentSecretsResponse = named("ListAgentSecretsResponse", ListAgentSecretsResponseSchema);
98
111
  export const DeletedResponse = named("DeletedResponse", DeletedResponseSchema);
99
112
  export const McpPreviewRequest = named("McpPreviewRequest", McpPreviewRequestSchema);
100
113
  export const McpPreview = named("McpPreview", McpPreviewSchema);
@@ -113,7 +126,7 @@ export const HistoryPage = named("HistoryPage", HistoryPageSchema.extend({ items
113
126
  export const SessionUsageTotals = named("SessionUsageTotals", SessionUsageTotalsSchema);
114
127
  export const ModelCallsPage = named("ModelCallsPage", ModelCallsPageSchema.extend({ calls: z.array(ModelCall) }));
115
128
  export const ModelCallExportPage = named("ModelCallExportPage", ModelCallExportPageSchema.extend({ calls: z.array(ModelCall) }));
116
- export const EnvironmentPage = named("EnvironmentPage", EnvironmentPageSchema.extend({ environments: z.array(EnvironmentView) }));
129
+ export const AgentPage = named("AgentPage", AgentPageSchema.extend({ environments: z.array(AgentView) }));
117
130
  export const ToolCall = named("ToolCall", ToolCallSchema);
118
131
  export const ToolCallsPage = named("ToolCallsPage", ToolCallsPageSchema.extend({ calls: z.array(ToolCall) }));
119
132
  export const TurnTrace = named("TurnTrace", TurnTraceSchema);
@@ -1,13 +1,16 @@
1
1
  import { bodyLimit } from "hono/body-limit";
2
2
  import { HttpError } from "../../tenant/http.js";
3
3
  import { VaultError } from "../../vault/error.js";
4
- import { KEYS_PATH, MAX_KEYS_BODY_BYTES } from "../../keys/contract.js";
4
+ import { KEYS_PATH } from "../../keys/contract.js";
5
+ import { hostTuning } from "../../tuning.js";
5
6
  import { KEYS_OPERATIONS } from "../../keys/keys.js";
6
7
  export function mountKeysRoutes(app, options) {
7
- app.post(`${KEYS_PATH}/:operation`, options.authorized, bodyLimit({
8
- maxSize: MAX_KEYS_BODY_BYTES,
8
+ app.post(`${KEYS_PATH}/:operation`, options.authorized,
9
+ // The largest request body: a credential with its secret, or a token's claims (`keys.bodyBytes`).
10
+ (c, next) => bodyLimit({
11
+ maxSize: hostTuning().keys.bodyBytes,
9
12
  onError: (c) => c.json({ error: { code: "invalid_request", message: "The body is too large" } }, 400),
10
- }), async (c) => {
13
+ })(c, next), async (c) => {
11
14
  const operation = c.req.param("operation");
12
15
  if (!KEYS_OPERATIONS.includes(operation))
13
16
  return c.json({ error: { code: "invalid_request", message: `Unknown keys operation ${operation}` } }, 404);
@@ -1,4 +1,5 @@
1
1
  import { Hono } from "hono";
2
+ import type { RuntimeLimits } from "@nylorun/core/contracts";
2
3
  import type { ModelCallHandler } from "../../gates/handler.js";
3
4
  import { type InflightCalls } from "../../gates/inflight.js";
4
5
  import type { McpHandler } from "../../gates/mcp-handler.js";
@@ -25,8 +26,11 @@ export interface GatesAppOptions {
25
26
  readonly inflight: InflightCalls;
26
27
  /** Whether the gate's dependencies answer (Postgres). */
27
28
  readonly ready: () => Promise<boolean>;
28
- /** Largest body read. Default `MAX_MODEL_CALL_BYTES`. */
29
- readonly maxBodyBytes?: number;
29
+ /**
30
+ * The Tenant's Runtime limits, read from its database for each call (`modelCallBytes` bounds a
31
+ * model call's body, `toolAnswerBytes` a tool request's).
32
+ */
33
+ readonly limits: () => Promise<RuntimeLimits>;
30
34
  /** Remote MCP servers (F4.1). Without it the MCP routes answer 404. */
31
35
  readonly mcp?: McpHandler;
32
36
  /** HTTP tool calls (R2 M3). Without it the HTTP calls route answers 404. */
@@ -22,10 +22,10 @@ import { Hono } from "hono";
22
22
  import { bodyLimit } from "hono/body-limit";
23
23
  import { HTTPException } from "hono/http-exception";
24
24
  import { isTenantId } from "@nylorun/core/compatibility";
25
- import { MAX_MODEL_CALL_BYTES, MODEL_CALLS_PATH, ModelCallBodySchema, TENANT_HEADER, } from "../../gates/contract.js";
25
+ import { MODEL_CALLS_PATH, ModelCallBodySchema, TENANT_HEADER, } from "../../gates/contract.js";
26
26
  import { InflightConflict, InflightStale } from "../../gates/inflight.js";
27
27
  import { mountKeysRoutes } from "./keys.js";
28
- import { HTTP_CALLS_PATH, HttpCallBodySchema, MAX_TOOL_BODY_BYTES, MCP_CLOSE_PATH, MCP_CONNECT_PATH, MCP_LIST_PATH, McpListBodySchema, McpServerBodySchema, TOOL_CALLS_PATH, ToolCallBodySchema, } from "../../gates/tool-contract.js";
28
+ import { HTTP_CALLS_PATH, HttpCallBodySchema, MCP_CLOSE_PATH, MCP_CONNECT_PATH, MCP_LIST_PATH, McpListBodySchema, McpServerBodySchema, TOOL_CALLS_PATH, ToolCallBodySchema, } from "../../gates/tool-contract.js";
29
29
  import { looksLikeToken } from "../../tenant/jwt.js";
30
30
  import { adminKeyMatches } from "../../host/http.js";
31
31
  import { canonical } from "../../store/canonical.js";
@@ -37,7 +37,6 @@ const gateError = (code, message) => ({
37
37
  });
38
38
  export function createGatesApp(options) {
39
39
  const app = new Hono();
40
- const maxSize = options.maxBodyBytes ?? MAX_MODEL_CALL_BYTES;
41
40
  const logger = options.logger ?? { info() { }, warn() { }, error() { } };
42
41
  // Hono's default, but logged through the logger: never the body, which may hold secrets.
43
42
  app.onError((error, c) => {
@@ -105,10 +104,18 @@ export function createGatesApp(options) {
105
104
  return claims?.tenantId ?? tenantId;
106
105
  };
107
106
  const badTenant = (c) => c.json(invalid(`The ${TENANT_HEADER} header must name a Tenant, the run token's when there is one`), 400);
108
- const toolBodies = bodyLimit({
109
- maxSize: MAX_TOOL_BODY_BYTES,
110
- onError: (c) => c.json(invalid(`A request body may be at most ${MAX_TOOL_BODY_BYTES} bytes`), 400),
111
- });
107
+ /**
108
+ * A body of at most the Tenant's limit `name`, read for this request: a larger one is `400`,
109
+ * naming the limit.
110
+ */
111
+ const limited = (name, what) => async (c, next) => {
112
+ const maxSize = (await options.limits())[name];
113
+ return bodyLimit({
114
+ maxSize,
115
+ onError: (c) => c.json(invalid(`${what} may be at most ${maxSize} bytes (the Runtime limit ${name})`), 400),
116
+ })(c, next);
117
+ };
118
+ const toolBodies = limited("toolAnswerBytes", "A request body");
112
119
  /** The parsed body, or the 400 to answer. */
113
120
  async function read(c, schema) {
114
121
  const tenantId = tenantOf(c);
@@ -322,10 +329,7 @@ export function createGatesApp(options) {
322
329
  return c.json(gateError("gate_forbidden", "The call is another session's"), 403);
323
330
  return c.body(null, 204);
324
331
  });
325
- app.post(MODEL_CALLS_PATH, run({ live: true }), bodyLimit({
326
- maxSize,
327
- onError: (c) => c.json(invalid(`A model call body may be at most ${maxSize} bytes`), 400),
328
- }), async (c) => {
332
+ app.post(MODEL_CALLS_PATH, run({ live: true }), limited("modelCallBytes", "A model call body"), async (c) => {
329
333
  // Optional: the gate serves its database's one Tenant, and refuses a call naming another.
330
334
  const tenantId = tenantOf(c);
331
335
  if (tenantId === false)
@@ -12,8 +12,10 @@ import { declaredRoute, pathSegments, routeNotFound } from "./define.js";
12
12
  import { jsonResponse, rejectionOf } from "./respond.js";
13
13
  import { accessRoutes } from "./routes/access.js";
14
14
  import { meRoutes } from "./routes/me.js";
15
- import { environmentRoutes } from "./routes/environments.js";
16
- import { environmentManifestRoutes } from "./routes/environment-manifests.js";
15
+ import { agentRoutes } from "./routes/agents.js";
16
+ import { triggerRoutes, webhookRoutes } from "./routes/triggers.js";
17
+ import { memoryRoutes } from "./routes/memories.js";
18
+ import { agentManifestRoutes } from "./routes/agent-manifests.js";
17
19
  import { artifactRoutes } from "./routes/artifacts.js";
18
20
  import { readRoutes } from "./routes/reads.js";
19
21
  import { sessionRoutes } from "./routes/sessions.js";
@@ -45,8 +47,11 @@ function build() {
45
47
  });
46
48
  sessionRoutes(api);
47
49
  fileRoutes(api);
48
- environmentRoutes(api);
49
- environmentManifestRoutes(api);
50
+ agentRoutes(api);
51
+ triggerRoutes(api);
52
+ memoryRoutes(api);
53
+ webhookRoutes(api);
54
+ agentManifestRoutes(api);
50
55
  artifactRoutes(api);
51
56
  tenantRoutes(api);
52
57
  keyRoutes(api);
@@ -1,4 +1,18 @@
1
+ import type { TenantContext } from "../../tenant/context.js";
2
+ /** What a body is: a JSON request (`requestBodyBytes`), or a message that may carry files inline. */
3
+ export type BodyKind = "json" | "inline";
4
+ /** The most bytes the Tenant's route reads of a body of `kind`. */
5
+ export declare function bodyLimit(tenant: TenantContext, kind?: BodyKind): Promise<number>;
1
6
  /** The body as text; past `maxBytes`, `413 Request too large`. */
2
- export declare function readText(request: Request, maxBytes?: number): Promise<string>;
3
- /** The body as JSON, before any schema. */
4
- export declare function readJson(request: Request, maxBytes?: number): Promise<unknown>;
7
+ export declare function readText(request: Request, maxBytes: number): Promise<string>;
8
+ /** The body's bytes; past `maxBytes`, `413` with code `limit_exceeded`. */
9
+ export declare function readBytes(request: Request, maxBytes: number, limit: string): Promise<Buffer>;
10
+ /** The body of a Tenant route's request as JSON, before any schema. */
11
+ export declare function readJson(c: {
12
+ readonly req: {
13
+ readonly raw: Request;
14
+ };
15
+ readonly env: {
16
+ readonly tenant: TenantContext;
17
+ };
18
+ }, kind?: BodyKind): Promise<unknown>;
@@ -1,12 +1,20 @@
1
1
  /**
2
2
  * Request bodies of Tenant routes, read as the router they replace read them
3
- * (`tenant/http.ts`): at most 1 MiB unless a route allows more (an endpoint that takes files
4
- * inline), UTF-8, and a missing or malformed JSON body is `400 Invalid JSON`.
3
+ * (`tenant/http.ts`): at most the Tenant's Runtime limit `requestBodyBytes`, or for an endpoint
4
+ * that takes files inline `inlineBodyBytes` of its limits (one file at `inlineFileBytes` in
5
+ * base64, and the rest), UTF-8, and a missing or malformed JSON body is `400 Invalid JSON`. The
6
+ * limits are read for each request.
5
7
  */
8
+ import { inlineBodyBytes } from "@nylorun/core/contracts";
6
9
  import { fail } from "../../tenant/http.js";
7
- const MAX_BODY_BYTES = 1024 * 1024;
10
+ import { readRuntimeLimits } from "../../tenant/runtime-limits.js";
11
+ /** The most bytes the Tenant's route reads of a body of `kind`. */
12
+ export async function bodyLimit(tenant, kind = "json") {
13
+ const limits = await tenant.store.tx((t) => readRuntimeLimits(t));
14
+ return kind === "inline" ? inlineBodyBytes(limits) : limits.requestBodyBytes;
15
+ }
8
16
  /** The body as text; past `maxBytes`, `413 Request too large`. */
9
- export async function readText(request, maxBytes = MAX_BODY_BYTES) {
17
+ export async function readText(request, maxBytes) {
10
18
  if (request.body === null)
11
19
  return "";
12
20
  const chunks = [];
@@ -25,9 +33,29 @@ export async function readText(request, maxBytes = MAX_BODY_BYTES) {
25
33
  }
26
34
  return Buffer.concat(chunks).toString("utf8");
27
35
  }
28
- /** The body as JSON, before any schema. */
29
- export async function readJson(request, maxBytes = MAX_BODY_BYTES) {
30
- const text = await readText(request, maxBytes);
36
+ /** The body's bytes; past `maxBytes`, `413` with code `limit_exceeded`. */
37
+ export async function readBytes(request, maxBytes, limit) {
38
+ if (request.body === null)
39
+ return Buffer.alloc(0);
40
+ const chunks = [];
41
+ let bytes = 0;
42
+ const reader = request.body.getReader();
43
+ for (;;) {
44
+ const { done, value } = await reader.read();
45
+ if (done)
46
+ break;
47
+ bytes += value.byteLength;
48
+ if (bytes > maxBytes) {
49
+ await reader.cancel();
50
+ fail(413, `The body is over ${maxBytes} bytes, the Runtime limit ${limit}`, { code: "limit_exceeded" });
51
+ }
52
+ chunks.push(value);
53
+ }
54
+ return Buffer.concat(chunks);
55
+ }
56
+ /** The body of a Tenant route's request as JSON, before any schema. */
57
+ export async function readJson(c, kind = "json") {
58
+ const text = await readText(c.req.raw, await bodyLimit(c.env.tenant, kind));
31
59
  try {
32
60
  return JSON.parse(text);
33
61
  }
@@ -4,6 +4,7 @@
4
4
  * (`routes.ts`) both answer through here, so a route answers the same wherever it runs.
5
5
  */
6
6
  import { SandboxRouteError } from "../../core/sandbox-routes.js";
7
+ import { RecordEntryTooLargeError } from "../../record/index.js";
7
8
  import { HttpError, OpaqueAuthError } from "../../tenant/http.js";
8
9
  import { VaultError } from "../../vault/error.js";
9
10
  /** A JSON answer. CORS headers a browser needs are already on the Node response. */
@@ -24,13 +25,16 @@ export function rejectionOf(error) {
24
25
  return { status: error.status, body: error.body, headers: {} };
25
26
  const status = error instanceof HttpError ||
26
27
  error instanceof VaultError ||
27
- error instanceof SandboxRouteError
28
+ error instanceof SandboxRouteError ||
29
+ error instanceof RecordEntryTooLargeError
28
30
  ? error.status
29
31
  : error?.name === "ZodError" ||
30
32
  error?.message === "Invalid cursor"
31
33
  ? 400
32
34
  : 500;
33
- const rejection = error instanceof HttpError || error instanceof VaultError ? error.rejection : {};
35
+ const rejection = error instanceof HttpError || error instanceof VaultError || error instanceof RecordEntryTooLargeError
36
+ ? error.rejection
37
+ : {};
34
38
  return {
35
39
  status,
36
40
  body: {
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
- import { RevokeSigningKeyRequestSchema, RotateSigningKeysRequestSchema, TOKEN_TTL_MAX_SECONDS, } from "@nylorun/core/contracts";
2
+ import { RevokeSigningKeyRequestSchema, RotateSigningKeysRequestSchema, } from "@nylorun/core/contracts";
3
3
  import { Jwks, RevokeSigningKeyRequest, RotateSigningKeysRequest, SigningKeyList, SigningKeyView, } from "../../components.js";
4
4
  import { publicJwk, signingKeyView } from "../../../tenant/signing-keys.js";
5
5
  import { readJson } from "../body.js";
6
6
  import { tenantRoute } from "../define.js";
7
7
  import { jsonResponse } from "../respond.js";
8
+ import { hostTuning } from "../../../tuning.js";
8
9
  /** The Management API's signing-key routes: a management key. */
9
10
  const MANAGEMENT = { credentials: ["management"], scopes: "never" };
10
11
  const json = (schema, description) => ({
@@ -74,10 +75,10 @@ function signingKeyRoutesAt(api, base, access) {
74
75
  },
75
76
  }, async (c) => {
76
77
  const ctx = c.env.tenant;
77
- const request = RotateSigningKeysRequestSchema.parse(await readJson(c.req.raw));
78
+ const request = RotateSigningKeysRequestSchema.parse(await readJson(c));
78
79
  // The longest any token the Runtime signs lives (capability links, run tokens).
79
80
  const keys = await ctx.keys.rotateSigningKeys({
80
- maxTtlSeconds: TOKEN_TTL_MAX_SECONDS,
81
+ maxTtlSeconds: hostTuning().keys.tokenTtlMaxSeconds,
81
82
  force: request.force === true,
82
83
  });
83
84
  ctx.config.logger.info("signing keys rotated", { force: request.force === true });
@@ -95,7 +96,7 @@ function signingKeyRoutesAt(api, base, access) {
95
96
  },
96
97
  }, async (c) => {
97
98
  const ctx = c.env.tenant;
98
- RevokeSigningKeyRequestSchema.parse(await readJson(c.req.raw));
99
+ RevokeSigningKeyRequestSchema.parse(await readJson(c));
99
100
  const row = await ctx.store.tx((t) => ctx.signingKeys.revoke(t, c.req.param("kid")));
100
101
  ctx.config.logger.info("signing key revoked", { kid: row.id });
101
102
  return jsonResponse(200, signingKeyView(row));
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent manifests (`/v1/agent-manifests/**`, protocol 16): save, read, list and delete the named,
3
+ * versioned documents Agents are made from, each with a harness and a runtime section. A save
4
+ * never changes an Agent. Reading needs `agents:read` (or a write scope), saving and deleting
5
+ * `agent-manifests:write`, from any client (Q12). A token caller reaches none: a manifest holds
6
+ * an agent's instructions, tools and servers.
7
+ */
8
+ import type { OpenAPIHono } from "@hono/zod-openapi";
9
+ import type { TenantEnv } from "../app.js";
10
+ export declare function agentManifestRoutes(api: OpenAPIHono<TenantEnv>): void;
@@ -0,0 +1,135 @@
1
+ import { z } from "zod";
2
+ import { isAgentManifestName, PutAgentManifestRequestSchema } from "@nylorun/core/contracts";
3
+ import { AgentManifestPlan, AgentManifestVersions, AgentManifestView, DeleteAgentManifestResponse, ListAgentManifestsResponse, PutAgentManifestRequest, SaveAgentManifestResponse, } from "../../components.js";
4
+ import { requirePrincipal } from "../../../tenant/auth.js";
5
+ import { fail } from "../../../tenant/http.js";
6
+ import { agentManifestVersions, deleteAgentManifest, getAgentManifest, listAgentManifests, saveAgentManifest, } from "../../../tenant/agent-manifests.js";
7
+ import { readJson } from "../body.js";
8
+ import { tenantRoute } from "../define.js";
9
+ import { jsonResponse } from "../respond.js";
10
+ const READ = {
11
+ credentials: ["application", "subject"],
12
+ scopes: ["agents:read", "agents:write", "agent-manifests:write"],
13
+ };
14
+ const WRITE = {
15
+ credentials: ["application", "subject"],
16
+ scopes: ["agent-manifests:write"],
17
+ };
18
+ const json = (schema, description) => ({
19
+ description,
20
+ content: { "application/json": { schema } },
21
+ });
22
+ const namePath = z.object({
23
+ name: z.string().meta({ description: "The agent manifest's name, such as `triage`" }),
24
+ });
25
+ function nameOf(value) {
26
+ if (!isAgentManifestName(value))
27
+ return fail(400, "An agent manifest's name is 1-64 letters, digits, '.', '_' and '-', starting with a letter or digit");
28
+ return value;
29
+ }
30
+ function versionOf(value) {
31
+ const version = Number(value);
32
+ if (!Number.isInteger(version) || version < 1)
33
+ return fail(400, "version is a positive integer");
34
+ return version;
35
+ }
36
+ /** `If-Match: <version>` (or `"<version>"`), when sent. */
37
+ function ifMatchOf(value) {
38
+ if (value === undefined || value.trim() === "")
39
+ return undefined;
40
+ const version = Number(value.trim().replace(/^W\//, "").replace(/^"|"$/g, ""));
41
+ if (!Number.isInteger(version) || version < 0)
42
+ return fail(400, "If-Match is the version you read: a whole number, 0 for none yet");
43
+ return version;
44
+ }
45
+ export function agentManifestRoutes(api) {
46
+ tenantRoute(api, READ, {
47
+ method: "get",
48
+ path: "/v1/agent-manifests",
49
+ tags: ["Agent manifests"],
50
+ summary: "List agent manifests",
51
+ description: "Each manifest's latest version, by name, with how many Agents were made from it.",
52
+ responses: { 200: json(ListAgentManifestsResponse, "The manifests") },
53
+ }, async (c) => {
54
+ requirePrincipal(c.get("scope"));
55
+ return jsonResponse(200, await listAgentManifests(c.env.tenant));
56
+ });
57
+ tenantRoute(api, WRITE, {
58
+ method: "put",
59
+ path: "/v1/agent-manifests/{name}",
60
+ tags: ["Agent manifests"],
61
+ summary: "Save an agent manifest",
62
+ description: "Saves the manifest as its next version, or answers the latest unchanged when nothing differs. Every Agent that tracks the manifest moves to the new version (track T3): at once, at its pod's next start for a runtime change a pod applies only when it starts, or once a required secret the version adds is set; a pinned one stays, and so does one whose kind, harness or storage the version changes (`agents_behind`). The Runtime checks the harness and runtime sections against each other: a custom harness needs a pod with an image, every credential the harness names is a declared slot of the right type, and the runtime's kind gives the loop the sandbox it needs; every gap is named in one `422 manifest_inconsistent` (`details.gaps`). `If-Match: <version>` refuses the save with `412 manifest_changed` when the latest version is no longer the one you read (`0` for a manifest that does not exist yet). With `?dryRun=true` the answer is the plan: the changes by section, every reason a save would be refused (`errors`, the gaps first), warnings, the Agents it would move (`moves`) and how many stay on older versions (`behind`); nothing is saved. Clients compose the authoring files and drop their `$schema` before they send one document.",
63
+ request: {
64
+ params: namePath,
65
+ query: z.object({
66
+ dryRun: z.enum(["true", "false"]).optional().meta({ description: "`true`: answer the plan and save nothing" }),
67
+ }),
68
+ body: { required: true, content: { "application/json": { schema: PutAgentManifestRequest } } },
69
+ },
70
+ responses: {
71
+ 200: json(z.union([SaveAgentManifestResponse, AgentManifestPlan]), "The version saved, or the plan with dryRun"),
72
+ 400: {
73
+ description: "The manifest breaks the Tenant's limits, has a tool that runs code, or names files the Runtime does not hold (`definition_files_missing`)",
74
+ },
75
+ 412: { description: "If-Match named a version that is no longer the latest (`manifest_changed`)" },
76
+ 413: { description: "A skill's files hold more than the manifest's skill limit together (`limit_exceeded`)" },
77
+ 422: { description: "The harness and runtime sections do not fit (`manifest_inconsistent`, `details.gaps`)" },
78
+ },
79
+ }, async (c) => {
80
+ const name = nameOf(c.req.param("name"));
81
+ const body = PutAgentManifestRequestSchema.parse(await readJson(c));
82
+ const ifMatch = ifMatchOf(c.req.header("if-match"));
83
+ const options = ifMatch === undefined ? {} : { ifMatch };
84
+ return jsonResponse(200, c.req.query("dryRun") === "true"
85
+ ? await saveAgentManifest(c.env.tenant, name, body, c.get("scope"), { ...options, dryRun: true })
86
+ : await saveAgentManifest(c.env.tenant, name, body, c.get("scope"), options));
87
+ });
88
+ tenantRoute(api, READ, {
89
+ method: "get",
90
+ path: "/v1/agent-manifests/{name}",
91
+ tags: ["Agent manifests"],
92
+ summary: "Get an agent manifest",
93
+ description: "Its latest version.",
94
+ request: { params: namePath },
95
+ responses: { 200: json(AgentManifestView, "The latest version") },
96
+ }, async (c) => {
97
+ requirePrincipal(c.get("scope"));
98
+ return jsonResponse(200, await getAgentManifest(c.env.tenant, nameOf(c.req.param("name"))));
99
+ });
100
+ tenantRoute(api, READ, {
101
+ method: "get",
102
+ path: "/v1/agent-manifests/{name}/versions",
103
+ tags: ["Agent manifests"],
104
+ summary: "List an agent manifest's versions",
105
+ description: "Every version, newest first, with who saved it and how many Agents were made from it.",
106
+ request: { params: namePath },
107
+ responses: { 200: json(AgentManifestVersions, "The versions") },
108
+ }, async (c) => {
109
+ requirePrincipal(c.get("scope"));
110
+ return jsonResponse(200, await agentManifestVersions(c.env.tenant, nameOf(c.req.param("name"))));
111
+ });
112
+ tenantRoute(api, READ, {
113
+ method: "get",
114
+ path: "/v1/agent-manifests/{name}/versions/{version}",
115
+ tags: ["Agent manifests"],
116
+ summary: "Get one version of an agent manifest",
117
+ request: { params: namePath.extend({ version: z.string().meta({ description: "The version number" }) }) },
118
+ responses: { 200: json(AgentManifestView, "The version") },
119
+ }, async (c) => {
120
+ requirePrincipal(c.get("scope"));
121
+ return jsonResponse(200, await getAgentManifest(c.env.tenant, nameOf(c.req.param("name")), versionOf(c.req.param("version"))));
122
+ });
123
+ tenantRoute(api, WRITE, {
124
+ method: "delete",
125
+ path: "/v1/agent-manifests/{name}",
126
+ tags: ["Agent manifests"],
127
+ summary: "Delete an agent manifest",
128
+ description: "Deletes every version. Refused while any Agent was made from one (`409 manifest_in_use`).",
129
+ request: { params: namePath },
130
+ responses: {
131
+ 200: json(DeleteAgentManifestResponse, "Deleted, or there was none"),
132
+ 409: { description: "An Agent was made from one of its versions (`manifest_in_use`)" },
133
+ },
134
+ }, async (c) => jsonResponse(200, await deleteAgentManifest(c.env.tenant, nameOf(c.req.param("name")))));
135
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Agents (`/v1/agents/**`, protocol 16; Environments from protocol 11, D55, D56): make one from a
3
+ * saved agent manifest or find it by id, read it, list them by label, state or manifest, read its
4
+ * lifecycle stream, stop, reset, fork and delete it, work its disk versions, and write its vault's
5
+ * secrets. Ids may hold `/`, sent percent-encoded as one path segment (`users%2Falice%2Ftriage`).
6
+ * A token caller reaches only the ids its Agent grants match, and changes them only with
7
+ * `agents:write`. Secret values are write-only: no route reads one back.
8
+ */
9
+ import type { OpenAPIHono } from "@hono/zod-openapi";
10
+ import type { TenantEnv } from "../app.js";
11
+ export declare function agentRoutes(api: OpenAPIHono<TenantEnv>): void;