@nylorun/runtime 0.23.0-beta → 0.24.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 (252) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/README.md +79 -28
  3. package/dist/adapters/execution/restate.js +1 -1
  4. package/dist/adapters/replication/pgoutput.d.ts +2 -0
  5. package/dist/adapters/replication/pgoutput.js +6 -3
  6. package/dist/adapters/sandbox/local.d.ts +9 -1
  7. package/dist/adapters/sandbox/local.js +16 -4
  8. package/dist/adapters/sandbox/virtual.js +4 -1
  9. package/dist/api/a2a/endpoint.js +5 -1
  10. package/dist/api/a2a/routes.d.ts +2 -0
  11. package/dist/api/a2a/routes.js +2 -2
  12. package/dist/api/a2a/tasks.js +2 -1
  13. package/dist/api/ag-ui/endpoint.js +4 -2
  14. package/dist/api/ag-ui/history.js +4 -1
  15. package/dist/api/ag-ui/routes.d.ts +4 -1
  16. package/dist/api/ag-ui/routes.js +11 -10
  17. package/dist/api/ag-ui/translate.js +3 -2
  18. package/dist/api/components.d.ts +4953 -1204
  19. package/dist/api/components.js +25 -16
  20. package/dist/api/gate/keys.js +7 -1
  21. package/dist/api/gate/routes.d.ts +6 -0
  22. package/dist/api/gate/routes.js +39 -3
  23. package/dist/api/http/app.js +4 -4
  24. package/dist/api/http/define.d.ts +6 -0
  25. package/dist/api/http/define.js +13 -1
  26. package/dist/api/http/respond.js +1 -1
  27. package/dist/api/http/routes/artifacts.js +35 -8
  28. package/dist/api/http/routes/coverage.d.ts +9 -0
  29. package/dist/api/http/routes/coverage.js +34 -0
  30. package/dist/api/http/routes/environments.d.ts +11 -0
  31. package/dist/api/http/routes/environments.js +283 -0
  32. package/dist/api/http/routes/mcp.d.ts +1 -1
  33. package/dist/api/http/routes/mcp.js +2 -2
  34. package/dist/api/http/routes/me.js +1 -1
  35. package/dist/api/http/routes/reads.d.ts +45 -9
  36. package/dist/api/http/routes/reads.js +54 -5
  37. package/dist/api/http/routes/sessions.js +11 -6
  38. package/dist/api/http/routes/tenant.js +32 -10
  39. package/dist/api/openapi.js +31 -26
  40. package/dist/artifacts/disk.d.ts +59 -0
  41. package/dist/artifacts/disk.js +563 -0
  42. package/dist/artifacts/export.d.ts +1 -1
  43. package/dist/artifacts/export.js +2 -3
  44. package/dist/artifacts/folders.d.ts +6 -3
  45. package/dist/artifacts/folders.js +17 -12
  46. package/dist/artifacts/service.d.ts +2 -1
  47. package/dist/artifacts/service.js +6 -1
  48. package/dist/artifacts/workspace.d.ts +1 -1
  49. package/dist/artifacts/workspace.js +1 -1
  50. package/dist/core/flow-host.d.ts +2 -3
  51. package/dist/core/flow-host.js +3 -0
  52. package/dist/core/provider.d.ts +3 -2
  53. package/dist/core/provider.js +5 -37
  54. package/dist/core/sandbox-routes.d.ts +2 -21
  55. package/dist/core/sandbox-routes.js +10 -43
  56. package/dist/execution/types.d.ts +1 -1
  57. package/dist/gates/contract.d.ts +3 -24
  58. package/dist/gates/contract.js +1 -36
  59. package/dist/gates/egress-credentials.d.ts +9 -0
  60. package/dist/gates/egress-credentials.js +11 -4
  61. package/dist/gates/egress.d.ts +28 -1
  62. package/dist/gates/egress.js +115 -10
  63. package/dist/gates/fixture-model.d.ts +28 -0
  64. package/dist/gates/fixture-model.js +92 -0
  65. package/dist/gates/handler.js +4 -4
  66. package/dist/gates/http-tool.d.ts +6 -2
  67. package/dist/gates/http-tool.js +3 -5
  68. package/dist/gates/in-process.d.ts +5 -0
  69. package/dist/gates/in-process.js +12 -1
  70. package/dist/gates/journal.d.ts +30 -0
  71. package/dist/gates/journal.js +52 -0
  72. package/dist/gates/mcp-handler.d.ts +4 -0
  73. package/dist/gates/mcp-handler.js +5 -1
  74. package/dist/gates/meter.d.ts +10 -2
  75. package/dist/gates/meter.js +20 -5
  76. package/dist/gates/policy.d.ts +49 -0
  77. package/dist/gates/policy.js +134 -0
  78. package/dist/gates/tenant-vaults.d.ts +7 -7
  79. package/dist/gates/tenant-vaults.js +5 -5
  80. package/dist/gates/tool-calls.d.ts +10 -5
  81. package/dist/gates/tool-calls.js +28 -10
  82. package/dist/gates/tool-client.d.ts +8 -0
  83. package/dist/gates/tool-client.js +27 -11
  84. package/dist/gates/tool-contract.d.ts +10 -68
  85. package/dist/gates/tool-contract.js +1 -85
  86. package/dist/gates/tool-gate.d.ts +1 -1
  87. package/dist/harness/calls.d.ts +12 -5
  88. package/dist/harness/calls.js +21 -12
  89. package/dist/harness/executors.js +12 -9
  90. package/dist/harness/main.js +18 -5
  91. package/dist/harness/pod.d.ts +34 -0
  92. package/dist/harness/pod.js +41 -0
  93. package/dist/harness/service.d.ts +0 -1
  94. package/dist/harness/service.js +13 -5
  95. package/dist/harness/setup.d.ts +27 -0
  96. package/dist/harness/setup.js +150 -0
  97. package/dist/harness/ws-client.js +3 -2
  98. package/dist/harness/ws-port.d.ts +1 -5
  99. package/dist/harness/ws-port.js +1 -5
  100. package/dist/harness-api/in-process.js +3 -3
  101. package/dist/harness-api/record.d.ts +15 -1
  102. package/dist/harness-api/record.js +174 -44
  103. package/dist/harness-api/redact.d.ts +3 -0
  104. package/dist/harness-api/redact.js +45 -0
  105. package/dist/harness-api/server.d.ts +8 -0
  106. package/dist/harness-api/server.js +93 -13
  107. package/dist/harness-api/start.d.ts +10 -3
  108. package/dist/harness-api/start.js +40 -10
  109. package/dist/harness-api/tool-journal.d.ts +96 -0
  110. package/dist/harness-api/tool-journal.js +102 -0
  111. package/dist/harness-api/tool-status.d.ts +13 -0
  112. package/dist/harness-api/tool-status.js +26 -0
  113. package/dist/harness-api/workspace.d.ts +6 -3
  114. package/dist/harness-api/workspace.js +27 -11
  115. package/dist/harness-api/ws-server.d.ts +11 -3
  116. package/dist/harness-api/ws-server.js +94 -15
  117. package/dist/host/gates.d.ts +2 -1
  118. package/dist/host/gates.js +10 -2
  119. package/dist/host/main.js +54 -5
  120. package/dist/host/operate.js +67 -5
  121. package/dist/host/stack-config.d.ts +64 -0
  122. package/dist/host/stack-config.js +61 -1
  123. package/dist/keys/client.js +4 -1
  124. package/dist/keys/keys.d.ts +5 -5
  125. package/dist/keys/keys.js +5 -7
  126. package/dist/management-openapi.json +999 -2211
  127. package/dist/mcp/connect.d.ts +25 -20
  128. package/dist/mcp/connect.js +29 -30
  129. package/dist/mcp/pool.d.ts +2 -2
  130. package/dist/mcp/pool.js +1 -1
  131. package/dist/mcp/preview.d.ts +3 -3
  132. package/dist/mcp/preview.js +10 -20
  133. package/dist/mcp/snapshot.d.ts +5 -11
  134. package/dist/mcp/snapshot.js +6 -7
  135. package/dist/model/pi-model.js +8 -0
  136. package/dist/openapi.json +6955 -2526
  137. package/dist/reads/types.d.ts +16 -3
  138. package/dist/record/append.d.ts +3 -1
  139. package/dist/record/append.js +1 -0
  140. package/dist/record/envelope.d.ts +5 -1
  141. package/dist/record/envelope.js +7 -3
  142. package/dist/record/environment.d.ts +25 -0
  143. package/dist/record/environment.js +44 -0
  144. package/dist/record/index.d.ts +1 -1
  145. package/dist/record/index.js +1 -1
  146. package/dist/sandbox/disk-fs.d.ts +95 -0
  147. package/dist/sandbox/disk-fs.js +206 -0
  148. package/dist/sandbox/join.d.ts +17 -18
  149. package/dist/sandbox/join.js +42 -15
  150. package/dist/sandbox/manager.d.ts +16 -8
  151. package/dist/sandbox/manager.js +33 -17
  152. package/dist/sandbox/placement.d.ts +13 -12
  153. package/dist/sandbox/placement.js +29 -12
  154. package/dist/sandbox/pods/client.d.ts +6 -1
  155. package/dist/sandbox/pods/lifecycle.d.ts +28 -27
  156. package/dist/sandbox/pods/lifecycle.js +14 -26
  157. package/dist/sandbox/pods/reconcile.js +18 -12
  158. package/dist/sandbox/pods/spec.d.ts +15 -13
  159. package/dist/sandbox/pods/spec.js +16 -20
  160. package/dist/sandbox/records.d.ts +2 -2
  161. package/dist/sandbox/records.js +3 -3
  162. package/dist/sandbox/resolve.d.ts +35 -27
  163. package/dist/sandbox/resolve.js +66 -41
  164. package/dist/sandbox/session-sandbox.js +1 -1
  165. package/dist/sandbox/setup.d.ts +61 -0
  166. package/dist/sandbox/setup.js +123 -0
  167. package/dist/sandbox/share.d.ts +11 -21
  168. package/dist/sandbox/share.js +12 -41
  169. package/dist/sandbox/tenant-config.d.ts +12 -14
  170. package/dist/sandbox/tenant-config.js +12 -17
  171. package/dist/sandbox/types.d.ts +6 -0
  172. package/dist/store/postgres/drizzle/0020_environments.sql +63 -0
  173. package/dist/store/postgres/drizzle/0021_disk_versions.sql +7 -0
  174. package/dist/store/postgres/drizzle/0022_model_usage_timing.sql +5 -0
  175. package/dist/store/postgres/drizzle/0023_artifact_pages.sql +1 -0
  176. package/dist/store/postgres/drizzle/meta/_journal.json +28 -0
  177. package/dist/store/postgres/reads.js +117 -17
  178. package/dist/store/postgres/record-writer.d.ts +4 -4
  179. package/dist/store/postgres/record-writer.js +9 -9
  180. package/dist/store/postgres/record.d.ts +7 -0
  181. package/dist/store/postgres/record.js +23 -2
  182. package/dist/store/postgres/schema.d.ts +934 -761
  183. package/dist/store/postgres/schema.js +102 -73
  184. package/dist/store/postgres/store.js +119 -66
  185. package/dist/store/types.d.ts +109 -48
  186. package/dist/tenant/advance.d.ts +7 -6
  187. package/dist/tenant/advance.js +115 -42
  188. package/dist/tenant/artifact-tool.js +3 -4
  189. package/dist/tenant/commands.d.ts +15 -2
  190. package/dist/tenant/commands.js +93 -12
  191. package/dist/tenant/context.d.ts +48 -22
  192. package/dist/tenant/context.js +4 -15
  193. package/dist/tenant/effects.d.ts +1 -1
  194. package/dist/tenant/effects.js +37 -20
  195. package/dist/tenant/environments.d.ts +167 -0
  196. package/dist/tenant/environments.js +823 -0
  197. package/dist/tenant/harness-tokens.d.ts +21 -0
  198. package/dist/tenant/harness-tokens.js +61 -0
  199. package/dist/tenant/host-token.d.ts +1 -1
  200. package/dist/tenant/host-token.js +2 -4
  201. package/dist/tenant/identity-file.d.ts +4 -4
  202. package/dist/tenant/identity-file.js +17 -8
  203. package/dist/tenant/issuers.js +3 -3
  204. package/dist/tenant/principals.js +1 -1
  205. package/dist/tenant/reset.js +3 -3
  206. package/dist/tenant/runtime.d.ts +6 -1
  207. package/dist/tenant/runtime.js +7 -1
  208. package/dist/tenant/session.d.ts +3 -3
  209. package/dist/tenant/session.js +0 -14
  210. package/dist/tenant/sessions.d.ts +13 -13
  211. package/dist/tenant/sessions.js +61 -138
  212. package/dist/tenant/signing-keys.d.ts +5 -1
  213. package/dist/tenant/status.js +3 -3
  214. package/dist/tenant/sweep.js +12 -6
  215. package/dist/tenant/transcript.d.ts +210 -20
  216. package/dist/tenant/transcript.js +62 -11
  217. package/dist/tenant/turn-timing.d.ts +43 -0
  218. package/dist/tenant/turn-timing.js +39 -0
  219. package/dist/tenant/types.d.ts +2 -0
  220. package/dist/traces/ids.d.ts +42 -0
  221. package/dist/traces/ids.js +85 -0
  222. package/dist/traces/key.d.ts +6 -0
  223. package/dist/traces/key.js +37 -0
  224. package/dist/traces/map.d.ts +113 -0
  225. package/dist/traces/map.js +317 -0
  226. package/dist/traces/options.d.ts +7 -0
  227. package/dist/traces/options.js +1 -0
  228. package/dist/traces/otlp.d.ts +42 -0
  229. package/dist/traces/otlp.js +84 -0
  230. package/dist/traces/projector.d.ts +58 -0
  231. package/dist/traces/projector.js +200 -0
  232. package/dist/traces/read.d.ts +23 -0
  233. package/dist/traces/read.js +16 -0
  234. package/dist/vault/coverage.d.ts +26 -0
  235. package/dist/vault/coverage.js +64 -0
  236. package/dist/vault/error.d.ts +11 -1
  237. package/dist/vault/error.js +5 -1
  238. package/dist/vault/service.d.ts +47 -48
  239. package/dist/vault/service.js +321 -382
  240. package/dist/vault/sources.d.ts +5 -16
  241. package/dist/vault/sources.js +6 -8
  242. package/dist/version.d.ts +1 -1
  243. package/dist/version.js +2 -2
  244. package/package.json +13 -13
  245. package/dist/api/http/routes/sandboxes.d.ts +0 -9
  246. package/dist/api/http/routes/sandboxes.js +0 -153
  247. package/dist/api/http/routes/vaults.d.ts +0 -10
  248. package/dist/api/http/routes/vaults.js +0 -139
  249. package/dist/record/sandbox.d.ts +0 -25
  250. package/dist/record/sandbox.js +0 -43
  251. package/dist/tenant/sandboxes.d.ts +0 -123
  252. package/dist/tenant/sandboxes.js +0 -566
