@nylorun/runtime 0.25.0-beta → 0.27.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 (326) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/README.md +26 -16
  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.js +1 -1
  12. package/dist/api/a2a/endpoint.js +3 -4
  13. package/dist/api/a2a/protocol.js +4 -0
  14. package/dist/api/a2a/routes.d.ts +2 -6
  15. package/dist/api/a2a/routes.js +12 -18
  16. package/dist/api/ag-ui/endpoint.js +2 -3
  17. package/dist/api/ag-ui/routes.js +4 -4
  18. package/dist/api/components.d.ts +326 -45
  19. package/dist/api/components.js +5 -1
  20. package/dist/api/gate/keys.js +7 -4
  21. package/dist/api/gate/routes.d.ts +6 -2
  22. package/dist/api/gate/routes.js +15 -11
  23. package/dist/api/http/app.d.ts +2 -2
  24. package/dist/api/http/app.js +2 -2
  25. package/dist/api/http/body.d.ts +15 -3
  26. package/dist/api/http/body.js +15 -7
  27. package/dist/api/http/define.d.ts +1 -1
  28. package/dist/api/http/respond.js +7 -3
  29. package/dist/api/http/routes/access.js +5 -4
  30. package/dist/api/http/routes/artifacts.js +19 -7
  31. package/dist/api/http/routes/coverage.js +1 -1
  32. package/dist/api/http/routes/environment-manifests.js +1 -1
  33. package/dist/api/http/routes/environments.js +6 -6
  34. package/dist/api/http/routes/files.d.ts +2 -1
  35. package/dist/api/http/routes/files.js +31 -5
  36. package/dist/api/http/routes/mcp.js +1 -1
  37. package/dist/api/http/routes/reads.d.ts +35 -0
  38. package/dist/api/http/routes/reads.js +50 -22
  39. package/dist/api/http/routes/sessions.js +12 -11
  40. package/dist/api/http/routes/tenant.d.ts +2 -2
  41. package/dist/api/http/routes/tenant.js +69 -16
  42. package/dist/api/inbound-files.d.ts +3 -9
  43. package/dist/api/inbound-files.js +18 -24
  44. package/dist/api/openapi.js +6 -2
  45. package/dist/artifacts/disk.d.ts +0 -4
  46. package/dist/artifacts/disk.js +77 -73
  47. package/dist/artifacts/files.d.ts +13 -4
  48. package/dist/artifacts/files.js +27 -9
  49. package/dist/artifacts/folder-upload.d.ts +75 -0
  50. package/dist/artifacts/folder-upload.js +263 -0
  51. package/dist/artifacts/folders.d.ts +14 -8
  52. package/dist/artifacts/folders.js +19 -11
  53. package/dist/artifacts/links.js +7 -6
  54. package/dist/artifacts/parts.d.ts +9 -14
  55. package/dist/artifacts/parts.js +11 -9
  56. package/dist/artifacts/pipe.d.ts +15 -0
  57. package/dist/artifacts/pipe.js +71 -0
  58. package/dist/artifacts/quota.d.ts +36 -0
  59. package/dist/artifacts/quota.js +44 -0
  60. package/dist/artifacts/service.d.ts +25 -1
  61. package/dist/artifacts/service.js +70 -25
  62. package/dist/blob/fs.js +2 -1
  63. package/dist/blob/s3.d.ts +6 -2
  64. package/dist/blob/s3.js +9 -7
  65. package/dist/blob/types.d.ts +1 -1
  66. package/dist/blob/types.js +1 -1
  67. package/dist/core/limits.d.ts +11 -35
  68. package/dist/core/limits.js +5 -73
  69. package/dist/core/sandbox-routes.js +0 -1
  70. package/dist/core/turn-manifest.d.ts +1 -2
  71. package/dist/core/turn-manifest.js +4 -28
  72. package/dist/execution/memory.d.ts +8 -5
  73. package/dist/execution/memory.js +8 -6
  74. package/dist/execution/types.d.ts +1 -6
  75. package/dist/execution/types.js +0 -5
  76. package/dist/gates/contract.d.ts +3 -2
  77. package/dist/gates/contract.js +1 -1
  78. package/dist/gates/egress-credentials.js +4 -3
  79. package/dist/gates/egress.d.ts +9 -9
  80. package/dist/gates/egress.js +19 -19
  81. package/dist/gates/fixture-model.js +13 -2
  82. package/dist/gates/handler.d.ts +1 -3
  83. package/dist/gates/handler.js +4 -3
  84. package/dist/gates/http-client.d.ts +4 -3
  85. package/dist/gates/http-client.js +5 -7
  86. package/dist/gates/http-tool.d.ts +24 -4
  87. package/dist/gates/http-tool.js +53 -17
  88. package/dist/gates/in-process.d.ts +2 -1
  89. package/dist/gates/in-process.js +17 -9
  90. package/dist/gates/inflight.d.ts +2 -2
  91. package/dist/gates/inflight.js +3 -2
  92. package/dist/gates/journal.js +5 -7
  93. package/dist/gates/mcp-handler.d.ts +4 -3
  94. package/dist/gates/mcp-handler.js +15 -5
  95. package/dist/gates/model-gate.d.ts +11 -2
  96. package/dist/gates/policy.d.ts +28 -5
  97. package/dist/gates/policy.js +60 -17
  98. package/dist/gates/provider-gate.d.ts +22 -0
  99. package/dist/gates/provider-gate.js +30 -0
  100. package/dist/gates/tool-calls.d.ts +1 -3
  101. package/dist/gates/tool-calls.js +2 -3
  102. package/dist/gates/tool-client.d.ts +1 -1
  103. package/dist/gates/tool-client.js +5 -6
  104. package/dist/gates/tool-contract.d.ts +8 -5
  105. package/dist/gates/tool-contract.js +1 -1
  106. package/dist/gates/tool-gate.d.ts +18 -7
  107. package/dist/gates/tool-gate.js +49 -7
  108. package/dist/harness/calls.d.ts +27 -25
  109. package/dist/harness/calls.js +40 -46
  110. package/dist/harness/executors.d.ts +10 -3
  111. package/dist/harness/executors.js +53 -23
  112. package/dist/harness/main.js +2 -2
  113. package/dist/harness/pod.d.ts +0 -2
  114. package/dist/harness/pod.js +7 -6
  115. package/dist/harness/run-tokens.d.ts +4 -1
  116. package/dist/harness/run-tokens.js +6 -2
  117. package/dist/harness/service.d.ts +17 -14
  118. package/dist/harness/service.js +21 -35
  119. package/dist/harness/setup.d.ts +0 -2
  120. package/dist/harness/setup.js +4 -9
  121. package/dist/harness/ws-client.d.ts +2 -2
  122. package/dist/harness/ws-client.js +7 -5
  123. package/dist/harness/ws-port.d.ts +3 -4
  124. package/dist/harness/ws-port.js +3 -4
  125. package/dist/harness-api/artifacts.d.ts +20 -0
  126. package/dist/harness-api/artifacts.js +478 -0
  127. package/dist/harness-api/in-process.d.ts +2 -2
  128. package/dist/harness-api/in-process.js +18 -16
  129. package/dist/harness-api/record.d.ts +10 -9
  130. package/dist/harness-api/record.js +102 -157
  131. package/dist/harness-api/renew.d.ts +1 -1
  132. package/dist/harness-api/renew.js +2 -2
  133. package/dist/harness-api/server.d.ts +1 -16
  134. package/dist/harness-api/server.js +82 -73
  135. package/dist/harness-api/start.d.ts +20 -2
  136. package/dist/harness-api/start.js +57 -18
  137. package/dist/harness-api/tool-journal.d.ts +15 -10
  138. package/dist/harness-api/tool-journal.js +26 -24
  139. package/dist/harness-api/workspace.d.ts +0 -4
  140. package/dist/harness-api/workspace.js +2 -45
  141. package/dist/harness-api/ws-server.js +10 -10
  142. package/dist/host/create-host.js +2 -3
  143. package/dist/host/execution.js +2 -3
  144. package/dist/host/gates.d.ts +2 -9
  145. package/dist/host/gates.js +15 -12
  146. package/dist/host/http.d.ts +0 -2
  147. package/dist/host/http.js +0 -27
  148. package/dist/host/main.js +10 -3
  149. package/dist/host/operate.js +12 -3
  150. package/dist/host/stack-config.d.ts +11 -0
  151. package/dist/host/stack-config.js +21 -1
  152. package/dist/index.d.ts +0 -1
  153. package/dist/index.js +0 -1
  154. package/dist/infra/index.js +2 -1
  155. package/dist/infra/readiness.d.ts +0 -2
  156. package/dist/infra/readiness.js +4 -3
  157. package/dist/keys/client.d.ts +1 -0
  158. package/dist/keys/client.js +2 -3
  159. package/dist/keys/contract.d.ts +1 -3
  160. package/dist/keys/contract.js +1 -3
  161. package/dist/keys/egress-ca.d.ts +0 -2
  162. package/dist/keys/egress-ca.js +2 -3
  163. package/dist/keys/keys.js +6 -1
  164. package/dist/keys/x509.d.ts +8 -4
  165. package/dist/keys/x509.js +14 -5
  166. package/dist/management-openapi.json +1961 -994
  167. package/dist/mcp/connect.d.ts +35 -26
  168. package/dist/mcp/connect.js +112 -141
  169. package/dist/mcp/pool.d.ts +27 -22
  170. package/dist/mcp/pool.js +34 -48
  171. package/dist/mcp/preview.d.ts +13 -6
  172. package/dist/mcp/preview.js +37 -20
  173. package/dist/mcp/snapshot.d.ts +35 -86
  174. package/dist/mcp/snapshot.js +93 -135
  175. package/dist/model/auth-store.js +5 -3
  176. package/dist/model/capabilities.d.ts +1 -1
  177. package/dist/model/catalog.d.ts +9 -36
  178. package/dist/model/catalog.js +6 -33
  179. package/dist/model/descriptor.d.ts +51 -0
  180. package/dist/model/descriptor.js +83 -0
  181. package/dist/model/models.d.ts +0 -3
  182. package/dist/model/models.js +3 -5
  183. package/dist/model/native-blocks.js +1 -1
  184. package/dist/model/pi-model.d.ts +16 -5
  185. package/dist/model/pi-model.js +86 -105
  186. package/dist/openapi.json +866 -1218
  187. package/dist/reads/cursor.js +3 -1
  188. package/dist/record/append.d.ts +34 -2
  189. package/dist/record/append.js +50 -1
  190. package/dist/record/environment.d.ts +2 -0
  191. package/dist/record/environment.js +2 -0
  192. package/dist/record/index.d.ts +1 -1
  193. package/dist/record/index.js +1 -1
  194. package/dist/redact.d.ts +1 -1
  195. package/dist/redact.js +3 -2
  196. package/dist/sandbox/egress-token.d.ts +3 -3
  197. package/dist/sandbox/egress-token.js +3 -3
  198. package/dist/sandbox/join.js +3 -2
  199. package/dist/sandbox/manager.d.ts +41 -41
  200. package/dist/sandbox/manager.js +112 -44
  201. package/dist/sandbox/placement.d.ts +1 -1
  202. package/dist/sandbox/placement.js +5 -8
  203. package/dist/sandbox/pods/client.d.ts +1 -10
  204. package/dist/sandbox/pods/client.js +8 -4
  205. package/dist/sandbox/pods/lifecycle.d.ts +19 -11
  206. package/dist/sandbox/pods/lifecycle.js +45 -23
  207. package/dist/sandbox/pods/network-gate.d.ts +4 -5
  208. package/dist/sandbox/pods/network-gate.js +7 -7
  209. package/dist/sandbox/pods/reconcile.js +4 -1
  210. package/dist/sandbox/pods/spec.js +8 -5
  211. package/dist/sandbox/policy.d.ts +7 -1
  212. package/dist/sandbox/policy.js +10 -3
  213. package/dist/sandbox/resolve.d.ts +8 -3
  214. package/dist/sandbox/resolve.js +12 -2
  215. package/dist/sandbox/setup.d.ts +3 -1
  216. package/dist/sandbox/setup.js +34 -11
  217. package/dist/sandbox/share.d.ts +5 -14
  218. package/dist/sandbox/share.js +5 -34
  219. package/dist/sandbox/skills.d.ts +7 -13
  220. package/dist/sandbox/skills.js +16 -31
  221. package/dist/sandbox/tenant-config.d.ts +2 -2
  222. package/dist/sandbox/tenant-config.js +4 -3
  223. package/dist/sandbox/tools.d.ts +7 -1
  224. package/dist/sandbox/tools.js +26 -26
  225. package/dist/sandbox/types.d.ts +10 -3
  226. package/dist/sandbox/types.js +9 -0
  227. package/dist/store/postgres/connect.d.ts +6 -5
  228. package/dist/store/postgres/connect.js +14 -11
  229. package/dist/store/postgres/control.js +13 -13
  230. package/dist/store/postgres/drizzle/0028_artifact_write_keys.sql +2 -0
  231. package/dist/store/postgres/drizzle/0029_protocol_15.sql +11 -0
  232. package/dist/store/postgres/drizzle/0030_protocol_15_runtime_block.sql +11 -0
  233. package/dist/store/postgres/drizzle/0031_protocol_15_mcp_snapshot.sql +8 -0
  234. package/dist/store/postgres/drizzle/meta/_journal.json +28 -0
  235. package/dist/store/postgres/migrate.js +1 -1
  236. package/dist/store/postgres/reads.js +10 -2
  237. package/dist/store/postgres/schema.d.ts +19 -0
  238. package/dist/store/postgres/schema.js +7 -0
  239. package/dist/store/postgres/store.js +55 -26
  240. package/dist/store/types.d.ts +17 -7
  241. package/dist/streams/relay/core.d.ts +3 -3
  242. package/dist/streams/relay/core.js +9 -10
  243. package/dist/tenant/advance.js +21 -31
  244. package/dist/tenant/commands.js +9 -16
  245. package/dist/tenant/context.d.ts +14 -17
  246. package/dist/tenant/definition-files.d.ts +25 -4
  247. package/dist/tenant/definition-files.js +85 -47
  248. package/dist/tenant/effects.js +9 -36
  249. package/dist/tenant/environment-manifests.js +9 -1
  250. package/dist/tenant/environments.d.ts +0 -2
  251. package/dist/tenant/environments.js +54 -30
  252. package/dist/tenant/ephemeral.d.ts +1 -1
  253. package/dist/tenant/ephemeral.js +2 -1
  254. package/dist/tenant/history.d.ts +1 -1
  255. package/dist/tenant/history.js +1 -1
  256. package/dist/tenant/host-token.d.ts +3 -3
  257. package/dist/tenant/host-token.js +12 -11
  258. package/dist/tenant/http.d.ts +5 -8
  259. package/dist/tenant/http.js +9 -0
  260. package/dist/tenant/identity-file.d.ts +24 -1
  261. package/dist/tenant/identity-file.js +35 -7
  262. package/dist/tenant/issuers.d.ts +5 -5
  263. package/dist/tenant/issuers.js +31 -23
  264. package/dist/tenant/jwt.d.ts +8 -2
  265. package/dist/tenant/jwt.js +10 -2
  266. package/dist/tenant/limits.d.ts +90 -0
  267. package/dist/tenant/limits.js +175 -0
  268. package/dist/tenant/module.d.ts +4 -1
  269. package/dist/tenant/module.js +9 -8
  270. package/dist/tenant/outbound.d.ts +17 -19
  271. package/dist/tenant/outbound.js +18 -21
  272. package/dist/tenant/run-grants.js +3 -2
  273. package/dist/tenant/run-token.d.ts +0 -4
  274. package/dist/tenant/run-token.js +6 -11
  275. package/dist/tenant/runtime-limits.d.ts +24 -0
  276. package/dist/tenant/runtime-limits.js +27 -0
  277. package/dist/tenant/runtime.js +30 -43
  278. package/dist/tenant/session-streams.js +7 -6
  279. package/dist/tenant/session.d.ts +1 -1
  280. package/dist/tenant/session.js +1 -1
  281. package/dist/tenant/sessions.js +32 -29
  282. package/dist/tenant/signing-keys.d.ts +1 -1
  283. package/dist/tenant/signing-keys.js +5 -6
  284. package/dist/tenant/status.js +4 -3
  285. package/dist/tenant/streams.js +18 -20
  286. package/dist/tenant/sweep.d.ts +1 -21
  287. package/dist/tenant/sweep.js +39 -48
  288. package/dist/tenant/transcript.d.ts +70 -23
  289. package/dist/tenant/transcript.js +28 -22
  290. package/dist/tenant/types.d.ts +11 -16
  291. package/dist/tenant/worker.d.ts +2 -10
  292. package/dist/tenant/worker.js +5 -14
  293. package/dist/traces/ids.js +5 -1
  294. package/dist/traces/map.d.ts +9 -6
  295. package/dist/traces/map.js +9 -11
  296. package/dist/traces/otlp.d.ts +3 -3
  297. package/dist/traces/otlp.js +5 -3
  298. package/dist/traces/projector.d.ts +9 -4
  299. package/dist/traces/projector.js +13 -7
  300. package/dist/traces/read.js +6 -1
  301. package/dist/tuning.d.ts +383 -0
  302. package/dist/tuning.js +658 -0
  303. package/dist/vault/headers.js +4 -2
  304. package/dist/version.d.ts +1 -1
  305. package/dist/version.js +1 -1
  306. package/package.json +3 -3
  307. package/dist/artifacts/export.d.ts +0 -8
  308. package/dist/artifacts/export.js +0 -204
  309. package/dist/artifacts/media-types.d.ts +0 -30
  310. package/dist/artifacts/media-types.js +0 -137
  311. package/dist/artifacts/workspace.d.ts +0 -60
  312. package/dist/artifacts/workspace.js +0 -45
  313. package/dist/media.d.ts +0 -10
  314. package/dist/media.js +0 -58
  315. package/dist/sandbox/runtime-tools.d.ts +0 -9
  316. package/dist/sandbox/runtime-tools.js +0 -16
  317. package/dist/sandbox/session-sandbox.d.ts +0 -16
  318. package/dist/sandbox/session-sandbox.js +0 -77
  319. package/dist/tenant/artifact-tool.d.ts +0 -13
  320. package/dist/tenant/artifact-tool.js +0 -243
  321. package/dist/tenant/skill-tool.d.ts +0 -20
  322. package/dist/tenant/skill-tool.js +0 -67
  323. package/dist/tenant/tool-results.d.ts +0 -57
  324. package/dist/tenant/tool-results.js +0 -298
  325. package/dist/tenant/tool-search.d.ts +0 -39
  326. package/dist/tenant/tool-search.js +0 -103
