From 2c4b3857109422c367fdf817f6d3096bc5148e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Mon, 28 Sep 2026 14:01:38 +0200 Subject: [PATCH] refactor(replay): move adapter leaves into replay-port --- packages/replay-port/package.json | 25 +++++++++++++++++++ .../session-replay-maestro-observer.test.ts | 2 +- .../daemon-port}/replay-script-selection.ts | 0 .../daemon-port}/replay-session-binding.ts | 0 .../src/daemon-port}/session-replay-heal.ts | 0 .../session-replay-maestro-observer.ts | 0 .../session-replay-video-recording.ts | 0 .../session-test-shard-devices.ts | 0 pnpm-lock.yaml | 3 +++ scripts/layering/architecture-ownership.ts | 11 +------- .../__tests__/replay-device-selection.test.ts | 2 +- src/daemon/handlers/session-replay-command.ts | 3 ++- src/daemon/replay-device-selection.ts | 2 +- src/daemon/replay/index.ts | 8 ------ .../internal/session-replay-divergence.ts | 2 +- .../session-replay-maestro-runtime.ts | 4 +-- .../internal/session-replay-runtime-plan.ts | 2 +- .../session-replay-runtime-session.ts | 2 +- src/daemon/replay/internal/test-command.ts | 4 +-- src/daemon/session-replay-coordinator.ts | 2 +- 20 files changed, 42 insertions(+), 30 deletions(-) rename src/daemon/replay/internal/__tests__/session-replay-maestro-label.test.ts => packages/replay-port/src/daemon-port/__tests__/session-replay-maestro-observer.test.ts (94%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/replay-script-selection.ts (100%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/replay-session-binding.ts (100%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/session-replay-heal.ts (100%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/session-replay-maestro-observer.ts (100%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/session-replay-video-recording.ts (100%) rename {src/daemon/replay/internal => packages/replay-port/src/daemon-port}/session-test-shard-devices.ts (100%) diff --git a/packages/replay-port/package.json b/packages/replay-port/package.json index 7bb2c3a491..2c730a0114 100644 --- a/packages/replay-port/package.json +++ b/packages/replay-port/package.json @@ -9,6 +9,7 @@ "@agent-device/ad-script": "workspace:*", "@agent-device/capture-kit": "workspace:*", "@agent-device/contracts": "workspace:*", + "@agent-device/device-selection": "workspace:*", "@agent-device/host-kit": "workspace:*", "@agent-device/kernel": "workspace:*", "@agent-device/maestro": "workspace:*", @@ -28,10 +29,26 @@ "types": "./src/daemon-port/replay-dispatch-envelope.ts", "default": "./src/daemon-port/replay-dispatch-envelope.ts" }, + "./replay-script-selection": { + "types": "./src/daemon-port/replay-script-selection.ts", + "default": "./src/daemon-port/replay-script-selection.ts" + }, + "./replay-session-binding": { + "types": "./src/daemon-port/replay-session-binding.ts", + "default": "./src/daemon-port/replay-session-binding.ts" + }, "./script-source": { "types": "./src/daemon-port/script-source.ts", "default": "./src/daemon-port/script-source.ts" }, + "./session-replay-heal": { + "types": "./src/daemon-port/session-replay-heal.ts", + "default": "./src/daemon-port/session-replay-heal.ts" + }, + "./session-replay-maestro-observer": { + "types": "./src/daemon-port/session-replay-maestro-observer.ts", + "default": "./src/daemon-port/session-replay-maestro-observer.ts" + }, "./session-replay-maestro-request": { "types": "./src/daemon-port/session-replay-maestro-request.ts", "default": "./src/daemon-port/session-replay-maestro-request.ts" @@ -60,6 +77,10 @@ "types": "./src/session-replay-vars.ts", "default": "./src/session-replay-vars.ts" }, + "./session-replay-video-recording": { + "types": "./src/daemon-port/session-replay-video-recording.ts", + "default": "./src/daemon-port/session-replay-video-recording.ts" + }, "./session-test-infrastructure": { "types": "./src/daemon-port/session-test-infrastructure.ts", "default": "./src/daemon-port/session-test-infrastructure.ts" @@ -68,6 +89,10 @@ "types": "./src/daemon-port/session-test-outcome.ts", "default": "./src/daemon-port/session-test-outcome.ts" }, + "./session-test-shard-devices": { + "types": "./src/daemon-port/session-test-shard-devices.ts", + "default": "./src/daemon-port/session-test-shard-devices.ts" + }, "./target-classification": { "types": "./src/daemon-port/target-classification.ts", "default": "./src/daemon-port/target-classification.ts" diff --git a/src/daemon/replay/internal/__tests__/session-replay-maestro-label.test.ts b/packages/replay-port/src/daemon-port/__tests__/session-replay-maestro-observer.test.ts similarity index 94% rename from src/daemon/replay/internal/__tests__/session-replay-maestro-label.test.ts rename to packages/replay-port/src/daemon-port/__tests__/session-replay-maestro-observer.test.ts index bde6978873..09e346aed9 100644 --- a/src/daemon/replay/internal/__tests__/session-replay-maestro-label.test.ts +++ b/packages/replay-port/src/daemon-port/__tests__/session-replay-maestro-observer.test.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { expect, test, vi } from 'vitest'; import type { MaestroActionEvent } from '@agent-device/maestro'; -import { mkdtempForTestSync } from '../../../../__tests__/test-utils/tmp-dir.ts'; +import { mkdtempForTestSync } from '../../tmp-dir.fixtures.ts'; import { createMaestroReplayObserver } from '../session-replay-maestro-observer.ts'; test('forwards command labels to progress and replay trace projection', () => { diff --git a/src/daemon/replay/internal/replay-script-selection.ts b/packages/replay-port/src/daemon-port/replay-script-selection.ts similarity index 100% rename from src/daemon/replay/internal/replay-script-selection.ts rename to packages/replay-port/src/daemon-port/replay-script-selection.ts diff --git a/src/daemon/replay/internal/replay-session-binding.ts b/packages/replay-port/src/daemon-port/replay-session-binding.ts similarity index 100% rename from src/daemon/replay/internal/replay-session-binding.ts rename to packages/replay-port/src/daemon-port/replay-session-binding.ts diff --git a/src/daemon/replay/internal/session-replay-heal.ts b/packages/replay-port/src/daemon-port/session-replay-heal.ts similarity index 100% rename from src/daemon/replay/internal/session-replay-heal.ts rename to packages/replay-port/src/daemon-port/session-replay-heal.ts diff --git a/src/daemon/replay/internal/session-replay-maestro-observer.ts b/packages/replay-port/src/daemon-port/session-replay-maestro-observer.ts similarity index 100% rename from src/daemon/replay/internal/session-replay-maestro-observer.ts rename to packages/replay-port/src/daemon-port/session-replay-maestro-observer.ts diff --git a/src/daemon/replay/internal/session-replay-video-recording.ts b/packages/replay-port/src/daemon-port/session-replay-video-recording.ts similarity index 100% rename from src/daemon/replay/internal/session-replay-video-recording.ts rename to packages/replay-port/src/daemon-port/session-replay-video-recording.ts diff --git a/src/daemon/replay/internal/session-test-shard-devices.ts b/packages/replay-port/src/daemon-port/session-test-shard-devices.ts similarity index 100% rename from src/daemon/replay/internal/session-test-shard-devices.ts rename to packages/replay-port/src/daemon-port/session-test-shard-devices.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47ca30ed72..b423209e03 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -515,6 +515,9 @@ importers: '@agent-device/contracts': specifier: workspace:* version: link:../contracts + '@agent-device/device-selection': + specifier: workspace:* + version: link:../device-selection '@agent-device/host-kit': specifier: workspace:* version: link:../host-kit diff --git a/scripts/layering/architecture-ownership.ts b/scripts/layering/architecture-ownership.ts index 084aae0264..21aad68ba2 100644 --- a/scripts/layering/architecture-ownership.ts +++ b/scripts/layering/architecture-ownership.ts @@ -13,16 +13,7 @@ export type LogicalModulePolicy = Readonly<{ const DAEMON_REPLAY_FACADE = { root: 'src/daemon/replay/index.ts', - exports: [ - 'appTargetResolutionOptions', - 'bindReplaySession', - 'buildMaestroReplayTargetDeviceResolutionOptions', - 'buildReplayScriptPlatformFlags', - 'healedScriptSiblingPath', - 'readScriptReplaySelection', - 'runReplayCommand', - 'runReplayTestCommand', - ], + exports: ['runReplayCommand', 'runReplayTestCommand'], } as const; const DAEMON_SESSION_LIFECYCLE_FACADE = { diff --git a/src/daemon/__tests__/replay-device-selection.test.ts b/src/daemon/__tests__/replay-device-selection.test.ts index c9d8db3cfe..0f499d5eff 100644 --- a/src/daemon/__tests__/replay-device-selection.test.ts +++ b/src/daemon/__tests__/replay-device-selection.test.ts @@ -3,7 +3,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { parseReplayInput } from '@agent-device/ad-script'; import { buildReplayTargetDeviceResolution } from '../replay-device-selection.ts'; -import { buildReplayScriptPlatformFlags } from '../replay/index.ts'; +import { buildReplayScriptPlatformFlags } from '@agent-device/replay-port/replay-script-selection'; import { mkdtempForTestSync } from '../../__tests__/test-utils/tmp-dir.ts'; import { replayScriptSourceBundleFor } from '../../__tests__/test-utils/replay-script-source.ts'; diff --git a/src/daemon/handlers/session-replay-command.ts b/src/daemon/handlers/session-replay-command.ts index 448a85ae2b..7109133c7d 100644 --- a/src/daemon/handlers/session-replay-command.ts +++ b/src/daemon/handlers/session-replay-command.ts @@ -6,7 +6,8 @@ import { bindInternalObservationAuthority } from '../internal-observation.ts'; import type { LeaseRegistry } from '../lease-registry.ts'; import type { BindDeviceRuntime, InspectDeviceRuntimeFacts } from '../request-runtime-binding.ts'; import type { PlatformResourceCleanup } from '../platform-resource-cleanup.ts'; -import { bindReplaySession, runReplayCommand, runReplayTestCommand } from '../replay/index.ts'; +import { runReplayCommand, runReplayTestCommand } from '../replay/index.ts'; +import { bindReplaySession } from '@agent-device/replay-port/replay-session-binding'; import { replayInvokeOverDispatch, splitReplayCommandRequest, diff --git a/src/daemon/replay-device-selection.ts b/src/daemon/replay-device-selection.ts index 25f95be8cd..4eafe33aa2 100644 --- a/src/daemon/replay-device-selection.ts +++ b/src/daemon/replay-device-selection.ts @@ -9,7 +9,7 @@ import { buildMaestroReplayTargetDeviceResolutionOptions, buildReplayScriptPlatformFlags, readScriptReplaySelection, -} from './replay/index.ts'; +} from '@agent-device/replay-port/replay-script-selection'; export type ReplayTargetDeviceResolution = { flags: CommandFlags; diff --git a/src/daemon/replay/index.ts b/src/daemon/replay/index.ts index d443840eed..28b2a346d5 100644 --- a/src/daemon/replay/index.ts +++ b/src/daemon/replay/index.ts @@ -1,11 +1,3 @@ /** Public replay application seam for daemon handlers and their admitted owner capabilities. */ export { runReplayCommand } from './internal/native-command.ts'; export { runReplayTestCommand } from './internal/test-command.ts'; -export { bindReplaySession } from './internal/replay-session-binding.ts'; -export { healedScriptSiblingPath } from './internal/session-replay-heal.ts'; -export { - appTargetResolutionOptions, - buildMaestroReplayTargetDeviceResolutionOptions, - buildReplayScriptPlatformFlags, - readScriptReplaySelection, -} from './internal/replay-script-selection.ts'; diff --git a/src/daemon/replay/internal/session-replay-divergence.ts b/src/daemon/replay/internal/session-replay-divergence.ts index 9d81ffaa2e..95bcd80022 100644 --- a/src/daemon/replay/internal/session-replay-divergence.ts +++ b/src/daemon/replay/internal/session-replay-divergence.ts @@ -7,7 +7,7 @@ import { displayLabel, formatRole } from '@agent-device/capture-kit/snapshot-lin import type { ResponseLevel } from '@agent-device/kernel/contracts'; import type { DaemonError } from '@agent-device/kernel/errors'; import type { SnapshotNode } from '@agent-device/kernel/snapshot'; -import { collectReplaySelectorCandidates } from './session-replay-heal.ts'; +import { collectReplaySelectorCandidates } from '@agent-device/replay-port/session-replay-heal'; import { buildSelectorCandidates, resolveReplaySuggestionCandidate } from '@agent-device/selectors'; import { collectSettleChromeRefs } from '@agent-device/capture-kit/snapshot-chrome'; import { buildAndPersistReplayDivergenceResume } from './session-replay-resume.ts'; diff --git a/src/daemon/replay/internal/session-replay-maestro-runtime.ts b/src/daemon/replay/internal/session-replay-maestro-runtime.ts index 4980000e19..348537f0d4 100644 --- a/src/daemon/replay/internal/session-replay-maestro-runtime.ts +++ b/src/daemon/replay/internal/session-replay-maestro-runtime.ts @@ -18,13 +18,13 @@ import { import { createDaemonMaestroRuntimePort } from '@agent-device/maestro/daemon-runtime-port'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { buildReplayBuiltinVars } from '@agent-device/replay-port/session-replay-vars'; -import { createMaestroReplayObserver } from './session-replay-maestro-observer.ts'; +import { createMaestroReplayObserver } from '@agent-device/replay-port/session-replay-maestro-observer'; import { maestroOperationDispatchRequest } from '@agent-device/replay-port/session-replay-maestro-request'; import { buildTypedMaestroReplayErrorResponse, buildTypedMaestroSuccessResponse, } from './session-replay-maestro-response.ts'; -import { buildMaestroReplayTargetDeviceResolutionOptions } from './replay-script-selection.ts'; +import { buildMaestroReplayTargetDeviceResolutionOptions } from '@agent-device/replay-port/replay-script-selection'; import { readReplayScriptSourceFile, REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE, diff --git a/src/daemon/replay/internal/session-replay-runtime-plan.ts b/src/daemon/replay/internal/session-replay-runtime-plan.ts index 1b361352a4..7c27f76e7e 100644 --- a/src/daemon/replay/internal/session-replay-runtime-plan.ts +++ b/src/daemon/replay/internal/session-replay-runtime-plan.ts @@ -8,7 +8,7 @@ import type { ReplaySessionState, ReplaySessionStore, } from '@agent-device/replay-port/command-types'; -import { buildReplayScriptPlatformFlags } from './replay-script-selection.ts'; +import { buildReplayScriptPlatformFlags } from '@agent-device/replay-port/replay-script-selection'; import { inspectAdReplay, type AdReplayManifest, diff --git a/src/daemon/replay/internal/session-replay-runtime-session.ts b/src/daemon/replay/internal/session-replay-runtime-session.ts index bf4fb80db1..325abf3eab 100644 --- a/src/daemon/replay/internal/session-replay-runtime-session.ts +++ b/src/daemon/replay/internal/session-replay-runtime-session.ts @@ -6,7 +6,7 @@ import type { ReplaySessionView, } from '@agent-device/replay-port/command-types'; import { expandSessionPath } from '@agent-device/host-kit/session-paths'; -import { healedScriptSiblingPath } from './session-replay-heal.ts'; +import { healedScriptSiblingPath } from '@agent-device/replay-port/session-replay-heal'; import { errorResponse, noActiveSessionError, diff --git a/src/daemon/replay/internal/test-command.ts b/src/daemon/replay/internal/test-command.ts index c8cf3450fd..957df25cd4 100644 --- a/src/daemon/replay/internal/test-command.ts +++ b/src/daemon/replay/internal/test-command.ts @@ -36,7 +36,7 @@ import { buildReplayTestShardFlags, buildReplayTestShardTargetResolver, readReplayTestShardSelection, -} from './session-test-shard-devices.ts'; +} from '@agent-device/replay-port/session-test-shard-devices'; import { toReplayTestAttemptOutcome, toReplayTestFinalizeFailure, @@ -45,7 +45,7 @@ import { buildReplayTestVideoOpenLifecycle, finalizeReplayTestVideoRecording, startReplayTestVideoRecordingIfReady, -} from './session-replay-video-recording.ts'; +} from '@agent-device/replay-port/session-replay-video-recording'; import { REPLAY_ONLY_TEST_FLAG_REJECTIONS } from '@agent-device/replay-port/session-replay-test-policy'; import { errorResponse, diff --git a/src/daemon/session-replay-coordinator.ts b/src/daemon/session-replay-coordinator.ts index 787fde430d..7b288f6b6b 100644 --- a/src/daemon/session-replay-coordinator.ts +++ b/src/daemon/session-replay-coordinator.ts @@ -16,7 +16,7 @@ import { scriptTargetPath, type SessionScriptPublicationState, } from './session-script-publication-state.ts'; -import { healedScriptSiblingPath } from './replay/index.ts'; +import { healedScriptSiblingPath } from '@agent-device/replay-port/session-replay-heal'; import type { ReplayCoordinator, ReplayResumeStamper,