@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
@@ -1,20 +1,19 @@
1
- import { createHash } from "node:crypto";
2
- import { delegatesOf, pluginOf, deferredToolsInstructions, deferredToolsTools, delegateManifest, mcpToolSettings, } from "@nylorun/core/define";
1
+ import { delegatesOf, pluginOf, delegateManifest, mcpToolSettings, } from "@nylorun/core/define";
2
+ import { findServer } from "./pool.js";
3
3
  /**
4
- * The `mcp.discovered` payload: each server's outcome, with the tools it added to the snapshot,
5
- * and the Agent Plugin that brought the server (from `manifest`, the session's pinned one).
4
+ * The `mcp.discovered` payload: each server's outcome, with the tools it added to the snapshot
5
+ * that its settings in `manifest` (the session's pinned one) leave enabled, and the Agent Plugin
6
+ * that brought the server.
6
7
  */
7
8
  export function mcpDiscovered(snapshot, diagnostics, manifest) {
8
9
  const agents = new Map(manifest === undefined
9
10
  ? []
10
11
  : [[undefined, manifest], ...delegatesOf(manifest).map(({ manifest: child }) => [child.id, child])]);
11
- const key = (item) => JSON.stringify([item.agentId ?? null, item.serverName]);
12
+ const key = (agentId, serverName) => JSON.stringify([agentId ?? null, serverName]);
12
13
  const tools = new Map();
13
- const deferred = new Map();
14
- for (const tool of snapshot.mcpTools) {
15
- tools.set(key(tool), (tools.get(key(tool)) ?? 0) + 1);
16
- if (tool.deferred)
17
- deferred.set(key(tool), (deferred.get(key(tool)) ?? 0) + 1);
14
+ for (const server of snapshot.servers) {
15
+ const enabled = server.tools.filter((tool) => manifest === undefined || isEnabledIn(manifest, server.agentId, server.name, tool.name));
16
+ tools.set(key(server.agentId, server.name), enabled.length);
18
17
  }
19
18
  return {
20
19
  servers: diagnostics.map((item) => ({
@@ -23,149 +22,108 @@ export function mcpDiscovered(snapshot, diagnostics, manifest) {
23
22
  ...withPlugin(pluginOf(agents.get(item.agentId), { server: item.serverName })),
24
23
  outcome: item.outcome,
25
24
  message: item.message,
26
- tools: tools.get(key(item)) ?? 0,
27
- ...(deferred.has(key(item)) ? { deferred: deferred.get(key(item)) } : {}),
25
+ tools: tools.get(key(item.agentId, item.serverName)) ?? 0,
28
26
  ...(item.disabled ? { disabled: item.disabled } : {}),
29
27
  ...(item.unknownTools?.length ? { unknownTools: [...item.unknownTools] } : {}),
30
28
  ...(item.credentialIds === undefined ? {} : { credentialIds: [...item.credentialIds] }),
31
- ...(item.renamed?.length ? { renamed: item.renamed.map((tool) => ({ ...tool })) } : {}),
32
29
  })),
33
30
  };
34
31
  }
35
32
  function withPlugin(plugin) {
36
33
  return plugin === undefined ? {} : { plugin };
37
34
  }
38
- /** The longest tool name every model provider accepts (R2b C6, Q14). */
39
- export const MODEL_TOOL_NAME_MAX = 64;
40
- /**
41
- * The name the model knows an MCP tool by (R2b C6, Q13): `server__tool`, with each character
42
- * outside `[A-Za-z0-9_-]` replaced by `_`, since MCP allows `.` and 128 characters and OpenAI,
43
- * Bedrock and Gemini on Vertex do not. A name over 64 characters, or one that collides
44
- * (`suffixed`), keeps 55 and adds `_` and 8 hex characters of the SHA-256 of the raw
45
- * `server/tool`.
46
- */
47
- export function normalizeToolName(serverName, serverToolName, options = {}) {
48
- const name = `${serverName}__${serverToolName}`.replace(/[^A-Za-z0-9_-]/gu, "_");
49
- if (name.length <= MODEL_TOOL_NAME_MAX && !options.suffixed)
50
- return name;
51
- const hash = createHash("sha256")
52
- .update(`${serverName}/${serverToolName}`)
53
- .digest("hex")
54
- .slice(0, 8);
55
- return `${name.slice(0, MODEL_TOOL_NAME_MAX - 9)}_${hash}`;
56
- }
57
- /** The names of the agent's tools: its own and those the Runtime pinned. */
58
- export function declaredToolNames(manifest) {
59
- return new Set([...(manifest.tools ?? []), ...(manifest.runtime?.tools ?? [])].map((tool) => tool.name));
60
- }
61
- /** The declaration of the server a tool of the snapshot comes from, in `manifest`. */
62
- function serverOf(manifest, tool) {
63
- const agent = tool.agentId === undefined ? manifest : delegateManifest(manifest, tool.agentId);
64
- return agent?.mcpServers?.[tool.serverName];
35
+ /** The tool `tool` of server `server` of agent `agentId` (the root when absent), as discovered. */
36
+ export function mcpToolIn(snapshot, agentId, server, tool) {
37
+ return snapshot?.servers
38
+ .find((item) => item.agentId === agentId && item.name === server)
39
+ ?.tools.find((item) => item.name === tool);
65
40
  }
66
41
  /** The tool's settings in `manifest` (R2b C9); the defaults when its server is not there. */
67
- export function mcpToolSettingsIn(manifest, tool) {
68
- const server = serverOf(manifest, tool);
69
- return server ? mcpToolSettings(server, tool.serverToolName) : { enabled: true, approval: "never" };
42
+ export function mcpToolSettingsIn(manifest, agentId, server, tool) {
43
+ const declared = findServer(manifest, agentId, server);
44
+ return declared ? mcpToolSettings(declared.server, tool) : { enabled: true, approval: "never" };
45
+ }
46
+ /** True when the tool's settings in `manifest` leave it enabled (R2b C9). */
47
+ export function isEnabledIn(manifest, agentId, server, tool) {
48
+ return mcpToolSettingsIn(manifest, agentId, server, tool).enabled;
70
49
  }
71
50
  /**
72
- * The tools of a snapshot, as the engine gets them for a turn whose manifest is `manifest` (the
73
- * session's pin, or a turn variant that tightened its MCP servers' tools):
74
- *
75
- * - a tool its settings disable is left out (R2b C9); the Tool Gate holds a call its approval
76
- * or the Tenant's tool policy asks a person about (R5 step 2);
77
- * - a deferred tool (R2b C10) is marked so, out of the model's list, and its agent gets the
78
- * session tools `tool_search`, with the note on the servers it holds deferred tools of, and
79
- * `tool_call`. Their names are reserved: no tool of the agent's own takes them.
80
- *
81
- * Nothing here changes between the steps of a turn, so neither does the model's tool list.
51
+ * The snapshot's facts for a turn whose manifest is `manifest` (the session's pin, or a turn
52
+ * variant that tightened its MCP servers' tools): each tool with whether its settings leave it
53
+ * `enabled` and, when they say, whether to defer it. A server the turn's manifest no longer
54
+ * declares is left out.
82
55
  */
83
- export function sessionToolsOf(snapshot, manifest) {
84
- if (!snapshot?.mcpTools.length)
85
- return undefined;
86
- const inline = [];
87
- const deferred = new Map();
88
- const notes = new Map();
89
- for (const tool of snapshot.mcpTools) {
90
- const settings = mcpToolSettingsIn(manifest, tool);
91
- if (!settings.enabled)
92
- continue;
93
- const defer = tool.deferred === true;
94
- const entry = {
95
- ...(tool.agentId === undefined ? {} : { agentId: tool.agentId }),
96
- name: tool.name,
97
- ...(tool.description === undefined ? {} : { description: tool.description }),
98
- inputSchema: tool.inputSchema,
99
- ...(tool.outputSchema === undefined ? {} : { outputSchema: tool.outputSchema }),
100
- ...(defer ? { deferred: true } : {}),
101
- };
102
- if (!defer) {
103
- inline.push(entry);
104
- continue;
105
- }
106
- deferred.set(tool.agentId, [...(deferred.get(tool.agentId) ?? []), entry]);
107
- const servers = notes.get(tool.agentId) ?? new Map();
108
- servers.set(tool.serverName, (servers.get(tool.serverName) ?? 0) + 1);
109
- notes.set(tool.agentId, servers);
110
- }
111
- const session = [];
112
- for (const [agentId, tools] of deferred) {
113
- const servers = [...notes.get(agentId)].map(([serverName, count]) => {
114
- const instructions = snapshot.servers?.find((item) => item.agentId === agentId && item.serverName === serverName)?.instructions;
115
- return { serverName, tools: count, ...(instructions ? { instructions } : {}) };
116
- });
117
- const [search, call] = deferredToolsTools();
118
- for (const tool of [
119
- { ...search, instructions: [deferredToolsInstructions(servers)] },
120
- call,
121
- ])
122
- session.push({ ...(agentId === undefined ? {} : { agentId }), ...tool });
123
- session.push(...tools);
124
- }
125
- return [...inline, ...session];
56
+ export function mcpFactsOf(snapshot, manifest) {
57
+ return {
58
+ servers: snapshot.servers.flatMap((server) => {
59
+ if (!findServer(manifest, server.agentId, server.name))
60
+ return [];
61
+ return [
62
+ {
63
+ ...(server.agentId === undefined ? {} : { agentId: server.agentId }),
64
+ name: server.name,
65
+ ...(server.instructions === undefined ? {} : { instructions: server.instructions }),
66
+ tools: server.tools.map((tool) => {
67
+ const settings = mcpToolSettingsIn(manifest, server.agentId, server.name, tool.name);
68
+ return {
69
+ ...tool,
70
+ enabled: settings.enabled,
71
+ ...(settings.deferred === undefined ? {} : { deferred: settings.deferred }),
72
+ };
73
+ }),
74
+ },
75
+ ];
76
+ }),
77
+ };
78
+ }
79
+ /** The manifest of the agent an effect belongs to: the root, or an agent it uses as a tool. */
80
+ export function manifestFor(manifest, agent) {
81
+ return agent ? delegateManifest(manifest, agent.id) : manifest;
126
82
  }
127
- /** The share of the model's context window past which an agent's MCP tools are deferred (Q21). */
128
- export const DEFER_CONTEXT_SHARE = 0.1;
129
- /** Characters per token, to estimate what tool definitions take of a context window (Q21). */
130
- export const CHARS_PER_TOKEN = 4;
131
83
  /**
132
- * The snapshot with its deferred tools marked (R2b C10, Q21), decided once for the session when
133
- * core records it. A tool's own setting, then `"*"`'s, then its server's, decides; a tool none
134
- * sets is deferred when the JSON of its agent's MCP tools that would be listed passes a tenth of
135
- * the model's context window (`contextWindow` tokens, at 4 characters a token).
84
+ * `snapshot` within the Tenant's Runtime limit `mcpSnapshotBytes` (its JSON, which every
85
+ * `turn.start.mcp` carries): its servers in order while they fit. A server that does not is left
86
+ * out, so the session never offers its tools, and its diagnostic says so (`failed`, replacing
87
+ * the one it had). Unchanged when the whole snapshot fits.
136
88
  */
137
- export function pinDeferral(snapshot, manifest, contextWindow) {
138
- const limit = contextWindow * CHARS_PER_TOKEN * DEFER_CONTEXT_SHARE;
139
- const listed = new Map();
140
- const set = snapshot.mcpTools.map((tool) => mcpToolSettingsIn(manifest, tool).deferred);
141
- snapshot.mcpTools.forEach((tool, i) => {
142
- if (set[i] === true)
143
- return;
144
- const size = JSON.stringify({ name: tool.name, description: tool.description ?? "", inputSchema: tool.inputSchema }).length;
145
- listed.set(tool.agentId, (listed.get(tool.agentId) ?? 0) + size);
89
+ export function fitSnapshot(snapshot, diagnostics, limitBytes) {
90
+ const bytes = (value) => Buffer.byteLength(JSON.stringify(value));
91
+ if (bytes(snapshot) <= limitBytes)
92
+ return { snapshot, diagnostics: [...diagnostics] };
93
+ const kept = [];
94
+ const dropped = new Map();
95
+ const key = (agentId, serverName) => JSON.stringify([agentId ?? null, serverName]);
96
+ for (const server of snapshot.servers) {
97
+ const next = { ...snapshot, servers: [...kept, server] };
98
+ const size = bytes(next);
99
+ if (size <= limitBytes)
100
+ kept.push(server);
101
+ else
102
+ dropped.set(key(server.agentId, server.name), bytes(server));
103
+ }
104
+ const tooLarge = (agentId, serverName, size) => ({
105
+ ...(agentId === undefined ? {} : { agentId }),
106
+ serverName,
107
+ outcome: "failed",
108
+ message: `The server's tools and instructions take ${size} bytes, past what the session may pin with the rest: the Runtime limit mcpSnapshotBytes (${limitBytes} bytes; PUT /v1/tenant/limits). Its tools are not offered.`,
146
109
  });
147
- const mcpTools = snapshot.mcpTools.map((tool, i) => {
148
- const { deferred: _, ...rest } = tool;
149
- const defer = set[i] ?? (listed.get(tool.agentId) ?? 0) > limit;
150
- return defer ? { ...rest, deferred: true } : rest;
110
+ const out = diagnostics.map((item) => {
111
+ const size = dropped.get(key(item.agentId, item.serverName));
112
+ return size === undefined ? item : tooLarge(item.agentId, item.serverName, size);
151
113
  });
152
- return { ...snapshot, mcpTools };
153
- }
154
- /**
155
- * The snapshot's record of an MCP tool call, or undefined when the call is not an MCP tool. With
156
- * the turn's `manifest`, a tool its settings disable is not one either (R2b C9).
157
- */
158
- export function mcpToolOf(snapshot, request, manifest) {
159
- const tool = snapshot?.mcpTools.find((tool) => tool.agentId === request.agent?.id && tool.name === request.toolName);
160
- if (tool && manifest && !isEnabledIn(manifest, tool))
161
- return undefined;
162
- return tool;
163
- }
164
- /** True when the tool's settings in `manifest` leave it enabled (R2b C9). */
165
- export function isEnabledIn(manifest, tool) {
166
- return mcpToolSettingsIn(manifest, tool).enabled;
114
+ for (const server of snapshot.servers) {
115
+ const size = dropped.get(key(server.agentId, server.name));
116
+ if (size !== undefined && !out.some((item) => key(item.agentId, item.serverName) === key(server.agentId, server.name)))
117
+ out.push(tooLarge(server.agentId, server.name, size));
118
+ }
119
+ return { snapshot: { ...snapshot, servers: kept }, diagnostics: out };
167
120
  }
168
- /** The manifest of the agent an effect belongs to: the root, or an agent it uses as a tool. */
169
- export function manifestFor(manifest, agent) {
170
- return agent ? delegateManifest(manifest, agent.id) : manifest;
121
+ /** True for a snapshot of the shape this Runtime pins (`snapshotSchemaVersion` 2). */
122
+ export function isSnapshot(value) {
123
+ const snapshot = value;
124
+ return (typeof snapshot === "object" &&
125
+ snapshot !== null &&
126
+ snapshot.snapshotSchemaVersion === 2 &&
127
+ typeof snapshot.manifestHash === "string" &&
128
+ Array.isArray(snapshot.servers));
171
129
  }
@@ -0,0 +1,97 @@
1
+ import { type MemoryOperation, type MemorySummary, type MemoryVersion, type MemoryVersionDetail, type RuntimeLimits } from "@nylorun/core/contracts";
2
+ import type { MemoryRow, MemoryVersionRow, Tx } from "../store/types.js";
3
+ /** Who makes a write: `agent:<manifest>@<n>` with its session, turn and run, or an API caller. */
4
+ export interface MemoryAuthor {
5
+ readonly actor: string;
6
+ readonly sessionId?: string;
7
+ readonly turnId?: string;
8
+ readonly triggerRunId?: string;
9
+ }
10
+ /** One of the `memory` tool's write commands, with Anthropic's parameters. */
11
+ export type MemoryCommand = {
12
+ readonly command: "create";
13
+ readonly path: string;
14
+ readonly fileText: string;
15
+ } | {
16
+ readonly command: "str_replace";
17
+ readonly path: string;
18
+ readonly oldStr: string;
19
+ readonly newStr?: string;
20
+ } | {
21
+ readonly command: "insert";
22
+ readonly path: string;
23
+ readonly insertLine: number;
24
+ readonly insertText: string;
25
+ } | {
26
+ readonly command: "delete";
27
+ readonly path: string;
28
+ } | {
29
+ readonly command: "rename";
30
+ readonly oldPath: string;
31
+ readonly newPath: string;
32
+ };
33
+ /**
34
+ * Why a command did not apply. `path_invalid`, `too_large` and `limit` are the Runtime's rules;
35
+ * the rest are Anthropic's ordinary failures (a missing path, an `old_str` that is not there or
36
+ * not unique, an `insert_line` out of range, a rename onto an existing path).
37
+ */
38
+ export type MemoryRefusal = "memory.path_invalid" | "memory.too_large" | "memory.limit" | "memory.not_found" | "memory.no_match" | "memory.not_unique" | "memory.invalid_line" | "memory.exists";
39
+ /** A memory a command changed: its path, what changed it and its version after. */
40
+ export interface MemoryChange {
41
+ readonly path: string;
42
+ readonly operation: MemoryOperation;
43
+ readonly version: number;
44
+ }
45
+ /** A refused command or view: the code, and the text for the model. */
46
+ export interface MemoryRefused {
47
+ readonly ok: false;
48
+ readonly code: MemoryRefusal;
49
+ readonly text: string;
50
+ }
51
+ /** What a command came to: the text for the model, and the changes, or why it was refused. */
52
+ export type MemoryResult = {
53
+ readonly ok: true;
54
+ readonly text: string;
55
+ readonly changes: readonly MemoryChange[];
56
+ } | MemoryRefused;
57
+ /** What a view came to: the listing or the text, or why it was refused. */
58
+ export type MemoryViewResult = {
59
+ readonly ok: true;
60
+ readonly text: string;
61
+ } | MemoryRefused;
62
+ /** A new version id: increasing with time, so versions page newest first by id. */
63
+ export declare function newMemoryVersionId(now?: number): string;
64
+ export declare function sha256(text: string): string;
65
+ /**
66
+ * The tool's `view`: a memory's text with line numbers (`viewRange` `[start, end]`, 1-based,
67
+ * `end` -1 for the last line), or a folder's listing two levels deep with sizes. `/memories`
68
+ * lists even when the Agent has no memories.
69
+ */
70
+ export declare function viewMemory(t: Tx, agentId: string, rawPath: string, viewRange?: readonly [number, number]): Promise<MemoryViewResult>;
71
+ interface Applied {
72
+ readonly t: Tx;
73
+ readonly agentId: string;
74
+ readonly author: MemoryAuthor;
75
+ readonly limits: Pick<RuntimeLimits, "memoryBytes" | "memoriesPerAgent">;
76
+ readonly now: string;
77
+ }
78
+ /**
79
+ * Applies one write command to Agent `agentId`'s memories in `t`, as `author`, within the
80
+ * Runtime limits. Access is the caller's to check. A command that changes nothing (a `create`
81
+ * with the same text) makes no version.
82
+ */
83
+ export declare function applyMemoryCommand(t: Tx, agentId: string, command: MemoryCommand, author: MemoryAuthor, limits: Applied["limits"], now?: string): Promise<MemoryResult>;
84
+ /**
85
+ * The index a session pins (`turn.start.memory.index`, design §6.3): a line per memory, newest
86
+ * first, `- <path>`, then ` — <description>` when it has one, within `memoryIndexLines` lines and
87
+ * `memoryIndexBytes` bytes. `truncated` when some memories were left out; the harness tells the
88
+ * model to view folders for the rest.
89
+ */
90
+ export declare function renderMemoryIndex(t: Tx, agentId: string, limits: Pick<RuntimeLimits, "memoryIndexLines" | "memoryIndexBytes">): Promise<{
91
+ index: string;
92
+ truncated: boolean;
93
+ }>;
94
+ export declare function memorySummaryOf(row: MemoryRow): MemorySummary;
95
+ export declare function memoryVersionOf(row: MemoryVersionRow): MemoryVersion;
96
+ export declare function memoryVersionDetailOf(row: MemoryVersionRow): MemoryVersionDetail;
97
+ export {};