@nylorun/runtime 0.23.0-beta → 0.25.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.
- package/CHANGELOG.md +252 -0
- package/README.md +87 -28
- package/dist/adapters/execution/restate.js +1 -1
- package/dist/adapters/replication/pgoutput.d.ts +2 -0
- package/dist/adapters/replication/pgoutput.js +6 -3
- package/dist/adapters/sandbox/local.d.ts +9 -1
- package/dist/adapters/sandbox/local.js +16 -4
- package/dist/adapters/sandbox/virtual.js +4 -1
- package/dist/api/a2a/card.d.ts +11 -1
- package/dist/api/a2a/card.js +26 -2
- package/dist/api/a2a/endpoint.js +9 -3
- package/dist/api/a2a/protocol.d.ts +25 -2
- package/dist/api/a2a/protocol.js +20 -3
- package/dist/api/a2a/routes.d.ts +6 -1
- package/dist/api/a2a/routes.js +67 -9
- package/dist/api/a2a/tasks.js +2 -1
- package/dist/api/ag-ui/endpoint.js +8 -3
- package/dist/api/ag-ui/history.d.ts +6 -1
- package/dist/api/ag-ui/history.js +39 -3
- package/dist/api/ag-ui/routes.d.ts +4 -1
- package/dist/api/ag-ui/routes.js +63 -20
- package/dist/api/ag-ui/translate.js +3 -2
- package/dist/api/components.d.ts +5327 -1091
- package/dist/api/components.js +40 -16
- package/dist/api/gate/keys.d.ts +2 -1
- package/dist/api/gate/keys.js +14 -1
- package/dist/api/gate/routes.d.ts +6 -0
- package/dist/api/gate/routes.js +52 -3
- package/dist/api/http/app.js +17 -6
- package/dist/api/http/body.d.ts +3 -3
- package/dist/api/http/body.js +7 -7
- package/dist/api/http/define.d.ts +6 -0
- package/dist/api/http/define.js +13 -1
- package/dist/api/http/respond.js +1 -1
- package/dist/api/http/routes/artifacts.js +35 -8
- package/dist/api/http/routes/coverage.d.ts +9 -0
- package/dist/api/http/routes/coverage.js +34 -0
- package/dist/api/http/routes/environment-manifests.d.ts +9 -0
- package/dist/api/http/routes/environment-manifests.js +118 -0
- package/dist/api/http/routes/environments.d.ts +11 -0
- package/dist/api/http/routes/environments.js +332 -0
- package/dist/api/http/routes/mcp.d.ts +1 -1
- package/dist/api/http/routes/mcp.js +2 -2
- package/dist/api/http/routes/me.js +1 -1
- package/dist/api/http/routes/reads.d.ts +94 -9
- package/dist/api/http/routes/reads.js +54 -5
- package/dist/api/http/routes/sessions.js +24 -9
- package/dist/api/http/routes/tenant.js +65 -15
- package/dist/api/inbound-files.d.ts +65 -0
- package/dist/api/inbound-files.js +115 -0
- package/dist/api/openapi.js +48 -28
- package/dist/artifacts/disk.d.ts +59 -0
- package/dist/artifacts/disk.js +569 -0
- package/dist/artifacts/export.d.ts +1 -1
- package/dist/artifacts/export.js +2 -3
- package/dist/artifacts/folders.d.ts +6 -3
- package/dist/artifacts/folders.js +17 -12
- package/dist/artifacts/media-types.d.ts +15 -0
- package/dist/artifacts/media-types.js +56 -4
- package/dist/artifacts/parts.d.ts +12 -3
- package/dist/artifacts/parts.js +15 -4
- package/dist/artifacts/service.d.ts +2 -1
- package/dist/artifacts/service.js +6 -1
- package/dist/artifacts/workspace.d.ts +5 -5
- package/dist/artifacts/workspace.js +7 -19
- package/dist/core/flow-host.d.ts +3 -4
- package/dist/core/flow-host.js +5 -2
- package/dist/core/provider.d.ts +3 -2
- package/dist/core/provider.js +5 -37
- package/dist/core/sandbox-routes.d.ts +2 -21
- package/dist/core/sandbox-routes.js +11 -44
- package/dist/core/turn-manifest.d.ts +3 -2
- package/dist/core/turn-manifest.js +29 -5
- package/dist/execution/types.d.ts +1 -1
- package/dist/gates/contract.d.ts +3 -24
- package/dist/gates/contract.js +1 -36
- package/dist/gates/egress-credentials.d.ts +9 -0
- package/dist/gates/egress-credentials.js +11 -4
- package/dist/gates/egress.d.ts +22 -1
- package/dist/gates/egress.js +116 -10
- package/dist/gates/fixture-model.d.ts +28 -0
- package/dist/gates/fixture-model.js +92 -0
- package/dist/gates/handler.js +4 -4
- package/dist/gates/http-tool.d.ts +9 -6
- package/dist/gates/http-tool.js +11 -17
- package/dist/gates/in-process.d.ts +5 -0
- package/dist/gates/in-process.js +12 -1
- package/dist/gates/journal.d.ts +30 -0
- package/dist/gates/journal.js +51 -0
- package/dist/gates/mcp-handler.d.ts +4 -0
- package/dist/gates/mcp-handler.js +7 -4
- package/dist/gates/meter.d.ts +10 -2
- package/dist/gates/meter.js +20 -5
- package/dist/gates/policy.d.ts +49 -0
- package/dist/gates/policy.js +132 -0
- package/dist/gates/tenant-vaults.d.ts +7 -7
- package/dist/gates/tenant-vaults.js +5 -5
- package/dist/gates/tool-calls.d.ts +10 -5
- package/dist/gates/tool-calls.js +28 -10
- package/dist/gates/tool-client.d.ts +8 -0
- package/dist/gates/tool-client.js +27 -11
- package/dist/gates/tool-contract.d.ts +11 -69
- package/dist/gates/tool-contract.js +1 -85
- package/dist/gates/tool-gate.d.ts +1 -1
- package/dist/harness/calls.d.ts +14 -7
- package/dist/harness/calls.js +30 -24
- package/dist/harness/executors.js +12 -9
- package/dist/harness/main.js +24 -5
- package/dist/harness/pod.d.ts +39 -0
- package/dist/harness/pod.js +46 -0
- package/dist/harness/service.d.ts +0 -1
- package/dist/harness/service.js +17 -9
- package/dist/harness/setup.d.ts +29 -0
- package/dist/harness/setup.js +174 -0
- package/dist/harness/ws-client.js +3 -2
- package/dist/harness/ws-port.d.ts +1 -5
- package/dist/harness/ws-port.js +1 -5
- package/dist/harness-api/in-process.js +3 -3
- package/dist/harness-api/record.d.ts +15 -1
- package/dist/harness-api/record.js +180 -50
- package/dist/harness-api/redact.d.ts +3 -0
- package/dist/harness-api/redact.js +45 -0
- package/dist/harness-api/server.d.ts +35 -4
- package/dist/harness-api/server.js +130 -17
- package/dist/harness-api/start.d.ts +10 -3
- package/dist/harness-api/start.js +40 -10
- package/dist/harness-api/tool-journal.d.ts +105 -0
- package/dist/harness-api/tool-journal.js +132 -0
- package/dist/harness-api/tool-status.d.ts +13 -0
- package/dist/harness-api/tool-status.js +26 -0
- package/dist/harness-api/workspace.d.ts +12 -7
- package/dist/harness-api/workspace.js +47 -25
- package/dist/harness-api/ws-server.d.ts +11 -3
- package/dist/harness-api/ws-server.js +94 -15
- package/dist/host/gates.d.ts +2 -1
- package/dist/host/gates.js +10 -2
- package/dist/host/main.js +54 -5
- package/dist/host/operate.js +67 -5
- package/dist/host/stack-config.d.ts +64 -0
- package/dist/host/stack-config.js +62 -2
- package/dist/keys/client.js +4 -1
- package/dist/keys/keys.d.ts +13 -6
- package/dist/keys/keys.js +9 -8
- package/dist/management-openapi.json +1264 -2171
- package/dist/mcp/connect.d.ts +26 -22
- package/dist/mcp/connect.js +30 -34
- package/dist/mcp/pool.d.ts +3 -6
- package/dist/mcp/pool.js +14 -28
- package/dist/mcp/preview.d.ts +3 -3
- package/dist/mcp/preview.js +10 -21
- package/dist/mcp/snapshot.d.ts +16 -24
- package/dist/mcp/snapshot.js +33 -45
- package/dist/model/capabilities.d.ts +26 -0
- package/dist/model/capabilities.js +44 -0
- package/dist/model/catalog.d.ts +34 -3
- package/dist/model/catalog.js +38 -2
- package/dist/model/models.d.ts +2 -0
- package/dist/model/models.js +1 -1
- package/dist/model/native-blocks.d.ts +35 -0
- package/dist/model/native-blocks.js +170 -0
- package/dist/model/pi-model.js +114 -94
- package/dist/openapi.json +12822 -3943
- package/dist/reads/types.d.ts +16 -3
- package/dist/record/append.d.ts +3 -1
- package/dist/record/append.js +1 -0
- package/dist/record/envelope.d.ts +5 -1
- package/dist/record/envelope.js +7 -3
- package/dist/record/environment.d.ts +25 -0
- package/dist/record/environment.js +44 -0
- package/dist/record/index.d.ts +1 -1
- package/dist/record/index.js +1 -1
- package/dist/sandbox/disk-fs.d.ts +95 -0
- package/dist/sandbox/disk-fs.js +206 -0
- package/dist/sandbox/join.d.ts +17 -18
- package/dist/sandbox/join.js +46 -15
- package/dist/sandbox/manager.d.ts +47 -21
- package/dist/sandbox/manager.js +162 -107
- package/dist/sandbox/placement.d.ts +14 -13
- package/dist/sandbox/placement.js +31 -14
- package/dist/sandbox/pods/client.d.ts +9 -2
- package/dist/sandbox/pods/lifecycle.d.ts +36 -27
- package/dist/sandbox/pods/lifecycle.js +29 -26
- package/dist/sandbox/pods/reconcile.js +18 -12
- package/dist/sandbox/pods/spec.d.ts +15 -13
- package/dist/sandbox/pods/spec.js +17 -20
- package/dist/sandbox/records.d.ts +2 -2
- package/dist/sandbox/records.js +3 -3
- package/dist/sandbox/resolve.d.ts +37 -27
- package/dist/sandbox/resolve.js +73 -41
- package/dist/sandbox/runtime-tools.d.ts +9 -0
- package/dist/sandbox/runtime-tools.js +16 -0
- package/dist/sandbox/session-sandbox.d.ts +4 -6
- package/dist/sandbox/session-sandbox.js +47 -94
- package/dist/sandbox/setup.d.ts +64 -0
- package/dist/sandbox/setup.js +160 -0
- package/dist/sandbox/share.d.ts +21 -26
- package/dist/sandbox/share.js +36 -63
- package/dist/sandbox/skills.d.ts +8 -6
- package/dist/sandbox/skills.js +24 -23
- package/dist/sandbox/tenant-config.d.ts +12 -14
- package/dist/sandbox/tenant-config.js +12 -17
- package/dist/sandbox/types.d.ts +6 -0
- package/dist/store/postgres/drizzle/0020_environments.sql +63 -0
- package/dist/store/postgres/drizzle/0021_disk_versions.sql +7 -0
- package/dist/store/postgres/drizzle/0022_model_usage_timing.sql +5 -0
- package/dist/store/postgres/drizzle/0023_artifact_pages.sql +1 -0
- package/dist/store/postgres/drizzle/0024_flat_manifest.sql +7 -0
- package/dist/store/postgres/drizzle/0025_environment_manifests.sql +14 -0
- package/dist/store/postgres/drizzle/0026_environment_forks.sql +1 -0
- package/dist/store/postgres/drizzle/0027_environment_image_digest.sql +1 -0
- package/dist/store/postgres/drizzle/meta/_journal.json +56 -0
- package/dist/store/postgres/reads.js +123 -17
- package/dist/store/postgres/record-writer.d.ts +4 -4
- package/dist/store/postgres/record-writer.js +9 -9
- package/dist/store/postgres/record.d.ts +7 -0
- package/dist/store/postgres/record.js +23 -2
- package/dist/store/postgres/schema.d.ts +1126 -736
- package/dist/store/postgres/schema.js +136 -73
- package/dist/store/postgres/store.js +195 -67
- package/dist/store/types.d.ts +165 -50
- package/dist/tenant/advance.d.ts +7 -6
- package/dist/tenant/advance.js +118 -42
- package/dist/tenant/artifact-tool.d.ts +1 -1
- package/dist/tenant/artifact-tool.js +46 -26
- package/dist/tenant/commands.d.ts +15 -2
- package/dist/tenant/commands.js +115 -14
- package/dist/tenant/context.d.ts +56 -24
- package/dist/tenant/context.js +4 -15
- package/dist/tenant/effects.d.ts +1 -1
- package/dist/tenant/effects.js +44 -29
- package/dist/tenant/environment-manifests.d.ts +57 -0
- package/dist/tenant/environment-manifests.js +200 -0
- package/dist/tenant/environments.d.ts +174 -0
- package/dist/tenant/environments.js +1044 -0
- package/dist/tenant/harness-tokens.d.ts +21 -0
- package/dist/tenant/harness-tokens.js +61 -0
- package/dist/tenant/host-token.d.ts +1 -1
- package/dist/tenant/host-token.js +2 -4
- package/dist/tenant/identity-file.d.ts +4 -4
- package/dist/tenant/identity-file.js +17 -8
- package/dist/tenant/issuers.js +3 -3
- package/dist/tenant/model-setting.d.ts +14 -0
- package/dist/tenant/model-setting.js +51 -0
- package/dist/tenant/principals.js +1 -1
- package/dist/tenant/reset.js +3 -3
- package/dist/tenant/runtime.d.ts +6 -1
- package/dist/tenant/runtime.js +7 -1
- package/dist/tenant/session.d.ts +3 -3
- package/dist/tenant/session.js +0 -14
- package/dist/tenant/sessions.d.ts +18 -14
- package/dist/tenant/sessions.js +99 -143
- package/dist/tenant/signing-keys.d.ts +5 -1
- package/dist/tenant/skill-tool.d.ts +3 -3
- package/dist/tenant/skill-tool.js +6 -11
- package/dist/tenant/status.js +3 -3
- package/dist/tenant/sweep.js +13 -7
- package/dist/tenant/tool-results.js +1 -1
- package/dist/tenant/tool-search.d.ts +7 -11
- package/dist/tenant/tool-search.js +8 -5
- package/dist/tenant/transcript.d.ts +245 -36
- package/dist/tenant/transcript.js +64 -12
- package/dist/tenant/turn-timing.d.ts +43 -0
- package/dist/tenant/turn-timing.js +39 -0
- package/dist/tenant/types.d.ts +2 -0
- package/dist/traces/ids.d.ts +41 -0
- package/dist/traces/ids.js +81 -0
- package/dist/traces/key.d.ts +6 -0
- package/dist/traces/key.js +37 -0
- package/dist/traces/map.d.ts +113 -0
- package/dist/traces/map.js +289 -0
- package/dist/traces/options.d.ts +7 -0
- package/dist/traces/options.js +1 -0
- package/dist/traces/otlp.d.ts +42 -0
- package/dist/traces/otlp.js +84 -0
- package/dist/traces/projector.d.ts +58 -0
- package/dist/traces/projector.js +200 -0
- package/dist/traces/read.d.ts +23 -0
- package/dist/traces/read.js +16 -0
- package/dist/vault/coverage.d.ts +26 -0
- package/dist/vault/coverage.js +62 -0
- package/dist/vault/error.d.ts +11 -1
- package/dist/vault/error.js +5 -1
- package/dist/vault/host-model.d.ts +4 -1
- package/dist/vault/host-model.js +10 -2
- package/dist/vault/service.d.ts +92 -48
- package/dist/vault/service.js +462 -376
- package/dist/vault/sources.d.ts +5 -16
- package/dist/vault/sources.js +6 -8
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +13 -13
- package/dist/api/http/routes/sandboxes.d.ts +0 -9
- package/dist/api/http/routes/sandboxes.js +0 -153
- package/dist/api/http/routes/vaults.d.ts +0 -10
- package/dist/api/http/routes/vaults.js +0 -139
- package/dist/record/sandbox.d.ts +0 -25
- package/dist/record/sandbox.js +0 -43
- package/dist/sandbox/capability.d.ts +0 -3
- package/dist/sandbox/capability.js +0 -10
- package/dist/tenant/sandboxes.d.ts +0 -123
- package/dist/tenant/sandboxes.js +0 -566
package/dist/api/ag-ui/routes.js
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* - `POST …/threads/:thread/cancel` — cancel the running turn.
|
|
13
13
|
*
|
|
14
14
|
* Each thread maps to one session per subject, agent and thread. The message id is the
|
|
15
|
-
* idempotency key,
|
|
15
|
+
* idempotency key, a message's media parts become file parts (bytes sent inline are stored as
|
|
16
|
+
* artifacts of the session, `../inbound-files.ts`; a file the model does not read is a
|
|
17
|
+
* `RUN_ERROR`), approvals become interrupts resumed through `resume`, and the last AG-UI
|
|
16
18
|
* event made from each Runtime event carries its cursor as the SSE id. A run's session is
|
|
17
19
|
* created on its first run with the options in `forwardedProps.nylorun.session` and never
|
|
18
20
|
* changed afterwards. A stream opened with an issuer token ends at the token's expiry with
|
|
@@ -22,7 +24,8 @@ import { randomUUID } from "node:crypto";
|
|
|
22
24
|
import { EventType, } from "@ag-ui/core";
|
|
23
25
|
import { RunAgentInputSchema } from "@ag-ui/core/schemas";
|
|
24
26
|
import { PutSessionRequestSchema, } from "@nylorun/core/contracts";
|
|
25
|
-
import { messagesFromEvents } from "./history.js";
|
|
27
|
+
import { messagesFromEvents, NYLORUN_FILE_PROVIDER } from "./history.js";
|
|
28
|
+
import { discardFiles, inlineFileName, messageParts, refuseUrl, } from "../inbound-files.js";
|
|
26
29
|
import { sessionIdFor } from "./session-id.js";
|
|
27
30
|
import { SSE_CONTENT_TYPE, SSE_HEARTBEAT, sseFrame } from "./sse.js";
|
|
28
31
|
import { RunTranslator } from "./translate.js";
|
|
@@ -33,7 +36,7 @@ import { fail, HttpError } from "../../tenant/http.js";
|
|
|
33
36
|
import { observeSession, readHistory, StreamClosed, streamHolderOf, } from "../../tenant/session-streams.js";
|
|
34
37
|
import { putSession, sessionView } from "../../tenant/sessions.js";
|
|
35
38
|
import { mayUseAgent } from "../../tenant/auth.js";
|
|
36
|
-
import {
|
|
39
|
+
import { environmentGrantsOf } from "../../tenant/environments.js";
|
|
37
40
|
const HEARTBEAT_MS = 15_000;
|
|
38
41
|
const TERMINAL = new Set([
|
|
39
42
|
"turn.completed",
|
|
@@ -60,11 +63,38 @@ function runError(error) {
|
|
|
60
63
|
: error.message;
|
|
61
64
|
return { type: EventType.RUN_ERROR, message, code };
|
|
62
65
|
}
|
|
63
|
-
/**
|
|
66
|
+
/** A media part's file: bytes sent inline, or an artifact the Runtime already holds. */
|
|
67
|
+
function inboundFile(part, index) {
|
|
68
|
+
const { source } = part;
|
|
69
|
+
if (source.type === "url")
|
|
70
|
+
return refuseUrl();
|
|
71
|
+
if (source.type === "file") {
|
|
72
|
+
if (source.provider !== NYLORUN_FILE_PROVIDER)
|
|
73
|
+
return fail(400, `A file source names an artifact: provider "${NYLORUN_FILE_PROVIDER}" and its artifact id`, { code: "invalid_request" });
|
|
74
|
+
return { type: "artifact", artifactId: source.value };
|
|
75
|
+
}
|
|
76
|
+
const metadata = (part.metadata ?? {});
|
|
77
|
+
const named = [metadata.filename, metadata.name].find((value) => typeof value === "string" && value !== "");
|
|
78
|
+
return {
|
|
79
|
+
type: "inline",
|
|
80
|
+
name: named ?? inlineFileName(source.mimeType, index),
|
|
81
|
+
mediaType: source.mimeType,
|
|
82
|
+
data: source.value,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The trailing user message: the Runtime keeps the transcript, AG-UI resends all of it. Its
|
|
87
|
+
* text, or its parts when it carries a media part.
|
|
88
|
+
*/
|
|
64
89
|
function lastUserMessage(messages) {
|
|
65
90
|
const last = messages.at(-1);
|
|
66
91
|
if (!last || last.role !== "user")
|
|
67
92
|
return fail(400, "The run's last message must be a user message");
|
|
93
|
+
if (typeof last.content !== "string" && last.content.some((part) => part.type !== "text")) {
|
|
94
|
+
let files = 0;
|
|
95
|
+
const parts = last.content.map((part) => part.type === "text" ? { type: "text", text: part.text } : inboundFile(part, files++));
|
|
96
|
+
return { id: last.id, text: "", parts };
|
|
97
|
+
}
|
|
68
98
|
const text = typeof last.content === "string"
|
|
69
99
|
? last.content
|
|
70
100
|
: last.content
|
|
@@ -83,8 +113,7 @@ function sessionOptions(input, scope) {
|
|
|
83
113
|
return {};
|
|
84
114
|
const parsed = PutSessionRequestSchema.pick({
|
|
85
115
|
info: true,
|
|
86
|
-
|
|
87
|
-
credentialSelections: true,
|
|
116
|
+
environment: true,
|
|
88
117
|
})
|
|
89
118
|
.strict()
|
|
90
119
|
.safeParse(raw);
|
|
@@ -99,11 +128,11 @@ function sessionOptions(input, scope) {
|
|
|
99
128
|
});
|
|
100
129
|
return parsed.data;
|
|
101
130
|
}
|
|
102
|
-
async function accepted(ctx, id, body, scope) {
|
|
103
|
-
const result = (await command(ctx, id, body, scope));
|
|
131
|
+
async function accepted(ctx, id, body, scope, trace) {
|
|
132
|
+
const result = (await command(ctx, id, body, scope, trace ? { trace } : {}));
|
|
104
133
|
return result?.cursor ?? null;
|
|
105
134
|
}
|
|
106
|
-
async function submit(ctx, id, input, scope) {
|
|
135
|
+
async function submit(ctx, id, input, scope, trace) {
|
|
107
136
|
if (input.resume?.length) {
|
|
108
137
|
// The interaction's kind is on the session's pending view, not in its id.
|
|
109
138
|
const view = (await ctx.store.tx(async (t) => sessionView(t, await sessionOf(t, id, accessOf(scope)))));
|
|
@@ -139,12 +168,23 @@ async function submit(ctx, id, input, scope) {
|
|
|
139
168
|
const message = lastUserMessage(input.messages);
|
|
140
169
|
// The AG-UI message id is the idempotency key: a retried run replays the same turn, and
|
|
141
170
|
// history gives the message back its client id.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
171
|
+
if (!message.parts)
|
|
172
|
+
return accepted(ctx, id, {
|
|
173
|
+
type: "message",
|
|
174
|
+
requestId: randomUUID(),
|
|
175
|
+
idempotencyKey: message.id,
|
|
176
|
+
content: message.text,
|
|
177
|
+
}, scope, trace);
|
|
178
|
+
const access = accessOf(scope);
|
|
179
|
+
const { parts, stored } = await messageParts(ctx, id, message.id, message.parts, access);
|
|
180
|
+
try {
|
|
181
|
+
return await accepted(ctx, id, { type: "message", requestId: randomUUID(), idempotencyKey: message.id, parts }, scope, trace);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// A refused message leaves no files behind.
|
|
185
|
+
await discardFiles(ctx, stored, access);
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
148
188
|
}
|
|
149
189
|
/**
|
|
150
190
|
* Streams translated events until the run ends. Closing the connection stops the read, never
|
|
@@ -229,7 +269,9 @@ export function agUiCaller(scope, agentId) {
|
|
|
229
269
|
return { subject, access: accessOf(scope) };
|
|
230
270
|
}
|
|
231
271
|
/** `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
|
|
272
|
+
export async function startRun(ctx, scope, agentId, caller, body, response,
|
|
273
|
+
/** The request's trace context (R7.4): the turn the run starts joins the caller's trace. */
|
|
274
|
+
trace) {
|
|
233
275
|
const parsed = RunAgentInputSchema.safeParse(body);
|
|
234
276
|
if (!parsed.success)
|
|
235
277
|
return fail(400, "Invalid RunAgentInput", { code: "invalid_request" });
|
|
@@ -245,16 +287,17 @@ export async function startRun(ctx, scope, agentId, caller, body, response) {
|
|
|
245
287
|
...sessionOptions(input, scope),
|
|
246
288
|
}, caller.access, {
|
|
247
289
|
createOnly: true,
|
|
248
|
-
...(
|
|
290
|
+
...(environmentGrantsOf(scope) === undefined ? {} : { environmentGrants: environmentGrantsOf(scope) }),
|
|
249
291
|
});
|
|
250
292
|
const translator = new RunTranslator(input.threadId, input.runId);
|
|
251
293
|
let cursor;
|
|
252
294
|
try {
|
|
253
|
-
cursor = await submit(ctx, id, input, scope);
|
|
295
|
+
cursor = await submit(ctx, id, input, scope, trace);
|
|
254
296
|
}
|
|
255
297
|
catch (error) {
|
|
256
|
-
// A busy session or a
|
|
257
|
-
|
|
298
|
+
// A busy session, a limit or a file the model does not read is a run that could not start,
|
|
299
|
+
// not a transport failure.
|
|
300
|
+
if (error instanceof HttpError && [409, 422, 429].includes(error.status))
|
|
258
301
|
return stream(response, translator, undefined, [runError(error)]);
|
|
259
302
|
throw error;
|
|
260
303
|
}
|
|
@@ -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
|
-
|
|
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 };
|