Skip to content

fix(server-core): handle workflow options records with Zod v4#1089

Merged
omeraplak merged 2 commits into
VoltAgent:mainfrom
chrisisagile:fix/workflow-zod4-record-schema
Feb 20, 2026
Merged

fix(server-core): handle workflow options records with Zod v4#1089
omeraplak merged 2 commits into
VoltAgent:mainfrom
chrisisagile:fix/workflow-zod4-record-schema

Conversation

@chrisisagile

@chrisisagile chrisisagile commented Feb 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • update to use explicit record key/value form for and
  • add regression coverage to ensure payloads with and parse without runtime errors
  • add a changeset for a patch release of

Validation

@voltagent/server-core@2.1.7 test /home/chris/dev/opensource/voltagent/packages/server-core
vitest "src/schemas/agent.schemas.spec.ts"

RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/server-core

✓ src/schemas/agent.schemas.spec.ts (2 tests) 3ms

Test Files 1 passed (1)
Tests 2 passed (2)
Start at 12:57:09
Duration 192ms (transform 35ms, setup 0ms, collect 33ms, tests 3ms, environment 0ms, prepare 55ms)

@voltagent/server-core@2.1.7 test /home/chris/dev/opensource/voltagent/packages/server-core
vitest

RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/server-core

✓ src/auth/defaults.spec.ts (48 tests) 9ms
✓ src/auth/next.spec.ts (7 tests) 2ms
✓ src/utils/server-utils.spec.ts (15 tests) 5ms
✓ src/schemas/agent.schemas.spec.ts (2 tests) 3ms
✓ src/handlers/agent.handlers.spec.ts (2 tests) 2ms
✓ src/handlers/workflow.stream-attach.handlers.spec.ts (4 tests) 5ms
✓ src/handlers/workflow.handlers.spec.ts (5 tests) 5ms
✓ src/handlers/memory-observability.handlers.spec.ts (6 tests) 6ms
✓ src/utils/port-manager.spec.ts (19 tests) 1476ms

Test Files 9 passed (9)
Tests 108 passed (108)
Start at 12:57:09
Duration 1.80s (transform 798ms, setup 0ms, collect 3.34s, tests 1.51s, environment 2ms, prepare 714ms)

  • Scope: all 114 workspace projects
    Lockfile is up to date, resolution step is skipped
    Packages: +55
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++

. prepare$ husky install
. prepare: husky - Git hooks installed
. prepare: Done
Done in 3.4s

Lerna (powered by Nx) Running target test for 24 projects:

- @voltagent/a2a-server
- @voltagent/ag-ui
- @voltagent/cli
- @voltagent/cloudflare-d1
- @voltagent/core
- @voltagent/docs-mcp
- @voltagent/evals
- @voltagent/internal
- @voltagent/langfuse-exporter
- @voltagent/libsql
- @voltagent/logger
- @voltagent/mcp-server
- @voltagent/postgres
- @voltagent/rag
- @voltagent/resumable-streams
- @voltagent/scorers
- @voltagent/sdk
- @voltagent/server-core
- @voltagent/server-elysia
- @voltagent/server-hono
- @voltagent/serverless-hono
- @voltagent/supabase
- @voltagent/voice
- @voltagent/voltagent-memory

@voltagent/core:test

@voltagent/resumable-streams:test

@voltagent/server-hono:test

@voltagent/serverless-hono:test

@voltagent/ag-ui:test

@voltagent/voltagent-memory:test

@voltagent/supabase:test [existing outputs match the cache, left as is]

@voltagent/internal:test [existing outputs match the cache, left as is]

@voltagent/sdk:test [existing outputs match the cache, left as is]

@voltagent/evals:test [existing outputs match the cache, left as is]

@voltagent/postgres:test [existing outputs match the cache, left as is]

@voltagent/voice:test [existing outputs match the cache, left as is]

@voltagent/libsql:test [existing outputs match the cache, left as is]

@voltagent/cli:test [existing outputs match the cache, left as is]

@voltagent/mcp-server:test [existing outputs match the cache, left as is]

@voltagent/scorers:test [existing outputs match the cache, left as is]

