diff --git a/packages/contracts/src/replay-divergence.ts b/packages/contracts/src/replay-divergence.ts index be4efbe917..d749e7128c 100644 --- a/packages/contracts/src/replay-divergence.ts +++ b/packages/contracts/src/replay-divergence.ts @@ -181,7 +181,7 @@ export type ReplayDivergenceOverflow = { /** * ADR 0012 decision 6, R3: the daemon-computed repair routing hint. Always * defined (never absent/null) — the mapping in - * `src/daemon/replay/internal/session-replay-repair-hint.ts` is total, defaulting + * `packages/replay-port/src/daemon-port/repair-hint.ts` is total, defaulting * to `manual` whenever no safer routing can be proven. A small fixed token, * so it is carried at every response level (including `--level digest`) and * every projection (text, JSON, client `AppError`, MCP `structuredContent`). diff --git a/packages/replay-port/package.json b/packages/replay-port/package.json index 8d438f07cd..dac8e0c68b 100644 --- a/packages/replay-port/package.json +++ b/packages/replay-port/package.json @@ -7,9 +7,23 @@ "description": "Daemon-side replay port: the adapter over the ad-replay, ad-script and replay-test engines.", "dependencies": { "@agent-device/ad-script": "workspace:*", - "@agent-device/contracts": "workspace:*" + "@agent-device/contracts": "workspace:*", + "@agent-device/kernel": "workspace:*", + "@agent-device/selectors": "workspace:*" }, "exports": { + "./target-token": { + "types": "./src/daemon-port/target-token.ts", + "default": "./src/daemon-port/target-token.ts" + }, + "./repair-hint": { + "types": "./src/daemon-port/repair-hint.ts", + "default": "./src/daemon-port/repair-hint.ts" + }, + "./script-source": { + "types": "./src/daemon-port/script-source.ts", + "default": "./src/daemon-port/script-source.ts" + }, "./session-replay-vars": { "types": "./src/session-replay-vars.ts", "default": "./src/session-replay-vars.ts" diff --git a/src/daemon/replay/internal/__tests__/session-replay-repair-hint.test.ts b/packages/replay-port/src/daemon-port/__tests__/repair-hint.test.ts similarity index 99% rename from src/daemon/replay/internal/__tests__/session-replay-repair-hint.test.ts rename to packages/replay-port/src/daemon-port/__tests__/repair-hint.test.ts index 2fdfdafd6e..f2a77c5cea 100644 --- a/src/daemon/replay/internal/__tests__/session-replay-repair-hint.test.ts +++ b/packages/replay-port/src/daemon-port/__tests__/repair-hint.test.ts @@ -2,10 +2,7 @@ import { test } from 'vitest'; import assert from 'node:assert/strict'; import type { RawSnapshotNode, SnapshotNode } from '@agent-device/kernel/snapshot'; import type { TargetAnnotationV1 } from '@agent-device/contracts/replay'; -import { - computeReplayRepairHint, - type ReplayRepairHintCapture, -} from '../session-replay-repair-hint.ts'; +import { computeReplayRepairHint, type ReplayRepairHintCapture } from '../repair-hint.ts'; /** * ADR 0012 decision 6, R3: `computeReplayRepairHint` must be a TOTAL mapping diff --git a/src/daemon/__tests__/replay-script-source.test.ts b/packages/replay-port/src/daemon-port/__tests__/script-source.test.ts similarity index 90% rename from src/daemon/__tests__/replay-script-source.test.ts rename to packages/replay-port/src/daemon-port/__tests__/script-source.test.ts index e11679bfd0..e7d35f2084 100644 --- a/src/daemon/__tests__/replay-script-source.test.ts +++ b/packages/replay-port/src/daemon-port/__tests__/script-source.test.ts @@ -1,6 +1,6 @@ import { expect, test } from 'vitest'; import { AppError } from '@agent-device/kernel/errors'; -import { readReplayScriptSourceFile } from '../replay-script-source.ts'; +import { readReplayScriptSourceFile } from '../script-source.ts'; test('reading a file the bundle does not carry names the file and the entry', () => { const bundle = { entry: '/flows/login.yaml', files: { '/flows/login.yaml': '---\n- back\n' } }; diff --git a/src/daemon/replay/internal/__tests__/session-replay-target-token.test.ts b/packages/replay-port/src/daemon-port/__tests__/target-token.test.ts similarity index 96% rename from src/daemon/replay/internal/__tests__/session-replay-target-token.test.ts rename to packages/replay-port/src/daemon-port/__tests__/target-token.test.ts index 12de6251a2..585c5fa3c7 100644 --- a/src/daemon/replay/internal/__tests__/session-replay-target-token.test.ts +++ b/packages/replay-port/src/daemon-port/__tests__/target-token.test.ts @@ -3,7 +3,7 @@ import type { SessionAction } from '@agent-device/contracts/session'; import { test } from 'vitest'; import assert from 'node:assert/strict'; -import { extractReplayTargetToken, readRefLabel } from '../session-replay-target-token.ts'; +import { extractReplayTargetToken, readRefLabel } from '../target-token.ts'; // --------------------------------------------------------------------------- diff --git a/src/daemon/replay/internal/session-replay-repair-hint.ts b/packages/replay-port/src/daemon-port/repair-hint.ts similarity index 96% rename from src/daemon/replay/internal/session-replay-repair-hint.ts rename to packages/replay-port/src/daemon-port/repair-hint.ts index 7b3759894b..bfddf9bc21 100644 --- a/src/daemon/replay/internal/session-replay-repair-hint.ts +++ b/packages/replay-port/src/daemon-port/repair-hint.ts @@ -1,5 +1,5 @@ /** - * ADR 0012 decision 6, R3: the daemon-side `repairHint` computation. + * ADR 0012 decision 6, R3: the replay port's `repairHint` computation. * * Computed daemon-side at divergence time, never by the agent, from (i) the * recorded `target-v1` evidence for the diverged action (decision 3's @@ -13,8 +13,7 @@ * evidence, or a sparse/unavailable capture — so `repairHint` is always * defined. * - * Lives in the daemon zone because the container-presence test - * below is a genuine structural containment check over `parentIndex` — the + * The container-presence test below is a genuine structural containment check over `parentIndex` — the * same tree-walking machinery decision 3's own identity-set filter uses * (`buildAncestryChain`/`computeScrollRegionKey`, `@agent-device/selectors/target-evidence`) * — not a flat identity-string search. diff --git a/src/daemon/replay-script-source.ts b/packages/replay-port/src/daemon-port/script-source.ts similarity index 100% rename from src/daemon/replay-script-source.ts rename to packages/replay-port/src/daemon-port/script-source.ts diff --git a/src/daemon/replay/internal/session-replay-target-token.ts b/packages/replay-port/src/daemon-port/target-token.ts similarity index 100% rename from src/daemon/replay/internal/session-replay-target-token.ts rename to packages/replay-port/src/daemon-port/target-token.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7989d46b82..25c6aa7cad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -512,6 +512,12 @@ importers: '@agent-device/contracts': specifier: workspace:* version: link:../contracts + '@agent-device/kernel': + specifier: workspace:* + version: link:../kernel + '@agent-device/selectors': + specifier: workspace:* + version: link:../selectors packages/replay-test: dependencies: diff --git a/src/daemon/__tests__/request-save-script-transports.test.ts b/src/daemon/__tests__/request-save-script-transports.test.ts index e750abceb9..730a37d25a 100644 --- a/src/daemon/__tests__/request-save-script-transports.test.ts +++ b/src/daemon/__tests__/request-save-script-transports.test.ts @@ -18,7 +18,7 @@ import net from 'node:net'; import path from 'node:path'; import { afterEach, expect, test } from 'vitest'; import { LeaseRegistry } from '../lease-registry.ts'; -import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '../replay-script-source.ts'; +import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '@agent-device/replay-port/script-source'; import { createRequestHandler } from './test-device-runtime-gateway.ts'; import { SessionStore } from '../session-store.ts'; import { createDaemonHttpServer } from '../server/http-server.ts'; diff --git a/src/daemon/replay-device-selection.ts b/src/daemon/replay-device-selection.ts index 92f0c09d67..25f95be8cd 100644 --- a/src/daemon/replay-device-selection.ts +++ b/src/daemon/replay-device-selection.ts @@ -2,7 +2,7 @@ import { inspectMaestroFlow } from '@agent-device/maestro'; import { parseReplayInput, resolveReplayFormat } from '@agent-device/ad-script'; import type { ResolveTargetDeviceOptions } from '@agent-device/device-selection/dispatch-resolve'; import type { CommandFlags } from '@agent-device/contracts/command'; -import { readReplayScriptSourceFile } from './replay-script-source.ts'; +import { readReplayScriptSourceFile } from '@agent-device/replay-port/script-source'; import type { DaemonRequest } from './daemon-request.ts'; import { appTargetResolutionOptions, diff --git a/src/daemon/replay/internal/__tests__/session-replay-script-source.test.ts b/src/daemon/replay/internal/__tests__/session-replay-script-source.test.ts index 97c31e20a4..f6d24bbb98 100644 --- a/src/daemon/replay/internal/__tests__/session-replay-script-source.test.ts +++ b/src/daemon/replay/internal/__tests__/session-replay-script-source.test.ts @@ -26,7 +26,7 @@ import { maestroScriptSourceBundleFor, replayScriptSourceBundleFor, } from '../../../../__tests__/test-utils/replay-script-source.ts'; -import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '../../../replay-script-source.ts'; +import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '@agent-device/replay-port/script-source'; import { captureSnapshotThroughLegacyDispatchFixture, legacyDispatchCapture, diff --git a/src/daemon/replay/internal/native-command.ts b/src/daemon/replay/internal/native-command.ts index 6dcfd19c9f..66c4542a33 100644 --- a/src/daemon/replay/internal/native-command.ts +++ b/src/daemon/replay/internal/native-command.ts @@ -13,7 +13,7 @@ import { prepareReplayPlan, routeMaestroReplay } from './session-replay-runtime- import { readReplayScriptSourceFile, REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE, -} from '../../replay-script-source.ts'; +} from '@agent-device/replay-port/script-source'; import { prepareReplaySession } from './session-replay-runtime-session.ts'; import type { ReplayCommand, diff --git a/src/daemon/replay/internal/session-replay-divergence.ts b/src/daemon/replay/internal/session-replay-divergence.ts index 3dde9a1b59..613bbedf9f 100644 --- a/src/daemon/replay/internal/session-replay-divergence.ts +++ b/src/daemon/replay/internal/session-replay-divergence.ts @@ -15,7 +15,7 @@ import { formatDivergenceActionLabel, isTouchTargetCommand } from '@agent-device import { computeReplayRepairHint, type ReplayRepairHintCapture, -} from './session-replay-repair-hint.ts'; +} from '@agent-device/replay-port/repair-hint'; import type { ReplayResumeStamper, ReplaySessionObservation, diff --git a/src/daemon/replay/internal/session-replay-maestro-failure.ts b/src/daemon/replay/internal/session-replay-maestro-failure.ts index 5e0a766e0e..1e1a4f713a 100644 --- a/src/daemon/replay/internal/session-replay-maestro-failure.ts +++ b/src/daemon/replay/internal/session-replay-maestro-failure.ts @@ -26,7 +26,7 @@ import { type DivergenceFieldSanitizer, } from './session-replay-divergence.ts'; import { boundReplayDivergenceForSession } from './session-replay-divergence-publication.ts'; -import { computeReplayRepairHint } from './session-replay-repair-hint.ts'; +import { computeReplayRepairHint } from '@agent-device/replay-port/repair-hint'; import { buildReplayDivergenceFailureResponseFromDescriptor, hoistReplayFailureCauseDiagnosticMeta, diff --git a/src/daemon/replay/internal/session-replay-maestro-runtime.ts b/src/daemon/replay/internal/session-replay-maestro-runtime.ts index 1e9a960197..2e4235e628 100644 --- a/src/daemon/replay/internal/session-replay-maestro-runtime.ts +++ b/src/daemon/replay/internal/session-replay-maestro-runtime.ts @@ -28,7 +28,7 @@ import { buildMaestroReplayTargetDeviceResolutionOptions } from './replay-script import { readReplayScriptSourceFile, REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE, -} from '../../replay-script-source.ts'; +} from '@agent-device/replay-port/script-source'; import type { ReplayScriptSourceBundle } from '@agent-device/contracts/replay'; import type { ReplayCommand, ReplayDispatchRequest, ReplaySessionStore } from './command-types.ts'; import { diff --git a/src/daemon/replay/internal/session-replay-target-verification.ts b/src/daemon/replay/internal/session-replay-target-verification.ts index 56c050359c..1f049e659f 100644 --- a/src/daemon/replay/internal/session-replay-target-verification.ts +++ b/src/daemon/replay/internal/session-replay-target-verification.ts @@ -49,11 +49,11 @@ import type { import { computeReplayRepairHint, type ReplayRepairHintCapture, -} from './session-replay-repair-hint.ts'; +} from '@agent-device/replay-port/repair-hint'; import { buildReplayDivergenceFailureResponse } from './session-replay-runtime-failure-response.ts'; import { buildAndPersistReplayDivergenceResume } from './session-replay-resume.ts'; import { classifyReplayTarget } from './session-replay-target-classification.ts'; -import { extractReplayTargetToken, readRefLabel } from './session-replay-target-token.ts'; +import { extractReplayTargetToken, readRefLabel } from '@agent-device/replay-port/target-token'; // --------------------------------------------------------------------------- // #1555 review R3 ("target verification must happen INSIDE the engine"): the diff --git a/src/daemon/replay/internal/session-test-source-discovery.ts b/src/daemon/replay/internal/session-test-source-discovery.ts index 54bb8fec40..169182b8ae 100644 --- a/src/daemon/replay/internal/session-test-source-discovery.ts +++ b/src/daemon/replay/internal/session-test-source-discovery.ts @@ -1,7 +1,7 @@ import { inspectMaestroFlow } from '@agent-device/maestro'; import type { ReplayScriptSourceBundle } from '@agent-device/contracts/replay'; import { readReplayScriptMetadata, resolveReplayFormat } from '@agent-device/ad-script'; -import { readReplayScriptSourceFile } from '../../replay-script-source.ts'; +import { readReplayScriptSourceFile } from '@agent-device/replay-port/script-source'; import type { ReplayTestDiscoverSources, ReplayTestManifest, diff --git a/src/daemon/replay/internal/test-command.ts b/src/daemon/replay/internal/test-command.ts index c96bec9ba1..3a70d6d372 100644 --- a/src/daemon/replay/internal/test-command.ts +++ b/src/daemon/replay/internal/test-command.ts @@ -8,7 +8,7 @@ import type { ReplaySuiteResult, ReplayScriptSourceBundle, } from '@agent-device/contracts/replay'; -import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '../../replay-script-source.ts'; +import { REPLAY_SCRIPT_SOURCE_REQUIRED_MESSAGE } from '@agent-device/replay-port/script-source'; import type { ReplayScriptMetadata } from '@agent-device/ad-script'; import { expandSessionPath } from '@agent-device/host-kit/session-paths'; import type { ReplayCommand, ReplayTestCommand } from './command-types.ts';