@@ -2,7 +2,8 @@ import { RESPONSE_ALREADY_SENT } from "@hono/node-server/utils/response";
2
2
  import { z } from "zod";
3
3
  import { EventSchemas, MessageSchema, RunAgentInputSchema } from "@ag-ui/core/schemas";
4
4
  import { readJson } from "../http/body.js";
5
- import { tenantRoute } from "../http/define.js";
5
+ import { TraceHeaders, tenantRoute } from "../http/define.js";
6
+ import { traceContextOf } from "../../traces/ids.js";
6
7
  import { jsonResponse } from "../http/respond.js";
7
8
  import { agUiCaller, cancelRun, reattachRun, startRun, threadMessages } from "./routes.js";
8
9
  import { sessionIdFor } from "./session-id.js";
@@ -56,11 +57,12 @@ export function agUiRoutes(api) {
56
57
  required: true,
57
58
  content: { "application/json": { schema: ref("AgUiRunAgentInput") } },
58
59
  },
60
+ headers: TraceHeaders,
59
61
  },
60
62
  responses: { 200: events("The run's events, from RUN_STARTED to its end") },
61
63
  }, async (c) => {
62
64
  const { scope, subject, access } = callerOf(c);
63
- await startRun(c.env.tenant, scope, c.req.param("agentId"), { subject, access }, await readJson(c.req.raw), c.env.outgoing);
65
+ await startRun(c.env.tenant, scope, c.req.param("agentId"), { subject, access }, await readJson(c.req.raw), c.env.outgoing, traceContextOf(c.req.raw.headers));
64
66
  return RESPONSE_ALREADY_SENT;
65
67
  });