@voltagent/a2a-server:test [existing outputs match the cache, left as is]

@voltagent/logger:test [existing outputs match the cache, left as is]

@voltagent/server-core:test [existing outputs match the cache, left as is]

@voltagent/cloudflare-d1:test

@voltagent/server-elysia:test

@voltagent/langfuse-exporter:test [existing outputs match the cache, left as is]

@voltagent/docs-mcp:test [existing outputs match the cache, left as is]

@voltagent/rag:test [existing outputs match the cache, left as is]

@voltagent/serverless-hono: > @voltagent/serverless-hono@2.0.9 test /home/chris/dev/opensource/voltagent/packages/serverless-hono
@voltagent/serverless-hono: > vitest
@voltagent/server-hono: > @voltagent/server-hono@2.0.7 test /home/chris/dev/opensource/voltagent/packages/server-hono
@voltagent/server-hono: > vitest
@voltagent/ag-ui: > @voltagent/ag-ui@1.0.4 test /home/chris/dev/opensource/voltagent/packages/ag-ui
@voltagent/ag-ui: > vitest
@voltagent/voltagent-memory: > @voltagent/voltagent-memory@1.0.4 test /home/chris/dev/opensource/voltagent/packages/voltagent-memory
@voltagent/voltagent-memory: > vitest
@voltagent/core: > @voltagent/core@2.4.4 test /home/chris/dev/opensource/voltagent/packages/core
@voltagent/core: > vitest --reporter=hanging-process --reporter=default --typecheck
@voltagent/resumable-streams: > @voltagent/resumable-streams@2.0.1 test /home/chris/dev/opensource/voltagent/packages/resumable-streams
@voltagent/resumable-streams: > vitest
@voltagent/cloudflare-d1: > @voltagent/cloudflare-d1@2.1.2 test /home/chris/dev/opensource/voltagent/packages/cloudflare-d1
@voltagent/cloudflare-d1: > vitest --reporter=hanging-process --reporter=default --typecheck
@voltagent/server-elysia: > @voltagent/server-elysia@2.0.6 test /home/chris/dev/opensource/voltagent/packages/server-elysia
@voltagent/server-elysia: > vitest
@voltagent/serverless-hono: RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/serverless-hono
@voltagent/server-hono: RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/server-hono
@voltagent/voltagent-memory: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/core: RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/core
@voltagent/ag-ui: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/resumable-streams: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/cloudflare-d1: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/server-elysia: RUN v3.2.4 /home/chris/dev/opensource/voltagent/packages/server-elysia
@voltagent/serverless-hono: ❯ src/utils/wait-until-wrapper.spec.ts (11 tests | 2 failed) 46ms
@voltagent/serverless-hono: ✓ withWaitUntil > should set global waitUntil when context has waitUntil 2ms
@voltagent/serverless-hono: ✓ withWaitUntil > should not set global waitUntil when context is undefined 0ms
@voltagent/serverless-hono: ✓ withWaitUntil > should not set global waitUntil when context is null 0ms
@voltagent/serverless-hono: ✓ withWaitUntil > should not set global waitUntil when context has no waitUntil 0ms
@voltagent/serverless-hono: ✓ withWaitUntil > should call context.waitUntil when global waitUntil is invoked 1ms
@voltagent/serverless-hono: × withWaitUntil > should handle errors from context.waitUntil gracefully 32ms
@voltagent/serverless-hono: → expected [Function] to not throw an error but 'Error: waitUntil error' was thrown
@voltagent/serverless-hono: ✓ withWaitUntil > should restore previous waitUntil after cleanup 1ms
@voltagent/serverless-hono: ✓ withWaitUntil > should clear global waitUntil after cleanup when no previous value existed 0ms
@voltagent/serverless-hono: ✓ withWaitUntil > should handle nested calls with proper state restoration 1ms
@voltagent/serverless-hono: × withWaitUntil > should not affect global state when context has no waitUntil 1ms
@voltagent/serverless-hono: → expected undefined to be [Function spy] // Object.is equality
@voltagent/serverless-hono: ✓ withWaitUntil > should handle context with non-function waitUntil 0ms
@voltagent/serverless-hono: Test Files 1 failed (1)
@voltagent/serverless-hono: Tests 2 failed | 9 passed (11)
@voltagent/serverless-hono: Start at 12:57:17
@voltagent/serverless-hono: Duration 555ms (transform 95ms, setup 0ms, collect 148ms, tests 46ms, environment 0ms, prepare 139ms)
@voltagent/serverless-hono: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/server-elysia: ✓ src/mcp/elysia-sse-bridge.spec.ts (4 tests) 9ms
@voltagent/core: ✓ src/workspace/sandbox/local.spec.ts (7 tests) 136ms
@voltagent/core: ✓ src/memory/adapters/storage/in-memory.spec.ts (42 tests) 172ms
@voltagent/core: ✓ src/workflow/steps/and-foreach.spec.ts (10 tests) 83ms
@voltagent/core: ✓ src/utils/queue/queue.spec.ts (9 tests) 913ms
@voltagent/server-hono: ✓ src/auth/middleware.spec.ts (12 tests) 17ms
@voltagent/server-hono: ✓ src/utils/custom-endpoints.spec.ts (44 tests) 23ms
@voltagent/core: ✓ src/workspace/sandbox/toolkit.spec.ts (5 tests) 64ms
@voltagent/server-hono: Test Files 2 failed | 2 passed (4)
@voltagent/server-hono: Tests 56 passed (56)
@voltagent/server-hono: Start at 12:57:17
@voltagent/server-hono: Duration 2.25s (transform 1.57s, setup 0ms, collect 3.41s, tests 40ms, environment 1ms, prepare 836ms)
@voltagent/server-elysia: ✓ src/utils/custom-endpoints.spec.ts (43 tests) 56ms
@voltagent/server-elysia: ✓ src/routes/mcp.routes.spec.ts (1 test) 4ms
@voltagent/server-elysia: ✓ src/auth/middleware.spec.ts (12 tests) 56ms
@voltagent/server-elysia: stdout | src/routes/registration.spec.ts > Route Registration > should register trigger routes
@voltagent/server-elysia: [volt] Trigger route registered { trigger: undefined, method: 'POST', path: '/trigger/test' }
@voltagent/core: ✓ src/mcp/client/index.spec.ts (38 tests) 47ms
@voltagent/server-elysia: ✓ src/routes/registration.spec.ts (3 tests) 11ms
@voltagent/server-elysia: ✓ src/utils/zod-adapter.spec.ts (2 tests) 12ms
@voltagent/core: ✓ src/logger/logger-proxy.spec.ts (29 tests | 1 skipped) 38ms
@voltagent/server-hono: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/server-elysia: ✓ src/routes/trigger.routes.spec.ts (3 tests) 25ms
@voltagent/server-elysia: ✓ src/routes/a2a.routes.spec.ts (3 tests) 31ms
@voltagent/server-elysia: ✓ src/routes/observability.spec.ts (15 tests) 31ms
@voltagent/server-elysia: ✓ src/routes/controllers.httpError.spec.ts (4 tests) 60ms
@voltagent/server-elysia: ✓ src/app-factory.spec.ts (11 tests) 75ms
@voltagent/server-elysia: ❯ src/elysia-server-provider.spec.ts (6 tests | 6 failed) 21ms
@voltagent/server-elysia: × ElysiaServerProvider > should start the server 9ms
@voltagent/server-elysia: → listen EADDRINUSE: address already in use 0.0.0.0:3000
@voltagent/server-elysia: × ElysiaServerProvider > should stop the server 1ms
@voltagent/server-elysia: → listen EADDRINUSE: address already in use 0.0.0.0:3000
@voltagent/server-elysia: × ElysiaServerProvider > should throw if already running 0ms
@voltagent/server-elysia: → listen EADDRINUSE: address already in use 0.0.0.0:3000
@voltagent/server-elysia: × ElysiaServerProvider > should configure websocket if enabled 0ms
@voltagent/server-elysia: → listen EADDRINUSE: address already in use 0.0.0.0:3000
@voltagent/server-elysia: × ElysiaServerProvider > should extract and display custom endpoints from configureApp 1ms
@voltagent/server-elysia: → listen EADDRINUSE: address already in use 0.0.0.0:3000
@voltagent/server-elysia: × ElysiaServerProvider > should handle startup errors and release port 8ms
@voltagent/server-elysia: → expected [Function] to throw error including 'Startup failed' but got 'listen EADDRINUSE: address already in…'
@voltagent/server-elysia: Test Files 1 failed | 11 passed (12)
@voltagent/server-elysia: Tests 6 failed | 101 passed (107)
@voltagent/server-elysia: Start at 12:57:17
@voltagent/server-elysia: Duration 2.42s (transform 1.86s, setup 0ms, collect 18.83s, tests 390ms, environment 8ms, prepare 2.26s)
@voltagent/server-elysia: �[41m�[30m ELIFECYCLE �[39m�[49m �[31mTest failed. See above for more details.�[39m
@voltagent/core: ✓ src/workflow/chain.spec.ts (4 tests) 34ms
@voltagent/core: ✓ src/workflow/stream.spec.ts (15 tests) 69ms
@voltagent/core: ✓ TS src/agent/agent.spec-d.ts (67 tests)
@voltagent/core: ✓ TS src/memory/index.spec-d.ts (34 tests)
@voltagent/core: ✓ TS src/workflow/chain.spec-d.ts (22 tests)
@voltagent/core: ✓ TS src/workflow/core.spec-d.ts (5 tests)
@voltagent/core: ✓ TS src/agent/errors/abort-error.spec-d.ts (1 test)
@voltagent/core: ✓ TS src/agent/errors/voltagent-error.spec-d.ts (1 test)
@voltagent/core: ✓ TS src/workflow/steps/and-all.spec-d.ts (2 tests)
@voltagent/core: ✓ src/workflow/hooks.spec.ts (3 tests) 36ms
@voltagent/core: stdout | src/agent/guardrail.integration.spec.ts > Agent guardrail integration > sanitizes generateText output and forwards metadata to guardrails
@voltagent/core: AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.
@voltagent/core: ✓ src/agent/subagent/index.spec.ts (41 tests | 1 skipped) 48ms
@voltagent/core: ✓ src/workflow/steps/and-agent.spec.ts (2 tests) 40ms
@voltagent/core: ✓ src/workflow/steps/and-workflow.spec.ts (1 test) 29ms
@voltagent/core: ✓ src/workflow/step-schemas-runtime.spec.ts (3 tests) 206ms
@voltagent/core: ✓ src/agent/concurrent-tool-spans.spec.ts (2 tests) 95ms
@voltagent/core: ✓ src/agent/guardrail.integration.spec.ts (2 tests) 77ms
@voltagent/core: ✓ src/agent/streaming/guardrail-stream.spec.ts (5 tests) 90ms
@voltagent/core: ✓ src/workflow/core.spec.ts (12 tests) 64ms
@voltagent/core: ✓ src/workflow/usage-tracking.spec.ts (8 tests) 110ms
@voltagent/core: ✓ src/memory/adapters/embedding/ai-sdk.spec.ts (11 tests) 29ms
@voltagent/core: ✓ src/logger/console-logger.spec.ts (47 tests) 26ms
@voltagent/core: ✓ src/voltops/prompt-manager.spec.ts (35 tests) 20ms
@voltagent/core: ✓ src/memory/working-memory.spec.ts (32 tests) 21ms
@voltagent/core: ✓ src/memory/semantic-search.spec.ts (12 tests) 14ms
@voltagent/core: ✓ src/tool/index.spec.ts (16 tests) 7ms
@voltagent/core: ✓ src/voltagent.spec.ts (5 tests) 15ms
@voltagent/core: stdout | ConsoleLogger.info (/home/chris/dev/opensource/voltagent/packages/core/src/logger/console-logger.ts:109:9)
@voltagent/core: [2026-02-20T18:57:20.589Z] INFO {"component":"voltagent"}: [VoltAgent] Received SIGTERM...
@voltagent/core: [2026-02-20T18:57:20.591Z] INFO {"component":"voltagent"}: [VoltAgent] Starting graceful shutdown...
@voltagent/core: [2026-02-20T18:57:20.591Z] INFO {"component":"voltagent"}: [VoltAgent] Suspending active workflows...
@voltagent/core: [2026-02-20T18:57:20.591Z] INFO {"component":"voltagent"}: [VoltAgent] Received SIGTERM...
@voltagent/core: [2026-02-20T18:57:20.591Z] INFO {"component":"voltagent"}: [VoltAgent] Starting graceful shutdown...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Suspending active workflows...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Received SIGTERM...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Starting graceful shutdown...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Suspending active workflows...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Received SIGTERM...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Starting graceful shutdown...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Suspending active workflows...
@voltagent/core: [2026-02-20T18:57:20.592Z] INFO {"component":"voltagent"}: [VoltAgent] Received SIGTERM...
@voltagent/core: [2026-02-20T18:57:20.593Z] INFO {"component":"voltagent"}: [VoltAgent] Starting graceful shutdown...
@voltagent/core: [2026-02-20T18:57:20.593Z] INFO {"component":"voltagent"}: [VoltAgent] Suspending active workflows...
@voltagent/core: [2026-02-20T18:57:20.593Z] INFO {"component":"voltagent"}: [VoltAgent] Shutting down telemetry...
@voltagent/core: [2026-02-20T18:57:20.593Z] INFO {"component":"voltagent"}: [VoltAgent] Shutting down telemetry...
@voltagent/core: [2026-02-20T18:57:20.594Z] INFO {"component":"voltagent"}: [VoltAgent] Shutting down telemetry...
@voltagent/core: [2026-02-20T18:57:20.594Z] INFO {"component":"voltagent"}: [VoltAgent] Shutting down telemetry...
@voltagent/core: [2026-02-20T18:57:20.595Z] INFO {"component":"voltagent"}: [VoltAgent] Shutting down telemetry...
@voltagent/core: stdout | ConsoleLogger.info (/home/chris/dev/opensource/voltagent/packages/core/src/logger/console-logger.ts:109:9)
@voltagent/core: [2026-02-20T18:57:20.596Z] INFO {"component":"voltagent"}: [VoltAgent] Graceful shutdown complete
@voltagent/core: [2026-02-20T18:57:20.596Z] INFO {"component":"voltagent"}: [VoltAgent] Graceful shutdown complete
@voltagent/core: [2026-02-20T18:57:20.596Z] INFO {"component":"voltagent"}: [VoltAgent] Graceful shutdown complete
@voltagent/core: [2026-02-20T18:57:20.597Z] INFO {"component":"voltagent"}: [VoltAgent] Graceful shutdown complete
@voltagent/core: [2026-02-20T18:57:20.597Z] INFO {"component":"voltagent"}: [VoltAgent] Graceful shutdown complete
@voltagent/core: ✓ src/workspace/skills/index.spec.ts (9 tests) 16ms
@voltagent/core: ✓ src/workflow/open-telemetry/trace-context.spec.ts (2 tests) 18ms
@voltagent/core: ✓ src/workflow/guardrails.spec.ts (3 tests) 29ms
@voltagent/core: ✓ src/utils/message-helpers.spec.ts (50 tests) 11ms
@voltagent/core: ✓ src/memory/manager/memory-manager.spec.ts (11 tests) 19ms
@voltagent/core: ✓ src/voltops/client.spec.ts (37 tests) 10ms
@voltagent/core: ✓ src/workspace/filesystem/toolkit.spec.ts (2 tests) 15ms
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > disconnect > should disconnect all clients and clear local cache
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getTools > should return tools from all servers as an array
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getTools > should handle errors when retrieving tools
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getTools > should handle errors when retrieving tools
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getToolsets > should return tools grouped by server name with getTools method
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getToolsets > should not include servers with no tools
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getAgentToolsets > should return agent tools grouped by server name with getTools method
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getAgentToolsets > should handle errors from specific servers gracefully
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getAgentToolsets > should handle errors from specific servers gracefully
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getClient > should return a connected client for a valid server name
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getClient > should return a connected client for a valid server name
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getClient > should reuse existing client instance if already connected
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getClient > should reuse existing client instance if already connected
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: stdout | src/mcp/registry/index.spec.ts > MCPConfiguration > getClients > should return connected clients for all servers
@voltagent/core: Creating new MCP connection for server: server1
@voltagent/core: Creating new MCP connection for server: server2
@voltagent/core: Successfully connected to MCP server: server1
@voltagent/core: Successfully connected to MCP server: server2
@voltagent/core: ✓ src/mcp/registry/index.spec.ts (12 tests) 13ms
@voltagent/core: ✓ src/agent/guardrails/defaults.spec.ts (16 tests) 18ms
@voltagent/core: ✓ src/agent/message-normalizer.spec.ts (28 tests) 10ms
@voltagent/core: ✓ src/workflow/steps/and-sleep.spec.ts (6 tests) 11ms
@voltagent/core: ✓ src/planagent/plan-agent.spec.ts (4 tests) 8ms
@voltagent/core: ✓ src/workspace/filesystem/node-filesystem-backend.spec.ts (1 test) 8ms
@voltagent/core: ✓ src/agent/open-telemetry/trace-context.spec.ts (1 test) 11ms
@voltagent/core: ✓ src/agent/guardrail.spec.ts (24 tests) 13ms
@voltagent/core: ✓ src/tool/manager/index.spec.ts (21 tests) 12ms
@voltagent/core: ✓ src/index.spec.ts (4 tests | 1 skipped) 657ms
@voltagent/core: ✓ exports > should export the VoltAgent class as default 655ms
@voltagent/core: ✓ src/workflow/steps/and-map.spec.ts (2 tests) 12ms
@voltagent/core: ✓ src/logger/index.spec.ts (8 tests) 4ms
@voltagent/core: ✓ src/voltops/client-priority.spec.ts (10 tests) 18ms
@voltagent/core: ✓ src/workflow/steps/and-branch.spec.ts (6 tests) 6ms
@voltagent/core: ✓ src/logger/events.spec.ts (18 tests) 10ms
@voltagent/core: ✓ src/agent/conversation-buffer.spec.ts (5 tests) 5ms
@voltagent/core: ✓ src/voltops/prompt-api-client.spec.ts (15 tests) 10ms
@voltagent/core: ✓ src/workspace/index.spec.ts (5 tests) 9ms
@voltagent/core: ✓ src/voltops/actions/client.spec.ts (7 tests) 7ms
@voltagent/core: ✓ src/eval/builder.spec.ts (6 tests) 4ms
@voltagent/core: ✓ src/agent/memory-persistence.integration.spec.ts (2 tests) 5ms
@voltagent/core: ✓ src/utils/message-converter.spec.ts (28 tests) 16ms
@voltagent/core: ✓ src/agent/memory-persist-queue.spec.ts (4 tests) 9ms
@voltagent/core: ✓ src/agent/error-utils.spec.ts (5 tests) 8ms
@voltagent/core: ✓ src/logger/message-builder.spec.ts (24 tests) 4ms
@voltagent/core: ✓ src/agent/step-persistence.spec.ts (3 tests) 8ms
@voltagent/core: ✓ src/observability/voltagent-observability.spec.ts (2 tests) 8ms
@voltagent/core: ✓ src/workflow/internal/state.spec.ts (9 tests) 4ms
@voltagent/core: ✓ src/workflow/suspend-controller.spec.ts (11 tests) 5ms
@voltagent/core: ✓ src/agent/model-message-normalizer.spec.ts (4 tests) 4ms
@voltagent/core: ✓ src/observability/processors/span-filter-processor.spec.ts (5 tests) 5ms
@voltagent/core: ✓ src/agent/eval.spec.ts (4 tests) 5ms
@voltagent/core: ✓ src/workflow/steps/and-loop.spec.ts (4 tests) 4ms
@voltagent/core: stdout | src/agent/subagent/bail.spec.ts > SubAgentManager - Bail System > onHandoffComplete bail() > should set bailed flag when bail() is called in hook
@voltagent/core: [2026-02-20T18:57:21.497Z] INFO {"component":"voltagent"}: Supervisor bailed after handoff {"supervisorAgent":"Supervisor","subAgent":"Test Agent","transformed":true,"resultLength":21}
@voltagent/core: stdout | src/agent/subagent/bail.spec.ts > SubAgentManager - Bail System > onHandoffComplete bail() > should return correct format with agentName when bailed
@voltagent/core: [2026-02-20T18:57:21.499Z] INFO {"component":"voltagent"}: Supervisor bailed after handoff {"supervisorAgent":"Supervisor","subAgent":"Math Agent","transformed":true,"resultLength":21}
@voltagent/core: stdout | src/agent/subagent/bail.spec.ts > SubAgentManager - Bail System > Multiple agents bail > should return bailed result when one agent bails in parallel execution
@voltagent/core: [2026-02-20T18:57:21.501Z] INFO {"component":"voltagent"}: Supervisor bailed after handoff {"supervisorAgent":"Supervisor","subAgent":"Bailer","transformed":true,"resultLength":17}
@voltagent/core: stdout | src/agent/subagent/bail.spec.ts > SubAgentManager - Bail System > Multiple agents bail > should include all results when delegating to multiple agents
@voltagent/core: [2026-02-20T18:57:21.502Z] INFO {"component":"voltagent"}: Supervisor bailed after handoff {"supervisorAgent":"Supervisor","subAgent":"Agent 1","transformed":true,"resultLength":18}
@voltagent/core: ✓ src/agent/subagent/bail.spec.ts (5 tests) 11ms
@voltagent/core: ✓ src/utils/serialization/index.spec.ts (21 tests) 4ms
@voltagent/core: ✓ src/tool/reasoning/index.spec.ts (8 tests) 9ms
@voltagent/core: ✓ src/workspace/search/index.spec.ts (7 tests) 13ms
@voltagent/core: ✓ src/utils/toolParser/index.spec.ts (12 tests) 5ms
@voltagent/core: stdout | src/retriever/tools/index.spec.ts > createRetrieverTool > should pass context from operation context to retriever
@voltagent/core: [retriever:search_knowledge] start - search started {
@voltagent/core: resourceType: 'retriever',
@voltagent/core: resourceName: 'search_knowledge',
@voltagent/core: action: 'start',
@voltagent/core: event: 'retriever.search.started',
@voltagent/core: query: 'test query'
@voltagent/core: }
@voltagent/core: stdout | src/retriever/tools/index.spec.ts > createRetrieverTool > should pass context from operation context to retriever
@voltagent/core: [retriever:search_knowledge] complete - search completed {
@voltagent/core: resourceType: 'retriever',
@voltagent/core: resourceName: 'search_knowledge',
@voltagent/core: action: 'complete',
@voltagent/core: event: 'retriever.search.completed',
@voltagent/core: duration: 1,
@voltagent/core: result: 'Test content with context'
@voltagent/core: }
@voltagent/core: ✓ src/workflow/internal/utils.spec.ts (3 tests) 5ms
@voltagent/core: ✓ src/retriever/tools/index.spec.ts (8 tests) 16ms
@voltagent/core: ✓ src/agent/apply-summarization.spec.ts (2 tests) 6ms
@voltagent/core: ✓ src/workflow/steps/and-guardrail.spec.ts (2 tests) 4ms
@voltagent/core: ✓ src/workspace/timeout.spec.ts (3 tests) 5ms
@voltagent/core: ✓ src/eval/create-scorer.spec.ts (5 tests) 3ms
@voltagent/core: ✓ src/utils/usage-normalizer.spec.ts (9 tests) 3ms
@voltagent/core: ✓ src/agent/feedback.spec.ts (8 tests) 5ms
@voltagent/core: ✓ src/workflow/steps/and-tap.spec.ts (3 tests) 5ms
@voltagent/core: ✓ src/retriever/retriever.spec.ts (5 tests) 7ms
@voltagent/core: ✓ src/voltops/template-engine.spec.ts (12 tests) 3ms
@voltagent/core: ✓ src/workflow/suspend-resume.spec.ts (17 tests) 1857ms
@voltagent/core: ✓ workflow suspend/resume functionality > should resume suspended workflow from correct step 466ms
@voltagent/core: ✓ src/observability/utils.spec.ts (7 tests) 5ms
@voltagent/core: ✓ src/workspace/filesystem/index.spec.ts (2 tests) 3ms
@voltagent/core: ✓ src/voltops/types.spec.ts (13 tests) 3ms
@voltagent/core: ✓ src/utils/createPrompt/index.spec.ts (11 tests) 3ms
@voltagent/core: ✓ src/agent/errors/abort-error.spec.ts (4 tests) 3ms
@voltagent/core: ✓ src/agent/errors/voltagent-error.spec.ts (5 tests) 4ms
@voltagent/core: ✓ src/agent/tool-input-coercion.spec.ts (3 tests) 4ms
@voltagent/core: ✓ src/workflow/steps/and-all.spec.ts (2 tests) 3ms
@voltagent/core: ✓ src/agent/streaming/output-guardrail-stream-runner.spec.ts (4 tests) 5ms
@voltagent/core: ✓ src/agent/hooks/index.spec.ts (11 tests) 7090ms
@voltagent/core: ✓ Agent Hooks Functionality > onEnd > should call onEnd with an error when agent fails 7031ms
@voltagent/core: ✓ src/agent/agent-observability.spec.ts (8 tests) 7123ms
@voltagent/core: ✓ Agent with Observability > generateText > should handle errors and set error status 7018ms
@voltagent/core: ✓ src/agent/agent-semantic-search.spec.ts (20 tests) 21051ms
@voltagent/core: ✓ Agent Semantic Search > Semantic Memory Integration > should use semantic search when vector support exists and not disabled 7022ms
@voltagent/core: ✓ Agent Semantic Search > Semantic Memory Integration > should not use semantic search when explicitly disabled 7009ms
@voltagent/core: ✓ Agent Semantic Search > Semantic Memory Integration > should pass custom semantic options to memory manager 7007ms
@voltagent/core: ✓ src/agent/agent.spec.ts (94 tests) 24256ms
@voltagent/core: ✓ Agent > Hook System > should call onError hook with error details 7008ms
@voltagent/core: ✓ Agent > Error Handling > should retry the same model before returning a response 3004ms
@voltagent/core: ✓ Agent > Error Handling > should handle model errors gracefully 7004ms
@voltagent/core: ✓ Agent > Error Handling > should handle invalid input 7006ms
@voltagent/core: Test Files 103 passed (103)
@voltagent/core: Tests 1257 passed | 2 skipped | 1 todo (1260)
@voltagent/core: Type Errors no errors
@voltagent/core: Start at 12:57:17
@voltagent/core: Duration 27.15s (transform 5.82s, setup 0ms, collect 46.27s, tests 65.05s, environment 12ms, prepare 7.68s, typecheck 2.11s)

Lerna (powered by Nx) Running target test for 24 projects failed

Failed tasks:

  • @voltagent/voltagent-memory:test
  • @voltagent/ag-ui:test
  • @voltagent/resumable-streams:test
  • @voltagent/cloudflare-d1:test
  • @voltagent/serverless-hono:test
  • @voltagent/server-hono:test
  • @voltagent/server-elysia:test (fails due existing monorepo failures outside this change)

Summary by cubic

Make workflow execution options compatible with Zod v4 by using explicit record key types. This prevents runtime parsing errors for options.workflowState and options.metadata.

  • Bug Fixes
    • Updated schema to use z.record(z.string(), z.any()) for workflowState and metadata.
    • Added tests to validate payloads for both fields.
    • Included a changeset for a server-core patch release.

Written for commit e825287. Summary will update on new commits.

@changeset-bot

changeset-bot Bot commented Feb 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e825287

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@voltagent/server-core Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 3 files

@omeraplak omeraplak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much! 🎯

@omeraplak
omeraplak merged commit c007b3e into VoltAgent:main Feb 20, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants