@nylorun/runtime 0.16.0-beta → 0.19.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 (256) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +105 -63
  3. package/dist/adapters/execution/restate.d.ts +1 -3
  4. package/dist/adapters/execution/restate.js +4 -31
  5. package/dist/adapters/replication/pgoutput.js +1 -1
  6. package/dist/adapters/sandbox/local.js +1 -1
  7. package/dist/adapters/sandbox/virtual.js +1 -1
  8. package/dist/api/ag-ui/endpoint.js +1 -2
  9. package/dist/api/ag-ui/routes.d.ts +1 -1
  10. package/dist/api/ag-ui/routes.js +11 -13
  11. package/dist/api/ag-ui/translate.d.ts +1 -3
  12. package/dist/api/ag-ui/translate.js +2 -17
  13. package/dist/api/components.d.ts +4783 -2588
  14. package/dist/api/components.js +19 -21
  15. package/dist/api/gate/routes.d.ts +7 -8
  16. package/dist/api/gate/routes.js +58 -52
  17. package/dist/api/http/app.d.ts +6 -0
  18. package/dist/api/http/app.js +20 -14
  19. package/dist/api/http/define.d.ts +22 -13
  20. package/dist/api/http/define.js +43 -39
  21. package/dist/api/http/routes/access.d.ts +3 -19
  22. package/dist/api/http/routes/access.js +25 -184
  23. package/dist/api/http/routes/artifacts.js +3 -7
  24. package/dist/api/http/routes/files.d.ts +8 -0
  25. package/dist/api/http/routes/files.js +77 -0
  26. package/dist/api/http/routes/keys.d.ts +10 -0
  27. package/dist/api/http/routes/keys.js +64 -0
  28. package/dist/api/http/routes/me.d.ts +13 -0
  29. package/dist/api/http/routes/me.js +48 -0
  30. package/dist/api/http/routes/reads.d.ts +66 -0
  31. package/dist/api/http/routes/reads.js +127 -0
  32. package/dist/api/http/routes/sandboxes.d.ts +2 -2
  33. package/dist/api/http/routes/sandboxes.js +8 -7
  34. package/dist/api/http/routes/sessions.js +31 -20
  35. package/dist/api/http/routes/tenant.js +15 -18
  36. package/dist/api/http/routes/vaults.d.ts +13 -3
  37. package/dist/api/http/routes/vaults.js +136 -64
  38. package/dist/api/openapi.d.ts +10 -11
  39. package/dist/api/openapi.js +292 -68
  40. package/dist/artifacts/links.js +6 -6
  41. package/dist/artifacts/service.js +1 -1
  42. package/dist/core/flow-host.d.ts +44 -23
  43. package/dist/core/flow-host.js +88 -106
  44. package/dist/core/provider.d.ts +4 -1
  45. package/dist/core/provider.js +6 -1
  46. package/dist/core/sandbox-routes.d.ts +0 -9
  47. package/dist/core/sandbox-routes.js +2 -21
  48. package/dist/execution/memory.d.ts +4 -5
  49. package/dist/execution/memory.js +11 -25
  50. package/dist/execution/types.d.ts +3 -33
  51. package/dist/execution/types.js +2 -12
  52. package/dist/gates/http-tool.d.ts +86 -0
  53. package/dist/gates/http-tool.js +197 -0
  54. package/dist/gates/mcp-handler.d.ts +3 -0
  55. package/dist/gates/mcp-handler.js +6 -4
  56. package/dist/gates/meter.d.ts +2 -2
  57. package/dist/gates/meter.js +6 -0
  58. package/dist/gates/tenant-vaults.d.ts +19 -14
  59. package/dist/gates/tenant-vaults.js +17 -12
  60. package/dist/gates/tool-calls.d.ts +7 -15
  61. package/dist/gates/tool-calls.js +4 -4
  62. package/dist/gates/tool-client.d.ts +1 -1
  63. package/dist/gates/tool-client.js +23 -47
  64. package/dist/gates/tool-contract.d.ts +27 -39
  65. package/dist/gates/tool-contract.js +30 -21
  66. package/dist/gates/tool-gate.d.ts +25 -24
  67. package/dist/gates/tool-gate.js +11 -7
  68. package/dist/harness/calls.d.ts +10 -4
  69. package/dist/harness/calls.js +15 -6
  70. package/dist/harness/executors.d.ts +1 -1
  71. package/dist/harness/executors.js +17 -12
  72. package/dist/harness/main.d.ts +2 -2
  73. package/dist/harness/main.js +5 -13
  74. package/dist/harness/service.d.ts +4 -5
  75. package/dist/harness/service.js +9 -2
  76. package/dist/harness-api/in-process.js +2 -2
  77. package/dist/harness-api/record.d.ts +6 -3
  78. package/dist/harness-api/record.js +65 -72
  79. package/dist/harness-api/server.d.ts +1 -9
  80. package/dist/harness-api/server.js +19 -17
  81. package/dist/harness-api/start.js +1 -5
  82. package/dist/harness-api/workspace.js +2 -3
  83. package/dist/harness-api/ws-server.js +1 -1
  84. package/dist/host/app.d.ts +2 -10
  85. package/dist/host/app.js +24 -44
  86. package/dist/host/config-for.d.ts +5 -5
  87. package/dist/host/config-for.js +2 -3
  88. package/dist/host/config.d.ts +0 -11
  89. package/dist/host/create-host.d.ts +3 -40
  90. package/dist/host/create-host.js +18 -91
  91. package/dist/host/environment.d.ts +0 -3
  92. package/dist/host/environment.js +0 -9
  93. package/dist/host/gates.d.ts +4 -1
  94. package/dist/host/gates.js +9 -3
  95. package/dist/host/http.d.ts +1 -2
  96. package/dist/host/http.js +1 -7
  97. package/dist/host/index.d.ts +2 -2
  98. package/dist/host/index.js +2 -2
  99. package/dist/host/main.js +55 -40
  100. package/dist/host/operate.d.ts +29 -0
  101. package/dist/host/operate.js +223 -0
  102. package/dist/host/stack-config.d.ts +23 -20
  103. package/dist/host/stack-config.js +28 -44
  104. package/dist/index.d.ts +4 -1
  105. package/dist/index.js +3 -1
  106. package/dist/infra/workers.d.ts +1 -1
  107. package/dist/keys/client.js +9 -1
  108. package/dist/keys/keys.d.ts +12 -2
  109. package/dist/keys/keys.js +10 -2
  110. package/dist/management-openapi.json +6491 -0
  111. package/dist/mcp/connect.d.ts +8 -4
  112. package/dist/mcp/connect.js +8 -27
  113. package/dist/mcp/pool.d.ts +6 -9
  114. package/dist/mcp/pool.js +8 -18
  115. package/dist/mcp/snapshot.d.ts +8 -2
  116. package/dist/mcp/snapshot.js +29 -2
  117. package/dist/media.d.ts +1 -1
  118. package/dist/media.js +1 -1
  119. package/dist/model/pi-model.js +3 -0
  120. package/dist/openapi.json +6228 -15615
  121. package/dist/reads/access.d.ts +4 -0
  122. package/dist/reads/access.js +12 -0
  123. package/dist/reads/cursor.d.ts +11 -0
  124. package/dist/reads/cursor.js +80 -0
  125. package/dist/reads/types.d.ts +25 -0
  126. package/dist/reads/types.js +1 -0
  127. package/dist/sandbox/manager.d.ts +16 -0
  128. package/dist/sandbox/manager.js +40 -0
  129. package/dist/sandbox/session-sandbox.js +13 -3
  130. package/dist/sandbox/skills.d.ts +13 -0
  131. package/dist/sandbox/skills.js +46 -0
  132. package/dist/sandbox/types.d.ts +2 -2
  133. package/dist/store/ownership.d.ts +9 -0
  134. package/dist/store/ownership.js +13 -0
  135. package/dist/store/postgres/connect.d.ts +2 -0
  136. package/dist/store/postgres/connect.js +29 -0
  137. package/dist/store/postgres/drizzle/0008_installation_vaults.sql +2 -0
  138. package/dist/store/postgres/drizzle/0009_oauth_pending.sql +19 -0
  139. package/dist/store/postgres/drizzle/0010_oss_auth_removals.sql +3 -0
  140. package/dist/store/postgres/drizzle/0011_key_roles.sql +3 -0
  141. package/dist/store/postgres/drizzle/0012_session_reads.sql +8 -0
  142. package/dist/store/postgres/drizzle/0013_definition_files.sql +16 -0
  143. package/dist/store/postgres/drizzle/0014_action_endpoints_removed.sql +2 -0
  144. package/dist/store/postgres/drizzle/meta/_journal.json +49 -0
  145. package/dist/store/postgres/reads.d.ts +3 -0
  146. package/dist/store/postgres/reads.js +272 -0
  147. package/dist/store/postgres/schema.d.ts +423 -594
  148. package/dist/store/postgres/schema.js +84 -101
  149. package/dist/store/postgres/store.js +96 -248
  150. package/dist/store/postgres/tenant.d.ts +34 -2
  151. package/dist/store/postgres/tenant.js +16 -32
  152. package/dist/store/types.d.ts +44 -119
  153. package/dist/store/types.js +0 -1
  154. package/dist/streams/control.d.ts +0 -7
  155. package/dist/streams/control.js +0 -13
  156. package/dist/streams/types.d.ts +2 -20
  157. package/dist/streams/types.js +1 -1
  158. package/dist/tenant/advance.d.ts +3 -3
  159. package/dist/tenant/advance.js +10 -7
  160. package/dist/tenant/auth.d.ts +24 -15
  161. package/dist/tenant/auth.js +44 -55
  162. package/dist/tenant/cause.d.ts +3 -3
  163. package/dist/tenant/cause.js +1 -1
  164. package/dist/tenant/commands.d.ts +2 -18
  165. package/dist/tenant/commands.js +38 -179
  166. package/dist/tenant/context.d.ts +33 -45
  167. package/dist/tenant/definition-files.d.ts +24 -0
  168. package/dist/tenant/definition-files.js +103 -0
  169. package/dist/tenant/effects.d.ts +20 -18
  170. package/dist/tenant/effects.js +59 -133
  171. package/dist/tenant/ephemeral.d.ts +21 -8
  172. package/dist/tenant/ephemeral.js +11 -12
  173. package/dist/tenant/host-token.js +5 -5
  174. package/dist/tenant/identity-file.d.ts +75 -0
  175. package/dist/tenant/identity-file.js +202 -0
  176. package/dist/tenant/issuers.d.ts +48 -0
  177. package/dist/tenant/issuers.js +311 -0
  178. package/dist/tenant/jwt.js +3 -3
  179. package/dist/tenant/module.d.ts +1 -4
  180. package/dist/tenant/module.js +3 -12
  181. package/dist/tenant/operator-keys.d.ts +44 -0
  182. package/dist/tenant/operator-keys.js +87 -0
  183. package/dist/tenant/outbound.d.ts +40 -1
  184. package/dist/tenant/outbound.js +167 -18
  185. package/dist/tenant/paths.d.ts +1 -1
  186. package/dist/tenant/paths.js +1 -3
  187. package/dist/tenant/principals.d.ts +13 -13
  188. package/dist/tenant/principals.js +35 -36
  189. package/dist/tenant/run-token.js +6 -6
  190. package/dist/tenant/runtime.d.ts +5 -3
  191. package/dist/tenant/runtime.js +29 -15
  192. package/dist/tenant/sandboxes.d.ts +9 -6
  193. package/dist/tenant/sandboxes.js +16 -5
  194. package/dist/tenant/scheduler.d.ts +1 -5
  195. package/dist/tenant/scheduler.js +2 -5
  196. package/dist/tenant/session-streams.d.ts +8 -11
  197. package/dist/tenant/session-streams.js +48 -32
  198. package/dist/tenant/session.d.ts +8 -41
  199. package/dist/tenant/session.js +0 -37
  200. package/dist/tenant/sessions.d.ts +2 -2
  201. package/dist/tenant/sessions.js +17 -9
  202. package/dist/tenant/signing-keys.d.ts +3 -2
  203. package/dist/tenant/signing-keys.js +5 -5
  204. package/dist/tenant/skill-tool.d.ts +20 -0
  205. package/dist/tenant/skill-tool.js +72 -0
  206. package/dist/tenant/slim.d.ts +1 -1
  207. package/dist/tenant/slim.js +1 -1
  208. package/dist/tenant/status.js +7 -12
  209. package/dist/tenant/store-pg.d.ts +15 -0
  210. package/dist/tenant/store-pg.js +7 -3
  211. package/dist/tenant/streams.d.ts +3 -11
  212. package/dist/tenant/streams.js +2 -29
  213. package/dist/tenant/sweep.js +0 -5
  214. package/dist/tenant/transcript.d.ts +2 -2
  215. package/dist/tenant/transcript.js +2 -2
  216. package/dist/tenant/types.d.ts +33 -19
  217. package/dist/tenant/worker.d.ts +1 -3
  218. package/dist/tenant/worker.js +3 -8
  219. package/dist/vault/crypto.d.ts +7 -0
  220. package/dist/vault/crypto.js +16 -0
  221. package/dist/vault/oauth.d.ts +55 -0
  222. package/dist/vault/oauth.js +186 -0
  223. package/dist/vault/service.d.ts +54 -7
  224. package/dist/vault/service.js +261 -17
  225. package/dist/vault/sources.d.ts +60 -0
  226. package/dist/vault/sources.js +196 -0
  227. package/dist/version.d.ts +1 -1
  228. package/dist/version.js +1 -1
  229. package/package.json +5 -4
  230. package/dist/admin-openapi.json +0 -604
  231. package/dist/api/http/routes/actions.d.ts +0 -8
  232. package/dist/api/http/routes/actions.js +0 -76
  233. package/dist/api/http/routes/endpoints.d.ts +0 -7
  234. package/dist/api/http/routes/endpoints.js +0 -100
  235. package/dist/host/admin-api.d.ts +0 -23
  236. package/dist/host/admin-api.js +0 -74
  237. package/dist/host/cors.d.ts +0 -27
  238. package/dist/host/cors.js +0 -64
  239. package/dist/mcp/stdio.d.ts +0 -17
  240. package/dist/mcp/stdio.js +0 -82
  241. package/dist/tenant/access-policy.d.ts +0 -30
  242. package/dist/tenant/access-policy.js +0 -52
  243. package/dist/tenant/actions.d.ts +0 -14
  244. package/dist/tenant/actions.js +0 -29
  245. package/dist/tenant/browser.d.ts +0 -15
  246. package/dist/tenant/browser.js +0 -39
  247. package/dist/tenant/delivery-token.d.ts +0 -41
  248. package/dist/tenant/delivery-token.js +0 -104
  249. package/dist/tenant/delivery.d.ts +0 -62
  250. package/dist/tenant/delivery.js +0 -481
  251. package/dist/tenant/endpoints.d.ts +0 -67
  252. package/dist/tenant/endpoints.js +0 -90
  253. package/dist/tenant/subject-limits.d.ts +0 -16
  254. package/dist/tenant/subject-limits.js +0 -45
  255. package/dist/tenant/tokens.d.ts +0 -14
  256. package/dist/tenant/tokens.js +0 -187