66
68
  tenantRoute(api, FOR_A_PERSON, {
@@ -1,4 +1,4 @@
1
- import { parseTranscriptEvent } from "@nylorun/core/contracts";
1
+ import { isEmptyAssistantMessage, parseTranscriptEvent, } from "@nylorun/core/contracts";
2
2
  import { outputText, toolResultOf } from "./translate.js";
3
3
  export function messagesFromEvents(items) {
4
4
  const messages = [];
@@ -37,6 +37,9 @@ export function messagesFromEvents(items) {
37
37
  });
38
38
  continue;
39
39
  }
40
+ // A step that said nothing is in the log for its timing (R7.1), never a message.
41
+ if (event.type === "message.assistant" && isEmptyAssistantMessage(event.payload))
42
+ continue;
40
43
  if (event.type === "message.assistant" && !event.payload.agent) {
41
44
  const p = event.payload;
42
45
  sawAssistant = true;
@@ -1,6 +1,7 @@
1
1
  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
+ import type { TraceContext } from "../../traces/ids.js";
4
5
  /**
5
6
  * Who an AG-UI request acts for, once its agent is known: a person (an issuer token's subject,
6
7
  * or `Nylorun-Subject`), who may use the agent; else 400, or the 404 of a missing agent.
@@ -13,7 +14,9 @@ export declare function agUiCaller(scope: AuthScope, agentId: string): {
13
14
  export declare function startRun(ctx: TenantContext, scope: AuthScope, agentId: string, caller: {
14
15
  subject: string;
15
16
  access: SessionAccess | undefined;
16
- }, body: unknown, response: ServerResponse): Promise<void>;
17
+ }, body: unknown, response: ServerResponse,
18
+ /** The request's trace context (R7.4): the turn the run starts joins the caller's trace. */
19
+ trace?: TraceContext): Promise<void>;
17
20
  /** `GET …/threads/:thread/messages`: the thread's messages; none before its first run. */
18
21
  export declare function threadMessages(ctx: TenantContext, id: string, access: SessionAccess | undefined): Promise<Message[]>;
19
22
  /**
@@ -33,7 +33,7 @@ import { fail, HttpError } from "../../tenant/http.js";
33
33
  import { observeSession, readHistory, StreamClosed, streamHolderOf, } from "../../tenant/session-streams.js";
34
34
  import { putSession, sessionView } from "../../tenant/sessions.js";
35
35
  import { mayUseAgent } from "../../tenant/auth.js";
36
- import { sandboxGrantsOf } from "../../tenant/sandboxes.js";
36
+ import { environmentGrantsOf } from "../../tenant/environments.js";
37
37
  const HEARTBEAT_MS = 15_000;
38
38
  const TERMINAL = new Set([
39
39
  "turn.completed",
@@ -83,8 +83,7 @@ function sessionOptions(input, scope) {
83
83
  return {};
84
84
  const parsed = PutSessionRequestSchema.pick({
85
85
  info: true,
86
- vaultIds: true,
87
- credentialSelections: true,
86
+ environment: true,
88
87
  })
89
88
  .strict()
90
89
  .safeParse(raw);
@@ -99,11 +98,11 @@ function sessionOptions(input, scope) {
99
98
  });
100
99
  return parsed.data;
101
100
  }
102
- async function accepted(ctx, id, body, scope) {
103
- const result = (await command(ctx, id, body, scope));
101
+ async function accepted(ctx, id, body, scope, trace) {
102
+ const result = (await command(ctx, id, body, scope, trace ? { trace } : {}));
104
103
  return result?.cursor ?? null;
105
104
  }
106
- async function submit(ctx, id, input, scope) {
105
+ async function submit(ctx, id, input, scope, trace) {
107
106
  if (input.resume?.length) {
108
107
  // The interaction's kind is on the session's pending view, not in its id.
109
108
  const view = (await ctx.store.tx(async (t) => sessionView(t, await sessionOf(t, id, accessOf(scope)))));
@@ -144,7 +143,7 @@ async function submit(ctx, id, input, scope) {
144
143
  requestId: randomUUID(),
145
144
  idempotencyKey: message.id,
146
145
  content: message.text,
147
- }, scope);
146
+ }, scope, trace);
148
147
  }
149
148
  /**
150
149
  * Streams translated events until the run ends. Closing the connection stops the read, never
@@ -229,7 +228,9 @@ export function agUiCaller(scope, agentId) {
229
228
  return { subject, access: accessOf(scope) };
230
229
  }
231
230
  /** `POST /v1/ag-ui/agents/:agent`: start a run, and stream it on `response`. */
232
- export async function startRun(ctx, scope, agentId, caller, body, response) {
231
+ export async function startRun(ctx, scope, agentId, caller, body, response,
232
+ /** The request's trace context (R7.4): the turn the run starts joins the caller's trace. */
233
+ trace) {
233
234
  const parsed = RunAgentInputSchema.safeParse(body);
234
235
  if (!parsed.success)
235
236
  return fail(400, "Invalid RunAgentInput", { code: "invalid_request" });
@@ -245,12 +246,12 @@ export async function startRun(ctx, scope, agentId, caller, body, response) {
245
246
  ...sessionOptions(input, scope),
246
247
  }, caller.access, {
247
248
  createOnly: true,
248
- ...(sandboxGrantsOf(scope) === undefined ? {} : { sandboxGrants: sandboxGrantsOf(scope) }),
249
+ ...(environmentGrantsOf(scope) === undefined ? {} : { environmentGrants: environmentGrantsOf(scope) }),
249
250
  });
250
251
  const translator = new RunTranslator(input.threadId, input.runId);
251
252
  let cursor;
252
253
  try {
253
- cursor = await submit(ctx, id, input, scope);
254
+ cursor = await submit(ctx, id, input, scope, trace);
254
255
  }
255
256
  catch (error) {
256
257
  // A busy session or a limit is a run that could not start, not a transport failure.
@@ -4,7 +4,7 @@
4
4
  * `<callId>:result`, so live runs and `messagesFromEvents` agree.
5
5
  */
6
6
  import { EventType } from "@ag-ui/core";
7
- import { parseTranscriptEvent, } from "@nylorun/core/contracts";
7
+ import { isEmptyAssistantMessage, parseTranscriptEvent, } from "@nylorun/core/contracts";
8
8
  /** The text a tool result shows; `undefined` while there is no result yet. */
9
9
  export function toolResultText(result) {
10
10
  const value = result;
@@ -89,7 +89,8 @@ export class RunTranslator {
89
89
  switch (event.type) {
90
90
  case "message.assistant": {
91
91
  const p = event.payload;
92
- if (p.agent)
92
+ // A step that said nothing is in the log for its timing (R7.1), never a message.
93
+ if (p.agent || isEmptyAssistantMessage(p))
93
94
  return none;
94
95
  this.sawAssistant = true;
95
96
  return { events: assistantEvents(p), finished: false };