From 37be358d2298f5a9afc90b1f03f3fef781191493 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 10 Aug 2026 12:34:18 +0200 Subject: [PATCH 1/4] fix(a2a): serve agent-card discovery at the standard well-known path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-card discovery is where A2A federation starts, and it does not work today on any deployment whose workspace is not named after the first label of its hostname. Verified against production, where the hosted workspace is named rw_7ccfea89: GET /.well-known/agent-card.json -> 404 workspace_not_found GET /.well-known/agent-card.json?workspace=rw_7ccfea89 -> 200 GET /rw_7ccfea89/.well-known/agent-card.json -> 404 workspace_not_found GET /.well-known/agent-card.json (Bearer token) -> 200 Two defects, one root cause. extractWorkspaceHint resolved query -> host label -> path param, and the unauthenticated card handler had no other source. 1. The documented /:workspace/.well-known/agent-card.json route was dead on any authority with three or more labels, because host inference always answered first and the path parameter was never read. The Relay identifier profile requires multi-label, non-loopback authorities, so every conformant deployment sits exactly where that route cannot work. 2. A single-tenant self-host could not answer the bare standard URL at all, which is the one an A2A counterparty tries first. The path parameter now beats host inference, and the card handler falls back to the sole workspace when a deployment has exactly one. The fallback is skipped whenever a query or path selector was supplied, so a misspelled selector fails loudly rather than quietly resolving to another tenant, and the candidate query is bounded to two rows so multi-tenant deployments fail closed without scanning the table. POST /a2a/rpc is unaffected: it authenticates and takes the workspace from the token. That is what made this narrow and misleading — discovery 404s while everything authenticated works, and the error text blames agent registration. Six tests, including the one that makes the change safe to ship: a valid hosted workspace subdomain stays authoritative, since this reorders live routing. Split out of the Phase 2 federation work so it can ship on its own; it affects any A2A counterparty, not only that engagement. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 6 +- packages/engine/CHANGELOG.md | 6 +- .../engine/src/engine/__tests__/a2a.test.ts | 98 +++++++++++++++++++ packages/engine/src/routes/a2a.ts | 26 ++++- 4 files changed, 133 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cf8cd2f..0125021d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,11 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Packages without a separate changelog are covered by the cross-package notes below. -## [Unreleased] +## [Unreleased - Patch] + +### Fixed + +- A2A agent-card discovery now answers the standard `GET /.well-known/agent-card.json` on a single-tenant deployment, and an explicit `/:workspace/` path selector is honoured instead of being overridden by host inference. Previously a deployment whose workspace was not named after the first label of its hostname returned `workspace_not_found` at the standard discovery URL, and the documented path route could never take effect on any authority with three or more labels. Multi-tenant deployments still fail closed, and an invalid explicit selector is never silently replaced. ## [7.0.0] - 2026-08-07 diff --git a/packages/engine/CHANGELOG.md b/packages/engine/CHANGELOG.md index d7f1ab15..23222fec 100644 --- a/packages/engine/CHANGELOG.md +++ b/packages/engine/CHANGELOG.md @@ -7,7 +7,11 @@ See the [root changelog](../../CHANGELOG.md) for cross-package release highlight The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [Unreleased - Patch] + +### Fixed + +- `extractWorkspaceHint` consults an explicit `/:workspace/` path parameter before host-label inference, so the documented `/:workspace/.well-known/agent-card.json` route works on authorities with three or more labels instead of being unreachable. `handleWorkspaceAgentCard` falls back to the sole workspace when a deployment has exactly one and the caller supplied no explicit selector, so a single-tenant self-host answers the bare standard well-known URL. The fallback is skipped whenever a query or path selector was supplied — a misspelled selector fails rather than crossing a tenant boundary — and the candidate query is bounded to two rows so a multi-tenant deployment fails closed without scanning the table. ## [7.0.0] - 2026-08-07 diff --git a/packages/engine/src/engine/__tests__/a2a.test.ts b/packages/engine/src/engine/__tests__/a2a.test.ts index ec2e5ec5..ca58c1a5 100644 --- a/packages/engine/src/engine/__tests__/a2a.test.ts +++ b/packages/engine/src/engine/__tests__/a2a.test.ts @@ -470,3 +470,101 @@ describe('getWorkspaceAgentCard', () => { ]); }); }); + +describe('workspace agent-card discovery', () => { + let stack: TestStack; + + beforeEach(() => { + stack = makeNodeStack(); + }); + + afterEach(() => stack.close()); + + it('serves the standard bare well-known path for a sole self-hosted workspace', async () => { + const ws = await createWorkspace(stack.app, 'borealis'); + await registerAgent(stack.app, ws.workspaceKey, 'worker'); + + const response = await stack.app.request( + 'https://relay.borealis.example/.well-known/agent-card.json', + ); + + expect(response.status).toBe(200); + const card = await response.json() as { provider?: Record }; + expect(card.provider).toMatchObject({ + workspace_id: ws.workspaceId, + workspace_name: 'borealis', + }); + }); + + it('keeps a valid hosted workspace subdomain authoritative', async () => { + const selected = await createWorkspace(stack.app, 'northwind'); + await createWorkspace(stack.app, 'borealis'); + + const response = await stack.app.request( + 'https://northwind.cast.example/.well-known/agent-card.json', + ); + + expect(response.status).toBe(200); + const card = await response.json() as { provider?: Record }; + expect(card.provider).toMatchObject({ + workspace_id: selected.workspaceId, + workspace_name: 'northwind', + }); + }); + + it('makes an explicit path workspace beat host inference on a multi-label authority', async () => { + const selected = await createWorkspace(stack.app, 'borealis'); + await createWorkspace(stack.app, 'cast'); + + const response = await stack.app.request( + 'https://cast.agentrelay.com/borealis/.well-known/agent-card.json', + ); + + expect(response.status).toBe(200); + const card = await response.json() as { provider?: Record }; + expect(card.provider).toMatchObject({ + workspace_id: selected.workspaceId, + workspace_name: 'borealis', + }); + }); + + it('does not replace an invalid path workspace with a valid host workspace', async () => { + await createWorkspace(stack.app, 'cast'); + + const response = await stack.app.request( + 'https://cast.agentrelay.com/misspelled/.well-known/agent-card.json', + ); + + expect(response.status).toBe(404); + await expect(response.json()).resolves.toMatchObject({ + error: { code: 'workspace_not_found' }, + }); + }); + + it('fails closed on a bare multi-tenant deployment instead of selecting a workspace', async () => { + await createWorkspace(stack.app, 'northwind'); + await createWorkspace(stack.app, 'borealis'); + + const response = await stack.app.request( + 'https://cast.agentrelay.com/.well-known/agent-card.json', + ); + + expect(response.status).toBe(404); + await expect(response.json()).resolves.toMatchObject({ + error: { code: 'workspace_not_found' }, + }); + }); + + it('does not hide an invalid explicit workspace selector behind the sole-workspace fallback', async () => { + await createWorkspace(stack.app, 'borealis'); + + const response = await stack.app.request( + 'https://relay.borealis.example/.well-known/agent-card.json?workspace=misspelled', + ); + + expect(response.status).toBe(404); + await expect(response.json()).resolves.toMatchObject({ + error: { code: 'workspace_not_found' }, + }); + }); +}); diff --git a/packages/engine/src/routes/a2a.ts b/packages/engine/src/routes/a2a.ts index 2cf9a8fc..ee433f97 100644 --- a/packages/engine/src/routes/a2a.ts +++ b/packages/engine/src/routes/a2a.ts @@ -62,6 +62,13 @@ function extractWorkspaceHint(c: Context): string | null { const explicit = c.req.query('workspace'); if (explicit) return explicit; + // An explicit path selector must beat host inference. Previously the host + // branch was consulted first, so on any authority with three or more labels + // — which the Relay identifier profile requires — the documented + // `/:workspace/.well-known/agent-card.json` route could never take effect. + const pathWorkspace = c.req.param('workspace'); + if (pathWorkspace) return pathWorkspace; + const host = c.req.header('Host') ?? new URL(c.req.url).host; const hostname = host.split(':')[0] ?? ''; const hostSegments = hostname.split('.').filter(Boolean); @@ -70,7 +77,7 @@ function extractWorkspaceHint(c: Context): string | null { return hostSegments[0]!; } - return c.req.param('workspace') || null; + return null; } function extractTargetAgentName(params: Record | undefined, fallbackContextId?: string): string | null { @@ -228,6 +235,23 @@ async function handleWorkspaceAgentCard(c: Context) { } } + // A self-hosted, single-tenant deployment must answer the standard bare + // well-known URL without requiring a Relaycast-specific query parameter. + // Only use this fallback when the caller supplied no explicit workspace: + // a misspelled query/path selector must fail rather than silently crossing + // a tenant boundary. Limit to two rows so the multi-tenant case fails + // closed without scanning the workspace table. + if ( + !workspace + && !c.req.query('workspace') + && !c.req.param('workspace') + ) { + const candidates = await db.select().from(workspaces).limit(2); + if (candidates.length === 1) { + workspace = candidates[0]!; + } + } + if (!workspace) { return jsonNotFound(c, 'workspace_not_found', 'Workspace could not be inferred from request. Provide an Authorization header or ?workspace= query param.'); } From ada0cff0717ece1f1be397fad5dc6f6591057c6c Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 10 Aug 2026 13:00:39 +0200 Subject: [PATCH 2/4] address review: docs parity, changelog concision, and pin the fallback boundary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Devin (docs): AGENTS.md requires README.md and openapi.yaml to move with API behaviour. Documents the resolution order, the ?workspace= selector, the path-scoped route, and the 404 workspace_not_found response for both forms. Devin (security): the sole-workspace fallback also fires when a host label was inferred but did not resolve. Keeping that is deliberate and now explained in code: an explicit query/path selector is caller intent and must 404 on a typo, whereas host-label inference is a hosted convention that always yields a candidate on any authority with three or more labels. Treating it as explicit would mean the fallback never fires on the deployments it exists for. The row cap is the actual boundary — with two or more workspaces it declines rather than guessing, so no tenant boundary can be crossed, and the card is unauthenticated by design. Added a test asserting the single-tenant behaviour directly, so it is stated intent rather than an accident; the existing multi-tenant test already covers the same request 404ing. CodeRabbit: changelog entries trimmed to one impact-first bullet each, per the repo guideline. Engine suite 559/559 across 52 files. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 2 +- README.md | 3 +- openapi.yaml | 59 +++++++++++++++++++ packages/engine/CHANGELOG.md | 2 +- .../engine/src/engine/__tests__/a2a.test.ts | 16 +++++ packages/engine/src/routes/a2a.ts | 23 ++++++-- 6 files changed, 98 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0125021d..d9846617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ Packages without a separate changelog are covered by the cross-package notes bel ### Fixed -- A2A agent-card discovery now answers the standard `GET /.well-known/agent-card.json` on a single-tenant deployment, and an explicit `/:workspace/` path selector is honoured instead of being overridden by host inference. Previously a deployment whose workspace was not named after the first label of its hostname returned `workspace_not_found` at the standard discovery URL, and the documented path route could never take effect on any authority with three or more labels. Multi-tenant deployments still fail closed, and an invalid explicit selector is never silently replaced. +- A2A counterparties can discover a self-hosted deployment at the standard `GET /.well-known/agent-card.json`, and `/:workspace/.well-known/agent-card.json` now resolves. Deployments holding more than one workspace still require a selector. ## [7.0.0] - 2026-08-07 diff --git a/README.md b/README.md index 61cf0856..6c7eebe9 100644 --- a/README.md +++ b/README.md @@ -649,7 +649,8 @@ POST /v1/a2a/register Register an external A2A agent GET /v1/a2a/agents List registered A2A agents DELETE /v1/a2a/agents/:name Remove an A2A agent GET /v1/a2a/agents/:name/card Get agent card for a registered agent -GET /.well-known/agent-card.json A2A agent card (root-level) +GET /.well-known/agent-card.json A2A agent card (root-level; ?workspace= selects on multi-tenant) +GET /:workspace/.well-known/agent-card.json A2A agent card for a named workspace POST /a2a/rpc A2A JSON-RPC gateway (root-level) POST /a2a/webhook/:ws/:name Inbound webhook for relay agents ``` diff --git a/openapi.yaml b/openapi.yaml index a89abce7..1ffe4d16 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4801,7 +4801,60 @@ paths: description: Local development server get: summary: Workspace A2A agent card + description: > + Unauthenticated A2A discovery. The workspace is resolved in order: + Authorization header, `?workspace=` query parameter, an explicit + `/:workspace/` path segment, then the first host label (the hosted + workspace-per-subdomain convention). A deployment holding exactly one + workspace answers this bare path with that workspace; a deployment + holding more than one returns 404 unless a selector identifies it. An + explicit query or path selector that does not resolve always returns + 404 rather than falling back. + tags: [A2A] + parameters: + - in: query + name: workspace + required: false + schema: + type: string + description: Workspace name. Required on a deployment holding more than one workspace. + responses: + '200': + description: Agent card JSON + content: + application/json: + schema: + type: object + '404': + description: > + `workspace_not_found` — no selector resolved a workspace, or an + explicit selector named one that does not exist. + content: + application/json: + schema: + type: object + + /{workspace}/.well-known/agent-card.json: + servers: + - url: https://cast.agentrelay.com + description: Production server (root, no /v1 prefix) + - url: http://localhost:8787 + description: Local development server + get: + summary: Workspace A2A agent card, path-scoped + description: > + Path-scoped form of A2A discovery. The path segment takes precedence + over host-label inference, so this route resolves on multi-label + authorities. A segment naming a workspace that does not exist returns + 404 rather than falling back to any other workspace. tags: [A2A] + parameters: + - in: path + name: workspace + required: true + schema: + type: string + description: Workspace name. responses: '200': description: Agent card JSON @@ -4809,6 +4862,12 @@ paths: application/json: schema: type: object + '404': + description: '`workspace_not_found` — the named workspace does not exist.' + content: + application/json: + schema: + type: object /a2a/register: post: diff --git a/packages/engine/CHANGELOG.md b/packages/engine/CHANGELOG.md index 23222fec..d825ed38 100644 --- a/packages/engine/CHANGELOG.md +++ b/packages/engine/CHANGELOG.md @@ -11,7 +11,7 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht ### Fixed -- `extractWorkspaceHint` consults an explicit `/:workspace/` path parameter before host-label inference, so the documented `/:workspace/.well-known/agent-card.json` route works on authorities with three or more labels instead of being unreachable. `handleWorkspaceAgentCard` falls back to the sole workspace when a deployment has exactly one and the caller supplied no explicit selector, so a single-tenant self-host answers the bare standard well-known URL. The fallback is skipped whenever a query or path selector was supplied — a misspelled selector fails rather than crossing a tenant boundary — and the candidate query is bounded to two rows so a multi-tenant deployment fails closed without scanning the table. +- Agent-card discovery resolves the workspace from an explicit `/:workspace/` path segment before host-label inference, and serves the sole workspace when a deployment has exactly one and no selector was given. Deployments with more than one workspace, and unresolved explicit selectors, return `workspace_not_found`. ## [7.0.0] - 2026-08-07 diff --git a/packages/engine/src/engine/__tests__/a2a.test.ts b/packages/engine/src/engine/__tests__/a2a.test.ts index ca58c1a5..badacc7f 100644 --- a/packages/engine/src/engine/__tests__/a2a.test.ts +++ b/packages/engine/src/engine/__tests__/a2a.test.ts @@ -555,6 +555,22 @@ describe('workspace agent-card discovery', () => { }); }); + it('serves the sole workspace even when an unresolved host label was inferred', async () => { + // Host-label inference is a hosted convention, not caller intent, so a + // label that names no workspace does not suppress the single-tenant + // fallback — otherwise a self-host could never answer the standard path, + // since a conformant authority always yields some first label. The row cap + // is the boundary: the multi-tenant case above 404s on this same request. + await createWorkspace(stack.app, 'ratify-protocol'); + + const response = await stack.app.request( + 'https://relay.ratifyprotocol.com/.well-known/agent-card.json', + ); + + expect(response.status).toBe(200); + await expect(response.json()).resolves.toMatchObject({ name: 'ratify-protocol' }); + }); + it('does not hide an invalid explicit workspace selector behind the sole-workspace fallback', async () => { await createWorkspace(stack.app, 'borealis'); diff --git a/packages/engine/src/routes/a2a.ts b/packages/engine/src/routes/a2a.ts index ee433f97..6dc11b32 100644 --- a/packages/engine/src/routes/a2a.ts +++ b/packages/engine/src/routes/a2a.ts @@ -237,10 +237,25 @@ async function handleWorkspaceAgentCard(c: Context) { // A self-hosted, single-tenant deployment must answer the standard bare // well-known URL without requiring a Relaycast-specific query parameter. - // Only use this fallback when the caller supplied no explicit workspace: - // a misspelled query/path selector must fail rather than silently crossing - // a tenant boundary. Limit to two rows so the multi-tenant case fails - // closed without scanning the workspace table. + // + // Two guards, and the distinction between them is deliberate: + // + // 1. An *explicit* selector is caller intent, so a misspelled `?workspace=` + // or `/:workspace/` must 404 rather than silently resolving to a + // different tenant. Host-label inference is not caller intent — it is a + // hosted workspace-per-subdomain convention, and on any authority with + // three or more labels it always produces a candidate. Treating it as an + // explicit selector would mean the fallback never fires on exactly the + // deployments it exists for. + // 2. The row cap is what makes that safe: with two or more workspaces the + // fallback declines rather than guessing, so there is no tenant boundary + // to cross. It is `limit(2)` rather than a count so a large table is + // never scanned. + // + // Net effect: on a multi-tenant deployment an unresolved host label 404s; + // on a single-tenant one it serves the only workspace there is. The card is + // unauthenticated by design (A2A discovery), so this exposes nothing that + // the standard well-known path is not already meant to publish. if ( !workspace && !c.req.query('workspace') From 5bd11afad742cd92c956f509b513bdfd6609f12d Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 10 Aug 2026 14:00:40 +0200 Subject: [PATCH 3/4] register the path-scoped discovery route in the SDK/OpenAPI sync test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI caught what my local run did not: adding a path to openapi.yaml requires classifying it in packages/types' sdk-openapi-sync test as either SDK-covered or intentionally non-SDK. The path-scoped agent-card route is the latter, for the same reason as the bare form already listed beside it — unauthenticated A2A discovery is not an agent-SDK surface. I had run the engine and sdk-typescript suites and inferred the rest. Full • Packages in scope: @relaycast/a2a, @relaycast/engine, @relaycast/mcp, @relaycast/observer-dashboard, @relaycast/openclaw, @relaycast/react, @relaycast/sdk, @relaycast/types, relaycast • Running test in 9 packages • Remote caching disabled, using shared worktree cache @relaycast/a2a:build: cache hit, replaying logs a458c4ed01107517 @relaycast/a2a:build: @relaycast/a2a:build: > @relaycast/a2a@7.0.0 build @relaycast/a2a:build: > rm -rf dist tsconfig.tsbuildinfo && tsc @relaycast/a2a:build: @relaycast/types:build: cache hit, replaying logs 2c2c15f9a185bd51 @relaycast/types:build: @relaycast/types:build: > @relaycast/types@7.0.0 build @relaycast/types:build: > rm -rf dist tsconfig.tsbuildinfo && tsc @relaycast/types:build: @relaycast/a2a:test: cache hit, replaying logs 14539744c6a0e79a @relaycast/types:test: cache hit, replaying logs bfcaf87044a67093 @relaycast/types:test: @relaycast/types:test: > @relaycast/types@7.0.0 test @relaycast/types:test: > vitest run @relaycast/types:test: @relaycast/types:test: @relaycast/types:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/types @relaycast/types:test: @relaycast/types:test: ✓ src/__tests__/sdk-openapi-sync.test.ts (3 tests) 2ms @relaycast/types:test: ✓ src/__tests__/event-id.test.ts (2 tests) 2ms @relaycast/types:test: ✓ src/__tests__/telemetry.test.ts (6 tests) 11ms @relaycast/types:test: ✓ src/__tests__/types.test.ts (36 tests) 6ms @relaycast/types:test: ✓ src/__tests__/fleet-wire-fixtures.test.ts (25 tests) 19ms @relaycast/types:test: ✓ src/__tests__/events.test.ts (91 tests) 22ms @relaycast/types:test: @relaycast/types:test:  Test Files  6 passed (6) @relaycast/types:test:  Tests  163 passed (163) @relaycast/types:test:  Start at  13:59:43 @relaycast/types:test:  Duration  425ms (transform 715ms, setup 0ms, import 1.15s, tests 64ms, environment 0ms) @relaycast/types:test: @relaycast/a2a:test: @relaycast/a2a:test: > @relaycast/a2a@7.0.0 test @relaycast/a2a:test: > vitest run --passWithNoTests @relaycast/a2a:test: @relaycast/a2a:test: @relaycast/a2a:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/a2a @relaycast/a2a:test: @relaycast/a2a:test: ✓ src/__tests__/schemas.test.ts (62 tests) 14ms @relaycast/a2a:test: @relaycast/a2a:test:  Test Files  1 passed (1) @relaycast/a2a:test:  Tests  62 passed (62) @relaycast/a2a:test:  Start at  13:59:42 @relaycast/a2a:test:  Duration  218ms (transform 52ms, setup 0ms, import 102ms, tests 14ms, environment 0ms) @relaycast/a2a:test: @relaycast/sdk:build: cache hit, replaying logs 339abf92be4d4365 @relaycast/sdk:build: @relaycast/sdk:build: > @relaycast/sdk@7.0.0 build @relaycast/sdk:build: > tsc @relaycast/sdk:build: @relaycast/openclaw:build: cache hit, replaying logs 8e480d460ef51321 @relaycast/openclaw:build: @relaycast/openclaw:build: > @relaycast/openclaw@7.0.0 build @relaycast/openclaw:build: > tsc @relaycast/openclaw:build: @relaycast/openclaw:test: cache hit, replaying logs 026f2a4985d6ddaa @relaycast/mcp:build: cache hit, replaying logs df96a76760111a0b @relaycast/sdk:test: cache hit, replaying logs 30ef527af4c37095 @relaycast/openclaw:test: @relaycast/openclaw:test: > @relaycast/openclaw@7.0.0 test @relaycast/openclaw:test: > vitest run --root ../.. packages/openclaw/src/__tests__/bridge.test.ts packages/openclaw/src/__tests__/config.test.ts packages/openclaw/src/__tests__/setup.test.ts @relaycast/openclaw:test: @relaycast/openclaw:test: @relaycast/openclaw:test: RUN v3.2.7 /private/tmp/disc-split @relaycast/openclaw:test: @relaycast/openclaw:test: ✓ packages/openclaw/src/__tests__/setup.test.ts (3 tests) 6ms @relaycast/openclaw:test: ✓ packages/openclaw/src/__tests__/config.test.ts (5 tests) 3ms @relaycast/openclaw:test: ✓ packages/openclaw/src/__tests__/bridge.test.ts (11 tests) 8ms @relaycast/openclaw:test: @relaycast/openclaw:test: Test Files 3 passed (3) @relaycast/openclaw:test: Tests 19 passed (19) @relaycast/openclaw:test: Start at 13:59:49 @relaycast/openclaw:test: Duration 630ms (transform 221ms, setup 0ms, collect 334ms, tests 17ms, environment 0ms, prepare 317ms) @relaycast/openclaw:test: @relaycast/mcp:build: @relaycast/mcp:build: > @relaycast/mcp@7.0.0 build @relaycast/mcp:build: > tsc @relaycast/mcp:build: @relaycast/sdk:test: @relaycast/sdk:test: > @relaycast/sdk@7.0.0 test @relaycast/sdk:test: > vitest run @relaycast/sdk:test: @relaycast/sdk:test: @relaycast/sdk:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/sdk-typescript @relaycast/engine:build: cache hit, replaying logs 54ae5d8711716441 @relaycast/sdk:test: @relaycast/sdk:test: ✓ src/__tests__/programmability.test.ts (29 tests) 30ms @relaycast/sdk:test: ✓ src/__tests__/invite-consumption.test.ts (4 tests) 16ms @relaycast/sdk:test: ✓ src/__tests__/relay.test.ts (69 tests) 880ms @relaycast/sdk:test: ✓ requires apiKey  784ms @relaycast/sdk:test: ✓ src/__tests__/ws.test.ts (33 tests) 169ms @relaycast/sdk:test: ✓ src/__tests__/agent-ws.test.ts (37 tests) 150ms @relaycast/sdk:test: ✓ src/__tests__/node-provider.test.ts (18 tests) 300ms @relaycast/sdk:test: ✓ src/__tests__/errors.test.ts (43 tests) 34ms @relaycast/sdk:test: ✓ src/__tests__/agent-messaging.test.ts (33 tests) 10ms @relaycast/sdk:test: ✓ src/__tests__/strict-identity.test.ts (14 tests) 388ms @relaycast/sdk:test: ✓ registers agent with exact name  380ms @relaycast/sdk:test: ✓ src/__tests__/agent-features.test.ts (34 tests) 46ms @relaycast/sdk:test: ✓ src/__tests__/harness.test.ts (25 tests) 428ms @relaycast/sdk:test: ✓ is available from the package root  378ms @relaycast/sdk:test: ✓ src/__tests__/type-safety.test.ts (3 tests) 1ms @relaycast/sdk:test: ✓ src/__tests__/communicate.test.ts (6 tests) 90ms @relaycast/sdk:test: ✓ src/__tests__/identity.test.ts (18 tests) 407ms @relaycast/sdk:test: ✓ forwards identity onto an agent socket too, not just the observer socket  402ms @relaycast/sdk:test: ✓ src/__tests__/deliveries.test.ts (8 tests) 9ms @relaycast/sdk:test: ✓ src/__tests__/client-retry.test.ts (4 tests) 25ms @relaycast/sdk:test: ✓ src/__tests__/casing.test.ts (6 tests) 51ms @relaycast/sdk:test: ✓ src/__tests__/workspace.test.ts (6 tests) 286ms @relaycast/sdk:test: ✓ src/__tests__/event-id.test.ts (2 tests) 4ms @relaycast/sdk:test: ✓ src/__tests__/index.test.ts (1 test) 5ms @relaycast/sdk:test: ✓ src/__tests__/relay-connection.test.ts (4 tests) 329ms @relaycast/sdk:test: ✓ src/__tests__/setup.test.ts (20 tests) 3437ms @relaycast/sdk:test: ✓ createWorkspace() accepts 200 success responses  666ms @relaycast/sdk:test: ✓ createWorkspace() surfaces API errors with status and body  2717ms @relaycast/sdk:test: @relaycast/sdk:test:  Test Files  22 passed (22) @relaycast/sdk:test:  Tests  417 passed (417) @relaycast/sdk:test:  Start at  13:59:45 @relaycast/sdk:test:  Duration  4.05s (transform 4.00s, setup 0ms, import 7.31s, tests 7.09s, environment 2ms) @relaycast/sdk:test: @relaycast/engine:build: @relaycast/engine:build: > @relaycast/engine@7.0.0 build @relaycast/engine:build: > tsc && node -e "require('fs').cpSync('src/db/migrations','dist/db/migrations',{recursive:true})" @relaycast/engine:build: @relaycast/react:build: cache hit, replaying logs 9ed587b55f4950e5 @relaycast/react:build: @relaycast/react:build: > @relaycast/react@7.0.0 build @relaycast/react:build: > tsc @relaycast/react:build: @relaycast/mcp:test: cache hit, replaying logs 025d73b448b58e29 relaycast:build: cache hit, replaying logs dc46d3a60d94fbbe @relaycast/engine:test: cache hit, replaying logs 2a11bf1a828fb39d @relaycast/mcp:test: @relaycast/mcp:test: > @relaycast/mcp@7.0.0 test @relaycast/mcp:test: > vitest run @relaycast/mcp:test: @relaycast/mcp:test: @relaycast/mcp:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/mcp @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > appends unread channels to tool response @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > appends unread DMs to tool response @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=1 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > appends mentions to tool response @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=1 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > does not append when inbox is empty @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > filters out self-sent DMs from piggyback @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=2 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > filters out self-mentions from piggyback @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=2 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > filters self-sent DMs with case and @ prefix differences @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=2 dms=3 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > suppresses piggyback entirely when all messages are self-sent @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=1 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > appends recent reactions to tool response @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=1 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > filters out self-reactions from piggyback @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=2 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > suppresses piggyback when only self-reactions exist @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=1 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > handles inbox error gracefully @relaycast/mcp:test: [piggyback] inbox fetch failed — Network error @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > filters self-authored items using the routed workspace identity @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=2 dms=2 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/piggyback.test.ts > piggyback unread messages > falls back to routing.as for self-filtering when no identity resolver is provided @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=2 dms=2 reactions=2 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/piggyback.test.ts (17 tests) 115ms @relaycast/mcp:test: ✓ src/__tests__/messaging-tools.test.ts (13 tests) 1044ms @relaycast/mcp:test: ✓ post_message calls send()  446ms @relaycast/mcp:test: ✓ src/__tests__/registration-tools.test.ts (19 tests) 1135ms @relaycast/mcp:test: ✓ src/__tests__/ws-bridge.test.ts (19 tests) 302ms @relaycast/mcp:test: stderr | src/__tests__/server-multi-workspace.test.ts > multi-workspace server setup > message.post with workspace_id routes to correct workspace @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/server-multi-workspace.test.ts > multi-workspace server setup > message.post without workspace routing uses the active workspace identity @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/observer-dashboard:build: cache hit, replaying logs 9a67e4a8948ac9e7 relaycast:build: relaycast:build: > relaycast@7.0.0 build relaycast:build: > tsc relaycast:build: @relaycast/engine:test: @relaycast/engine:test: > @relaycast/engine@7.0.0 test @relaycast/engine:test: > vitest run @relaycast/engine:test: @relaycast/engine:test: @relaycast/engine:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/engine @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed bodies handled by the shared parser @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '6eb95cda-16d9-427b-8906-74c273832ff3', @relaycast/engine:test: route: '/v1/triggers', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'b0966a840da20881', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > lists the queued delivery for a recipient with the message payload @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540436826226688', @relaycast/engine:test: node_id: 'node_direct_212540436897529856', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540436897529856', @relaycast/engine:test: delivery_id: 'del_212540437287600128_212540436897529856' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed bodies that still flow through route catches @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd1751920-7d22-4035-a4ed-fceb0bb03a32', @relaycast/engine:test: route: '/v1/channels', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 11, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '42e7cf5a834e9c3f', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed channel update request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '71685fbd-43d9-4a97-bda6-2720448dfea5', @relaycast/engine:test: route: '/v1/channels/malformed-update-channel', @relaycast/engine:test: method: 'PATCH', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '47cca9f02db1a83a', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not expose deliveries to non-recipients @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540437639921664', @relaycast/engine:test: node_id: 'node_direct_212540437753167872', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540437753167872', @relaycast/engine:test: delivery_id: 'del_212540437887385600_212540437753167872' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > acks a delivery idempotently and removes it from the default queue @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540438994681856', @relaycast/engine:test: node_id: 'node_direct_212540439024041984', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540439024041984', @relaycast/engine:test: delivery_id: 'del_212540439074373632_212540439024041984' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > keeps custom validation messages when routes use the shared parser @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '74079be9-bb74-4b28-a65c-f30779bbbd21', @relaycast/engine:test: route: '/v1/subscriptions', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 14, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '644c9f60d4f63f9c', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'events array is required' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for another route migrated to the shared parser @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '6f0d22b5-ef35-4ca1-b519-62f75c1158b8', @relaycast/engine:test: route: '/v1/subscriptions', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'db19f86aace6309e', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > attaches, replaces on reconnect, and rejects a duplicate live instance @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540439496306688', @relaycast/engine:test: nodeId: 'node_a', @relaycast/engine:test: provider: 'py', @relaycast/engine:test: message: 'Provider "py" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > records a failed delivery with error text and retryability @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540439741267968', @relaycast/engine:test: node_id: 'node_direct_212540439762239488', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540439762239488', @relaycast/engine:test: delivery_id: 'del_212540440089395200_212540439762239488' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed directory request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '60bcd16a-8cc9-4460-b228-3ee6c9ce4251', @relaycast/engine:test: route: '/v1/directory/agents', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '336cdfeefc94800e', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > defers a delivery with available_at and keeps it in the queue @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540440940838912', @relaycast/engine:test: node_id: 'node_direct_212540440953421824', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540440953421824', @relaycast/engine:test: delivery_id: 'del_212540440986976256_212540440953421824' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > still rejects a direct SDK instance through the attach-liveness boundary @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540441044004864', @relaycast/engine:test: nodeId: 'node_a', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Provider "default" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed file upload request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '642e8b43-c3cd-4bc2-8aac-5b849d6cbb87', @relaycast/engine:test: route: '/v1/files/upload', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'd303d27ace9e6719', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed direct message request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'c11e13f4-68b3-4c8b-9396-902f492d9a15', @relaycast/engine:test: route: '/v1/dm', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 8, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '0a87a802e21a919e', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > rejects a second provider registering an action another provider already owns on the node @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'action_name_conflict', @relaycast/engine:test: workspaceId: '212540441723482112', @relaycast/engine:test: nodeId: 'node_a', @relaycast/engine:test: provider: 'rb', @relaycast/engine:test: message: 'Action "run-etl" is already registered by provider "py" on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > workspace stream > fans out published events to workspace-stream sockets @relaycast/engine:test: [telemetry] captureException TypeError: The database connection is not open @relaycast/engine:test: at Database.prepare (/private/tmp/disc-split/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21) @relaycast/engine:test: at BetterSQLiteSession.prepareQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/better-sqlite3/session.js:23:30) @relaycast/engine:test: at BetterSQLiteSession.prepareOneTimeQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/session.js:141:17) @relaycast/engine:test: at QueryPromise._prepare (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:86:81) @relaycast/engine:test: at QueryPromise.execute (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:114:17) @relaycast/engine:test: at QueryPromise.then (file:///private/tmp/disc-split/node_modules/drizzle-orm/query-promise.js:21:17) { source: 'node.event_queue', op: 'retention_prune' } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not resurrect an acked (terminal) delivery via defer or fail @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540441444155392', @relaycast/engine:test: node_id: 'node_direct_212540441653870592', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540441653870592', @relaycast/engine:test: delivery_id: 'del_212540441981026304_212540441653870592' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > rate limiter > allows up to the limit then blocks within the window @relaycast/engine:test: [telemetry] captureException TypeError: The database connection is not open @relaycast/engine:test: at Database.prepare (/private/tmp/disc-split/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21) @relaycast/engine:test: at BetterSQLiteSession.prepareQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/better-sqlite3/session.js:23:30) @relaycast/engine:test: at BetterSQLiteSession.prepareOneTimeQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/session.js:141:17) @relaycast/engine:test: at QueryPromise._prepare (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:86:81) @relaycast/engine:test: at QueryPromise.execute (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:114:17) @relaycast/engine:test: at QueryPromise.then (file:///private/tmp/disc-split/node_modules/drizzle-orm/query-promise.js:21:17) { source: 'node.event_queue', op: 'retention_prune' } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed channel message request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '7a31c072-7f3e-4e92-a90a-3e6bd7ca3cdc', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '8fa1bfed523cb9f3', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > allows recovering a failed delivery via ack (retryable failures are not terminal) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540442958299136', @relaycast/engine:test: node_id: 'node_direct_212540442983464960', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540442983464960', @relaycast/engine:test: delivery_id: 'del_212540443029602304_212540442983464960' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed group DM request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '221170b7-81e4-478a-acac-41f94af5e510', @relaycast/engine:test: route: '/v1/dm/group', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/react:test: cache hit, replaying logs 8b42683d0f84ff07 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/server-multi-workspace.test.ts > multi-workspace server setup > message.post with workspace_id and as uses the registered workspace identity @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/server-multi-workspace.test.ts (6 tests) 579ms @relaycast/mcp:test: ✓ message.post with workspace_id routes to correct workspace  346ms @relaycast/mcp:test: ✓ src/__tests__/channel-tools.test.ts (14 tests) 99ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > uses agent token for authenticated requests after register @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > clears a routed invalid token without clearing the active workspace token @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > sends mcp origin headers on relay API requests @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > workspace.join registers in the new workspace and uses the restored agent token @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > workspace.switch restores the previous workspace agent token from workspace_ref @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > workspace.switch accepts the canonical workspace_name from the API @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.create → POST /v1/channels @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.list → GET /v1/channels @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.join → POST /v1/channels/:name/join @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.leave → POST /v1/channels/:name/leave @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/server.test.ts > createRelayMcpServer > supports legacy flat tool calls without advertising legacy names @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.invite → POST /channels/:name/invite {agent_name} @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.set_topic → PATCH /v1/channels/:name/topic @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > channel.archive → DELETE /v1/channels/:name @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/server.test.ts > createRelayMcpServer > register tool works and enables other tools @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/server.test.ts > createRelayMcpServer > auto-bootstraps when agentToken and agentName are provided @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/multi-agent-piggyback.test.ts > multi-agent piggyback routing > fetches piggyback inbox from the routed workspace_id context @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.post → POST /v1/channels/:name/messages @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/multi-agent-piggyback.test.ts > multi-agent piggyback routing > fetches piggyback inbox from the routed workspace_alias context @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/programmability-tools.test.ts (14 tests) 498ms @relaycast/mcp:test: stderr | src/__tests__/multi-agent-piggyback.test.ts > multi-agent piggyback routing > passes routed workspace and requested as identity to piggyback inbox fetches @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/feature-tools.test.ts (13 tests) 538ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.list → GET /v1/channels/:name/messages @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.reply → POST /v1/messages/:id/replies @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/multi-agent-piggyback.test.ts > multi-agent piggyback routing > still piggybacks routed inbox state when the active session token is missing @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/multi-agent-piggyback.test.ts (4 tests) 540ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.get_thread → GET /v1/messages/:id/replies @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.dm.send → POST /v1/dm @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.dm.list → GET /v1/dm/conversations @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/multi-agent-integration.test.ts > multi-agent integration routing > uses the routed workspace for both message dispatch and piggyback inbox fetch @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/multi-agent-integration.test.ts > multi-agent integration routing > uses the requested routed agent identity for both message dispatch and piggyback inbox fetches @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=1 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/multi-agent-integration.test.ts (2 tests) 599ms @relaycast/mcp:test: ✓ uses the routed workspace for both message dispatch and piggyback inbox fetch  463ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.dm.send_group → POST /v1/dm/group then POST /v1/dm/:id/messages @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/server.test.ts (10 tests) 2754ms @relaycast/mcp:test: ✓ lists all 45 tools  369ms @relaycast/mcp:test: ✓ supports legacy flat tool calls without advertising legacy names  1083ms @relaycast/mcp:test: ✓ supports keyless startup and bootstrap via set_workspace_key  310ms @relaycast/mcp:test: ✓ retries WS bridge initialization after switching away from a token that failed WS init  499ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.reaction.add → POST /v1/messages/:id/reactions @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.reaction.remove → DELETE /v1/messages/:id/reactions/:emoji @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.search → GET /v1/search?q=... @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/multi-agent-bridge.test.ts (2 tests) 1152ms @relaycast/mcp:test: ✓ stops and recreates the bridge when the active agent token changes across workspaces  734ms @relaycast/mcp:test: ✓ does not recreate the bridge when the agent token changes inside the same workspace  417ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.inbox.mark_read → POST /v1/messages/:id/read @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > message.file.upload → POST /v1/files/upload @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > agent.list → GET /v1/agents @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/react:test: @relaycast/react:test: > @relaycast/react@7.0.0 test @relaycast/react:test: > vitest run @relaycast/react:test: @relaycast/react:test: @relaycast/react:test: RUN v3.2.7 /private/tmp/disc-split/packages/react @relaycast/react:test: @relaycast/react:test: ✓ src/__tests__/reducer.test.ts (25 tests) 9ms @relaycast/react:test: ✓ src/__tests__/messageAdapters.test.ts (3 tests) 3ms @relaycast/react:test: ✓ src/__tests__/provider.test.tsx (1 test) 302ms @relaycast/react:test: ✓ src/__tests__/fetchRaceGuards.test.tsx (3 tests) 508ms @relaycast/react:test: ✓ React data fetch race guards > ignores stale useMessages responses after the channel changes 467ms @relaycast/react:test: ✓ src/__tests__/useMessages.test.tsx (2 tests) 803ms @relaycast/react:test: ✓ useMessages > normalizes initial history to chronological order 470ms @relaycast/react:test: ✓ useMessages > keeps chronological order when fetching older pages 333ms @relaycast/react:test: ✓ src/__tests__/messageMarkdown.test.tsx (5 tests) 643ms @relaycast/react:test: ✓ MessageMarkdown > renders highlighted fenced code and supports copy button 348ms @relaycast/react:test: @relaycast/react:test: Test Files 6 passed (6) @relaycast/react:test: Tests 39 passed (39) @relaycast/react:test: Start at 13:59:50 @relaycast/react:test: Duration 8.13s (transform 2.52s, setup 0ms, collect 12.78s, tests 2.27s, environment 16.56s, prepare 1.01s) @relaycast/react:test: @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'f7ea9e10e208e5cb', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > includes queued deliveries in the agent detail pending_deliveries @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540443755216896', @relaycast/engine:test: node_id: 'node_direct_212540443771994112', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540443771994112', @relaycast/engine:test: delivery_id: 'del_212540443922989056_212540443771994112' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed thread reply request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f4e5d153-2c99-4616-92e5-0942b73f6a25', @relaycast/engine:test: route: '/v1/messages/212540443986472960/replies', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'a14faa5565262f75', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > shadows native spawn capacity with a provider action and never silently bypasses it @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '45f52096-b278-42b1-a54c-b886a239805f', @relaycast/engine:test: route: '/v1/actions/spawn/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'c331498e09769645', @relaycast/engine:test: error_code: 'handler_unavailable', @relaycast/engine:test: error_reason: 'Provider "policy" is offline for action "spawn:claude"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > uses the shared invalid_request envelope for query validation @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'ae5419f7-a845-42f0-9e09-9e1223fbe1ff', @relaycast/engine:test: route: '/v1/console/messages', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: 'bcdbb04a6bd18fdc', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid console message query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > uses schema-backed validation messages for search query parameters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'cbefcc68-887e-430e-a88d-f2b5199ab9bc', @relaycast/engine:test: route: '/v1/search', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '3850494aec8ee444', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'q (search query) is required' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > uses schema-backed validation messages for search query parameters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b76e4dc8-f9d0-4f29-898d-0ebf8ec37ef1', @relaycast/engine:test: route: '/v1/search', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '3850494aec8ee444', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid search query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects a malformed JSON fail body with 400 (no state change) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540444455665664', @relaycast/engine:test: node_id: 'node_direct_212540444501803008', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540444501803008', @relaycast/engine:test: delivery_id: 'del_212540444640215040_212540444501803008' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects a malformed JSON fail body with 400 (no state change) @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '003efbbe-df0d-4578-8143-8af08ec256f6', @relaycast/engine:test: route: '/v1/deliveries/del_212540444640215040_212540444501803008/fail', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 12, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'bcb193858df7d143', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid JSON body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > gates capability liveness per provider @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f09911fe-566a-4598-a664-4a3e1ada7500', @relaycast/engine:test: route: '/v1/nodes/alpha/actions/run-etl/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 22, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'ba0eb1d760a506c3', @relaycast/engine:test: error_code: 'handler_unavailable', @relaycast/engine:test: error_reason: 'Provider "py" is offline for action "run-etl"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeDeliveryContracts.test.ts > node delivery contracts > defaults http_push nodes to one active agent binding @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'aacc2f5c-3940-461d-8acf-6e7982109f29', @relaycast/engine:test: route: '/v1/nodes/single-http-node/agents', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'e8fccba3c212954d', @relaycast/engine:test: error_code: 'node_capacity_exceeded', @relaycast/engine:test: error_reason: 'Node "single-http-node" is at capacity' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > accepts an empty fail body (optional metadata) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540446124998656', @relaycast/engine:test: node_id: 'node_direct_212540446141775872', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540446141775872', @relaycast/engine:test: delivery_id: 'del_212540446166941696_212540446141775872' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > enforces schema-level handler requirements for action registration @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'e11189c3-bef7-4c23-bad6-359d1a278bb7', @relaycast/engine:test: route: '/v1/actions', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'e92b94e43a5615dc', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'handler_agent or handler_node is required' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540446433452032', @relaycast/engine:test: nodeId: 'node_0', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540446848688128', @relaycast/engine:test: nodeId: 'node_1', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540446873853952', @relaycast/engine:test: nodeId: 'node_2', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540446928379904', @relaycast/engine:test: nodeId: 'node_3', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540446999683072', @relaycast/engine:test: nodeId: 'node_4', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > http integration: channel message delivery > replays queued direct-node deliveries when the agent socket reconnects @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540447281295360', @relaycast/engine:test: node_id: 'node_direct_212540447302266880', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540447302266880', @relaycast/engine:test: delivery_id: 'del_212540447323238400_212540447302266880' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not inherit the acceptance reason when deferring without a reason @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540447173574656', @relaycast/engine:test: node_id: 'node_direct_212540447211323392', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540447211323392', @relaycast/engine:test: delivery_id: 'del_212540447366512640_212540447211323392' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540447096152064', @relaycast/engine:test: nodeId: 'node_5', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > reports field-specific message validation failures @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'ce9cc91a-774b-479a-bbf9-e6015e6ab7c7', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 4, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '0b17e38bc8786bea', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'mode must be "wait" or "steer"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > reports placeholder load as unavailable until a finite node explicitly marks it measured @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540448002715648', @relaycast/engine:test: nodeId: 'node_unbounded', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540447641411584', @relaycast/engine:test: nodeId: 'node_6', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > reports placeholder load as unavailable until a finite node explicitly marks it measured @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540448002715648', @relaycast/engine:test: nodeId: 'node_finite', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448056647680', @relaycast/engine:test: nodeId: 'node_7', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448220225536', @relaycast/engine:test: nodeId: 'node_8', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: > @relaycast/observer-dashboard@7.0.0 build @relaycast/observer-dashboard:build: > next build @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: ▲ Next.js 14.2.35 @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: Creating an optimized production build ... @relaycast/observer-dashboard:build: ✓ Compiled successfully @relaycast/observer-dashboard:build: Linting and checking validity of types ... @relaycast/observer-dashboard:build: Collecting page data ... @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.webhook.create → POST /v1/webhooks @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.webhook.list → GET /v1/webhooks @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/resource-integration.test.ts (9 tests) 4ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.webhook.delete → DELETE /v1/webhooks/:id @relaycast/observer-dashboard:build: ⚠ Using edge runtime on a page currently disables static generation for that page @relaycast/observer-dashboard:build: Generating static pages (0/4) ... @relaycast/observer-dashboard:build: Generating static pages (1/4) @relaycast/observer-dashboard:build: Generating static pages (2/4) @relaycast/observer-dashboard:build: Generating static pages (3/4) @relaycast/observer-dashboard:build: ✓ Generating static pages (4/4) @relaycast/observer-dashboard:build: Finalizing page optimization ... @relaycast/observer-dashboard:build: Collecting build traces ... @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: Route (app) Size First Load JS @relaycast/observer-dashboard:build: ┌ ○ /_not-found 873 B 88.2 kB @relaycast/observer-dashboard:build: ├ ƒ /[[...slug]] 133 kB 220 kB @relaycast/observer-dashboard:build: ├ ƒ /api/auth/login 0 B 0 B @relaycast/observer-dashboard:build: ├ ƒ /api/auth/logout 0 B 0 B @relaycast/observer-dashboard:build: ├ ƒ /api/auth/session 0 B 0 B @relaycast/observer-dashboard:build: └ ○ /login 1.73 kB 89.1 kB @relaycast/observer-dashboard:build: + First Load JS shared by all 87.3 kB @relaycast/observer-dashboard:build: ├ chunks/1dd3208c-a3f87aba78a4be4f.js 53.6 kB @relaycast/observer-dashboard:build: ├ chunks/456-3124963a6c43a344.js 31.8 kB @relaycast/observer-dashboard:build: └ other shared chunks (total) 1.93 kB @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: @relaycast/observer-dashboard:build: ○ (Static) prerendered as static content @relaycast/observer-dashboard:build: ƒ (Dynamic) server-rendered on demand @relaycast/observer-dashboard:build: relaycast:test: cache hit, replaying logs 5f948552bd38ec54 @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448270557184', @relaycast/engine:test: nodeId: 'node_9', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448299917312', @relaycast/engine:test: nodeId: 'node_10', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects an invalid defer payload @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540448272482304', @relaycast/engine:test: node_id: 'node_direct_212540448285065216', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540448285065216', @relaycast/engine:test: delivery_id: 'del_212540448360562688_212540448285065216' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects an invalid defer payload @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '657864fb-30f1-43d2-b931-a7c340f64477', @relaycast/engine:test: route: '/v1/deliveries/del_212540448360562688_212540448285065216/defer', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '3fd9b7a634cdf5d5', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'available_at must be an ISO-8601 timestamp' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448350248960', @relaycast/engine:test: nodeId: 'node_11', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448408969216', @relaycast/engine:test: nodeId: 'node_12', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448455106560', @relaycast/engine:test: nodeId: 'node_13', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448518021120', @relaycast/engine:test: nodeId: 'node_14', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448593518592', @relaycast/engine:test: nodeId: 'node_15', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeDeliveryContracts.test.ts > node delivery contracts > rejects direct nodes with unlimited capacity @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '410aa205-4eb1-48d2-9d32-92929624a212', @relaycast/engine:test: route: '/v1/nodes', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 30, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'd57323563e361635', @relaycast/engine:test: error_code: 'direct_node_capacity_exceeded', @relaycast/engine:test: error_reason: 'direct nodes can bind at most one agent' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448656433152', @relaycast/engine:test: nodeId: 'node_16', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448757096448', @relaycast/engine:test: nodeId: 'node_17', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448849371136', @relaycast/engine:test: nodeId: 'node_18', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448954228736', @relaycast/engine:test: nodeId: 'node_19', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > uses a generic validation message for invalid thread reply bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd3761dd5-9b10-458c-b967-3f6f5c45552a', @relaycast/engine:test: route: '/v1/messages/missing/replies', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 23, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '65c00518e2ade873', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'invalid reply body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540448991977472', @relaycast/engine:test: nodeId: 'node_20', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > returns 404 for an unknown or unowned delivery @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540448557694976', @relaycast/engine:test: node_id: 'node_direct_212540449648214016', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540449648214016', @relaycast/engine:test: delivery_id: 'del_212540454039650304_212540449648214016' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > returns 404 for an unknown or unowned delivery @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '6ed3fc43-9beb-4cd0-8d0d-45c5e76c5e9d', @relaycast/engine:test: route: '/v1/deliveries/del_does_not_exist/ack', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 15, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: actor_fingerprint: '8c2c14fbc99deb93', @relaycast/engine:test: error_code: 'delivery_not_found', @relaycast/engine:test: error_reason: 'Delivery not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540454012559360', @relaycast/engine:test: nodeId: 'node_21', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540454213885952', @relaycast/engine:test: nodeId: 'node_22', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540455069523968', @relaycast/engine:test: nodeId: 'node_23', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/providerAttachRace.test.ts > provider attach race > resolves two providers claiming the same name deterministically, without silent cap loss @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540455216324608', @relaycast/engine:test: nodeId: 'node_24', @relaycast/engine:test: provider: 'dup', @relaycast/engine:test: message: 'Provider "dup" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeDeliveryContracts.test.ts > node delivery contracts > does not clobber an explicit http_push binding when the agent opens /ws @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'ba3b262a-f347-43a7-9e65-9de5adf5de2b', @relaycast/engine:test: route: '/v1/ws', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 426, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'ws', @relaycast/engine:test: auth_scheme: 'query_agent_token', @relaycast/engine:test: actor_fingerprint: '7f8c827d180f0642' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/providerAttachRace.test.ts (3 tests) 4697ms @relaycast/engine:test: ✓ keeps both providers in the node aggregate when two attach concurrently  1230ms @relaycast/engine:test: ✓ keeps a stable aggregate when a register races another provider disconnecting  1020ms @relaycast/engine:test: ✓ resolves two providers claiming the same name deterministically, without silent cap loss  2445ms @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > caps activity limits @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '1e3788cd-9881-4343-b55d-f8b1716b72dd', @relaycast/engine:test: route: '/v1/activity', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '751814eb36e886fa', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid activity query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > emits delivery.delivered once on ack, not on idempotent retries @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540456661090304', @relaycast/engine:test: node_id: 'node_direct_212540456690450432', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540456690450432', @relaycast/engine:test: delivery_id: 'del_212540456807890944_212540456690450432' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > supports optional delivery fail bodies through the shared parser @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540457307582464', @relaycast/engine:test: node_id: 'node_direct_212540457336942592', @relaycast/engine:test: provider_name: 'default', @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/subscriptions.test.ts (7 tests) 8ms @relaycast/mcp:test: ✓ src/__tests__/stdio.test.ts (14 tests) 9ms @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.webhook.trigger → POST /v1/hooks/:id @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.subscription.create → POST /v1/subscriptions @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.subscription.list → GET /v1/subscriptions @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: stderr | src/__tests__/integration.test.ts > MCP → SDK → HTTP integration > integration.subscription.delete → DELETE /v1/subscriptions/:id @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/integration.test.ts (39 tests) 3618ms @relaycast/mcp:test: ✓ uses agent token for authenticated requests after register  310ms @relaycast/mcp:test: ✓ message.reaction.add → POST /v1/messages/:id/reactions  352ms @relaycast/mcp:test: ✓ message.search → GET /v1/search?q=...  337ms @relaycast/mcp:test: ✓ src/__tests__/telemetry.test.ts (6 tests) 210ms @relaycast/mcp:test: ✓ src/__tests__/resource-definitions.test.ts (6 tests) 521ms @relaycast/mcp:test: ✓ relay://agents reads use routed workspace and as metadata  327ms @relaycast/mcp:test: ✓ src/__tests__/prompts.test.ts (3 tests) 21ms @relaycast/mcp:test: stderr | src/__tests__/multi-agent-session.test.ts > multi-agent routed session dispatch > dispatches routed message.post calls through as(targetToken) @relaycast/mcp:test: [piggyback] inbox fetch ok — channels=0 mentions=0 dms=0 reactions=0 @relaycast/mcp:test: @relaycast/mcp:test: ✓ src/__tests__/multi-agent-session.test.ts (2 tests) 367ms @relaycast/mcp:test: ✓ src/__tests__/index.test.ts (1 test) 2ms @relaycast/mcp:test: @relaycast/mcp:test:  Test Files  21 passed (21) @relaycast/mcp:test:  Tests  220 passed (220) @relaycast/mcp:test:  Start at  13:59:53 @relaycast/mcp:test:  Duration  13.48s (transform 12.33s, setup 0ms, import 41.74s, tests 14.12s, environment 2ms) @relaycast/mcp:test: relaycast:test: relaycast:test: > relaycast@7.0.0 test relaycast:test: > vitest run --root ../.. packages/cli/src/__tests__/cli.test.ts relaycast:test: relaycast:test: relaycast:test:  RUN  v4.1.10 /private/tmp/disc-split relaycast:test: relaycast:test: ✓ packages/cli/src/__tests__/cli.test.ts (3 tests) 147ms relaycast:test: relaycast:test:  Test Files  1 passed (1) relaycast:test:  Tests  3 passed (3) relaycast:test:  Start at  14:00:08 relaycast:test:  Duration  1.59s (transform 555ms, setup 0ms, import 1.18s, tests 147ms, environment 0ms) relaycast:test: @relaycast/engine:test: agent_id: '212540457336942592', @relaycast/engine:test: delivery_id: 'del_212540457416634368_212540457336942592' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > supports optional delivery fail bodies through the shared parser @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '9f4749c1-2488-4607-aa5b-dde59f2731f1', @relaycast/engine:test: route: '/v1/deliveries/del_212540457416634368_212540457336942592/fail', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '6df3de98fdecaf0f', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid JSON body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > enforces node capacity for agents registered over node control @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540457620254720', @relaycast/engine:test: nodeId: 'node_capacity_one', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > enforces node capacity for agents registered over node control @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'agent.register', @relaycast/engine:test: code: 'node_capacity_exceeded', @relaycast/engine:test: workspaceId: '212540457620254720', @relaycast/engine:test: nodeId: 'node_capacity_one', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Node "capacity-one" is at capacity' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > releases reserved capacity when a fail-fast node-scoped spawn hits an offline provider @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '7d77fa64-7439-4abc-9c63-a04f20d88548', @relaycast/engine:test: route: '/v1/nodes/alpha/actions/spawn:claude/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 12, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '4cd90e39e225b07d', @relaycast/engine:test: error_code: 'handler_unavailable', @relaycast/engine:test: error_reason: 'Provider "py" is offline for action "spawn:claude"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not re-emit delivery.deferred when re-deferred to the same time @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540458414309376', @relaycast/engine:test: node_id: 'node_direct_212540458720493568', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540458720493568', @relaycast/engine:test: delivery_id: 'del_212540459890704384_212540458720493568' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed routing request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd7672dfb-5f8e-4c3f-ace8-391cf49fe407', @relaycast/engine:test: route: '/v1/route', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '452011f627b08e6b', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540460862451712', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '7bd53811-62c0-4582-8bfd-b71f4b5f17a1', @relaycast/engine:test: route: '/v1/actions/spawn/invocations/inv_212540461479014400/complete', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 403, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 6, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'e7a95f62f5a62845', @relaycast/engine:test: error_code: 'node_owned_invocation', @relaycast/engine:test: error_reason: 'Node-owned invocations must be completed over the node control channel' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeDeliveryContracts.test.ts > node delivery contracts > rejects an unsafe http_push url if the stored config changes before dispatch @relaycast/engine:test: [telemetry] captureException TypeError: The database connection is not open @relaycast/engine:test: at Database.prepare (/private/tmp/disc-split/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21) @relaycast/engine:test: at BetterSQLiteSession.prepareQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/better-sqlite3/session.js:23:30) @relaycast/engine:test: at BetterSQLiteSession.prepareOneTimeQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/session.js:141:17) @relaycast/engine:test: at QueryPromise._prepare (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/update.js:145:81) @relaycast/engine:test: at QueryPromise.all (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/update.js:164:17) @relaycast/engine:test: at QueryPromise.execute (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/update.js:173:41) @relaycast/engine:test: at QueryPromise.then (file:///private/tmp/disc-split/node_modules/drizzle-orm/query-promise.js:21:17) { source: 'node.event_queue', op: 'poll' } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed reaction request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '590af8f3-cfc2-4503-8f47-ab5d319ab1db', @relaycast/engine:test: route: '/v1/messages/missing/reactions', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9ece380cd7b377ef', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > preserves failure metadata across repeated fail calls (idempotent) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540461799112704', @relaycast/engine:test: node_id: 'node_direct_212540463422308352', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540463422308352', @relaycast/engine:test: delivery_id: 'del_212540463611052032_212540463422308352' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > rejects an explicit global alias that would shadow an agent-hosted action @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'action_name_conflict', @relaycast/engine:test: workspaceId: '212540464255283200', @relaycast/engine:test: nodeId: 'node_a', @relaycast/engine:test: provider: 'py', @relaycast/engine:test: message: 'Action "run-etl" is already registered as an agent-hosted action' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540460862451712', @relaycast/engine:test: nodeId: 'node_beta', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death @relaycast/engine:test: [node.inventory] rejected active-name claim { @relaycast/engine:test: workspace_id: '212540460862451712', @relaycast/engine:test: node_id: 'node_beta', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540466805780480', @relaycast/engine:test: agent_name: 'claimed-agent', @relaycast/engine:test: existing_location_type: 'via_node', @relaycast/engine:test: existing_location_node_id: 'node_alpha' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'inventory.sync', @relaycast/engine:test: code: 'agent_location_conflict', @relaycast/engine:test: workspaceId: '212540460862451712', @relaycast/engine:test: nodeId: 'node_beta', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Agent "claimed-agent" is already active on another live location' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed inbound webhook request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '49eaf9fe-9e05-49e0-8a7c-0f63daea0fc8', @relaycast/engine:test: route: '/v1/webhooks', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 4, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'fed2af376584472f', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > REST disconnect is presence-only for a node-hosted agent by default @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540471436292096', @relaycast/engine:test: nodeId: 'node_disconnect_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > REST disconnect is presence-only for a node-hosted agent by default @relaycast/engine:test: [agent.disconnect] presence-only disconnect; skipping node deregistration { @relaycast/engine:test: workspaceId: '212540471436292096', @relaycast/engine:test: agentId: '212540471633424384', @relaycast/engine:test: nodeId: 'node_disconnect_alpha' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed certification request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '01b3bb70-637c-421e-a509-350e16988d47', @relaycast/engine:test: route: '/v1/certify/monitor', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 7, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '22f21835147d897d', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed optional action invocation bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '88787eb0-c79d-4491-a939-0807ee15bce8', @relaycast/observer-dashboard:test: cache hit, replaying logs d77b32a1a7b850fe @relaycast/engine:test: route: '/v1/actions/missing/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 4, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '1023b121f3b98101', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > clears a queued delivery from the replay queue when the message is read @relaycast/observer-dashboard:test: @relaycast/observer-dashboard:test: > @relaycast/observer-dashboard@7.0.0 test @relaycast/observer-dashboard:test: > vitest run @relaycast/observer-dashboard:test: @relaycast/observer-dashboard:test: @relaycast/observer-dashboard:test:  RUN  v4.1.10 /private/tmp/disc-split/packages/observer-dashboard @relaycast/observer-dashboard:test: @relaycast/observer-dashboard:test: ✓ src/lib/relay-server.test.ts (11 tests) 15ms @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540472389730304', @relaycast/engine:test: node_id: 'node_direct_212540472523948032', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540472523948032', @relaycast/observer-dashboard:test: ✓ src/lib/observer-token.test.ts (7 tests) 17ms @relaycast/observer-dashboard:test: @relaycast/observer-dashboard:test:  Test Files  2 passed (2) @relaycast/observer-dashboard:test:  Tests  18 passed (18) @relaycast/observer-dashboard:test:  Start at  14:00:30 @relaycast/observer-dashboard:test:  Duration  138ms (transform 61ms, setup 0ms, import 78ms, tests 33ms, environment 0ms) @relaycast/observer-dashboard:test: @relaycast/engine:test: delivery_id: 'del_212540473174065152_212540472523948032' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/adapters/node/__tests__/event-queue.test.ts (9 tests) 9811ms @relaycast/engine:test: ✓ retryable failure keeps the row pending with attempts++ and backoff  3072ms @relaycast/engine:test: ✓ exhausting maxAttempts settles the row as failed  3255ms @relaycast/engine:test: ✓ settles an expired final-attempt lease after a crash  855ms @relaycast/engine:test: ✓ resumes pending deliveries after a restart over the same database  1519ms @relaycast/engine:test: ✓ prunes settled rows older than 24h on the poll cadence  805ms @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > REST disconnect with deregister:true tears down a node-hosted agent without a node socket @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540473176928256', @relaycast/engine:test: nodeId: 'node_disconnect_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > REST disconnect with deregister:true tears down a node-hosted agent without a node socket @relaycast/engine:test: [agent.disconnect] deregistering node-hosted agent; re-homing to direct node { @relaycast/engine:test: workspaceId: '212540473176928256', @relaycast/engine:test: agentId: '212540475064365056', @relaycast/engine:test: fromNodeId: 'node_disconnect_alpha', @relaycast/engine:test: directNodeId: 'node_direct_212540475064365056' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed agent update request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'fbfc065e-e57f-47ce-abbe-968bde7d1a84', @relaycast/engine:test: route: '/v1/agents/updatable-agent', @relaycast/engine:test: method: 'PATCH', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'de2cb08aabf3dc03', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > drains an offline-queued invoke into dispatched state so the timeout sweep reschedules it @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540476515594240', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > drains an offline-queued invoke into dispatched state so the timeout sweep reschedules it @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540476515594240', @relaycast/engine:test: nodeId: 'node_beta', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed workspace update request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '87854cbe-1388-4b2a-a6ee-fa01dcc85ce6', @relaycast/engine:test: route: '/v1/workspace', @relaycast/engine:test: method: 'PATCH', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '895ac5852dae9edc', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > returns the authoritative cursor before resumed delivery only to negotiated brokers @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540478106566656', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540478219812864', @relaycast/engine:test: delivery_id: 'del_212540478299504640_212540478219812864' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/httpResponse.test.ts > route response helpers > returns invalid_json for malformed A2A registration request bodies @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '01993bc4-7990-4f01-b2b1-93c0b05a565f', @relaycast/engine:test: route: '/v1/a2a/register', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 21, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '925dfec30d95d0e1', @relaycast/engine:test: error_code: 'invalid_json', @relaycast/engine:test: error_reason: 'Malformed JSON in request body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/httpResponse.test.ts (27 tests) 10530ms @relaycast/engine:test: ✓ keeps custom validation messages when routes use the shared parser  332ms @relaycast/engine:test: ✓ returns invalid_json for malformed directory request bodies  334ms @relaycast/engine:test: ✓ keeps success envelopes consistent for command-style routes  328ms @relaycast/engine:test: ✓ uses a generic validation message for invalid thread reply bodies  1417ms @relaycast/engine:test: ✓ caps activity limits  512ms @relaycast/engine:test: ✓ supports optional delivery fail bodies through the shared parser  387ms @relaycast/engine:test: ✓ returns invalid_json for malformed routing request bodies  788ms @relaycast/engine:test: ✓ returns invalid_json for malformed reaction request bodies  525ms @relaycast/engine:test: ✓ returns invalid_json for malformed inbound webhook request bodies  1034ms @relaycast/engine:test: ✓ returns invalid_json for malformed certification request bodies  1108ms @relaycast/engine:test: ✓ returns invalid_json for malformed agent update request bodies  741ms @relaycast/engine:test: ✓ returns invalid_json for malformed A2A registration request bodies  857ms @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > exported drain helper dispatches pending handler-agent invocations with v5 agent fields @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540480865087488', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/nodeDeliveryContracts.test.ts (20 tests) 10485ms @relaycast/engine:test: ✓ keeps response-mode http_push deliveries queued when 2xx omits an ack signal  435ms @relaycast/engine:test: ✓ treats a 3xx redirect response as a failed http_push dispatch  322ms @relaycast/engine:test: ✓ fails a use_proxy delivery when the proxy has no secret configured  437ms @relaycast/engine:test: ✓ defaults http_push nodes to one active agent binding  407ms @relaycast/engine:test: ✓ does not clobber an explicit http_push binding when the agent opens /ws  1683ms @relaycast/engine:test: ✓ records retry diagnostics when an http_push config is invalid at dispatch time  491ms @relaycast/engine:test: ✓ rejects an unsafe http_push url if the stored config changes before dispatch  1235ms @relaycast/engine:test: ✓ redrives failed http_push deliveries when their retry time is due  1574ms @relaycast/engine:test: ✓ claims a due http_push delivery only once across overlapping redrive sweeps  1207ms @relaycast/engine:test: ✓ claims a never-attempted http_push delivery only once across overlapping sweeps  561ms @relaycast/engine:test: ✓ does not let a slow http_push receiver block self-connected recipients  742ms @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not replay another negotiated agent before that agent receives its cursor @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540481495564288', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540481671725056', @relaycast/engine:test: delivery_id: 'del_212540482531557376_212540481671725056' @relaycast/engine:test: } @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540481495564288', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540481688502272', @relaycast/engine:test: delivery_id: 'del_212540482531557376_212540481688502272' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > exported drain helper preserves spawn-prefixed actions and skips retry-delayed invocations @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540482874159104', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > exported drain helper releases spawn capacity when redispatch is rejected @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540484971311104', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > requires `from` on a node-token message @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '0852fb31-dd3b-4d3c-8e4f-0ba0f5cfd1d6', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'da8114c9f9b57c72', @relaycast/engine:test: error_code: 'from_required', @relaycast/engine:test: error_reason: 'A node token must set "from" (an agent name in the node workspace)' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > gates live durable and seq-zero delivery until the agent cursor reply is sent @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540483198451712', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540484804870144', @relaycast/engine:test: delivery_id: 'del_212540485538873344_212540484804870144' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > rejects a node-token message whose `from` agent does not exist @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '1464a533-95c3-4196-b7e1-5e99d56c3f7d', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '936d90a95dcad97c', @relaycast/engine:test: error_code: 'agent_not_found', @relaycast/engine:test: error_reason: 'Agent "ghost" not found in this workspace' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > drains a queued spawn once the node registers without delaying the register-time drain @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540487009742848', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects a mismatched inventory identity without making its agent delivery-ready @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'inventory.sync', @relaycast/engine:test: code: 'agent_identity_mismatch', @relaycast/engine:test: workspaceId: '212540487078182912', @relaycast/engine:test: nodeId: 'node_mailbox', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Inventory identity for agent "bob" does not match its registered agent_id' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects a mismatched inventory identity without making its agent delivery-ready @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540487078182912', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540487145291776', @relaycast/engine:test: delivery_id: 'del_212540487187234816_212540487145291776' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > scopes node-token `from` to the node workspace, rejecting a cross-workspace agent @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '4b21d34a-66a4-4db0-8706-6e90d23f3b81', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'ece5549527bef43a', @relaycast/engine:test: error_code: 'agent_not_found', @relaycast/engine:test: error_reason: 'Agent "outsider" not found in this workspace' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > mints, lists, rotates, and revokes observer tokens without exposing token material after create/rotate @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '665e57d9-716b-474f-9de3-f8d15890f470', @relaycast/engine:test: route: '/v1/observer-tokens/ot_212540487816560640', @relaycast/engine:test: method: 'DELETE', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '222261280a7effa1', @relaycast/engine:test: error_code: 'observer_token_not_found', @relaycast/engine:test: error_reason: 'Observer token not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/nodeProviders.test.ts > node providers > rejects `from` on an agent-token message @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '07870906-4d0c-49c2-8d01-f8b4aa7a9332', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'eb79cff886a6a8eb', @relaycast/engine:test: error_code: 'from_not_allowed', @relaycast/engine:test: error_reason: '"from" is only valid with a node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > reserves spawn capacity atomically across concurrent invocations @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540487492087808', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > mints, lists, rotates, and revokes observer tokens without exposing token material after create/rotate @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '436ff419-b607-4e5e-8a65-d29baabb6df6', @relaycast/engine:test: route: '/v1/observer-tokens/ot_212540487816560640/rotate', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 131, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '222261280a7effa1', @relaycast/engine:test: error_code: 'observer_token_not_found', @relaycast/engine:test: error_reason: 'Observer token not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > reserves spawn capacity atomically across concurrent invocations @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540487492087808', @relaycast/engine:test: nodeId: 'node_beta', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > mints, lists, rotates, and revokes observer tokens without exposing token material after create/rotate @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '9138bd90-3a2b-4b77-a73a-e44b98dc4ada', @relaycast/engine:test: route: '/v1/observer-tokens/ot_212540487816560640', @relaycast/engine:test: method: 'PATCH', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 17, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '222261280a7effa1', @relaycast/engine:test: error_code: 'observer_token_not_found', @relaycast/engine:test: error_reason: 'Observer token not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/nodeProviders.test.ts (28 tests) 12702ms @relaycast/engine:test: ✓ supersedes a stale provider binding when a fresh instance restarts after an unclean disconnect  307ms @relaycast/engine:test: ✓ gates capability liveness per provider  424ms @relaycast/engine:test: ✓ keeps one provider inventory from offlining agents or rescheduling invocations owned by another  364ms @relaycast/engine:test: ✓ rejects cross-provider action results and delivery acknowledgements  1861ms @relaycast/engine:test: ✓ releases reserved capacity when a fail-fast node-scoped spawn hits an offline provider  406ms @relaycast/engine:test: ✓ does not release another spawn’s reservation when a shadowed spawn completes  697ms @relaycast/engine:test: ✓ rejects an explicit global alias that would shadow an agent-hosted action  714ms @relaycast/engine:test: ✓ routes context.update to the provider hosting the agent, not a phantom node default  1685ms @relaycast/engine:test: ✓ provider-scoped deregister removes its attachment, capabilities, and actions  1134ms @relaycast/engine:test: ✓ routes a node.spawn frame to the connection's own node capacity, bypassing any spawn shadow  958ms @relaycast/engine:test: ✓ posts a node-token message attributed to `from`, delivered to node-hosted recipients  605ms @relaycast/engine:test: ✓ requires `from` on a node-token message  544ms @relaycast/engine:test: ✓ rejects a node-token message whose `from` agent does not exist  305ms @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > fires a trigger only once when concurrent posts match the same rate-limited trigger @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540489413079040', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > replays only inventoried cursor agents after a transient control reconnect @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540488357445632', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540488562966528', @relaycast/engine:test: delivery_id: 'del_212540489447964672_212540488562966528' @relaycast/engine:test: } @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540488357445632', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540489120808960', @relaycast/engine:test: delivery_id: 'del_212540489447964672_212540489120808960' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > rejects non-ISO observer token timestamps @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '6ace95bc-ef38-45a6-b7f3-042c8043c4f6', @relaycast/engine:test: route: '/v1/observer-tokens', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '569d50913aa829a6', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'invalid observer token body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > rejects non-ISO observer token timestamps @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f133763c-0a43-4a71-8305-98a92593bb4f', @relaycast/engine:test: route: '/v1/observer-tokens', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '569d50913aa829a6', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'expires_at must be in the future' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > keeps a legacy provider reconnect from flushing a cursor provider mailbox @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540490207133696', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540490253271040', @relaycast/engine:test: delivery_id: 'del_212540490353934336_212540490253271040' @relaycast/engine:test: } @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540490207133696', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'legacy', @relaycast/engine:test: agent_id: '212540490286825472', @relaycast/engine:test: delivery_id: 'del_212540490353934336_212540490286825472' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > returns a conflict for duplicate observer token names in one workspace @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '523c5540-b74a-4f68-b188-796a9dc5df11', @relaycast/engine:test: route: '/v1/observer-tokens', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'b9ea15de1233faf6', @relaycast/engine:test: error_code: 'observer_token_name_conflict', @relaycast/engine:test: error_reason: 'Observer token name already exists in this workspace' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > refreshes the node roster snapshot from a roster-carrying heartbeat and stamps receipt time server-side @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540490923028480', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > refreshes the node roster snapshot from a roster-carrying heartbeat and stamps receipt time server-side @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.heartbeat', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540490923028480', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540491058757632', @relaycast/engine:test: node_id: 'node_direct_212540491083923456', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540491083923456', @relaycast/engine:test: delivery_id: 'del_212540492962971648_212540491083923456' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540491058757632', @relaycast/engine:test: node_id: 'node_direct_212540491071340544', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540491071340544', @relaycast/engine:test: delivery_id: 'del_212540493386596352_212540491071340544' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '3b9ce627-b5e8-4a32-8378-150c8eca8b0d', @relaycast/engine:test: route: '/v1/channels/team-chat/messages', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '10ffa0dfe8bbd005', @relaycast/engine:test: error_code: 'channel_not_found', @relaycast/engine:test: error_reason: 'Channel "team-chat" not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > fleet node control > publishes action.invoked to the workspace observer stream @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'node_id_mismatch', @relaycast/engine:test: workspaceId: '212540493657714688', @relaycast/engine:test: nodeId: 'node_alpha', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'node_id does not match the authenticated node token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '7f819164-4d6c-4594-8ccc-dd346144560b', @relaycast/engine:test: route: '/v1/messages/212540492962971648', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 18, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '80169e3f6846d547', @relaycast/engine:test: error_code: 'message_not_found', @relaycast/engine:test: error_reason: 'Message not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > resets readiness on a same-connection re-register with a new provider instance id @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540496473423872', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540496574087168', @relaycast/engine:test: delivery_id: 'del_212540496674750464_212540496574087168' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '53a78bcd-3926-4ca2-a775-85f4a405dcc4', @relaycast/engine:test: route: '/v1/messages/212540492962971648/reactions', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 403, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '10ffa0dfe8bbd005', @relaycast/engine:test: error_code: 'insufficient_scope', @relaycast/engine:test: error_reason: 'Observer token lacks the required scope' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > node enrollment identity > rejects enrolling a second node_id under an existing name instead of rewriting the other node @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'e77de58f-d255-4339-bc5d-057c173bc022', @relaycast/engine:test: route: '/v1/nodes', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 121, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '2207ba5bf9ec0cda', @relaycast/engine:test: error_code: 'node_name_conflict', @relaycast/engine:test: error_reason: 'Node name "host" is already enrolled by another node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b58e1a68-42c8-4ef7-ad78-d06db5a9bbce', @relaycast/engine:test: route: '/v1/messages/212540492962971648/reactions', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 7, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '80169e3f6846d547', @relaycast/engine:test: error_code: 'message_not_found', @relaycast/engine:test: error_reason: 'Message not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > gates REST reads by scope and channel filters and rejects observer writes @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'a7fd2f7c-0fdb-41f0-924b-7e9955ae4559', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '10ffa0dfe8bbd005', @relaycast/engine:test: error_code: 'observer_token_forbidden', @relaycast/engine:test: error_reason: 'Observer token cannot perform this operation' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540500307197952', @relaycast/engine:test: node_id: 'node_direct_212540500344946688', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540500344946688', @relaycast/engine:test: delivery_id: 'del_212540500370112513' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'e1ceefd1-7eac-49e9-820b-894eac20eb2e', @relaycast/engine:test: route: '/v1/channels/dm-2a4f4e894e7a800d70a8a5d1/messages', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '33c20c65f7b66975', @relaycast/engine:test: error_code: 'channel_not_found', @relaycast/engine:test: error_reason: 'Channel "dm-2a4f4e894e7a800d70a8a5d1" not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > resets readiness and drops the stale index entry on a same-connection re-register with a new provider name @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540499434602496', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540500147634176', @relaycast/engine:test: delivery_id: 'del_212540500327989248_212540500147634176' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b1a127c6-63f2-46e8-a171-558d4ce092e1', @relaycast/engine:test: route: '/v1/channels/dm-2a4f4e894e7a800d70a8a5d1', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 21, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '33c20c65f7b66975', @relaycast/engine:test: error_code: 'channel_not_found', @relaycast/engine:test: error_reason: 'Channel "dm-2a4f4e894e7a800d70a8a5d1" not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '6b59e250-620d-4fee-aa9a-41a45f37f5ba', @relaycast/engine:test: route: '/v1/channels/dm-2a4f4e894e7a800d70a8a5d1/members', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 4, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '33c20c65f7b66975', @relaycast/engine:test: error_code: 'channel_not_found', @relaycast/engine:test: error_reason: 'Channel "dm-2a4f4e894e7a800d70a8a5d1" not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f478a6f0-f9e2-4c83-a4f3-9cd280f494d9', @relaycast/engine:test: route: '/v1/messages/orphan_private_message', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 4, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '309eb13e46b710d7', @relaycast/engine:test: error_code: 'message_not_found', @relaycast/engine:test: error_reason: 'Message not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '3d9184dd-1bed-4048-adf0-71e015e9aa54', @relaycast/engine:test: route: '/v1/messages/orphan_private_message/reactions', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: 'c8c5d77be57ab8e9', @relaycast/engine:test: error_code: 'message_not_found', @relaycast/engine:test: error_reason: 'Message not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '50152fac-6bab-49f4-833d-67b6a037e154', @relaycast/engine:test: route: '/v1/messages/orphan_private_message/replies', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 523, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '6ac0cf1f4b3b7d05', @relaycast/engine:test: error_code: 'message_not_found', @relaycast/engine:test: error_reason: 'Parent message not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > requires the right read scopes and enforces DM opt-in filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '5cb72460-b94a-4828-99d8-dc01063bc8a2', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 403, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 7, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '7912e484400f5fcb', @relaycast/engine:test: error_code: 'insufficient_scope', @relaycast/engine:test: error_reason: 'Observer token lacks the required scope' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > stamps a retryable dispatch error when a reconnected provider never re-announces the agent @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540504035753984', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540505650561024', @relaycast/engine:test: delivery_id: 'del_212540506569113600_212540505650561024' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > node enrollment identity > rejects renaming a node onto a name held by a different node @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'ffed8c86-beaa-4057-b9a3-de626521006d', @relaycast/engine:test: route: '/v1/nodes', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'ebb2003ac76a0d83', @relaycast/engine:test: error_code: 'node_name_conflict', @relaycast/engine:test: error_reason: 'Node name "alpha" is already enrolled by another node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > filters file metadata by observer channel, agent, and time filters @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540508838412288', @relaycast/engine:test: node_id: 'node_direct_212540508850995200', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540508850995200', @relaycast/engine:test: delivery_id: 'del_212540508981018624_212540508850995200' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > filters file metadata by observer channel, agent, and time filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f0baac29-1ca2-4b10-bc4b-1ff3d746cabb', @relaycast/engine:test: route: '/v1/files/212540508926492672', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 7, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '96c3797b07d3f135', @relaycast/engine:test: error_code: 'file_not_found', @relaycast/engine:test: error_reason: 'File not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > filters file metadata by observer channel, agent, and time filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'a5a007eb-0bc4-4f02-8971-b28dfba4ae0e', @relaycast/engine:test: route: '/v1/files/212540508960047104', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '96c3797b07d3f135', @relaycast/engine:test: error_code: 'file_not_found', @relaycast/engine:test: error_reason: 'File not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > node enrollment identity > rejects names that normalize to empty or stay #-prefixed @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f906a830-5194-4759-956c-8b0e2d88e781', @relaycast/engine:test: route: '/v1/nodes', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'f804ba7f88dde461', @relaycast/engine:test: error_code: 'invalid_node_name', @relaycast/engine:test: error_reason: 'Node name must be non-empty and cannot begin with "#"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/node.test.ts > node adapter conformance > node enrollment identity > rejects names that normalize to empty or stay #-prefixed @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd2f66d34-7f5d-461f-85aa-7f60e73b2d44', @relaycast/engine:test: route: '/v1/nodes', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'f804ba7f88dde461', @relaycast/engine:test: error_code: 'invalid_node_name', @relaycast/engine:test: error_reason: 'Node name must be non-empty and cannot begin with "#"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > filters file metadata by observer channel, agent, and time filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b79be818-f153-45af-af50-2a2c16977221', @relaycast/engine:test: route: '/v1/files/212540508901326848', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: 'fa1861fa49c0903b', @relaycast/engine:test: error_code: 'file_not_found', @relaycast/engine:test: error_reason: 'File not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stamps a stranded ws-node row when the node is offline and respects next_attempt_at spacing @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540511359008768', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540511468060672', @relaycast/engine:test: delivery_id: 'del_212540511610667008_212540511468060672' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stamps a stranded ws-node row when the node is offline and respects next_attempt_at spacing @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540511359008768', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540511468060672', @relaycast/engine:test: delivery_id: 'del_212540511610667008_212540511468060672' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/node.test.ts (30 tests) 18130ms @relaycast/engine:test: ✓ emits agent.status.active on connect and agent.status.offline on sweep  1226ms @relaycast/engine:test: ✓ creates a mention delivery for muted members mentioned in thread replies  493ms @relaycast/engine:test: ✓ drives node control directly without the websocket route wrapper  1476ms @relaycast/engine:test: ✓ enforces node capacity for agents registered over node control  691ms @relaycast/engine:test: ✓ registers a node, dispatches spawn, completes from action.result, fires triggers, and reschedules on node death  2536ms @relaycast/engine:test: ✓ REST disconnect is presence-only for a node-hosted agent by default  796ms @relaycast/engine:test: ✓ REST disconnect with deregister:true tears down a node-hosted agent without a node socket  822ms @relaycast/engine:test: ✓ drains an offline-queued invoke into dispatched state so the timeout sweep reschedules it  822ms @relaycast/engine:test: ✓ exported drain helper dispatches pending handler-agent invocations with v5 agent fields  603ms @relaycast/engine:test: ✓ exported drain helper preserves spawn-prefixed actions and skips retry-delayed invocations  527ms @relaycast/engine:test: ✓ exported drain helper releases spawn capacity when redispatch is rejected  420ms @relaycast/engine:test: ✓ drains a queued spawn once the node registers without delaying the register-time drain  509ms @relaycast/engine:test: ✓ reserves spawn capacity atomically across concurrent invocations  479ms @relaycast/engine:test: ✓ refreshes the node roster snapshot from a roster-carrying heartbeat and stamps receipt time server-side  472ms @relaycast/engine:test: ✓ publishes action.invoked to the workspace observer stream  892ms @relaycast/engine:test: ✓ rejects enrolling a second node_id under an existing name instead of rewriting the other node  811ms @relaycast/engine:test: ✓ re-enrolling the same node_id under a new name renames the node  1046ms @relaycast/engine:test: ✓ rejects renaming a node onto a name held by a different node  1064ms @relaycast/engine:test: ✓ rejects names that normalize to empty or stay #-prefixed  508ms @relaycast/engine:test: ✓ enrolling without node_id still rotates the existing node by name  367ms @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > filters node roster and node agent bindings by observer agent filters @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f1453c53-746b-4e72-9cb7-d5f76e07b24b', @relaycast/engine:test: route: '/v1/nodes/hidden-node', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: '300e6b71fb06612a', @relaycast/engine:test: error_code: 'node_not_found', @relaycast/engine:test: error_reason: 'Node not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stamps a ws-node row (incrementing attempts) when the live send fails @relaycast/engine:test: [delivery.route] node send failed; delivery deferred { @relaycast/engine:test: workspace_id: '212540513565212672', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540513607155712', @relaycast/engine:test: delivery_id: 'del_212540513837842432_212540513607155712' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows DM stream events when channel filters are present and include_dms is enabled @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540514416836608', @relaycast/engine:test: node_id: 'node_direct_212540514442002432', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540514442002432', @relaycast/engine:test: delivery_id: 'del_212540514504916993' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows DM stream events when channel filters are present and include_dms is enabled @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540514416836608', @relaycast/engine:test: node_id: 'node_direct_212540514433613824', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540514433613824', @relaycast/engine:test: delivery_id: 'del_212540514538471424_212540514433613824' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/actionHandlerLifecycle.test.ts > agent-published action lifecycle > invoking an action whose handler points at a dead connection fails fast with handler_unavailable @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b977834d-12f5-4270-9a91-3411e387d001', @relaycast/engine:test: route: '/v1/actions/crm.get_person_batch/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '3685ef57022d62b1', @relaycast/engine:test: error_code: 'handler_unavailable', @relaycast/engine:test: error_reason: 'Action "crm.get_person_batch" handler "orchestrator" has no live connection' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/agentLifecycle.test.ts > agent presence and release lifecycle > atomically registers human rows with an implicit direct binding @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '146a7e17-239d-4c31-946b-de79291c0f1e', @relaycast/engine:test: route: '/v1/agents', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9f527d145ac9744e', @relaycast/engine:test: error_code: 'agent_already_exists', @relaycast/engine:test: error_reason: 'Agent "direct-human" already exists in this workspace' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows DM stream events when channel filters are present and include_dms is enabled @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540514416836608', @relaycast/engine:test: node_id: 'node_direct_212540514442002432', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540514442002432', @relaycast/engine:test: delivery_id: 'del_212540514949513217' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows DM stream events when channel filters are present and include_dms is enabled @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540514416836608', @relaycast/engine:test: node_id: 'node_direct_212540514433613824', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540514433613824', @relaycast/engine:test: delivery_id: 'del_212540514999844864_212540514433613824' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/agentLifecycle.test.ts > agent presence and release lifecycle > fails release explicitly when the agent has no live host @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'a75fd2e0-d4e1-4b10-a48d-fd0f106f858c', @relaycast/engine:test: route: '/v1/agents/release', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '7c211cf11b02607c', @relaycast/engine:test: error_code: 'agent_host_unavailable', @relaycast/engine:test: error_reason: 'Agent "hostless-agent" has no live host node; cannot dispatch release' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows GET /workspace with any observer token, still allows a workspace key, and still blocks PATCH @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'a7895cf8-70ac-4d83-870c-c20b1f56b754', @relaycast/engine:test: route: '/v1/workspace', @relaycast/engine:test: method: 'PATCH', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '1e38788b0a35e2c3', @relaycast/engine:test: error_code: 'observer_token_forbidden', @relaycast/engine:test: error_reason: 'Observer token cannot perform this operation' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/observerToken.test.ts > observer tokens > allows GET /workspace with any observer token, still allows a workspace key, and still blocks PATCH @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b84d2d31-244b-400d-adee-2c49ac342b39', @relaycast/engine:test: route: '/v1/workspace', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: actor_fingerprint: '835adb48dd541c56', @relaycast/engine:test: error_code: 'unauthorized', @relaycast/engine:test: error_reason: 'Workspace key required (rk_live_...)' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/observerToken.test.ts (10 tests) 7051ms @relaycast/engine:test: ✓ mints, lists, rotates, and revokes observer tokens without exposing token material after create/rotate  736ms @relaycast/engine:test: ✓ gates REST reads by scope and channel filters and rejects observer writes  2063ms @relaycast/engine:test: ✓ requires the right read scopes and enforces DM opt-in filters  1600ms @relaycast/engine:test: ✓ filters file metadata by observer channel, agent, and time filters  1209ms @relaycast/engine:test: ✓ filters node roster and node agent bindings by observer agent filters  483ms @relaycast/engine:test: stderr | src/__tests__/conformance/actionHandlerLifecycle.test.ts > agent-published action lifecycle > a handler takeover fails invocations in flight toward the previous handler @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '2356c381-56e6-4607-bb54-0a4dc8e7b10a', @relaycast/engine:test: route: '/v1/actions/crm.get_person_batch/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'e8ae1c0c251dc1ab', @relaycast/engine:test: error_code: 'handler_unavailable', @relaycast/engine:test: error_reason: 'Action "crm.get_person_batch" handler "orchestrator-run2" has no live connection' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stops a ws agent backlog at the first undeliverable seq (node connected, agent not ready) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540516178264064', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540516224401408', @relaycast/engine:test: delivery_id: 'del_212540516362813440_212540516224401408' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stops a ws agent backlog at the first undeliverable seq (node connected, agent not ready) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540516178264064', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540516224401408', @relaycast/engine:test: delivery_id: 'del_212540516425728000_212540516224401408' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > sweep stops a ws agent backlog at the first undeliverable seq (node connected, agent not ready) @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540516178264064', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540516224401408', @relaycast/engine:test: delivery_id: 'del_212540516362813440_212540516224401408' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/agentLifecycle.test.ts > agent presence and release lifecycle > refuses to register into the reserved released-agent namespace @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd9d7cc90-c576-46de-8298-b91cfe68f933', @relaycast/engine:test: route: '/v1/agents', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '89952f41687825ce', @relaycast/engine:test: error_code: 'invalid_agent_name', @relaycast/engine:test: error_reason: 'Agent name "victim#released-12345" is reserved: "#released-" marks a released agent' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/engine/__tests__/a2a.test.ts > workspace agent-card discovery > does not replace an invalid path workspace with a valid host workspace @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '0b56b5b2-8eab-4c83-832f-a459256fcdb3', @relaycast/engine:test: route: '/misspelled/.well-known/agent-card.json', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'other', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: error_code: 'workspace_not_found', @relaycast/engine:test: error_reason: 'Workspace could not be inferred from request. Provide an Authorization header or ?workspace= query param.' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/engine/__tests__/a2a.test.ts > workspace agent-card discovery > fails closed on a bare multi-tenant deployment instead of selecting a workspace @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'ad46ca75-fb39-4e8e-8a68-ad24ce8ead15', @relaycast/engine:test: route: '/.well-known/agent-card.json', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'well_known', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: error_code: 'workspace_not_found', @relaycast/engine:test: error_reason: 'Workspace could not be inferred from request. Provide an Authorization header or ?workspace= query param.' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > replays and acknowledges the next sequence after settled history is pruned offline @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540519210745856', @relaycast/engine:test: node_id: 'node_mailbox', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540519303020544', @relaycast/engine:test: delivery_id: 'del_212540519412072448_212540519303020544' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/engine/__tests__/a2a.test.ts > workspace agent-card discovery > does not hide an invalid explicit workspace selector behind the sole-workspace fallback @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'eb4c6d0b-9a92-4e6d-9385-5e2cda27d255', @relaycast/engine:test: route: '/.well-known/agent-card.json', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'well_known', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: error_code: 'workspace_not_found', @relaycast/engine:test: error_reason: 'Workspace could not be inferred from request. Provide an Authorization header or ?workspace= query param.' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/a2a.test.ts (34 tests) 1330ms @relaycast/engine:test: ✓ src/__tests__/conformance/actionHandlerLifecycle.test.ts (10 tests) 4571ms @relaycast/engine:test: ✓ re-registering the same (workspace, name) refreshes the row instead of failing  2391ms @relaycast/engine:test: ✓ re-registering under a fresh handler identity heals the handler pointer  571ms @relaycast/engine:test: ✓ deleting an action fails its open invocations and notifies the caller  316ms @relaycast/engine:test: stderr | src/__tests__/conformance/agentLifecycle.test.ts > agent presence and release lifecycle > rolls back every local reap mutation when invocation completion fails @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f537b3fb-6469-4b8a-b92e-e4a8fdf32307', @relaycast/engine:test: route: '/v1/agents/release', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 500, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 8, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '887a1f40145a1f89', @relaycast/engine:test: error_code: 'SQLITE_CONSTRAINT_TRIGGER', @relaycast/engine:test: error_reason: 'forced invocation completion failure' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/agentLifecycle.test.ts (13 tests) 2708ms @relaycast/engine:test: ✓ derives presence from last_seen and persists stale active agents offline  811ms @relaycast/engine:test: ✓ persists stale presence before returning agent detail  309ms @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > resolves the authenticated agent token and rejects duplicate agent names @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'd31c300b-bdef-46cc-ad37-f65730939e76', @relaycast/engine:test: route: '/v1/agents', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 409, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '05a0db26873e4404', @relaycast/engine:test: error_code: 'agent_already_exists', @relaycast/engine:test: error_reason: 'Agent "alice" already exists in this workspace' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/atomicity.test.ts (16 tests) 5225ms @relaycast/engine:test: ✓ rolls back the message when the deliveries insert fails mid channel send  1643ms @relaycast/engine:test: ✓ rolls back the message when the deliveries insert fails mid DM send  1229ms @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > filters actions by available_to, enforces invoke access, and emits action events @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'c58cc940-ab09-4682-9b00-e33eb23ed935', @relaycast/engine:test: route: '/v1/actions/summarize', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: actor_fingerprint: '6644b54b48f28997', @relaycast/engine:test: error_code: 'action_not_found', @relaycast/engine:test: error_reason: 'Action not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > filters actions by available_to, enforces invoke access, and emits action events @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '5c02b51d-a3be-4d48-852c-f219a3b9e0be', @relaycast/engine:test: route: '/v1/actions/summarize', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 404, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '43a69362dd80deb2', @relaycast/engine:test: error_code: 'action_not_found', @relaycast/engine:test: error_reason: 'Action not found' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > filters actions by available_to, enforces invoke access, and emits action events @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '9606936a-1ecf-4f8c-bae7-41a0366deb6c', @relaycast/engine:test: route: '/v1/actions/summarize/invoke', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 403, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '6644b54b48f28997', @relaycast/engine:test: error_code: 'action_denied', @relaycast/engine:test: error_reason: 'Agent "denied" is not authorized to invoke action "summarize"' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > requires inbound webhook tokens and accepts SDK message/author payloads @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'b900b18e-4132-43d4-9ddb-2b3e6aeb635e', @relaycast/engine:test: route: '/v1/hooks/wh_212540522717523968', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'webhook_token_required', @relaycast/engine:test: error_reason: 'Webhook bearer token required' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > requires inbound webhook tokens and accepts SDK message/author payloads @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'e029e25a-f19c-4d3f-b472-f6efe3ec4bf9', @relaycast/engine:test: route: '/v1/hooks/wh_212540522717523968', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'afcd815079a0d561', @relaycast/engine:test: error_code: 'webhook_token_invalid', @relaycast/engine:test: error_reason: 'Invalid webhook bearer token' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/sdk-contract.test.ts > SDK v8 service contract > passes subscription headers and signs delivery payloads with HMAC-SHA256 @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '3d39de34-b710-4c63-b756-6ef5db86a981', @relaycast/engine:test: route: '/v1/subscriptions', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: 'c32dcc894d20abe1', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'invalid subscription body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/sdk-contract.test.ts (8 tests) 1365ms @relaycast/engine:test: ✓ filters actions by available_to, enforces invoke access, and emits action events  355ms @relaycast/engine:test: stderr | src/__tests__/conformance/agentNodeExitEvents.test.ts > agent.exited + node.status durable events > (e) re-heartbeat after offline emits node.status.online exactly once @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'node.register', @relaycast/engine:test: code: 'provider_instance_conflict', @relaycast/engine:test: workspaceId: '212540526007779328', @relaycast/engine:test: nodeId: 'node_e', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Provider "default" is already connected on this node' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/agentNodeExitEvents.test.ts (7 tests) 943ms @relaycast/engine:test: ✓ (a) agent.deregister control frame emits a durable agent.exited  357ms @relaycast/engine:test: stderr | src/__tests__/conformance/workspaceEvents.test.ts > workspace event log > serves cursor-based reads to workspace keys with ascending seq and latest_seq @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'a0f87911-1e5c-49e2-93ee-a79625af0df0', @relaycast/engine:test: route: '/v1/workspace/events', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '2e2f0ed3560ca738', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid workspace events query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/workspaceEvents.test.ts > workspace event log > serves cursor-based reads to workspace keys with ascending seq and latest_seq @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '1cba2531-aa99-433b-9584-093eb6eb3dfe', @relaycast/engine:test: route: '/v1/workspace/events', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '2e2f0ed3560ca738', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid workspace events query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/workspaceEvents.test.ts > workspace event log > serves cursor-based reads to workspace keys with ascending seq and latest_seq @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '2519abdc-285b-4528-9d3a-099eba4b0e97', @relaycast/engine:test: route: '/v1/workspace/events', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 6, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: '2e2f0ed3560ca738', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'Invalid workspace events query' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > excludes expired (unswept) rows from the mailbox depth cap @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540527049900032', @relaycast/engine:test: node_id: 'node_direct_212540527137980416', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540527137980416', @relaycast/engine:test: delivery_id: 'del_212540527276392448_212540527137980416' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/workspaceEvents.test.ts > workspace event log > enforces the auth matrix: workspace key ok, stream:read observer ok, others rejected @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'cbcb6873-423a-4d9c-9634-d3d7d34b4588', @relaycast/engine:test: route: '/v1/workspace/events', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 403, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_unknown', @relaycast/engine:test: actor_fingerprint: 'dd79f7a71495f7e1', @relaycast/engine:test: error_code: 'insufficient_scope', @relaycast/engine:test: error_reason: 'Observer token lacks the required scope' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/workspaceEvents.test.ts > workspace event log > enforces the auth matrix: workspace key ok, stream:read observer ok, others rejected @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '13991f20-efd7-4594-bc30-677feef16a2d', @relaycast/engine:test: route: '/v1/workspace/events', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: actor_fingerprint: '90e06faa7f153035', @relaycast/engine:test: error_code: 'unauthorized', @relaycast/engine:test: error_reason: 'Workspace key required (rk_live_...)' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > excludes expired (unswept) rows from the mailbox depth cap @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540527049900032', @relaycast/engine:test: node_id: 'node_direct_212540527137980416', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540527137980416', @relaycast/engine:test: delivery_id: 'del_212540527536439296_212540527137980416' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/retention.test.ts (13 tests) 771ms @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > does not dead-letter an acked delivery after TTL expiry @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540528056532992', @relaycast/engine:test: node_id: 'node_direct_212540528119447552', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540528119447552', @relaycast/engine:test: delivery_id: 'del_212540528245276672_212540528119447552' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > expires TTL deliveries to dead-letter and notifies the sender @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540528626958336', @relaycast/engine:test: node_id: 'node_direct_212540528643735552', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540528643735552', @relaycast/engine:test: delivery_id: 'del_212540528677289984_212540528643735552' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/twoNodeWriteContention.test.ts (1 test) 834ms @relaycast/engine:test: ✓ keeps both nodes' broker providers when they register while the event-queue poll writes  832ms @relaycast/engine:test: ✓ src/__tests__/conformance/workspaceEvents.test.ts (5 tests) 993ms @relaycast/engine:test: ✓ src/__tests__/conformance/rescheduleNodeProvider.test.ts (7 tests) 1222ms @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects whitespace-only relayfile target path globs @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'bd9cf6e1-f4a4-42ec-848e-2a56524f6f2b', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound-target', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '93cb41ad13ee07c3', @relaycast/engine:test: error_code: 'invalid_request', @relaycast/engine:test: error_reason: 'invalid relayfile inbound target body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/eventQueue.test.ts (7 tests) 980ms @relaycast/engine:test: ✓ claims each due row exactly once across concurrent sweepers  369ms @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects inbound delivery URLs without an explicit path glob @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '2cc0eed3-9964-48ea-8c33-7895c831f37f', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540532980281344/212540532984475648', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'bad_request', @relaycast/engine:test: error_reason: 'missing relayfile inbound route parameters' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects inbound delivery URLs with blank path globs @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'caae11e7-2792-4d2a-bb55-90ce0b64e6e2', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540533252911104/212540533257105408', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'bad_request', @relaycast/engine:test: error_reason: 'missing relayfile inbound route parameters' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > scheduled expiry drains a large backlog in D1-safe batches without affecting reads @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540533878226944', @relaycast/engine:test: node_id: 'node_direct_212540533995667456', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540533995667456', @relaycast/engine:test: delivery_id: 'del_212540534113107968_212540533995667456' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > creates channel deliveries so node/broker agents receive the message @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540534129520640', @relaycast/engine:test: node_id: 'node_direct_212540534205018112', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540534205018112', @relaycast/engine:test: delivery_id: 'del_212540534381178880_212540534205018112' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects bad signatures @relaycast/engine:test: [relayfile.inbound] relayfile inbound signature rejected { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'relayfile.inbound', @relaycast/engine:test: request_id: 'e5a5ddf2-854a-4ba2-b68c-2187578f22da', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540534767054848/212540534767054849', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: workspace_id: '212540534767054848', @relaycast/engine:test: channel_id: '212540534767054849', @relaycast/engine:test: reason: 'signature_mismatch' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects bad signatures @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'e5a5ddf2-854a-4ba2-b68c-2187578f22da', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540534767054848/212540534767054849', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 401, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'unauthorized', @relaycast/engine:test: error_reason: 'invalid relayfile signature' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > keeps inbox and delivery reads available when scheduled expiry fails @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540534712893440', @relaycast/engine:test: node_id: 'node_direct_212540534721282048', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540534721282048', @relaycast/engine:test: delivery_id: 'del_212540534771613696_212540534721282048' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects oversized relayfile event bodies before signature verification @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '2edd3580-0e6a-4550-a0b7-ec926dda08fa', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540535320702976/212540535324897280', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 413, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 0, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'payload_too_large', @relaycast/engine:test: error_reason: 'relayfile event body exceeds maximum size' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/delivery.test.ts > durable delivery api > rejects new deliveries over the depth cap and sends feedback to the sender @relaycast/engine:test: [delivery.route] provider not delivery-ready; delivery deferred { @relaycast/engine:test: workspace_id: '212540535325261824', @relaycast/engine:test: node_id: 'node_direct_212540535375593472', @relaycast/engine:test: provider_name: 'default', @relaycast/engine:test: agent_id: '212540535375593472', @relaycast/engine:test: delivery_id: 'del_212540535434313728_212540535375593472' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/workspaceEvents.test.ts (7 tests) 583ms @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > rejects malformed signed event fields as bad requests @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '18d25107-fad6-46e4-b200-a53d417bf443', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540535584944128/212540535593332736', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 8, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'bad_request', @relaycast/engine:test: error_reason: 'invalid relayfile event body' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/delivery.test.ts (52 tests) 23701ms @relaycast/engine:test: ✓ does not resurrect an acked (terminal) delivery via defer or fail  332ms @relaycast/engine:test: ✓ rejects a malformed JSON fail body with 400 (no state change)  401ms @relaycast/engine:test: ✓ returns 404 for an unknown or unowned delivery  1387ms @relaycast/engine:test: ✓ emits delivery.delivered once on ack, not on idempotent retries  643ms @relaycast/engine:test: ✓ does not re-emit delivery.deferred when re-deferred to the same time  852ms @relaycast/engine:test: ✓ preserves failure metadata across repeated fail calls (idempotent)  1476ms @relaycast/engine:test: ✓ clears a queued delivery from the replay queue when the message is read  1772ms @relaycast/engine:test: ✓ routes via-node deliveries over the node control connection and cumulative ack marks them read  633ms @relaycast/engine:test: ✓ returns the authoritative cursor before resumed delivery only to negotiated brokers  432ms @relaycast/engine:test: ✓ does not replay another negotiated agent before that agent receives its cursor  973ms @relaycast/engine:test: ✓ gates live durable and seq-zero delivery until the agent cursor reply is sent  773ms @relaycast/engine:test: ✓ rejects a mismatched inventory identity without making its agent delivery-ready  314ms @relaycast/engine:test: ✓ replays only inventoried cursor agents after a transient control reconnect  565ms @relaycast/engine:test: ✓ keeps delivering after a same-connection node.register re-register without re-announcing agents  504ms @relaycast/engine:test: ✓ resets readiness on a same-connection re-register with a new provider instance id  992ms @relaycast/engine:test: ✓ resets readiness and drops the stale index entry on a same-connection re-register with a new provider name  901ms @relaycast/engine:test: ✓ stamps a retryable dispatch error when a reconnected provider never re-announces the agent  1466ms @relaycast/engine:test: ✓ sweep delivers a never-inline-dispatched ws-node row to a connected, ready node  810ms @relaycast/engine:test: ✓ sweep stamps a stranded ws-node row when the node is offline and respects next_attempt_at spacing  601ms @relaycast/engine:test: ✓ redelivers a channel message with the same deliver payload after broker death/reconnect  346ms @relaycast/engine:test: ✓ redelivers a DM with the same deliver payload after broker death/reconnect  344ms @relaycast/engine:test: ✓ expires TTL deliveries to dead-letter and notifies the sender  1242ms @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > fails closed when idempotency storage is unavailable @relaycast/engine:test: [relayfile.inbound] relayfile inbound idempotency storage unavailable { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'relayfile.inbound', @relaycast/engine:test: request_id: '81ad7c56-8330-4f07-902f-78deeb1ea4bd', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540535979208704/212540535983403008', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: workspace_id: '212540535979208704', @relaycast/engine:test: event_id: 'evt_1' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/relayfileInbound.test.ts > relayfile inbound bridge > fails closed when idempotency storage is unavailable @relaycast/engine:test: [request] Request failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '81ad7c56-8330-4f07-902f-78deeb1ea4bd', @relaycast/engine:test: route: '/v1/integrations/relayfile/inbound/212540535979208704/212540535983403008', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 503, @relaycast/engine:test: status_class: '5xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'none', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: error_code: 'idempotency_unavailable', @relaycast/engine:test: error_reason: 'idempotency storage unavailable' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/routes/__tests__/relayfileInbound.test.ts (13 tests) 1136ms @relaycast/engine:test: ✓ src/__tests__/conformance/triggerDispatchLog.test.ts (1 test) 130ms @relaycast/engine:test: ✓ src/__tests__/conformance/nodeControlExports.test.ts (5 tests) 635ms @relaycast/engine:test: stderr | src/__tests__/conformance/messageAttachments.test.ts > channel message attachments > rejects missing, incomplete, foreign-workspace, and duplicate file ids @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '31e821f5-3b61-44d8-a675-001069616582', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 3, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9a75ef8bdeb9039f', @relaycast/engine:test: error_code: 'invalid_attachments', @relaycast/engine:test: error_reason: 'Invalid attachments: file ids must exist in workspace and be complete' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/messageAttachments.test.ts > channel message attachments > rejects missing, incomplete, foreign-workspace, and duplicate file ids @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '4c88db44-67aa-4e84-8e92-b797a774c36a', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 2, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9a75ef8bdeb9039f', @relaycast/engine:test: error_code: 'invalid_attachments', @relaycast/engine:test: error_reason: 'Invalid attachments: file ids must exist in workspace and be complete' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/messageAttachments.test.ts > channel message attachments > rejects missing, incomplete, foreign-workspace, and duplicate file ids @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'f614e5d1-af3d-42b1-a472-9a3ee0ed6a0b', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9a75ef8bdeb9039f', @relaycast/engine:test: error_code: 'invalid_attachments', @relaycast/engine:test: error_reason: 'Invalid attachments: file ids must exist in workspace and be complete' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/__tests__/conformance/messageAttachments.test.ts > channel message attachments > rejects missing, incomplete, foreign-workspace, and duplicate file ids @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: 'bc65a9b3-8ac1-455a-b328-5ebdc6760e38', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 400, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 1, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_agent_token', @relaycast/engine:test: content_type: 'application/json', @relaycast/engine:test: actor_fingerprint: '9a75ef8bdeb9039f', @relaycast/engine:test: error_code: 'invalid_attachments', @relaycast/engine:test: error_reason: 'Invalid attachments: duplicate file ids are not allowed' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/messageAttachments.test.ts (2 tests) 448ms @relaycast/engine:test: ✓ src/lib/__tests__/serverTelemetryCatalog.test.ts (2 tests) 604ms @relaycast/engine:test: ✓ declares every event name the engine emits  528ms @relaycast/engine:test: ✓ src/engine/__tests__/dm.test.ts (12 tests) 1376ms @relaycast/engine:test: ✓ src/adapters/node/__tests__/writeGate.test.ts (6 tests) 832ms @relaycast/engine:test: stderr | src/__tests__/conformance/agentNameReclaim.test.ts > agent name reclaim across nodes > a roster read does not make a recently-active agent reclaimable by another node @relaycast/engine:test: [node.control] rejected message { @relaycast/engine:test: type: 'agent.register', @relaycast/engine:test: code: 'agent_location_conflict', @relaycast/engine:test: workspaceId: '212540543195971584', @relaycast/engine:test: nodeId: 'node_beta', @relaycast/engine:test: provider: 'default', @relaycast/engine:test: message: 'Agent "contested" already has an active location' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/routes/__tests__/webhookOutbox.test.ts > engine send path (persist-first outbox) > keeps the row sweepable when the queue send throws synchronously @relaycast/engine:test: [background.task] queue message.created failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'background.task', @relaycast/engine:test: request_id: 'b72bcf74-c847-4315-bcc8-51889df6724a', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: error_name: 'Error', @relaycast/engine:test: error_message: 'queue exploded', @relaycast/engine:test: error_stack: 'Error: queue exploded\n' + @relaycast/engine:test: ' at /private/tmp/disc-split/packages/engine/src/routes/__tests__/webhookOutbox.test.ts:163:27\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20\n' + @relaycast/engine:test: ' at new Promise ()\n' + @relaycast/engine:test: ' at runWithCancel (file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10)\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20\n' + @relaycast/engine:test: ' at new Promise ()\n' + @relaycast/engine:test: ' at runWithTimeout (file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10)\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/inboundWebhookTriggers.test.ts (2 tests) 461ms @relaycast/engine:test: ✓ fires a fleet trigger with the message created by the webhook route  340ms @relaycast/engine:test: ✓ src/__tests__/conformance/httpPushEphemeralEvents.test.ts (3 tests) 526ms @relaycast/engine:test: stderr | src/routes/__tests__/webhookOutbox.test.ts > engine send path (persist-first outbox) > keeps the row sweepable when the queue send rejects asynchronously @relaycast/engine:test: [background.task] queue message.created failed { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'background.task', @relaycast/engine:test: request_id: '23635d19-28de-4cb0-a6a4-b769d132c8c4', @relaycast/engine:test: route: '/v1/channels/general/messages', @relaycast/engine:test: method: 'POST', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: error_name: 'Error', @relaycast/engine:test: error_message: 'queue outage', @relaycast/engine:test: error_stack: 'Error: queue outage\n' + @relaycast/engine:test: ' at /private/tmp/disc-split/packages/engine/src/routes/__tests__/webhookOutbox.test.ts:180:27\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20\n' + @relaycast/engine:test: ' at new Promise ()\n' + @relaycast/engine:test: ' at runWithCancel (file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10)\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20\n' + @relaycast/engine:test: ' at new Promise ()\n' + @relaycast/engine:test: ' at runWithTimeout (file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10)\n' + @relaycast/engine:test: ' at file:///private/tmp/disc-split/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/routes/__tests__/webhookOutbox.test.ts (4 tests) 1258ms @relaycast/engine:test: ✓ inserts the outbox row before invoking eventQueue.send and passes its id  450ms @relaycast/engine:test: ✓ keeps the row sweepable when the queue send rejects asynchronously  367ms @relaycast/engine:test: ✓ src/__tests__/conformance/agentNameReclaim.test.ts (3 tests) 1150ms @relaycast/engine:test: ✓ a roster read does not make a recently-active agent reclaimable by another node  412ms @relaycast/engine:test: ✓ an agent silent beyond the reclaim grace can be reclaimed by another node  321ms @relaycast/engine:test: ✓ the owning node can re-register its own agent inside the grace window  410ms @relaycast/engine:test: ✓ src/__tests__/nodeUpgradeAuth.test.ts (4 tests) 335ms @relaycast/engine:test: ✓ src/__tests__/conformance/webhookOutbox.test.ts (2 tests) 632ms @relaycast/engine:test: ✓ skips the outbox insert when the workspace has no subscriptions  351ms @relaycast/engine:test: ✓ src/engine/__tests__/inboundWebhook.test.ts (2 tests) 356ms @relaycast/engine:test: stderr | src/__tests__/conformance/smoke.test.ts > node adapter smoke > boots, migrates, and serves health @relaycast/engine:test: [telemetry] captureException TypeError: The database connection is not open @relaycast/engine:test: at Database.prepare (/private/tmp/disc-split/node_modules/better-sqlite3/lib/methods/wrappers.js:5:21) @relaycast/engine:test: at BetterSQLiteSession.prepareQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/better-sqlite3/session.js:23:30) @relaycast/engine:test: at BetterSQLiteSession.prepareOneTimeQuery (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/session.js:141:17) @relaycast/engine:test: at QueryPromise._prepare (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:86:81) @relaycast/engine:test: at QueryPromise.execute (file:///private/tmp/disc-split/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js:114:17) @relaycast/engine:test: at QueryPromise.then (file:///private/tmp/disc-split/node_modules/drizzle-orm/query-promise.js:21:17) @relaycast/engine:test:  at processTicksAndRejections (node:internal/process/task_queues:103:5) { source: 'node.event_queue', op: 'retention_prune' } @relaycast/engine:test: @relaycast/engine:test: ✓ src/lib/__tests__/origin.test.ts (24 tests) 261ms @relaycast/engine:test: ✓ src/lib/__tests__/httpError.test.ts (3 tests) 170ms @relaycast/engine:test: ✓ src/__tests__/conformance/smoke.test.ts (2 tests) 704ms @relaycast/engine:test: ✓ boots, migrates, and serves health  377ms @relaycast/engine:test: ✓ creates a workspace and registers an agent (await works on better-sqlite3)  319ms @relaycast/engine:test: ✓ src/adapters/node/__tests__/database.test.ts (2 tests) 25ms @relaycast/engine:test: ✓ src/engine/__tests__/wsTransform.test.ts (34 tests) 36ms @relaycast/engine:test: stderr | src/__tests__/conformance/usageQuota.test.ts > usage quotas > records authenticated API calls and enforces the api_calls plan limit @relaycast/engine:test: [request] Request client error { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'request', @relaycast/engine:test: request_id: '9fe49321-f382-49cd-bc83-6fc55547d1e2', @relaycast/engine:test: route: '/v1/workspace', @relaycast/engine:test: method: 'GET', @relaycast/engine:test: origin_actor: 'unknown', @relaycast/engine:test: status_code: 429, @relaycast/engine:test: status_class: '4xx', @relaycast/engine:test: duration_ms: 5, @relaycast/engine:test: route_group: 'api_v1', @relaycast/engine:test: auth_scheme: 'bearer_workspace_key', @relaycast/engine:test: actor_fingerprint: 'be6c83e2272d859a', @relaycast/engine:test: error_code: 'plan_limit_exceeded', @relaycast/engine:test: error_reason: 'Plan limit exceeded for api_calls. Current plan: free. Limit: 2. Current usage: 2. Upgrade your plan to increase limits.' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/__tests__/conformance/providerAttachDecision.test.ts (4 tests) 391ms @relaycast/engine:test: ✓ src/lib/__tests__/crypto.test.ts (3 tests) 4ms @relaycast/engine:test: ✓ src/__tests__/conformance/usageQuota.test.ts (2 tests) 322ms @relaycast/engine:test: ✓ src/__tests__/conformance/triggerNodeScoped.test.ts (1 test) 318ms @relaycast/engine:test: ✓ dispatches to the node that owns a plain node-scoped action  317ms @relaycast/engine:test: stdout | src/lib/__tests__/logger.test.ts > engine logger PostHog export > exports logs through the hosted ingestion proxy by default @relaycast/engine:test: [test] hello { @relaycast/engine:test: app_version: '1.2.3', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stdout | src/lib/__tests__/logger.test.ts > engine logger PostHog export > allows a custom PostHog host override @relaycast/engine:test: [test] hello { @relaycast/engine:test: app_version: '0.1.0', @relaycast/engine:test: sdk_version: 'unknown', @relaycast/engine:test: environment: 'test', @relaycast/engine:test: source: 'test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/lib/__tests__/logger.test.ts (2 tests) 9ms @relaycast/engine:test: ✓ src/lib/__tests__/ssrf.test.ts (64 tests) 79ms @relaycast/engine:test: ✓ src/auth/__tests__/tokenKind.test.ts (5 tests) 6ms @relaycast/engine:test: ✓ src/engine/__tests__/console.test.ts (22 tests) 18ms @relaycast/engine:test: stderr | src/engine/__tests__/agentExitedEffects.test.ts > emitAgentExitedEffects > still publishes and sends the webhook when the durable outbox insert fails @relaycast/engine:test: [workspace.events] append failed { @relaycast/engine:test: workspace_id: 'ws-1', @relaycast/engine:test: event_type: 'agent.exited', @relaycast/engine:test: error: 'skip durable outbox in test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/engine/__tests__/agentExitedEffects.test.ts > emitNodeStatusEffects > publishes node.status.offline with a reason and enqueues the webhook @relaycast/engine:test: [workspace.events] append failed { @relaycast/engine:test: workspace_id: 'ws-1', @relaycast/engine:test: event_type: 'node.status.offline', @relaycast/engine:test: error: 'skip durable outbox in test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: stderr | src/engine/__tests__/agentExitedEffects.test.ts > emitNodeStatusEffects > publishes node.status.online without a reason field @relaycast/engine:test: [workspace.events] append failed { @relaycast/engine:test: workspace_id: 'ws-1', @relaycast/engine:test: event_type: 'node.status.online', @relaycast/engine:test: error: 'skip durable outbox in test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/agentExitedEffects.test.ts (6 tests) 14ms @relaycast/engine:test: ✓ src/engine/observerToken.conflictDetection.test.ts (11 tests) 10ms @relaycast/engine:test: ✓ src/adapters/node/__tests__/delivery-maintenance.test.ts (3 tests) 26ms @relaycast/engine:test: stderr | src/engine/__tests__/invocationCompletion.test.ts > emitInvocationCompletionEffects caller dedupe > delivers the completion to an online caller exactly once @relaycast/engine:test: [workspace.events] append failed { @relaycast/engine:test: workspace_id: 'ws-1', @relaycast/engine:test: event_type: 'action.completed', @relaycast/engine:test: error: 'skip durable outbox in test' @relaycast/engine:test: } @relaycast/engine:test: @relaycast/engine:test: ✓ src/engine/__tests__/invocationCompletion.test.ts (1 test) 9ms @relaycast/engine:test: ✓ src/__tests__/conformance/nodeLiveness.test.ts (2 tests) 4ms @relaycast/engine:test: @relaycast/engine:test:  Test Files  52 passed (52) @relaycast/engine:test:  Tests  559 passed (559) @relaycast/engine:test:  Start at  13:59:45 @relaycast/engine:test:  Duration  33.57s (transform 8.29s, setup 0ms, import 87.90s, tests 130.92s, environment 8ms) @relaycast/engine:test: Tasks: 18 successful, 18 total Cached: 18 cached, 18 total Time: 47ms >>> FULL TURBO now green: 18/18 tasks. Co-Authored-By: Claude Opus 5 --- packages/types/src/__tests__/sdk-openapi-sync.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/types/src/__tests__/sdk-openapi-sync.test.ts b/packages/types/src/__tests__/sdk-openapi-sync.test.ts index 46e0e24c..08807ab7 100644 --- a/packages/types/src/__tests__/sdk-openapi-sync.test.ts +++ b/packages/types/src/__tests__/sdk-openapi-sync.test.ts @@ -30,6 +30,10 @@ const IGNORED_SEGMENTS = new Set([ const NON_SDK_OPENAPI_PATHS = new Set([ '/v1/health', '/v1/.well-known/agent-card.json', + // Path-scoped form of the same unauthenticated A2A discovery endpoint. Served + // for counterparties that name the workspace explicitly; like the bare form + // it is not an agent-SDK surface. + '/v1/{param}/.well-known/agent-card.json', '/v1/a2a/rpc', '/v1/a2a/webhook/{param}/{param}', // Provider integration endpoints are provisioned/called by relayfile-cloud, From 434972792de1acbaa05a11254cde60a25fabf39a Mon Sep 17 00:00:00 2001 From: Khaliq Date: Mon, 10 Aug 2026 15:22:09 +0200 Subject: [PATCH 4/4] docs: a workspace subdomain resolves without ?workspace= on multi-tenant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit, correct. The parameter description said workspace was required on any deployment holding more than one, but host-label inference resolves on its own — the integration test hits northwind.cast.example/.well-known/agent-card.json and gets 200 with no query parameter. The endpoint description had the same ambiguity: 'unless a selector identifies it' read as excluding the host label, which is one of the four mechanisms listed a line above. Both now say a valid workspace subdomain is sufficient on its own, while keeping the part that matters: an explicit query or path selector that does not resolve still 404s rather than falling back to another workspace. turbo test 18/18. Co-Authored-By: Claude Opus 5 --- openapi.yaml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 1ffe4d16..9ae560ce 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4807,9 +4807,11 @@ paths: `/:workspace/` path segment, then the first host label (the hosted workspace-per-subdomain convention). A deployment holding exactly one workspace answers this bare path with that workspace; a deployment - holding more than one returns 404 unless a selector identifies it. An - explicit query or path selector that does not resolve always returns - 404 rather than falling back. + holding more than one resolves only if one of those mechanisms names a + workspace — a valid workspace subdomain is sufficient on its own — and + otherwise returns 404. An explicit query or path selector that does not + resolve always returns 404 rather than falling back to any other + workspace. tags: [A2A] parameters: - in: query @@ -4817,7 +4819,10 @@ paths: required: false schema: type: string - description: Workspace name. Required on a deployment holding more than one workspace. + description: > + Workspace name. Needed on a deployment holding more than one + workspace unless the request host already identifies one — a valid + workspace subdomain resolves without it. responses: '200': description: Agent card JSON