@@ -17,11 +17,6 @@
17
17
  * - `<prefix>NylorunTimer`, key `<tenantId>:<timer key>`. `set` records the
18
18
  * latest time and sends a delayed `fire`; a `fire` for an older time is a
19
19
  * no-op, which is how setting a key again replaces it.
20
- * - `<prefix>NylorunAction`, key `<tenantId>:<actionId>`. Its exclusive
21
- * `deliver` handler calls `WorkerHandlers.deliver`. Like `advance`, it keeps
22
- * no state and makes no `ctx.run`: its only journal entry is the delayed
23
- * self-send after a `retry` result, so an endpoint that is down never spends
24
- * the retry budget, which is for infrastructure errors.
25
20
  * - `<prefix>NylorunSandbox`, key `<tenantId>:<sandboxId>` (F7.2). Its
26
21
  * exclusive handlers serialize a pod sandbox's reconciles and timers:
27
22
  * `reconcile` calls `WorkerHandlers.sandbox`; `arm` records a timer's latest
@@ -29,7 +24,7 @@
29
24
  * `fire`; a `fire` for an older time is a no-op, as the timer object's.
30
25
  * What a run answers arms its timers and its retry.
31
26
  *
32
- * Wakes, deliveries, timers and sweep arming go through the ingress as one-way
27
+ * Wakes, sandbox reconciles, timers and sweep arming go through the ingress as one-way
33
28
  * sends, so an API node can call them without ever calling `start`.
