diff --git a/apps/server/package.json b/apps/server/package.json index e9db1c0fea54..74bb7cac0e94 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -57,6 +57,7 @@ "@effect/vitest": "catalog:", "@modelcontextprotocol/sdk": "1.29.0", "@t3tools/contracts": "workspace:*", + "@t3tools/provider-testing": "workspace:*", "@t3tools/shared": "workspace:*", "@t3tools/ssh": "workspace:*", "@t3tools/tailscale": "workspace:*", diff --git a/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts b/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts index e5a233dcc5c8..18e92b852600 100644 --- a/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts +++ b/apps/server/scripts/probe-claude-fork-local-rollback-replay.ts @@ -16,7 +16,7 @@ import { type ClaudeAgentSdkQueryOptions, } from "../src/orchestration-v2/Adapters/ClaudeAdapterV2.ts"; import { randomUuidV4 } from "../src/orchestration-v2/RandomUuid.ts"; -import { makeCheckpointWorkspace } from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +import { makeCheckpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const SCENARIO = "thread_fork_native_fork_local_rollback"; const DEFAULT_OUTPUT = new URL( diff --git a/apps/server/scripts/record-claude-agent-sdk-replay-fixture.ts b/apps/server/scripts/record-claude-agent-sdk-replay-fixture.ts index 220e342b1944..975a4786c468 100644 --- a/apps/server/scripts/record-claude-agent-sdk-replay-fixture.ts +++ b/apps/server/scripts/record-claude-agent-sdk-replay-fixture.ts @@ -15,7 +15,7 @@ import { type ProviderAdapterV2RuntimePolicy as ProviderAdapterV2RuntimePolicyType, } from "@t3tools/provider-core/server/adapter"; import type { RuntimePolicyV2Override } from "../src/orchestration-v2/RuntimePolicy.ts"; -import { makeCheckpointWorkspace } from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +import { makeCheckpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import { CLAUDE_MODEL_SELECTION } from "../src/orchestration-v2/testkit/fixtures/shared.ts"; import { MESSAGE_STEERING_INITIAL_PROMPT, diff --git a/apps/server/scripts/record-cursor-agent-sdk-replay-fixture.ts b/apps/server/scripts/record-cursor-agent-sdk-replay-fixture.ts index 1ccfb13c1bc5..0f50f11ba345 100644 --- a/apps/server/scripts/record-cursor-agent-sdk-replay-fixture.ts +++ b/apps/server/scripts/record-cursor-agent-sdk-replay-fixture.ts @@ -15,7 +15,7 @@ import { recordCursorAgentSdkReplayTranscript, type CursorAgentSdkReplayTranscript, } from "../src/orchestration-v2/Adapters/CursorAdapterV2.testkit.ts"; -import { checkpointWorkspace } from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import { CURSOR_MODEL_SELECTION, MESSAGE_STEERING_INITIAL_PROMPT, diff --git a/apps/server/scripts/record-grok-acp-replay-fixture.ts b/apps/server/scripts/record-grok-acp-replay-fixture.ts index 5a88e1561ca2..721a60412d0f 100644 --- a/apps/server/scripts/record-grok-acp-replay-fixture.ts +++ b/apps/server/scripts/record-grok-acp-replay-fixture.ts @@ -42,7 +42,7 @@ import { materializeFixtureInput } from "../src/orchestration-v2/testkit/fixture import { runOrchestratorV2Scenario } from "../src/orchestration-v2/testkit/OrchestratorScenario.ts"; import { makeReplayServerConfig } from "../src/orchestration-v2/testkit/ProviderReplayHarness.ts"; import * as ProviderReplayHarness from "../src/orchestration-v2/testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import { makeGrokAcpRuntime } from "../src/provider/acp/GrokAcpSupport.ts"; import { buildRuntimeInstructions } from "../src/provider/RuntimeInstructions.ts"; diff --git a/apps/server/scripts/record-muse-msp-replay-fixture.ts b/apps/server/scripts/record-muse-msp-replay-fixture.ts index 53572e50837d..7be7f85961ce 100644 --- a/apps/server/scripts/record-muse-msp-replay-fixture.ts +++ b/apps/server/scripts/record-muse-msp-replay-fixture.ts @@ -39,11 +39,11 @@ import { provideDeterministicTestRuntime } from "../src/orchestration-v2/testkit import { ORCHESTRATOR_REPLAY_FIXTURES } from "../src/orchestration-v2/testkit/fixtures/index.ts"; import { materializeFixtureInput } from "../src/orchestration-v2/testkit/fixtures/shared.ts"; import { runOrchestratorV2ProviderReplayScenario } from "../src/orchestration-v2/testkit/ProviderReplayHarness.ts"; -import { materializeReplayTranscriptWorkspace } from "../src/orchestration-v2/testkit/ReplayTranscriptNdjson.ts"; +import { materializeReplayTranscriptWorkspace } from "@t3tools/provider-testing/replayTranscript"; import { checkpointWorkspace, makeCheckpointWorkspace, -} from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +} from "@t3tools/provider-testing/replayWorkspace"; const CLOCK_TICK = Duration.millis(20); diff --git a/apps/server/scripts/record-pi-rpc-replay-fixture.ts b/apps/server/scripts/record-pi-rpc-replay-fixture.ts index 32d0dc7c7560..3b33ffb0a199 100644 --- a/apps/server/scripts/record-pi-rpc-replay-fixture.ts +++ b/apps/server/scripts/record-pi-rpc-replay-fixture.ts @@ -38,7 +38,7 @@ import { runOrchestratorV2ProviderReplayScenario } from "../src/orchestration-v2 import { checkpointWorkspace, makeCheckpointWorkspace, -} from "../src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +} from "@t3tools/provider-testing/replayWorkspace"; /** * Keeps the user's skills, templates and context files out of the recording. diff --git a/apps/server/src/mcp/OrchestratorMcpToolkit.integration.test.ts b/apps/server/src/mcp/OrchestratorMcpToolkit.integration.test.ts index 3a603a272c8e..f77e5290f5a3 100644 --- a/apps/server/src/mcp/OrchestratorMcpToolkit.integration.test.ts +++ b/apps/server/src/mcp/OrchestratorMcpToolkit.integration.test.ts @@ -65,12 +65,12 @@ import { } from "@t3tools/provider-core/server/adapter"; import * as ProviderAdapterRegistry from "../orchestration-v2/ProviderAdapterRegistry.ts"; import * as ProviderContinuationRequests from "../orchestration-v2/ProviderContinuationRequests.ts"; -import { checkpointWorkspace } from "../orchestration-v2/testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import * as ProviderReplayHarness from "../orchestration-v2/testkit/ProviderReplayHarness.ts"; import { decodeProviderReplayNdjson, materializeReplayTranscriptWorkspace, -} from "../orchestration-v2/testkit/ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; import * as ProviderRegistryMock from "../provider/testUtils/providerRegistryMock.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.testkit.ts index cf9c20e2860a..960ac6f57f01 100644 --- a/apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.testkit.ts @@ -14,7 +14,7 @@ import { ChildProcessSpawner } from "effect/process"; import * as EffectAcpErrors from "effect-acp/errors"; import * as AcpSessionRuntime from "../../provider/acp/AcpSessionRuntime.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; import { ACP_PROTOCOL, type AcpAdapterV2RuntimeInput } from "./AcpAdapterV2.ts"; export const AcpReplayTranscript = Schema.Struct({ diff --git a/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.testkit.ts index 4289d0314b38..014080b83155 100644 --- a/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.testkit.ts @@ -12,7 +12,7 @@ import { ChildProcessSpawner } from "effect/process"; import * as ServerConfig from "../../config.ts"; import * as IdAllocator from "../IdAllocator.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; import type { OrchestratorV2ProviderReplayHarness } from "../testkit/ProviderReplayHarness.ts"; import { makeReplayServerConfig } from "../testkit/ProviderReplayHarness.ts"; import { diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts index 3e70e3d9a8ff..f56516f0e82c 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts @@ -39,7 +39,7 @@ import { makeReplayServerConfig, type OrchestratorV2ProviderReplayHarness, } from "../testkit/ProviderReplayHarness.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; export const CLAUDE_AGENT_SDK_REPLAY_PROTOCOL = "claude-agent-sdk.query" as const; /** diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.testkit.ts index 99d941b66626..0018a7bbe2dc 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.testkit.ts @@ -19,7 +19,7 @@ import { ProviderAdapterOpenSessionError } from "@t3tools/provider-core/server/a import { ProviderAdapterDriverCreateError } from "../ProviderAdapterDriver.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; import type { OrchestratorV2ProviderReplayHarness } from "../testkit/ProviderReplayHarness.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; import * as CodexAdapterV2 from "./CodexAdapterV2.ts"; export class CodexReplayTranscriptDecodeError extends Schema.TaggedError()( diff --git a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.testkit.ts index 96d0bedab89a..f4d933725b8b 100644 --- a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.testkit.ts @@ -19,7 +19,7 @@ import { makeXAiPromptCompletionRuntime } from "../../provider/acp/XAiAcpExtensi import * as IdAllocator from "../IdAllocator.ts"; import * as ProviderContinuationRequests from "../ProviderContinuationRequests.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; import type { OrchestratorV2ProviderReplayHarness } from "../testkit/ProviderReplayHarness.ts"; import { makeReplayServerConfig } from "../testkit/ProviderReplayHarness.ts"; import { diff --git a/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.testkit.ts index e8fd1a0258f5..bb202e512387 100644 --- a/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.testkit.ts @@ -25,7 +25,7 @@ import * as OpenCode2Client from "../../provider/opencode2/OpenCode2Client.ts"; import * as OpenCode2Server from "../../provider/opencode2/OpenCode2Server.ts"; import * as IdAllocator from "../IdAllocator.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; -import type { ProviderReplayGate } from "../testkit/ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; import { makeReplayServerConfig, type OrchestratorV2ProviderReplayHarness, diff --git a/apps/server/src/orchestration-v2/BackgroundWorkStop.integration.test.ts b/apps/server/src/orchestration-v2/BackgroundWorkStop.integration.test.ts index b89e369106a5..c61bfc286dab 100644 --- a/apps/server/src/orchestration-v2/BackgroundWorkStop.integration.test.ts +++ b/apps/server/src/orchestration-v2/BackgroundWorkStop.integration.test.ts @@ -33,7 +33,7 @@ import type { import * as ProviderAdapterRegistry from "./ProviderAdapterRegistry.ts"; import * as ProviderSessionManager from "./ProviderSessionManager.ts"; import * as ProviderReplayHarness from "./testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const driver = ProviderDriverKind.make("codex"); const instanceId = ProviderInstanceId.make("codex"); diff --git a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts index a6cac12037e2..94cbafe85da0 100644 --- a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts +++ b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts @@ -38,7 +38,7 @@ import * as ProviderAdapterRegistry from "./ProviderAdapterRegistry.ts"; import * as ThreadLaunchService from "./ThreadLaunchService.ts"; import * as ThreadManagementService from "./ThreadManagementService.ts"; import * as ProviderReplayHarness from "./testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const sessionId = "automatic-delivery-session"; const settings = Schema.decodeSync(ClaudeSettings)({}); diff --git a/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.integration.test.ts b/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.integration.test.ts index 024b94c24236..584da5ede1f4 100644 --- a/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.integration.test.ts +++ b/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.integration.test.ts @@ -31,11 +31,11 @@ import { OPENCODE_PROVIDER } from "./Adapters/OpenCodeAdapterV2.ts"; import { provideDeterministicTestRuntime } from "./testkit/DeterministicRuntime.ts"; import type { OrchestratorV2ScenarioStep } from "./testkit/OrchestratorScenario.ts"; import { runOrchestratorV2ProviderReplayScenario } from "./testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import { decodeProviderReplayNdjson, readProviderReplayTranscript, -} from "./testkit/ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; import * as IdAllocator from "./IdAllocator.ts"; const SESSION = "ses_f148ca2deffeJcwCnRQtb0YFNX"; diff --git a/apps/server/src/orchestration-v2/SelectionRestart.integration.test.ts b/apps/server/src/orchestration-v2/SelectionRestart.integration.test.ts index a36eeede309e..5bb32d44e3d8 100644 --- a/apps/server/src/orchestration-v2/SelectionRestart.integration.test.ts +++ b/apps/server/src/orchestration-v2/SelectionRestart.integration.test.ts @@ -36,7 +36,7 @@ import { } from "@t3tools/provider-core/server/adapter"; import * as ProviderAdapterRegistry from "./ProviderAdapterRegistry.ts"; import * as ProviderReplayHarness from "./testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const driver = ProviderDriverKind.make("codex"); const providerInstanceId = ProviderInstanceId.make("codex-restart-test"); diff --git a/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts b/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts index 54cf85ecbae3..856e0479cdd2 100644 --- a/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts +++ b/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts @@ -31,7 +31,7 @@ import { } from "@t3tools/provider-core/server/adapter"; import * as ProviderAdapterRegistry from "./ProviderAdapterRegistry.ts"; import * as ProviderReplayHarness from "./testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const driver = ProviderDriverKind.make("codex"); const instanceId = ProviderInstanceId.make("codex"); diff --git a/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts b/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts index 084b122fc755..23970fdf7583 100644 --- a/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts +++ b/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts @@ -51,7 +51,7 @@ import { } from "@t3tools/provider-core/server/adapter"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; import * as ProviderReplayHarness from "../testkit/ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "../testkit/ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const PROJECT_ID = "project:cutover"; const ACTIVE_THREAD = "thread:cutover:active"; diff --git a/apps/server/src/orchestration-v2/testkit/ClaudeReplayFixtures.integration.test.ts b/apps/server/src/orchestration-v2/testkit/ClaudeReplayFixtures.integration.test.ts index d20a8d0b6160..ccc2ece34e31 100644 --- a/apps/server/src/orchestration-v2/testkit/ClaudeReplayFixtures.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/ClaudeReplayFixtures.integration.test.ts @@ -19,7 +19,7 @@ import { ORCHESTRATOR_REPLAY_FIXTURES } from "./fixtures/index.ts"; import { subagentInput } from "./fixtures/subagent/input.ts"; import { runOrchestratorV2Scenario } from "./OrchestratorScenario.ts"; import * as ProviderReplayHarness from "./ProviderReplayHarness.ts"; -import { materializeReplayTranscriptRuntimeInstructions } from "./ReplayTranscriptNdjson.ts"; +import { materializeReplayTranscriptRuntimeInstructions } from "./ReplayRuntimeInstructions.ts"; import { CLAUDE_MODEL_SELECTION, materializeFixtureInput } from "./fixtures/shared.ts"; import { THREAD_FORK_NATIVE_CONTINUE_FORK_MARKER, @@ -33,7 +33,7 @@ import { THREAD_MERGE_BACK_SIBLINGS_SOURCE_MARKER, THREAD_MERGE_BACK_SOURCE_MARKER, } from "./fixtures/shared.ts"; -import { readProviderReplayTranscript } from "./ReplayTranscriptNdjson.ts"; +import { readProviderReplayTranscript } from "@t3tools/provider-testing/replayTranscript"; const readTranscript = Effect.fn("readClaudeReplayFixture")(function* (file: URL) { return yield* readProviderReplayTranscript(file); diff --git a/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts b/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts index c04f9b326c81..eb2482cb6547 100644 --- a/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts @@ -18,7 +18,7 @@ import { THREAD_MERGE_BACK_SIBLINGS_SOURCE_MARKER, THREAD_MERGE_BACK_SOURCE_MARKER, } from "./fixtures/shared.ts"; -import { readProviderReplayTranscript } from "./ReplayTranscriptNdjson.ts"; +import { readProviderReplayTranscript } from "@t3tools/provider-testing/replayTranscript"; const PROVIDER_THREAD_RESUME_FIRST_FINAL = "provider thread resume fixture first turn complete"; const PROVIDER_THREAD_RESUME_SECOND_FINAL = "provider thread resume fixture second turn complete"; diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.contract.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.contract.test.ts index e0cd30fe5ba3..bf4128ce7ac9 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.contract.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.contract.test.ts @@ -8,7 +8,7 @@ import * as IdAllocator from "../IdAllocator.ts"; import { provideDeterministicTestRuntime } from "./DeterministicRuntime.ts"; import { ORCHESTRATOR_REPLAY_FIXTURES } from "./fixtures/index.ts"; import { materializeFixtureInput } from "./fixtures/shared.ts"; -import { readProviderReplayTranscript } from "./ReplayTranscriptNdjson.ts"; +import { readProviderReplayTranscript } from "@t3tools/provider-testing/replayTranscript"; const decodeCommand = Schema.decodeUnknownEffect(OrchestrationV2Command); const readTranscript = Effect.fn("readOrchestratorReplayContractTranscript")(function* (file: URL) { diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.integration.test.ts index a3925ea409c9..b1a649891bde 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayFixtures.integration.test.ts @@ -36,12 +36,12 @@ import { runOrchestratorV2ProviderReplayScenario, type OrchestratorV2ProviderReplayHarness, } from "./ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; +import { materializeReplayTranscriptRuntimeInstructions } from "./ReplayRuntimeInstructions.ts"; import { - materializeReplayTranscriptRuntimeInstructions, materializeReplayTranscriptWorkspace, readProviderReplayTranscript, -} from "./ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; const readTranscript = Effect.fn("readOrchestratorReplayTranscript")(function* (file: URL) { return yield* readProviderReplayTranscript(file); diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts index 21ba303966ec..a944b38159f0 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts @@ -43,12 +43,12 @@ import { projectionFor, } from "./fixtures/shared.ts"; import { runOrchestratorV2ProviderReplayScenario } from "./ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; +import { materializeReplayTranscriptRuntimeInstructions } from "./ReplayRuntimeInstructions.ts"; import { - materializeReplayTranscriptRuntimeInstructions, materializeReplayTranscriptWorkspace, readProviderReplayTranscript, -} from "./ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; const FIRST_FINAL = "provider thread resume fixture first turn complete"; const SECOND_FINAL = "provider thread resume fixture second turn complete"; diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts index 320310a94717..a2b4ccbc5ef1 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts @@ -23,8 +23,8 @@ import { import { runOrchestratorV2ProviderReplayScenario } from "./ProviderReplayHarness.ts"; import * as ProviderReplayHarness from "./ProviderReplayHarness.ts"; import { runOrchestratorV2Scenario } from "./OrchestratorScenario.ts"; -import { checkpointWorkspace } from "./ReplayFixtureWorkspace.ts"; -import { readProviderReplayTranscript } from "./ReplayTranscriptNdjson.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; +import { readProviderReplayTranscript } from "@t3tools/provider-testing/replayTranscript"; const SCENARIO = "claude_background_subagent_after_root"; const SESSION_ID = "cca274e4-25ae-4171-b972-bbb31118517e"; diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts index 0bb2d5053b4b..3d8ef589050e 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts @@ -23,7 +23,7 @@ import * as Stream from "effect/Stream"; import { TestClock } from "effect/testing"; import * as Orchestrator from "../Orchestrator.ts"; -import type { ProviderReplayGate } from "./ProviderReplayGate.testkit.ts"; +import type { ProviderReplayGate } from "@t3tools/provider-testing/replayGate"; export type OrchestratorV2ScenarioStep = | { diff --git a/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts b/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts index 230ad7aa0feb..318bb4def33c 100644 --- a/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts +++ b/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts @@ -59,7 +59,10 @@ import { type OrchestratorV2Scenario, type OrchestratorV2ScenarioResult, } from "./OrchestratorScenario.ts"; -import { makeProviderReplayGate, type ProviderReplayGate } from "./ProviderReplayGate.testkit.ts"; +import { + makeProviderReplayGate, + type ProviderReplayGate, +} from "@t3tools/provider-testing/replayGate"; export function makeReplayServerConfig( scenario: string, diff --git a/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts b/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts index cbab243192b8..9d05dbd92b5e 100644 --- a/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts @@ -69,7 +69,7 @@ import { GROK_MODEL_SELECTION, } from "./fixtures/shared.ts"; import * as ProviderReplayHarness from "./ProviderReplayHarness.ts"; -import { checkpointWorkspace } from "./ReplayFixtureWorkspace.ts"; +import { checkpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; const encodeJson = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); diff --git a/apps/server/src/orchestration-v2/testkit/ReplayRuntimeInstructions.ts b/apps/server/src/orchestration-v2/testkit/ReplayRuntimeInstructions.ts new file mode 100644 index 000000000000..18f87d1f7a4f --- /dev/null +++ b/apps/server/src/orchestration-v2/testkit/ReplayRuntimeInstructions.ts @@ -0,0 +1,70 @@ +import type { ProviderDriverKind, ProviderReplayTranscript } from "@t3tools/contracts"; + +import { buildRuntimeInstructions } from "../../provider/RuntimeInstructions.ts"; + +/** Adds current runtime context to legacy prompt expectations, keeping outbound matching exact. */ +export function materializeReplayTranscriptRuntimeInstructions( + transcript: ProviderReplayTranscript, + runtime: { readonly driver: ProviderDriverKind; readonly model: string }, +): ProviderReplayTranscript { + const harness = + runtime.driver === "cursor" + ? "Cursor" + : runtime.driver === "grok" + ? "Grok" + : runtime.driver === "acpRegistry" + ? "acpRegistry" + : undefined; + if (harness === undefined) return transcript; + const instructions = buildRuntimeInstructions({ harness, model: runtime.model }); + + return { + ...transcript, + entries: transcript.entries.map((entry) => { + if (entry.type !== "expect_outbound") return entry; + const frame = entry.frame; + if (typeof frame !== "object" || frame === null) return entry; + if ( + runtime.driver === "cursor" && + "type" in frame && + frame.type === "run.start" && + "message" in frame && + typeof frame.message === "string" + ) { + return frame.message.endsWith(instructions) + ? entry + : { ...entry, frame: { ...frame, message: `${frame.message}\n\n${instructions}` } }; + } + if ( + "method" in frame && + frame.method === "session/prompt" && + "params" in frame && + typeof frame.params === "object" && + frame.params !== null && + "prompt" in frame.params && + Array.isArray(frame.params.prompt) + ) { + const prompt: ReadonlyArray = frame.params.prompt; + const lastPart = prompt.at(-1); + if ( + typeof lastPart === "object" && + lastPart !== null && + "type" in lastPart && + lastPart.type === "text" && + "text" in lastPart && + lastPart.text === instructions + ) { + return entry; + } + return { + ...entry, + frame: { + ...frame, + params: { ...frame.params, prompt: [...prompt, { type: "text", text: instructions }] }, + }, + }; + } + return entry; + }), + }; +} diff --git a/apps/server/src/orchestration-v2/testkit/ThreadFork.integration.test.ts b/apps/server/src/orchestration-v2/testkit/ThreadFork.integration.test.ts index a40cb9f5d863..7e439747ea9a 100644 --- a/apps/server/src/orchestration-v2/testkit/ThreadFork.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/ThreadFork.integration.test.ts @@ -31,7 +31,7 @@ import { runOrchestratorV2ProviderReplayScenario } from "./ProviderReplayHarness import { decodeProviderReplayNdjson, materializeReplayTranscriptWorkspace, -} from "./ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; const CODEX_MODEL_SELECTION = { instanceId: ProviderInstanceId.make("codex"), diff --git a/apps/server/src/orchestration-v2/testkit/ThreadMergeBack.integration.test.ts b/apps/server/src/orchestration-v2/testkit/ThreadMergeBack.integration.test.ts index e22d847037ab..1980d16df2b7 100644 --- a/apps/server/src/orchestration-v2/testkit/ThreadMergeBack.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/ThreadMergeBack.integration.test.ts @@ -37,11 +37,11 @@ import { THREAD_MERGE_BACK_SOURCE_PROMPT, } from "./fixtures/shared.ts"; import { runOrchestratorV2ProviderReplayScenario } from "./ProviderReplayHarness.ts"; -import { makeCheckpointWorkspace } from "./ReplayFixtureWorkspace.ts"; +import { makeCheckpointWorkspace } from "@t3tools/provider-testing/replayWorkspace"; import { decodeProviderReplayNdjson, materializeReplayTranscriptWorkspace, -} from "./ReplayTranscriptNdjson.ts"; +} from "@t3tools/provider-testing/replayTranscript"; // These recorded 0.137 rollouts predate injection. Preserve their native fork // and turn exchanges, and assert the new history delivery at the adapter boundary. diff --git a/package.json b/package.json index d98839d3c2b7..078da2b29452 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "tc": "vp run -r --concurrency-limit 2 typecheck", "lint": "vp lint --report-unused-disable-directives", "knip": "knip --preprocessor ./scripts/knip-schemas.ts", - "knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints", + "knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints", "knip:production": "knip --production --preprocessor ./scripts/knip-schemas.ts", "lint:mobile": "node scripts/mobile-native-static-check.ts", "test": "vp run -r test", diff --git a/packages/provider-testing/package.json b/packages/provider-testing/package.json new file mode 100644 index 000000000000..429092733bcf --- /dev/null +++ b/packages/provider-testing/package.json @@ -0,0 +1,33 @@ +{ + "name": "@t3tools/provider-testing", + "private": true, + "type": "module", + "exports": { + "./replayTranscript": { + "types": "./src/replayTranscript.ts", + "import": "./src/replayTranscript.ts" + }, + "./replayGate": { + "types": "./src/replayGate.ts", + "import": "./src/replayGate.ts" + }, + "./replayWorkspace": { + "types": "./src/replayWorkspace.ts", + "import": "./src/replayWorkspace.ts" + } + }, + "scripts": { + "typecheck": "tsc --noEmit", + "test": "vp test run --config ../../vite.config.ts --dir ." + }, + "dependencies": { + "@effect/platform-node": "catalog:", + "@t3tools/contracts": "workspace:*", + "effect": "catalog:" + }, + "devDependencies": { + "@effect/vitest": "catalog:", + "@types/node": "catalog:", + "vite-plus": "catalog:" + } +} diff --git a/packages/provider-testing/src/replayGate.test.ts b/packages/provider-testing/src/replayGate.test.ts new file mode 100644 index 000000000000..72382ab823d4 --- /dev/null +++ b/packages/provider-testing/src/replayGate.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vite-plus/test"; + +import { makeProviderReplayGate } from "./replayGate.ts"; + +describe("makeProviderReplayGate", () => { + it("holds a gated emit until its label is released", async () => { + const gate = makeProviderReplayGate(["approval"]); + let emitted = false; + const emit = gate.beforeEmit("approval").then(() => { + emitted = true; + }); + + expect(await gate.waitForReached("approval")).toBe(true); + expect(emitted).toBe(false); + expect(gate.release("approval")).toBe(true); + await emit; + expect(emitted).toBe(true); + expect(gate.release("approval")).toBe(false); + }); + + it("passes ungated labels through and stops waiting when the emit is aborted", async () => { + const gate = makeProviderReplayGate(["approval"]); + await gate.beforeEmit(undefined); + await gate.beforeEmit("other"); + + const controller = new AbortController(); + const emit = gate.beforeEmit("approval", controller.signal); + controller.abort(); + await emit; + expect(gate.hasReached("approval")).toBe(true); + }); + + it("rejects duplicate labels", () => { + expect(() => makeProviderReplayGate(["approval", "approval"])).toThrow( + "Duplicate provider replay gate label approval.", + ); + }); +}); diff --git a/apps/server/src/orchestration-v2/testkit/ProviderReplayGate.testkit.ts b/packages/provider-testing/src/replayGate.ts similarity index 100% rename from apps/server/src/orchestration-v2/testkit/ProviderReplayGate.testkit.ts rename to packages/provider-testing/src/replayGate.ts diff --git a/packages/provider-testing/src/replayTranscript.test.ts b/packages/provider-testing/src/replayTranscript.test.ts new file mode 100644 index 000000000000..fc5fe57adaf2 --- /dev/null +++ b/packages/provider-testing/src/replayTranscript.test.ts @@ -0,0 +1,96 @@ +import { assert, describe, it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; + +import { + decodeProviderReplayNdjson, + materializeReplayTranscriptWorkspace, +} from "./replayTranscript.ts"; + +const header = JSON.stringify({ + type: "transcript_start", + provider: "codex", + protocol: "codex.app-server", + version: "0.156.1", + scenario: "simple", +}); + +describe("decodeProviderReplayNdjson", () => { + it.effect("reads the header and entries, skipping blank lines", () => + Effect.gen(function* () { + const transcript = yield* decodeProviderReplayNdjson( + [ + header, + "", + JSON.stringify({ type: "expect_outbound", frame: { method: "initialize" } }), + JSON.stringify({ type: "emit_inbound", frame: { result: {} } }), + ].join("\n"), + ); + + assert.strictEqual(transcript.provider, "codex"); + assert.strictEqual(transcript.scenario, "simple"); + assert.deepStrictEqual( + transcript.entries.map((entry) => entry.type), + ["expect_outbound", "emit_inbound"], + ); + }), + ); + + it.effect("rejects a second transcript_start record", () => + Effect.gen(function* () { + const error = yield* Effect.flip(decodeProviderReplayNdjson([header, header].join("\n"))); + + assert.strictEqual(error._tag, "ProviderReplayNdjsonLineParseError"); + assert.strictEqual( + error._tag === "ProviderReplayNdjsonLineParseError" && error.lineNumber, + 2, + ); + }), + ); + + it.effect("requires a header unless fallback metadata is given", () => + Effect.gen(function* () { + const entry = JSON.stringify({ type: "emit_inbound", frame: {} }); + + const error = yield* Effect.flip(decodeProviderReplayNdjson(entry)); + assert.strictEqual(error._tag, "ProviderReplayNdjsonMissingHeaderError"); + + const transcript = yield* decodeProviderReplayNdjson(entry, { + provider: "pi", + protocol: "pi.rpc-jsonl", + version: "1", + scenario: "fallback", + }); + assert.strictEqual(transcript.entries.length, 1); + }), + ); +}); + +describe("materializeReplayTranscriptWorkspace", () => { + it("replaces workspace placeholders in outbound frames only", () => { + const transcript = materializeReplayTranscriptWorkspace( + { + provider: "codex", + protocol: "codex.app-server", + version: "0.156.1", + scenario: "simple", + entries: [ + { + type: "expect_outbound", + frame: { params: { cwd: "", argv: [""] } }, + }, + { type: "emit_inbound", frame: { cwd: "" } }, + ], + }, + "/tmp/fixture", + ); + + assert.deepStrictEqual(transcript.entries[0], { + type: "expect_outbound", + frame: { params: { cwd: "/tmp/fixture", argv: ["/tmp/fixture"] } }, + }); + assert.deepStrictEqual(transcript.entries[1], { + type: "emit_inbound", + frame: { cwd: "" }, + }); + }); +}); diff --git a/apps/server/src/orchestration-v2/testkit/ReplayTranscriptNdjson.ts b/packages/provider-testing/src/replayTranscript.ts similarity index 70% rename from apps/server/src/orchestration-v2/testkit/ReplayTranscriptNdjson.ts rename to packages/provider-testing/src/replayTranscript.ts index 1b62ca0f126e..67bd754f5d2d 100644 --- a/apps/server/src/orchestration-v2/testkit/ReplayTranscriptNdjson.ts +++ b/packages/provider-testing/src/replayTranscript.ts @@ -2,7 +2,6 @@ import { ProviderReplayEntry, ProviderReplayNdjsonRecord, ProviderReplayTranscript, - type ProviderDriverKind, type ProviderReplayTranscriptHeader, } from "@t3tools/contracts"; import * as Effect from "effect/Effect"; @@ -10,8 +9,6 @@ import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; -import { buildRuntimeInstructions } from "../../provider/RuntimeInstructions.ts"; - export class ProviderReplayNdjsonLineParseError extends Schema.TaggedError()( "ProviderReplayNdjsonLineParseError", { @@ -93,73 +90,6 @@ export function materializeReplayTranscriptWorkspace( }; } -/** Adds current runtime context to legacy prompt expectations, keeping outbound matching exact. */ -export function materializeReplayTranscriptRuntimeInstructions( - transcript: ProviderReplayTranscript, - runtime: { readonly driver: ProviderDriverKind; readonly model: string }, -): ProviderReplayTranscript { - const harness = - runtime.driver === "cursor" - ? "Cursor" - : runtime.driver === "grok" - ? "Grok" - : runtime.driver === "acpRegistry" - ? "acpRegistry" - : undefined; - if (harness === undefined) return transcript; - const instructions = buildRuntimeInstructions({ harness, model: runtime.model }); - - return { - ...transcript, - entries: transcript.entries.map((entry) => { - if (entry.type !== "expect_outbound") return entry; - const frame = entry.frame; - if (typeof frame !== "object" || frame === null) return entry; - if ( - runtime.driver === "cursor" && - "type" in frame && - frame.type === "run.start" && - "message" in frame && - typeof frame.message === "string" - ) { - return frame.message.endsWith(instructions) - ? entry - : { ...entry, frame: { ...frame, message: `${frame.message}\n\n${instructions}` } }; - } - if ( - "method" in frame && - frame.method === "session/prompt" && - "params" in frame && - typeof frame.params === "object" && - frame.params !== null && - "prompt" in frame.params && - Array.isArray(frame.params.prompt) - ) { - const prompt: ReadonlyArray = frame.params.prompt; - const lastPart = prompt.at(-1); - if ( - typeof lastPart === "object" && - lastPart !== null && - "type" in lastPart && - lastPart.type === "text" && - "text" in lastPart && - lastPart.text === instructions - ) { - return entry; - } - return { - ...entry, - frame: { - ...frame, - params: { ...frame.params, prompt: [...prompt, { type: "text", text: instructions }] }, - }, - }; - } - return entry; - }), - }; -} - const decodeReplayRecord = Schema.decodeUnknownSync( Schema.fromJsonString(ProviderReplayNdjsonRecord), ); diff --git a/apps/server/src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts b/packages/provider-testing/src/replayWorkspace.ts similarity index 100% rename from apps/server/src/orchestration-v2/testkit/ReplayFixtureWorkspace.ts rename to packages/provider-testing/src/replayWorkspace.ts diff --git a/packages/provider-testing/tsconfig.json b/packages/provider-testing/tsconfig.json new file mode 100644 index 000000000000..374bac55202d --- /dev/null +++ b/packages/provider-testing/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"] + }, + "include": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb5c65446c13..04e55bb3b4d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -637,6 +637,9 @@ importers: '@t3tools/contracts': specifier: workspace:* version: link:../../packages/contracts + '@t3tools/provider-testing': + specifier: workspace:* + version: link:../../packages/provider-testing '@t3tools/shared': specifier: workspace:* version: link:../../packages/shared @@ -1075,6 +1078,28 @@ importers: specifier: 1.0.0 version: 1.0.0(@types/node@24.12.4)(@vitest/ui@5.0.1)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + packages/provider-testing: + dependencies: + '@effect/platform-node': + specifier: 4.0.1 + version: 4.0.1(bufferutil@4.1.0)(effect@4.0.1(patch_hash=a33cba07c41f32374c2aaa86ea4a84d3ab9a872a78c94b65e929b19f8361856f))(redis@6.2.1)(utf-8-validate@6.0.6) + '@t3tools/contracts': + specifier: workspace:* + version: link:../contracts + effect: + specifier: 4.0.1 + version: 4.0.1(patch_hash=a33cba07c41f32374c2aaa86ea4a84d3ab9a872a78c94b65e929b19f8361856f) + devDependencies: + '@effect/vitest': + specifier: 4.0.1 + version: 4.0.1(patch_hash=359f6fb2f7b3ec145bb72208edb9034f02489791aa2491a55cdbd69bd56ee0d2)(@types/node@24.12.4)(@vitest/ui@5.0.1)(bufferutil@4.1.0)(effect@4.0.1(patch_hash=a33cba07c41f32374c2aaa86ea4a84d3ab9a872a78c94b65e929b19f8361856f))(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + '@types/node': + specifier: 24.12.4 + version: 24.12.4 + vite-plus: + specifier: 1.0.0 + version: 1.0.0(@types/node@24.12.4)(@vitest/ui@5.0.1(vitest@5.0.1))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + packages/shared: dependencies: '@noble/curves': diff --git a/scripts/release-smoke.ts b/scripts/release-smoke.ts index 60ffe8e635fe..296b3ac1441f 100644 --- a/scripts/release-smoke.ts +++ b/scripts/release-smoke.ts @@ -29,6 +29,7 @@ const workspaceFiles = [ "packages/ssh/package.json", "packages/tailscale/package.json", "packages/provider-core/package.json", + "packages/provider-testing/package.json", "packages/effect-acp/package.json", "packages/effect-codex-app-server/package.json", "scripts/package.json",