@@ -8,19 +8,19 @@
8
8
  * a delivery after commit that failed, or that a crash between the commit and the send cut
9
9
  * off. The first pass on this process takes every row, so a previous process's are not
10
10
  * left waiting; later passes take those whose delivery after commit failed and those older
11
- * than `OUTBOX_GRACE_MS` (the database's clock), batch after batch within
12
- * `DRAIN_BUDGET_MS`. Each row carries the idempotency key it was first sent with, so a
11
+ * than `sweep.outboxGraceMs` (Host tuning) (the database's clock), batch after batch within
12
+ * `sweep.drainBudgetMs`. Each row carries the idempotency key it was first sent with, so a
13
13
  * request the execution did accept before the crash, or one still being sent after its
14
14
  * commit, runs once. Rows are delivered one by one: a row that fails is retried with
15
- * backoff and parked after `MAX_OUTBOX_ATTEMPTS` (`deliverOutbox`), and no delivery fails
15
+ * backoff and parked after `sweep.outboxAttempts` (`deliverOutbox`), and no delivery fails
16
16
  * the step.
17
17
  * 2. **Linked agents.** Pending workflow `agent` effects whose linked turn already settled
18
18
  * are completed and the workflow is woken. A linked turn's settle does both in its own
19
19
  * transaction; this is the backstop for one that settle left pending, such as an effect
20
20
  * an older Runtime wrote.
21
21
  * 3. **Orphaned sessions.** On this process's first pass for the Tenant, then at most every
22
- * `ORPHAN_SCAN_MS`: `running` or `runnable` sessions with no owner, or an owner whose lease
23
- * expired, are woken with reason `recover`, page by page within `DRAIN_BUDGET_MS`; a scan
22
+ * `sweep.orphanScanMs`: `running` or `runnable` sessions with no owner, or an owner whose lease
23
+ * expired, are woken with reason `recover`, page by page within `sweep.drainBudgetMs`; a scan
24
24
  * the budget cut short goes on at the next pass. Neither a lost wake (step 1) nor a Worker
25
25
  * that died mid-advance (the execution retries that advance, which takes over, §11.4)
26
26
  * needs it: it is the backstop for what the execution itself lost or ended without an
@@ -34,7 +34,7 @@
34
34
  * orphan scan, pod Environments whose change stalled get a reconcile (`reconcileStalePods`).
35
35
  * Environments unused for their `lifecycle.deleteAfter` are deleted
36
36
  * (`sweepUnusedEnvironments`).
37
- * 5. **Control signals.** Signals on the control bus older than `SIGNAL_RETENTION_MS` are
37
+ * 5. **Control signals.** Signals on the control bus older than `sweep.signalRetentionMs` are
38
38
  * deleted: followers read back only the last two minutes (`store/postgres/control.ts`).
39
39
  * 6. **Hooks.** Callbacks registered with `ctx.onSweep`.
40
40
  *
@@ -46,27 +46,20 @@
46
46
  import { sweepUnusedEnvironments } from "./environments.js";
47
47
  import { sweepPendingSeeds } from "../artifacts/disk.js";
48
48
  import { pendingAgentEffects, reconcilePendingAgentEffect, } from "../core/flow-host.js";
49
- const BATCH = 100;
50
- /** How long a control signal is kept after it was written. */
51
- const SIGNAL_RETENTION_MS = 60 * 60 * 1000;
52
- /**
53
- * How old an outbox row is before the sweep delivers it, unless its delivery after commit
54
- * already failed (then it is due at once): longer than that delivery can take with its
55
- * retries, so the sweep does not send again, and double the load on, an execution that is
56
- * only slow. Sending one twice is harmless either way (the idempotency key).
57
- */
58
- export const OUTBOX_GRACE_MS = 30_000;
59
- /**
60
- * How often the orphan scan, and the stale pod sandbox check, run after the first pass of a
61
- * Tenant opened on this process.
62
- */
63
- export const ORPHAN_SCAN_MS = 60_000;
64
- /**
65
- * How long one pass may spend draining the outbox, and paging through orphaned sessions.
66
- * A backlog is worked off over several passes rather than holding one (and with it the
67
- * Tenant's sweep object in the execution) for long.
49
+ import { hostTuning } from "../tuning.js";
50
+ /*
51
+ * The sweep's timings are the Host tuning's `sweep` group (`tuning.ts`):
52
+ * - `outboxGraceMs`: how old an outbox row is before the sweep delivers it, unless its delivery
53
+ * after commit already failed (then it is due at once): longer than that delivery can take with
54
+ * its retries, so the sweep does not send again, and double the load on, an execution that is
55
+ * only slow. Sending one twice is harmless either way (the idempotency key).
56
+ * - `orphanScanMs`: how often the orphan scan, and the stale pod sandbox check, run after the
57
+ * first pass of a Tenant opened on this process.
58
+ * - `drainBudgetMs`: how long one pass may spend draining the outbox, and paging through
59
+ * orphaned sessions. A backlog is worked off over several passes rather than holding one (and
60
+ * with it the Tenant's sweep object in the execution) for long.
61
+ * - `batchSize`, `signalRetentionMs`, `outboxAttempts`, `outboxRetry`, `stalePodMs`.
68
62
  */
69
- export const DRAIN_BUDGET_MS = 2000;
70
63
  /**
71
64
  * Each open Tenant's sweep state on this process: when its last orphan scan finished, the
72
65
  * last session id of one that ran out of budget, which the next pass goes on from, and when
@@ -82,10 +75,10 @@ export async function sweep(ctx) {
82
75
  passes.set(ctx, pass);
83
76
  const scanOrphans = pass.orphansAt === undefined ||
84
77
  pass.orphansAfter !== undefined ||
85
- now.getTime() - pass.orphansAt >= ORPHAN_SCAN_MS;
86
- const checkPods = pass.podsAt === undefined || now.getTime() - pass.podsAt >= ORPHAN_SCAN_MS;
78
+ now.getTime() - pass.orphansAt >= hostTuning().sweep.orphanScanMs;
79
+ const checkPods = pass.podsAt === undefined || now.getTime() - pass.podsAt >= hostTuning().sweep.orphanScanMs;
87
80
  const steps = [
88
- ["outbox", () => deliverOutbox(ctx, first ? 0 : OUTBOX_GRACE_MS)],
81
+ ["outbox", () => deliverOutbox(ctx, first ? 0 : hostTuning().sweep.outboxGraceMs)],
89
82
  ["linked", () => reconcileLinkedAgents(ctx)],
90
83
  ...(scanOrphans
91
84
  ? [
@@ -127,7 +120,7 @@ export async function sweep(ctx) {
127
120
  ["mcp", async () => ctx.mcp?.sweep()],
128
121
  [
129
122
  "signals",
130
- () => ctx.store.tx((t) => t.pruneSignals(new Date(now.getTime() - SIGNAL_RETENTION_MS))),
123
+ () => ctx.store.tx((t) => t.pruneSignals(new Date(now.getTime() - hostTuning().sweep.signalRetentionMs))),
131
124
  ],
132
125
  ...[...ctx.sweepHooks].map((hook) => ["hook", hook]),
133
126
  ];
@@ -149,30 +142,26 @@ export async function sweep(ctx) {
149
142
  if (failure)
150
143
  throw failure.error;
151
144
  }
152
- /** Failed deliveries after which the sweep parks an outbox row (`Tx.failOutbox`). */
153
- export const MAX_OUTBOX_ATTEMPTS = 10;
154
- /** How long after its first failed delivery the sweep tries a row again; doubled each time. */
155
- const RETRY_MS = 5000;
156
- const RETRY_MAX_MS = 10 * 60_000;
157
145
  /**
158
146
  * Deliver the outbox rows that are due (`Tx.pendingOutbox`: older than `graceMs`, or whose
159
147
  * delivery failed), oldest first, batch after batch until none is left or `budgetMs` is
160
148
  * spent, and delete the delivered ones. Each row is delivered on its own: one that fails
161
149
  * (Restate refuses it, or a Runtime that does not know a wake's reason) is tried again later,
162
- * with backoff, so it never holds back the rows behind it, and after `MAX_OUTBOX_ATTEMPTS`
150
+ * with backoff, so it never holds back the rows behind it, and after `sweep.outboxAttempts`
163
151
  * failures it is parked: logged once, at error, and kept in the outbox for an operator. A
164
152
  * parked wake's session is still re-woken by the orphan scan while it is runnable, and a
165
153
  * parked sandbox signal's pod by the stale pod check. A row the Tenant declines (it is
166
154
  * closing) stays as it is, and ends the drain. Never throws for a delivery; returns the rows
167
155
  * delivered.
168
156
  */
169
- export async function deliverOutbox(ctx, graceMs = 0, budgetMs = DRAIN_BUDGET_MS) {
157
+ export async function deliverOutbox(ctx, graceMs = 0, budgetMs = hostTuning().sweep.drainBudgetMs) {
170
158
  const deadline = Date.now() + budgetMs;
171
159
  const delivered = [];
160
+ const batchSize = hostTuning().sweep.batchSize;
172
161
  for (;;) {
173
- const pending = await ctx.store.tx((t) => t.pendingOutbox(graceMs, BATCH));
162
+ const pending = await ctx.store.tx((t) => t.pendingOutbox(graceMs, batchSize));
174
163
  const batch = [];
175
- let done = pending.length < BATCH;
164
+ let done = pending.length < batchSize;
176
165
  try {
177
166
  for (const row of pending) {
178
167
  if (Date.now() >= deadline) {
@@ -206,8 +195,11 @@ export async function deliverOutbox(ctx, graceMs = 0, budgetMs = DRAIN_BUDGET_MS
206
195
  /** Records a failed delivery of `row`: retried with backoff, parked after the last attempt. */
207
196
  async function failed(ctx, row, error) {
208
197
  const attempts = row.attempts + 1;
209
- const park = attempts >= MAX_OUTBOX_ATTEMPTS;
210
- const retryInMs = Math.min(RETRY_MS * 2 ** (attempts - 1), RETRY_MAX_MS);
198
+ // Parked after `sweep.outboxAttempts` failed deliveries (`Tx.failOutbox`); tried again after
199
+ // `outboxRetry.minMs`, doubled each time.
200
+ const { outboxAttempts, outboxRetry } = hostTuning().sweep;
201
+ const park = attempts >= outboxAttempts;
202
+ const retryInMs = Math.min(outboxRetry.minMs * 2 ** (attempts - 1), outboxRetry.maxMs);
211
203
  await ctx.store.tx((t) => t.failOutbox(row, { retryInMs, park }));
212
204
  const { request } = row;
213
205
  const fields = {
@@ -235,29 +227,28 @@ export async function reconcileLinkedAgents(ctx) {
235
227
  * after `after`, until none is left or `budgetMs` is spent. Returns the ids woken, and the last
236
228
  * id when the budget ran out first (`next`, where the next scan goes on).
237
229
  */
238
- export async function wakeOrphanedSessions(ctx, now = new Date(), after, budgetMs = DRAIN_BUDGET_MS) {
230
+ export async function wakeOrphanedSessions(ctx, now = new Date(), after, budgetMs = hostTuning().sweep.drainBudgetMs) {
239
231
  const deadline = Date.now() + budgetMs;
240
232
  const woken = [];
233
+ const batchSize = hostTuning().sweep.batchSize;
241
234
  let cursor = after;
242
235
  for (;;) {
243
- const page = await ctx.store.tx((t) => t.orphanedSessions(now, BATCH, cursor));
236
+ const page = await ctx.store.tx((t) => t.orphanedSessions(now, batchSize, cursor));
244
237
  for (const session of page) {
245
238
  await ctx.wake(session.id, { reason: "recover" });
246
239
  woken.push(session.id);
247
240
  cursor = session.id;
248
241
  }
249
- if (page.length < BATCH)
242
+ if (page.length < batchSize)
250
243
  return { woken };
251
244
  if (Date.now() >= deadline)
252
245
  return { woken, next: cursor };
253
246
  }
254
247
  }
255
- /** A pod sandbox in a change this long without a reconcile gets one from the sweep. */
256
- const STALE_POD_MS = 60_000;
257
248
  /**
258
249
  * Pod sandboxes (F7.2) whose change has not finished (creating, deleting, an old volume still
259
250
  * to delete, an expiry not yet recorded), or that should run but whose engine is not connected,
260
- * and whose row has not moved for a minute, get a reconcile: a pod or volume deleted outside
251
+ * and whose row has not moved for `sweep.stalePodMs` (a minute), get a reconcile: a pod or volume deleted outside
261
252
  * the Runtime is found, and a change goes on whose reconcile the execution itself lost (its
262
253
  * retry timer, an invocation an operator killed, Restate's state wiped) or whose outbox row
263
254
  * was parked. A reconcile a commit asked for is never lost: it is in the outbox.
@@ -267,7 +258,7 @@ async function reconcileStalePods(ctx, now) {
267
258
  return;
268
259
  const stale = await ctx.store.tx(async (t) => (await t.listEnvironments()).filter((row) => {
269
260
  const pod = row.pod;
270
- if (!pod || now.getTime() - Date.parse(row.updatedAt) < STALE_POD_MS)
261
+ if (!pod || now.getTime() - Date.parse(row.updatedAt) < hostTuning().sweep.stalePodMs)
271
262
  return false;
272
263
  return (pod.desired === "deleted" ||
273
264
  pod.retiring !== undefined ||
@@ -6,6 +6,8 @@
6
6
  import type { HostEffect } from "@nylorun/harness/run";
7
7
  import type { PluginLabel } from "@nylorun/core/define";
8
8
  import type { TOOL_CALL_KINDS, TOOL_CALL_STATUSES } from "@nylorun/core/contracts";
9
+ import { type CompactionFacts } from "@nylorun/core/harness-api";
10
+ import type { Tx } from "../store/types.js";
9
11
  export type ToolCallStatus = (typeof TOOL_CALL_STATUSES)[number];
10
12
  export type ToolCallKind = (typeof TOOL_CALL_KINDS)[number];
11
13
  /** The model's tool call id and the harness invocation, for tool effects. */
@@ -51,25 +53,52 @@ export declare function assistantMessage(request: HostEffect, value: unknown): {
51
53
  usage?: object | undefined;
52
54
  } | undefined;
53
55
  /**
54
- * `context.compacted` for a model effect that summarized history (Model Calls §8): the
55
- * engine replaced the older transcript with that summary. A partial summary (one call of
56
- * several) is marked `partial: true` (R7.1): only the last call's event replaced the history.
56
+ * `context.compacted` for a compaction a harness reported with its transcript edit (Q4, protocol
57
+ * 15): its facts, the last summary call's step and model facts, and the agent. Every summary
58
+ * effect it names must be a completed, successful model call of turn `turnId` made for a summary
59
+ * (`purpose: "summary"`); otherwise the edit is refused (`invalid`).
57
60
  */
58
- export declare function contextCompacted(request: HostEffect, value: unknown): {
61
+ export declare function contextCompacted(t: Tx, sessionId: string, turnId: string | null, facts: CompactionFacts): Promise<{
59
62
  agent: import("@nylorun/core/define").AgentRef;
60
63
  invocationId?: string | undefined;
61
64
  trigger: "overflow" | "threshold";
62
65
  tokensBefore: number;
63
66
  tokensAfter: number;
64
- partial?: true | undefined;
67
+ effectId: string;
68
+ durationMs?: number | undefined;
69
+ gate?: {
70
+ startedAt: string;
71
+ endedAt: string;
72
+ } | undefined;
73
+ firstTokenMs?: number | undefined;
74
+ meteredUsage?: {
75
+ inputTokens: number;
76
+ outputTokens: number;
77
+ totalTokens: number;
78
+ cachedTokens?: number | undefined;
79
+ costUsd?: number | undefined;
80
+ } | undefined;
65
81
  } | {
66
82
  agent?: undefined;
67
83
  invocationId?: string | undefined;
68
84
  trigger: "overflow" | "threshold";
69
85
  tokensBefore: number;
70
86
  tokensAfter: number;
71
- partial?: true | undefined;
72
- } | undefined;
87
+ effectId: string;
88
+ durationMs?: number | undefined;
89
+ gate?: {
90
+ startedAt: string;
91
+ endedAt: string;
92
+ } | undefined;
93
+ firstTokenMs?: number | undefined;
94
+ meteredUsage?: {
95
+ inputTokens: number;
96
+ outputTokens: number;
97
+ totalTokens: number;
98
+ cachedTokens?: number | undefined;
99
+ costUsd?: number | undefined;
100
+ } | undefined;
101
+ }>;
73
102
  /** `model.failed` for a model effect that completed with a failure outcome (Model Calls §6.4). */
74
103
  export declare function modelFailed(request: HostEffect, value: unknown): {
75
104
  agent: import("@nylorun/core/define").AgentRef;
@@ -137,6 +166,8 @@ export interface ToolCallFacts {
137
166
  readonly status: ToolCallStatus;
138
167
  readonly kind?: ToolCallKind;
139
168
  readonly server?: string;
169
+ /** The tool's identity: an MCP tool's name on `server`, an HTTP tool's declared name. */
170
+ readonly tool?: string;
140
171
  readonly skill?: string;
141
172
  readonly plugin?: PluginLabel;
142
173
  readonly attempts?: number;
@@ -161,8 +192,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
161
192
  redacted: number;
162
193
  toolName: string;
163
194
  status?: "cancelled" | "completed" | "failed" | undefined;
164
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
195
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
165
196
  server?: string | undefined;
197
+ tool?: string | undefined;
166
198
  skill?: string | undefined;
167
199
  plugin?: PluginLabel | undefined;
168
200
  attempts?: number | undefined;
@@ -182,8 +214,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
182
214
  redacted: number;
183
215
  toolName: string;
184
216
  status?: "cancelled" | "completed" | "failed" | undefined;
185
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
217
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
186
218
  server?: string | undefined;
219
+ tool?: string | undefined;
187
220
  skill?: string | undefined;
188
221
  plugin?: PluginLabel | undefined;
189
222
  attempts?: number | undefined;
@@ -203,8 +236,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
203
236
  redacted?: undefined;
204
237
  toolName: string;
205
238
  status?: "cancelled" | "completed" | "failed" | undefined;
206
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
239
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
207
240
  server?: string | undefined;
241
+ tool?: string | undefined;
208
242
  skill?: string | undefined;
209
243
  plugin?: PluginLabel | undefined;
210
244
  attempts?: number | undefined;
@@ -224,8 +258,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
224
258
  redacted?: undefined;
225
259
  toolName: string;
226
260
  status?: "cancelled" | "completed" | "failed" | undefined;
227
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
261
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
228
262
  server?: string | undefined;
263
+ tool?: string | undefined;
229
264
  skill?: string | undefined;
230
265
  plugin?: PluginLabel | undefined;
231
266
  attempts?: number | undefined;
@@ -240,8 +275,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
240
275
  redacted: number;
241
276
  toolName: string;
242
277
  status?: "cancelled" | "completed" | "failed" | undefined;
243
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
278
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
244
279
  server?: string | undefined;
280
+ tool?: string | undefined;
245
281
  skill?: string | undefined;
246
282
  plugin?: PluginLabel | undefined;
247
283
  attempts?: number | undefined;
@@ -256,8 +292,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
256
292
  redacted: number;
257
293
  toolName: string;
258
294
  status?: "cancelled" | "completed" | "failed" | undefined;
259
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
295
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
260
296
  server?: string | undefined;
297
+ tool?: string | undefined;
261
298
  skill?: string | undefined;
262
299
  plugin?: PluginLabel | undefined;
263
300
  attempts?: number | undefined;
@@ -272,8 +309,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
272
309
  redacted?: undefined;
273
310
  toolName: string;
274
311
  status?: "cancelled" | "completed" | "failed" | undefined;
275
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
312
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
276
313
  server?: string | undefined;
314
+ tool?: string | undefined;
277
315
  skill?: string | undefined;
278
316
  plugin?: PluginLabel | undefined;
279
317
  attempts?: number | undefined;
@@ -288,8 +326,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
288
326
  redacted?: undefined;
289
327
  toolName: string;
290
328
  status?: "cancelled" | "completed" | "failed" | undefined;
291
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
329
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
292
330
  server?: string | undefined;
331
+ tool?: string | undefined;
293
332
  skill?: string | undefined;
294
333
  plugin?: PluginLabel | undefined;
295
334
  attempts?: number | undefined;
@@ -311,8 +350,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
311
350
  redacted: number;
312
351
  toolName: string;
313
352
  status?: "cancelled" | "completed" | "failed" | undefined;
314
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
353
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
315
354
  server?: string | undefined;
355
+ tool?: string | undefined;
316
356
  skill?: string | undefined;
317
357
  plugin?: PluginLabel | undefined;
318
358
  attempts?: number | undefined;
@@ -334,8 +374,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
334
374
  redacted: number;
335
375
  toolName: string;
336
376
  status?: "cancelled" | "completed" | "failed" | undefined;
337
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
377
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
338
378
  server?: string | undefined;
379
+ tool?: string | undefined;
339
380
  skill?: string | undefined;
340
381
  plugin?: PluginLabel | undefined;
341
382
  attempts?: number | undefined;
@@ -357,8 +398,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
357
398
  redacted?: undefined;
358
399
  toolName: string;
359
400
  status?: "cancelled" | "completed" | "failed" | undefined;
360
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
401
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
361
402
  server?: string | undefined;
403
+ tool?: string | undefined;
362
404
  skill?: string | undefined;
363
405
  plugin?: PluginLabel | undefined;
364
406
  attempts?: number | undefined;
@@ -380,8 +422,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
380
422
  redacted?: undefined;
381
423
  toolName: string;
382
424
  status?: "cancelled" | "completed" | "failed" | undefined;
383
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
425
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
384
426
  server?: string | undefined;
427
+ tool?: string | undefined;
385
428
  skill?: string | undefined;
386
429
  plugin?: PluginLabel | undefined;
387
430
  attempts?: number | undefined;
@@ -398,8 +441,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
398
441
  redacted: number;
399
442
  toolName: string;
400
443
  status?: "cancelled" | "completed" | "failed" | undefined;
401
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
444
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
402
445
  server?: string | undefined;
446
+ tool?: string | undefined;
403
447
  skill?: string | undefined;
404
448
  plugin?: PluginLabel | undefined;
405
449
  attempts?: number | undefined;
@@ -416,8 +460,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
416
460
  redacted: number;
417
461
  toolName: string;
418
462
  status?: "cancelled" | "completed" | "failed" | undefined;
419
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
463
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
420
464
  server?: string | undefined;
465
+ tool?: string | undefined;
421
466
  skill?: string | undefined;
422
467
  plugin?: PluginLabel | undefined;
423
468
  attempts?: number | undefined;
@@ -434,8 +479,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
434
479
  redacted?: undefined;
435
480
  toolName: string;
436
481
  status?: "cancelled" | "completed" | "failed" | undefined;
437
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
482
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
438
483
  server?: string | undefined;
484
+ tool?: string | undefined;
439
485
  skill?: string | undefined;
440
486
  plugin?: PluginLabel | undefined;
441
487
  attempts?: number | undefined;
@@ -452,8 +498,9 @@ export declare function toolCompleted(request: HostEffect, value: unknown, facts
452
498
  redacted?: undefined;
453
499
  toolName: string;
454
500
  status?: "cancelled" | "completed" | "failed" | undefined;
455
- kind?: "harness" | "http" | "mcp" | "platform" | "sandbox" | undefined;
501
+ kind?: "harness" | "http" | "mcp" | "sandbox" | undefined;
456
502
  server?: string | undefined;
503
+ tool?: string | undefined;
457
504
  skill?: string | undefined;
458
505
  plugin?: PluginLabel | undefined;
459
506
  attempts?: number | undefined;
@@ -1,4 +1,5 @@
1
1
  import { isModelFailureOutcome } from "@nylorun/core/define";
2
+ import { HarnessApiError } from "@nylorun/core/harness-api";
2
3
  /** The model's tool call id and the harness invocation, for tool effects. */
3
4
  export function toolIds(context) {
4
5
  const c = context;
@@ -52,31 +53,35 @@ export function assistantMessage(request, value) {
52
53
  };
53
54
  }
54
55
  /**
55
- * `context.compacted` for a model effect that summarized history (Model Calls §8): the
56
- * engine replaced the older transcript with that summary. A partial summary (one call of
57
- * several) is marked `partial: true` (R7.1): only the last call's event replaced the history.
56
+ * `context.compacted` for a compaction a harness reported with its transcript edit (Q4, protocol
57
+ * 15): its facts, the last summary call's step and model facts, and the agent. Every summary
58
+ * effect it names must be a completed, successful model call of turn `turnId` made for a summary
59
+ * (`purpose: "summary"`); otherwise the edit is refused (`invalid`).
58
60
  */
59
- export function contextCompacted(request, value) {
60
- const compaction = request.context?.compaction;
61
- if (!compaction || isModelFailureOutcome(value))
62
- return undefined;
63
- const summary = typeof value === "string"
64
- ? value
65
- : Array.isArray(value?.output)
66
- ? value.output
67
- .map((block) => (block.type === "text" && typeof block.text === "string" ? block.text : ""))
68
- .join("")
69
- : "";
70
- const invocationId = request.context?.invocationId;
71
- const tokensBefore = Number(compaction.tokensBefore) || 0;
72
- const keptTokens = Number(compaction.keptTokens) || 0;
61
+ export async function contextCompacted(t, sessionId, turnId, facts) {
62
+ let last;
63
+ for (const effectId of facts.summaryEffectIds) {
64
+ const row = await t.get("effects", effectId);
65
+ const request = row?.request;
66
+ if (!row ||
67
+ row.status !== "completed" ||
68
+ request?.kind !== "model" ||
69
+ request.sessionId !== sessionId ||
70
+ request.turnId !== turnId ||
71
+ request.purpose !== "summary" ||
72
+ isModelFailureOutcome(row.outcome?.value))
73
+ throw new HarnessApiError("invalid", `The compaction names ${effectId}, which is not a completed summary call of this turn`);
74
+ last = { effectId, row };
75
+ }
76
+ const { effectId, row } = last;
77
+ const invocationId = row.request.context?.invocationId;
73
78
  return {
74
79
  ...(typeof invocationId === "string" ? { invocationId } : {}),
75
- trigger: compaction.trigger === "overflow" ? "overflow" : "threshold",
76
- tokensBefore,
77
- tokensAfter: keptTokens + Math.ceil(summary.trim().length / 4),
78
- ...(compaction.partial ? { partial: true } : {}),
79
- ...agentOf(request),
80
+ trigger: facts.trigger,
81
+ tokensBefore: facts.tokensBefore,
82
+ tokensAfter: facts.tokensAfter,
83
+ ...modelOutcomeFacts(effectId, row, await t.modelUsageOf(effectId)),
84
+ ...agentOf(row.request),
80
85
  };
81
86
  }
82
87
  /** `model.failed` for a model effect that completed with a failure outcome (Model Calls §6.4). */
@@ -164,6 +169,7 @@ export function toolCompleted(request, value, facts) {
164
169
  status: facts.status,
165
170
  ...(facts.kind === undefined ? {} : { kind: facts.kind }),
166
171
  ...(facts.server === undefined ? {} : { server: facts.server }),
172
+ ...(facts.tool === undefined ? {} : { tool: facts.tool }),
167
173
  ...(facts.skill === undefined ? {} : { skill: facts.skill }),
168
174
  ...(facts.plugin === undefined ? {} : { plugin: facts.plugin }),
169
175
  ...(facts.attempts === undefined ? {} : { attempts: facts.attempts }),
@@ -1,7 +1,6 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
2
  import type { HarnessStatus, HostTenant, TenantEnvelope } from "@nylorun/core/contracts";
3
3
  import type { HarnessChannel } from "@nylorun/core/harness-api";
4
- import type { FlowLimits } from "../core/limits.js";
5
4
  import type { HarnessPeer } from "../harness-api/server.js";
6
5
  import type { HostAuthority } from "../sandbox/join.js";
7
6
  import type { SessionStore } from "../store/types.js";
@@ -45,37 +44,33 @@ export interface TenantConfig {
45
44
  /**
46
45
  * Segment rollover (Model Calls §10): a turn ends its segment at a step boundary after this
47
46
  * many steps or milliseconds and continues in a new one, so no advance reaches its
48
- * deadline. Default 50 steps or 20 minutes.
47
+ * deadline. Default the Host tuning's `harnessApi.rolloverSteps` and `rolloverMs` (50 steps,
48
+ * 20 minutes).
49
49
  */
50
50
  rollover?: {
51
51
  steps?: number;
52
52
  ms?: number;
53
53
  };
54
- /** Retries and timeouts for model calls (Model Calls §5, §6). Defaults in `piModel`. */
55
- modelCall?: import("../gates/model-gate.js").ModelCallSettings;
56
54
  /**
57
55
  * How the Runtime may call MCP servers and HTTP tools (Host settings). Default: http and
58
56
  * private addresses allowed.
59
57
  */
60
58
  delivery?: OutboundPolicy;
61
- /** Bounds the default Tenant sweep interval (`sweepIntervalMs`). Default 30 s. */
59
+ /** Bounds the default Tenant sweep interval (`sweepIntervalMs`). Default: no bound. */
62
60
  leaseMs?: number;
63
- /** Ownership lease of an advance (§10.6); renewed every third while it runs. Default 30 s. */
61
+ /**
62
+ * Ownership lease of an advance (§10.6); renewed every third while it runs. Default the Host
63
+ * tuning's `tenant.ownerLeaseMs` (30 s).
64
+ */
64
65
  ownerLeaseMs?: number;
65
66
  /**
66
67
  * Delay between Tenant sweep passes when the Tenant runs its own in-process execution.
67
- * Default `min(leaseMs, 5 s)`. A Host-level execution sets its own.
68
+ * Default `min(leaseMs, sweep.intervalMs)` (Host tuning, 5 s). A Host-level execution sets its
69
+ * own.
68
70
  */
69
71
  sweepIntervalMs?: number;
70
- /** Operator flow limits (`RuntimeOptions.flow` / `workflows.md` §13). */
71
- flow?: Partial<FlowLimits>;
72
- /**
73
- * Optional env snapshot for `NYLORUN_FLOW_*`. Host passes this; the Runtime
74
- * never reads ambient process environment for flow limits.
75
- */
76
- flowEnv?: Readonly<Record<string, string | undefined>>;
77
72
  /**
78
- * The trusted issuers whose JWTs the Tenant API accepts (Host feature `trusted-issuers`), from
73
+ * The trusted issuers whose JWTs the Runtime API accepts (Host feature `trusted-issuers`), from
79
74
  * the identity file (`NYLORUN_IDENTITY_FILE`). Absent: none.
80
75
  */
81
76
  issuers?: import("./issuers.js").TrustedIssuers;
@@ -107,7 +102,7 @@ export interface TenantHandle {
107
102
  /** The handlers Durable Session Execution calls for this Tenant (`worker.ts`). */
108
103
  readonly worker?: TenantWorker;
109
104
  /**
110
- * A Tenant API request whose headers the Host has validated: authenticates, authorizes,
105
+ * A Runtime or Management API request whose headers the Host has validated: authenticates, authorizes,
111
106
  * dispatches. A response already written to `node.outgoing` is `RESPONSE_ALREADY_SENT`.
112
107
  */
113
108
  fetch(request: Request, node: NodeBindings): Promise<Response>;
@@ -4,14 +4,6 @@ import type { AdvanceResult, SandboxResult, SandboxTrigger, DurableExecution, St
4
4
  import type { Logger } from "./types.js";
5
5
  /** This process's Worker id: the `owner` it writes on the sessions it advances (§10.6). */
6
6
  export declare const WORKER_ID: string;
7
- /**
8
- * Default advance deadline: 50 minutes, below the one-hour inactivity and abort timeouts the
9
- * Restate adapter sets on the session object, so an advance always ends before Restate gives
10
- * up on it.
11
- */
12
- export declare const DEFAULT_ADVANCE_DEADLINE_MS: number;
13
- /** Default time an aborted advance has to settle before it is abandoned. */
14
- export declare const DEFAULT_ADVANCE_GRACE_MS = 30000;
15
7
  /** Why an advance's signal aborted (see "Abort reasons" above). */
16
8
  export type AdvanceAbortKind = AbortReason;
17
9
  /**
@@ -48,11 +40,11 @@ export interface TenantWorker {
48
40
  export interface TenantWorkersOptions {
49
41
  /** Finds or opens a Tenant that is not registered on this process. */
50
42
  resolve?: (tenantId: string) => Promise<TenantWorker | undefined>;
51
- /** How long one advance may run before its signal aborts. Default `DEFAULT_ADVANCE_DEADLINE_MS`. */
43
+ /** How long one advance may run before its signal aborts. Default `execution.advanceDeadlineMs` (Host tuning, 50 minutes). */
52
44
  advanceDeadlineMs?: number;
53
45
  /**
54
46
  * How long an advance whose signal aborted has to return before it is abandoned.
55
- * Default `DEFAULT_ADVANCE_GRACE_MS`.
47
+ * Default `execution.advanceGraceMs` (Host tuning, 30 s).
56
48
  */
57
49
  advanceGraceMs?: number;
58
50
  /** Receives a warning for each abandoned advance. */