34
29
  */
35
30
  import { createServer } from "node:http2";
@@ -60,7 +55,6 @@ export class RestateExecution {
60
55
  session: `${prefix}NylorunSession`,
61
56
  tenant: `${prefix}NylorunTenant`,
62
57
  timer: `${prefix}NylorunTimer`,
63
- action: `${prefix}NylorunAction`,
64
58
  sandbox: `${prefix}NylorunSandbox`,
65
59
  };
66
60
  this.ingressUrl = options.ingressUrl.replace(/\/+$/, "");
@@ -76,9 +70,6 @@ export class RestateExecution {
76
70
  throw new Error(`Unknown wake reason: ${String(wake.reason)}`);
77
71
  await this.send(this.names.session, sessionKey(tenantId, sessionId), "advance", { reason: wake.reason }, wake.dedupeKey);
78
72
  }
79
- async deliver(tenantId, actionId) {
80
- await this.send(this.names.action, sessionKey(tenantId, actionId), "deliver", {});
81
- }
82
73
  async sandbox(tenantId, sandboxId, signal) {
83
74
  const key = sessionKey(tenantId, sandboxId);
84
75
  if (signal.kind === "reconcile")
@@ -259,24 +250,6 @@ export class RestateExecution {
259
250
  },
260
251
  options: serviceOptions,
261
252
  });
262
- const action = restate.object({
263
- name: names.action,
264
- handlers: {
265
- deliver: async (ctx, _input) => {
266
- const { tenantId, sessionId: actionId } = parseSessionKey(ctx.key);
267
- const result = await this.runAborted(ctx.request().attemptCompletedSignal, (handlers, signal) => {
268
- if (!handlers.deliver)
269
- throw new Error("WorkerHandlers.deliver is required for deliveries");
270
- return handlers.deliver(tenantId, actionId, signal);
271
- });
272
- if (result.status === "retry")
273
- ctx
274
- .objectSendClient({ name: names.action }, ctx.key)
275
- .deliver({}, restate.rpc.sendOpts({ delay: Math.max(0, result.retryAfterMs) }));
276
- },
277
- },
278
- options: serviceOptions,
279
- });
280
253
  /** Sets a sandbox timer: the latest time wins; `fire` checks it. */
281
254
  const armSandbox = async (ctx, input) => {
282
255
  ctx.set(`at:${input.timer}`, input.at);
@@ -318,11 +291,11 @@ export class RestateExecution {
318
291
  },
319
292
  options: serviceOptions,
320
293
  });
321
- return [session, tenant, timer, action, sandbox];
294
+ return [session, tenant, timer, sandbox];
322
295
  }
323
296
  /**
324
297
  * Runs a Worker handler with a signal aborted by `stop` or by the end of the Restate
325
- * attempt (`advance` and `deliver`).
298
+ * attempt (`advance` and `reconcile`).
326
299
  */
327
300
  async runAborted(attemptDone, fn) {
328
301
  const controller = new AbortController();
@@ -424,7 +397,7 @@ export async function listStuckInvocations(options) {
424
397
  const prefix = options.servicePrefix ?? "";
425
398
  if (!/^[A-Za-z0-9_]*$/.test(prefix))
426
399
  throw new Error(`Invalid Restate service prefix: ${prefix}`);
427
- const services = ["NylorunSession", "NylorunTenant", "NylorunTimer", "NylorunAction", "NylorunSandbox"].map((name) => `'${prefix}${name}'`);
400
+ const services = ["NylorunSession", "NylorunTenant", "NylorunTimer", "NylorunSandbox"].map((name) => `'${prefix}${name}'`);
428
401
  const clauses = [
429
402
  `target_service_name IN (${services.join(", ")})`,
430
403
  `status IN ('paused', 'backing-off')`,
@@ -146,7 +146,7 @@ export function createPgoutputSource(options) {
146
146
  },
147
147
  async lag() {
148
148
  // An idle relay confirms one byte past the last record, ahead of pg_current_wal_lsn():
149
- // that is no lag, not -1 (the Admin status refuses a negative lag).
149
+ // that is no lag, not -1.
150
150
  const { rows } = await pool.query(`SELECT GREATEST(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn), 0)::text AS lag
151
151
  FROM pg_replication_slots WHERE slot_name = $1`, [slot]);
152
152
  return rows[0]?.lag == null ? undefined : Number(rows[0].lag);
@@ -164,7 +164,7 @@ export function localBackend(options) {
164
164
  return { entries, truncated: !complete };
165
165
  },
166
166
  async writeFile(path, content) {
167
- await writeFile(path, content, "utf8");
167
+ await (typeof content === "string" ? writeFile(path, content, "utf8") : writeFile(path, content));
168
168
  },
169
169
  async stop() { },
170
170
  };
@@ -140,7 +140,7 @@ export function virtualBackend(options) {
140
140
  return { entries, truncated: !complete };
141
141
  },
142
142
  async writeFile(path, content) {
143
- await fs.writeFile(path, content, "utf8");
143
+ await (typeof content === "string" ? fs.writeFile(path, content, "utf8") : fs.writeFile(path, content));
144
144
  },
145
145
  async stop() { },
146
146
  };
@@ -29,7 +29,6 @@ function registerComponents(api) {
29
29
  const FOR_A_PERSON = {
30
30
  credentials: ["subject", "token"],
31
31
  scopes: ["sessions:own"],
32
- browser: true,
33
32
  };
34
33
  const events = (description) => ({
35
34
  description,
@@ -50,7 +49,7 @@ export function agUiRoutes(api) {
50
49
  path: "/v1/ag-ui/agents/{agentId}",
51
50
  tags: TAGS,
52
51
  summary: "Run an agent",
53
- description: "For a person, named by a subject token or by `Nylorun-Subject`. The thread is one session per person, agent and thread, created on its first run with `forwardedProps.nylorun.session`. The trailing user message starts a turn (its id is the idempotency key); `resume` answers interrupts. A busy session or a turn limit is a `RUN_ERROR` in the stream.",
52
+ description: "For a person, named by a trusted issuer's token or by `Nylorun-Subject`. The thread is one session per person, agent and thread, created on its first run with `forwardedProps.nylorun.session`. The trailing user message starts a turn (its id is the idempotency key); `resume` answers interrupts. A busy session is a `RUN_ERROR` in the stream.",
54
53
  request: {
55
54
  params: agentId,
56
55
  body: {
@@ -2,7 +2,7 @@ import type { ServerResponse } from "node:http";
2
2
  import { type Message } from "@ag-ui/core";
3
3
  import { type AuthScope, type SessionAccess, type TenantContext } from "../../tenant/context.js";
4
4
  /**
5
- * Who an AG-UI request acts for, once its agent is known: a person (a subject token's subject,
5
+ * Who an AG-UI request acts for, once its agent is known: a person (an issuer token's subject,
6
6
  * or `Nylorun-Subject`), who may use the agent; else 400, or the 404 of a missing agent.
7
7
  */
8
8
  export declare function agUiCaller(scope: AuthScope, agentId: string): {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The Runtime's AG-UI endpoint (Host feature `ag-ui-endpoint`): the Tenant's agents served to
3
- * AG-UI clients, for a person named by a subject token (a browser or app) or by subject headers
3
+ * AG-UI clients, for a person named by a trusted issuer's token (a browser or app) or by subject headers
4
4
  * (an app server's `createAgUiHandler`, which forwards here). One implementation for both, so
5
5
  * a thread is the same session whichever way it is reached.
6
6
  *
@@ -15,8 +15,8 @@
15
15
  * idempotency key, approvals become interrupts resumed through `resume`, and the last AG-UI
16
16
  * event made from each Runtime event carries its cursor as the SSE id. A run's session is
17
17
  * created on its first run with the options in `forwardedProps.nylorun.session` and never
18
- * changed afterwards. A stream opened with a subject token ends at the token's expiry or
19
- * revocation with `CUSTOM nylorun.stream_closed`, and the client reattaches with a new token.
18
+ * changed afterwards. A stream opened with an issuer token ends at the token's expiry with
19
+ * `CUSTOM nylorun.stream_closed`, and the client reattaches with a new token.
20
20
  */
21
21
  import { randomUUID } from "node:crypto";
22
22
  import { EventType, } from "@ag-ui/core";
@@ -30,9 +30,9 @@ import { accessOf } from "../../tenant/auth.js";
30
30
  import { command } from "../../tenant/commands.js";
31
31
  import { loadSession, sessionOf, } from "../../tenant/context.js";
32
32
  import { fail, HttpError } from "../../tenant/http.js";
33
- import { observeSession, readHistory, StreamClosed, } from "../../tenant/session-streams.js";
33
+ import { observeSession, readHistory, StreamClosed, streamHolderOf, } from "../../tenant/session-streams.js";
34
34
  import { putSession, sessionView } from "../../tenant/sessions.js";
35
- import { mayUseAgent } from "../../tenant/tokens.js";
35
+ import { mayUseAgent } from "../../tenant/auth.js";
36
36
  import { sandboxGrantsOf } from "../../tenant/sandboxes.js";
37
37
  const HEARTBEAT_MS = 15_000;
38
38
  const TERMINAL = new Set([
@@ -41,16 +41,14 @@ const TERMINAL = new Set([
41
41
  "turn.failed",
42
42
  "turn.cancelled",
43
43
  ]);
44
- /** The person a request acts for: a subject token's subject, or `Nylorun-Subject`. */
44
+ /** The person a request acts for: an issuer token's subject, or `Nylorun-Subject`. */
45
45
  function personOf(scope) {
46
46
  if (scope.kind === "token" || scope.kind === "subject")
47
47
  return scope.subject;
48
- return fail(400, "AG-UI runs act for a person: send a subject token, or Nylorun-Subject with the application key", { code: "invalid_request" });
48
+ return fail(400, "AG-UI runs act for a person: send a trusted issuer's token, or Nylorun-Subject with the application key", { code: "invalid_request" });
49
49
  }
50
50
  function holderOf(scope) {
51
- return scope.kind === "token"
52
- ? { subject: scope.subject, epoch: scope.epoch, expiresAt: scope.expiresAt }
53
- : undefined;
51
+ return streamHolderOf(scope);
54
52
  }
55
53
  /** A refusal a client can act on, streamed as `RUN_ERROR` rather than an HTTP error. */
56
54
  function runError(error) {
@@ -96,7 +94,7 @@ function sessionOptions(input, scope) {
96
94
  });
97
95
  // Agent code may trust `info`: only an app server sets it.
98
96
  if (scope.kind === "token" && parsed.data.info !== undefined)
99
- return fail(403, "A subject token cannot set session info", {
97
+ return fail(403, "A token caller cannot set session info", {
100
98
  code: "scope_required",
101
99
  });
102
100
  return parsed.data;
@@ -220,7 +218,7 @@ async function historyFrom(ctx, id, cursor) {
220
218
  return items;
221
219
  }
222
220
  /**
223
- * Who an AG-UI request acts for, once its agent is known: a person (a subject token's subject,
221
+ * Who an AG-UI request acts for, once its agent is known: a person (an issuer token's subject,
224
222
  * or `Nylorun-Subject`), who may use the agent; else 400, or the 404 of a missing agent.
225
223
  */
226
224
  export function agUiCaller(scope, agentId) {
@@ -236,7 +234,7 @@ export async function startRun(ctx, scope, agentId, caller, body, response) {
236
234
  if (!parsed.success)
237
235
  return fail(400, "Invalid RunAgentInput", { code: "invalid_request" });
238
236
  const input = parsed.data;
239
- // Nylorun tools run in the Runtime or the app's Action endpoint; the browser runs none.
237
+ // Nylorun tools run in the Runtime (HTTP, MCP and built-in tools); the browser runs none.
240
238
  if (input.tools?.length)
241
239
  return fail(400, "Frontend tools are not supported", { code: "invalid_request" });
242
240
  const id = sessionIdFor(caller.subject, agentId, input.threadId);
@@ -13,7 +13,7 @@ export interface Step {
13
13
  readonly events: BaseEvent[];
14
14
  readonly finished: boolean;
15
15
  }
16
- /** A tool result from any of the three places a call can end. */
16
+ /** A tool result from either of the two places a call can end. */
17
17
  export declare function toolResultOf(event: TranscriptEvent): {
18
18
  callId: string;
19
19
  content: string;
@@ -21,8 +21,6 @@ export declare function toolResultOf(event: TranscriptEvent): {
21
21
  export declare class RunTranslator {
22
22
  private readonly threadId;
23
23
  private readonly runId;
24
- /** Tool invocation → the model's call id, for interrupts that name the invocation. */
25
- private readonly callIds;
26
24
  private readonly closed;
27
25
  private sawAssistant;
28
26
  /**
@@ -24,16 +24,9 @@ export function outputText(output) {
24
24
  return typeof output === "string" ? output : JSON.stringify(output);
25
25
  }
26
26
  const none = { events: [], finished: false };
27
- /** A tool result from any of the three places a call can end. */
27
+ /** A tool result from either of the two places a call can end. */
28
28
  export function toolResultOf(event) {
29
29
  switch (event.type) {
30
- case "action.completed": {
31
- const p = event.payload;
32
- if (p.kind !== "tool" || !p.callId || p.agent)
33
- return undefined;
34
- const content = toolResultText(p.result);
35
- return content === undefined ? undefined : { callId: p.callId, content };
36
- }
37
30
  case "tool.completed": {
38
31
  const p = event.payload;
39
32
  if (p.agent)
@@ -60,8 +53,6 @@ export function toolResultOf(event) {
60
53
  export class RunTranslator {
61
54
  threadId;
62
55
  runId;
63
- /** Tool invocation → the model's call id, for interrupts that name the invocation. */
64
- callIds = new Map();
65
56
  closed = new Set();
66
57
  sawAssistant;
67
58
  /**
@@ -77,11 +68,6 @@ export class RunTranslator {
77
68
  const event = parseTranscriptEvent(raw);
78
69
  if (!event)
79
70
  return none;
80
- if (event.type === "action.pending" || event.type === "action.completed") {
81
- const { callId, invocationId } = event.payload;
82
- if (callId && invocationId)
83
- this.callIds.set(invocationId, callId);
84
- }
85
71
  const result = toolResultOf(event);
86
72
  if (result) {
87
73
  if (this.closed.has(result.callId))
@@ -122,7 +108,7 @@ export class RunTranslator {
122
108
  case "turn.paused": {
123
109
  const interrupts = event.payload.interactions.map((w) => {
124
110
  const interaction = w.interaction;
125
- const toolCallId = this.callIds.get(w.invocationId);
111
+ const toolCallId = w.callId;
126
112
  return {
127
113
  id: interaction.id,
128
114
  reason: interaction.kind === "approval" ? "tool_approval" : "input_required",
@@ -163,7 +149,6 @@ export class RunTranslator {
163
149
  };
164
150
  }
165
151
  case "effect.uncertain":
166
- case "action.uncertain":
167
152
  // The Runtime cannot tell whether a side effect happened; the run goes on.
168
153
  return {
169
154
  events: [