From 1c2d522248e9411800f83ae1daf042755a0516c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 14 Oct 2026 19:43:51 +0200 Subject: [PATCH 1/2] refactor(daemon): move wire request and response types out of the daemon package The client, remote, and CLI import DaemonWireRequest from contracts and DaemonResponse/DaemonArtifact/DaemonResponseData from kernel, so nothing outside packages/daemon imports it. The daemon keeps its own DaemonRequest (wire request plus internal) and drops the response aliases. Co-Authored-By: Claude Sonnet 5.5 --- .../support/handlers/session-test-harness.ts | 3 +- ...pture-disclosure-target-activation.test.ts | 2 +- .../__tests__/request-dispatch-ledger.test.ts | 3 +- .../daemon/src/core/capture-disclosure.ts | 2 +- packages/daemon/src/core/daemon-request.ts | 14 ++---- .../daemon/src/core/generic-leaf-execution.ts | 3 +- .../src/core/interaction/internal/types.ts | 3 +- .../src/core/request-dispatch-ledger.ts | 3 +- .../daemon/src/core/request-ended-leases.ts | 3 +- .../src/core/session-runtime-admission.ts | 3 +- .../src/core/snapshot-runtime-binding.ts | 3 +- .../selector-capture-runtime.test.ts | 2 +- .../android-snapshot-timeout-evidence.ts | 2 +- .../daemon/src/execution/generic-settle.ts | 3 +- .../src/execution/handlers/react-native.ts | 2 +- .../execution/handlers/session-clipboard.ts | 8 ++- .../handlers/session-selector-dispatch.ts | 3 +- .../src/execution/handlers/snapshot-alert.ts | 4 +- .../execution/handlers/snapshot-settings.ts | 8 ++- .../__tests__/find-handler-fixture.ts | 3 +- .../__tests__/find-single-bind.test.ts | 2 +- .../find-target-activation-disclosure.test.ts | 2 +- .../__tests__/find-touch-runtime-fixture.ts | 3 +- .../internal/find-match-resolution.ts | 3 +- .../internal/find-target-capture.ts | 3 +- .../execution/interaction/internal/find.ts | 7 +-- .../internal/interaction-common.ts | 2 +- .../interaction/internal/interaction-flags.ts | 2 +- .../internal/interaction-gesture.ts | 2 +- .../internal/interaction-ref-policy.ts | 2 +- .../internal/interaction-response.ts | 2 +- .../internal/interaction-runtime.ts | 2 +- .../interaction-touch-android-readiness.ts | 2 +- .../internal/interaction-touch-direct-ios.ts | 2 +- .../internal/interaction-touch-fill.ts | 2 +- .../internal/interaction-touch-policy.ts | 2 +- .../interaction-touch-press-admission.ts | 2 +- .../internal/interaction-touch-press.ts | 2 +- .../internal/interaction-touch-runtime.ts | 2 +- .../internal/interaction-touch-targets.ts | 2 +- .../interaction/internal/interaction.ts | 2 +- .../daemon/src/execution/ref-positionals.ts | 2 +- .../src/execution/ref-snapshot-flag-policy.ts | 2 +- .../execution/request-dispatch-disclosure.ts | 3 +- .../src/execution/request-generic-dispatch.ts | 3 +- .../execution/screenshot-runtime-binding.ts | 2 +- .../src/execution/selector-capture-binding.ts | 2 +- .../src/execution/selector-match-errors.ts | 2 +- .../src/execution/selector-runtime-backend.ts | 3 +- .../daemon/src/execution/selector-runtime.ts | 3 +- .../src/execution/wait-current-surface.ts | 3 +- packages/daemon/src/execution/wait-runtime.ts | 3 +- .../__tests__/macos-app-lease.test.ts | 3 +- .../resources/device/device-claim-conflict.ts | 2 +- .../daemon/src/resources/macos-app-lease.ts | 3 +- .../resources/session-device-resolution.ts | 3 +- .../__tests__/http-server-artifacts.test.ts | 2 +- .../http-server-rpc-admission.test.ts | 3 +- .../http-server-rpc-invalid-body.test.ts | 2 +- .../http-server-rpc-lifetime.test.ts | 2 +- .../http-server-rpc-unowned-failure.test.ts | 2 +- .../http-server-rpc-validation.test.ts | 3 +- .../__tests__/http-server-rpc.fixtures.ts | 3 +- .../http-server-tenant-trust.test.ts | 3 +- .../request-diagnostics-http.test.ts | 2 +- .../__tests__/request-finalization.test.ts | 4 +- .../request-router-session-address.test.ts | 3 +- .../request-save-script-transports.test.ts | 3 +- .../server/__tests__/response-views.test.ts | 2 +- .../server/http/http-authorization.test.ts | 2 +- .../daemon/src/server/http/http-server.ts | 3 +- packages/daemon/src/server/http/transport.ts | 3 +- .../src/server/request-execution-scope.ts | 3 +- .../daemon/src/server/request-finalization.ts | 8 ++- packages/daemon/src/server/request-router.ts | 9 ++-- .../src/server/request-save-script-policy.ts | 3 +- packages/daemon/src/server/response-views.ts | 3 +- ...on-replay-runtime-maestro-dispatch.test.ts | 3 +- ...session-replay-runtime-maestro.fixtures.ts | 7 +-- .../session-replay-repair.fixtures.ts | 7 +-- .../replay-runtime/application.test.ts | 3 +- .../replay-runtime/replay-command-fixture.ts | 7 +-- .../session-replay-runtime-failure.test.ts | 2 +- .../session-test-suite-command-video.test.ts | 3 +- .../session-test-suite-infrastructure.test.ts | 2 +- .../session-test-suite.fixtures.ts | 2 +- .../session-replay-scenario.fixtures.ts | 7 +-- .../__tests__/request-handler-catalog.test.ts | 3 +- .../__tests__/lease-artifacts.test.ts | 3 +- ...ession-boot-shutdown-device-claims.test.ts | 3 +- .../handlers/__tests__/session-push.test.ts | 3 +- .../__tests__/session-reinstall.test.ts | 3 +- .../__tests__/session-trigger.test.ts | 3 +- .../src/sessions/handlers/human-control.ts | 3 +- .../daemon/src/sessions/handlers/lease.ts | 3 +- .../handlers/record-runtime-response.ts | 2 +- .../src/sessions/handlers/record-runtime.ts | 3 +- .../src/sessions/handlers/record-trace.ts | 3 +- .../handlers/session-app-deployment-route.ts | 3 +- .../handlers/session-app-deployment.ts | 3 +- .../handlers/session-app-source-deployment.ts | 3 +- .../session-appstate-apple-session.ts | 2 +- .../session-appstate-device-runtime.ts | 2 +- .../src/sessions/handlers/session-appstate.ts | 2 +- .../src/sessions/handlers/session-batch.ts | 3 +- .../src/sessions/handlers/session-boot.ts | 2 +- .../handlers/session-command-input.ts | 3 +- .../session-device-status-response.ts | 2 +- .../src/sessions/handlers/session-doctor.ts | 3 +- .../src/sessions/handlers/session-prepare.ts | 3 +- .../handlers/session-runtime-command.ts | 3 +- .../handlers/session-runtime-port-reverse.ts | 3 +- .../handlers/session-script-publication.ts | 3 +- .../src/sessions/handlers/session-shutdown.ts | 2 +- .../daemon/src/sessions/handlers/session.ts | 2 +- .../daemon/src/sessions/handlers/snapshot.ts | 3 +- .../src/sessions/handlers/trace-runtime.ts | 3 +- .../src/sessions/request-handler-chain.ts | 3 +- .../__tests__/application.test.ts | 3 +- .../session-close-ended-lease.test.ts | 3 +- .../session-close-lifecycle-runtime.test.ts | 3 +- .../session-close-shutdown.fixtures.ts | 3 +- ...session-close-without-session-mode.test.ts | 3 +- .../session-devices-batch-runtime.test.ts | 3 +- .../session-inventory-appleos.test.ts | 3 +- .../session-inventory-harmonyos.test.ts | 3 +- .../session-inventory-scoped-paths.test.ts | 3 +- .../__tests__/session-open-foreground.test.ts | 3 +- .../session-open-runtime.fixtures.ts | 3 +- .../session-lifecycle/internal/inventory.ts | 3 +- .../session-close-runtime-admission.ts | 2 +- .../internal/session-close-script.ts | 3 +- .../internal/session-close.ts | 3 +- .../internal/session-open-execution.ts | 8 ++- .../internal/session-open-foreground.ts | 3 +- .../internal/session-open-prepare.ts | 3 +- .../internal/session-open.ts | 3 +- .../__tests__/application.test.ts | 3 +- .../internal/__tests__/session-audio.test.ts | 2 +- .../internal/session-audio.ts | 8 ++- .../internal/session-network.ts | 3 +- .../internal/session-observability.ts | 8 ++- .../internal/session-perf-runtime.ts | 3 +- .../sessions/session-replay-coordinator.ts | 2 +- .../src/sessions/snapshot-command-runtime.ts | 3 +- .../src/sessions/snapshot-diff-runtime.ts | 2 +- .../src/sessions/snapshot-quality-latch.ts | 2 +- .../daemon/src/sessions/snapshot-runtime.ts | 3 +- src/__tests__/cli-remote-diagnostics.test.ts | 5 +- ...ommand-descriptor-ref-frame-effect.test.ts | 4 +- src/__tests__/daemon-client-progress.test.ts | 15 +++--- .../capture-disclosure.test.ts | 15 +++--- .../daemon-composition/generic-settle.test.ts | 3 +- .../handlers/session-doctor-warmup.test.ts | 2 +- .../handlers/snapshot-handler.test.ts | 2 +- .../interaction/find-production-route.test.ts | 3 +- .../request-handler-chain.test.ts | 3 +- .../request-router-macos-app-lease.test.ts | 3 +- .../session-close-runtime-hints.test.ts | 3 +- ...ssion-test-reporter-values-maestro.test.ts | 9 ++-- .../session-test-reporter-values.test.ts | 7 +-- src/client/client-normalizers.ts | 5 +- .../boundary-fault-acceptance.test.ts | 4 +- .../boundary-fault-transport.test.ts | 4 +- ...mon-client-abort-default-transport.test.ts | 10 ++-- .../daemon-client-abort-timeout.test.ts | 10 ++-- .../__tests__/daemon-client-abort.test.ts | 10 ++-- .../daemon-client-address-hints.test.ts | 2 +- .../daemon-client-lease-beat.test.ts | 6 +-- .../daemon-client-timeout-route.test.ts | 4 +- src/daemon-client/daemon-client-lease-beat.ts | 8 +-- src/daemon-client/daemon-client-lifecycle.ts | 19 +++---- .../daemon-client-liveness-probe.ts | 4 +- src/daemon-client/daemon-client-progress.ts | 13 ++--- src/daemon-client/daemon-client-rpc.ts | 15 +++--- src/daemon-client/daemon-client-transport.ts | 19 +++---- src/daemon-client/daemon-client.ts | 8 ++- src/remote/daemon-artifacts.ts | 49 +++++++++---------- .../nightly/concurrency-torture/bindings.ts | 13 +++-- .../real-scope-serialization.ts | 8 +-- .../cloud-webdriver-ios-text-entry.test.ts | 6 +-- ...oud-webdriver-provider-regressions.test.ts | 6 +-- .../cloud-webdriver-runtime.test.ts | 6 +-- .../daemon-http-boundary-cancellation.test.ts | 5 +- .../daemon-http-disconnect.test.ts | 5 +- .../daemon-http-lease-allocate.test.ts | 5 +- .../daemon-http-resumable-upload.test.ts | 2 +- .../daemon-http-server.test.ts | 7 +-- .../daemon-transport.test.ts | 3 +- .../integration/provider-scenarios/harness.ts | 28 +++++------ .../provider-device-runtime.fixtures.ts | 10 ++-- .../provider-ios-runner-transport.test.ts | 6 +-- .../provider-ios-selector-runtime.test.ts | 6 +-- .../remote-proxy-artifact-tenant.test.ts | 5 +- .../remote-proxy-parity.test.ts | 9 ++-- .../remote-proxy-request-diagnostics.test.ts | 2 +- ...ote-test-artifacts-materialization.test.ts | 4 +- .../remote-upload-lease-beat.test.ts | 4 +- .../provider-scenarios/scenario.ts | 12 ++--- test/output-economy/fixtures.ts | 2 +- test/output-economy/selection-fixtures.ts | 2 +- 201 files changed, 483 insertions(+), 399 deletions(-) diff --git a/packages/daemon/src/__tests__/support/handlers/session-test-harness.ts b/packages/daemon/src/__tests__/support/handlers/session-test-harness.ts index b9d11d9418..a494ce93bd 100644 --- a/packages/daemon/src/__tests__/support/handlers/session-test-harness.ts +++ b/packages/daemon/src/__tests__/support/handlers/session-test-harness.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isMacOs } from '@agent-device/kernel/device'; import { legacyDispatchCapture } from '../legacy-snapshot-capture-fixture.ts'; import { expect, vi, beforeEach } from 'vitest'; @@ -82,7 +83,7 @@ vi.mock('../../../sessions/materialized-path-registry.ts', async (importOriginal import * as path from 'node:path'; import { cleanupRetainedMaterializedPathsForSession } from '../../../sessions/materialized-path-registry.ts'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { resolveTargetDevice } from '@agent-device/device-selection/dispatch-resolve'; import { ensureDeviceReady } from '../../../core/device/device-ready.ts'; diff --git a/packages/daemon/src/core/__tests__/capture-disclosure-target-activation.test.ts b/packages/daemon/src/core/__tests__/capture-disclosure-target-activation.test.ts index 570d4d916f..affb5a84dd 100644 --- a/packages/daemon/src/core/__tests__/capture-disclosure-target-activation.test.ts +++ b/packages/daemon/src/core/__tests__/capture-disclosure-target-activation.test.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { iosTargetActivationDisclosure } from '@agent-device/contracts/ios-target-activation'; import type { IosTargetActivation } from '@agent-device/kernel/snapshot'; import { withCaptureDisclosures, withTargetActivationDisclosure } from '../capture-disclosure.ts'; -import type { DaemonResponse } from '../daemon-request.ts'; const FACT: IosTargetActivation = { reason: 'stale_target', diff --git a/packages/daemon/src/core/__tests__/request-dispatch-ledger.test.ts b/packages/daemon/src/core/__tests__/request-dispatch-ledger.test.ts index 2fd90ca093..db8c0f0a7f 100644 --- a/packages/daemon/src/core/__tests__/request-dispatch-ledger.test.ts +++ b/packages/daemon/src/core/__tests__/request-dispatch-ledger.test.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { AppError } from '@agent-device/kernel/errors'; -import type { DaemonRequest, DaemonResponse } from '../daemon-request.ts'; +import type { DaemonRequest } from '../daemon-request.ts'; import { createRequestDispatchLedger, recordBoundMutations, diff --git a/packages/daemon/src/core/capture-disclosure.ts b/packages/daemon/src/core/capture-disclosure.ts index 5a6ac46f6d..fc19678416 100644 --- a/packages/daemon/src/core/capture-disclosure.ts +++ b/packages/daemon/src/core/capture-disclosure.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { SnapshotState } from '@agent-device/kernel/snapshot'; import { systemSurfaceDisclosure } from '@agent-device/contracts/android-system-surface-disclosure'; import { iosSystemSurfaceDisclosure } from '@agent-device/contracts/ios-system-surface'; import { iosTargetActivationDisclosure } from '@agent-device/contracts/ios-target-activation'; import { formatPostGestureOutcomeWarning } from '@agent-device/capture-kit/post-gesture-stability'; -import type { DaemonResponse } from './daemon-request.ts'; /** The capture provenance a response must be disclosed against (#2438, #2682, gesture outcomes). */ export type CaptureProvenance = Pick< diff --git a/packages/daemon/src/core/daemon-request.ts b/packages/daemon/src/core/daemon-request.ts index 735f1ab478..0e6ba26d8e 100644 --- a/packages/daemon/src/core/daemon-request.ts +++ b/packages/daemon/src/core/daemon-request.ts @@ -2,24 +2,17 @@ import type { ExecutionPlan } from './execution-plan.ts'; import type { PreresolvedInteractionTarget } from '@agent-device/contracts/interaction'; import type { DeviceLease } from '@agent-device/contracts/device'; import type { ReplayDispatchOptions } from '@agent-device/contracts/replay'; -import type { - DaemonArtifact as PublicDaemonArtifact, - DaemonResponse as PublicDaemonResponse, - DaemonResponseData as PublicDaemonResponseData, -} from '@agent-device/kernel/contracts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonWireRequest } from '@agent-device/contracts/command'; import type { RequestDispatchLedger } from './request-dispatch-ledger.ts'; import type { EndedLeaseLedger } from './request-ended-leases.ts'; /** - * The daemon's own request and response vocabulary: the wire shape from `@agent-device/contracts/command` (`DaemonWireRequest`) - * plus what only the daemon may see. A consumer that must stay free of live session state takes + * The daemon's request vocabulary: the wire shape from `@agent-device/contracts/command` + * (`DaemonWireRequest`) plus what only the daemon may see. A consumer that must stay free of live session state takes * `DaemonWireRequest` directly. */ -export type DaemonArtifact = PublicDaemonArtifact; -export type DaemonResponseData = PublicDaemonResponseData; - /** * What only the daemon may see on a request: the replay dispatch options (declared once in * `@agent-device/contracts/replay`, so the port and the daemon cannot drift), plus the callbacks, @@ -78,5 +71,4 @@ export type DaemonRequest = DaemonWireRequest & { internal?: DaemonRequestInternal; }; -export type DaemonResponse = PublicDaemonResponse; export type DaemonInvokeFn = (req: DaemonRequest) => Promise; diff --git a/packages/daemon/src/core/generic-leaf-execution.ts b/packages/daemon/src/core/generic-leaf-execution.ts index 84c3690681..c9c958c3f0 100644 --- a/packages/daemon/src/core/generic-leaf-execution.ts +++ b/packages/daemon/src/core/generic-leaf-execution.ts @@ -1,7 +1,8 @@ // Shared by the generic dispatcher and its leaves; leaves must not import the dispatcher. +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonCommandContext } from './context.ts'; -import type { DaemonRequest, DaemonResponse } from './daemon-request.ts'; +import type { DaemonRequest } from './daemon-request.ts'; import type { SessionState } from './session-state.ts'; export type GenericPlatformExecutionParams = { diff --git a/packages/daemon/src/core/interaction/internal/types.ts b/packages/daemon/src/core/interaction/internal/types.ts index f9a0ade0f3..2ce6f12f73 100644 --- a/packages/daemon/src/core/interaction/internal/types.ts +++ b/packages/daemon/src/core/interaction/internal/types.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../platform-services.ts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; @@ -9,7 +10,7 @@ import type { CommandSessionStore } from '@agent-device/contracts/runtime-contra import type { DeferredInteractionOutcomeMark } from '../../deferred-interaction-outcome.ts'; import type { RecordActionEntry } from '../../session-action-recorder.ts'; import type { BoundContextFromFlags } from '../../context.ts'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../../daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../daemon-request.ts'; import type { SessionRef, SessionState } from '../../session-state.ts'; import type { BoundGestureExecutor } from '../../gesture-runtime.ts'; import type { BoundTouchExecutor } from '../../touch-runtime.ts'; diff --git a/packages/daemon/src/core/request-dispatch-ledger.ts b/packages/daemon/src/core/request-dispatch-ledger.ts index c433e49004..344cb656fb 100644 --- a/packages/daemon/src/core/request-dispatch-ledger.ts +++ b/packages/daemon/src/core/request-dispatch-ledger.ts @@ -1,4 +1,5 @@ -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from './daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; +import type { DaemonInvokeFn, DaemonRequest } from './daemon-request.ts'; import { RUNTIME_OPERATION_EFFECTS } from './runtime-operation-effects.ts'; /** diff --git a/packages/daemon/src/core/request-ended-leases.ts b/packages/daemon/src/core/request-ended-leases.ts index 6e4747c3e6..e774e1b849 100644 --- a/packages/daemon/src/core/request-ended-leases.ts +++ b/packages/daemon/src/core/request-ended-leases.ts @@ -1,5 +1,6 @@ import type { EndedLease } from '@agent-device/contracts/client'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from './daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; +import type { DaemonInvokeFn, DaemonRequest } from './daemon-request.ts'; /** The session leases one request ended, its nested requests' included. */ export type EndedLeaseLedger = EndedLease[]; diff --git a/packages/daemon/src/core/session-runtime-admission.ts b/packages/daemon/src/core/session-runtime-admission.ts index 2d8b84750c..2225b84f65 100644 --- a/packages/daemon/src/core/session-runtime-admission.ts +++ b/packages/daemon/src/core/session-runtime-admission.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from './platform-services.ts'; import type { PlatformRuntimeOperations } from '@agent-device/contracts/platform-runtime-operations'; import type { @@ -9,7 +10,7 @@ import type { DeviceInfo } from '@agent-device/kernel/device'; import { AppError } from '@agent-device/kernel/errors'; import type { BindDeviceRuntime, InspectDeviceRuntimeFacts } from './request-runtime-binding.ts'; import type { SessionStore } from './session-store.ts'; -import type { DaemonRequest, DaemonResponse } from './daemon-request.ts'; +import type { DaemonRequest } from './daemon-request.ts'; import { unsupportedOperationResponse } from './runtime-admission.ts'; export type RuntimeCommandHandlerParams = Readonly<{ diff --git a/packages/daemon/src/core/snapshot-runtime-binding.ts b/packages/daemon/src/core/snapshot-runtime-binding.ts index 7b2e9ec5b1..67dff13948 100644 --- a/packages/daemon/src/core/snapshot-runtime-binding.ts +++ b/packages/daemon/src/core/snapshot-runtime-binding.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from './platform-services.ts'; import type { RuntimeOperationFact } from '@agent-device/contracts/platform-runtime'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; @@ -20,7 +21,7 @@ import { } from './request-runtime-binding.ts'; import type { PlatformResourceCleanup } from './platform-resource-cleanup.ts'; import { SessionStore } from './session-store.ts'; -import type { DaemonRequest, DaemonResponse } from './daemon-request.ts'; +import type { DaemonRequest } from './daemon-request.ts'; import type { SessionRef, SessionState } from './session-state.ts'; import { admitRuntimePlan, diff --git a/packages/daemon/src/execution/__tests__/selector-capture-runtime.test.ts b/packages/daemon/src/execution/__tests__/selector-capture-runtime.test.ts index e2bb9e9e1c..5be9a47020 100644 --- a/packages/daemon/src/execution/__tests__/selector-capture-runtime.test.ts +++ b/packages/daemon/src/execution/__tests__/selector-capture-runtime.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { beforeEach, expect, test, vi } from 'vitest'; import type { CaptureSnapshotInput, @@ -8,7 +9,6 @@ import { type IosTargetActivation, type SnapshotState, } from '@agent-device/kernel/snapshot'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { type RequestCaptureProof, withCaptureDisclosures } from '../../core/capture-disclosure.ts'; import { makeIosSession } from '../../__tests__/support/session-factories.ts'; import { makeSessionStore } from '../../__tests__/support/store-factory.ts'; diff --git a/packages/daemon/src/execution/android-snapshot-timeout-evidence.ts b/packages/daemon/src/execution/android-snapshot-timeout-evidence.ts index 0d7ab1da01..de6d8e38b6 100644 --- a/packages/daemon/src/execution/android-snapshot-timeout-evidence.ts +++ b/packages/daemon/src/execution/android-snapshot-timeout-evidence.ts @@ -1,7 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { promises as fs } from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; diff --git a/packages/daemon/src/execution/generic-settle.ts b/packages/daemon/src/execution/generic-settle.ts index bd3b8fab84..3dda964b79 100644 --- a/packages/daemon/src/execution/generic-settle.ts +++ b/packages/daemon/src/execution/generic-settle.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; import { surfaceScopedNodes } from '@agent-device/capture-kit/snapshot-baseline'; @@ -20,7 +21,7 @@ import { resolveSettleObservationCapture } from '../core/settle-observation-capt import { isOutdatedObservation } from '../core/ref-frame.ts'; import { issueSettleRefs } from './session-snapshot.ts'; import type { SessionStore } from '../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; import type { SnapshotState } from '@agent-device/kernel/snapshot'; diff --git a/packages/daemon/src/execution/handlers/react-native.ts b/packages/daemon/src/execution/handlers/react-native.ts index 1eb4e5a2e2..9f7aba8f39 100644 --- a/packages/daemon/src/execution/handlers/react-native.ts +++ b/packages/daemon/src/execution/handlers/react-native.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { createBoundTouchExecutor, resolveBoundTouchRuntime, @@ -14,7 +15,6 @@ import { successText } from '@agent-device/kernel/success-text'; import type { SnapshotQualityVerdict, SnapshotState } from '@agent-device/kernel/snapshot'; import { isSparseSnapshotQualityVerdict } from '@agent-device/capture-kit/snapshot-quality-verdict'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import type { SessionState } from '../../core/session-state.ts'; import { bindInteractionSession, diff --git a/packages/daemon/src/execution/handlers/session-clipboard.ts b/packages/daemon/src/execution/handlers/session-clipboard.ts index 85b18755a5..72e9794cc2 100644 --- a/packages/daemon/src/execution/handlers/session-clipboard.ts +++ b/packages/daemon/src/execution/handlers/session-clipboard.ts @@ -12,7 +12,7 @@ import { publicPlatformString, type DeviceInfo } from '@agent-device/kernel/devi import { AppError } from '@agent-device/kernel/errors'; import { PUBLIC_COMMANDS } from '@agent-device/command-registry/catalog'; import { contextFromFlags, type DaemonCommandContext } from '../../core/context.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionStore } from '../../core/session-store.ts'; import type { BindDeviceRuntime, @@ -26,7 +26,11 @@ import { requireSessionOrExplicitSelector, resolveCommandDevice, } from '../../resources/session-device-resolution.ts'; -import { type DaemonFailureResponse, errorResponse } from '@agent-device/kernel/contracts'; +import { + type DaemonFailureResponse, + errorResponse, + type DaemonResponse, +} from '@agent-device/kernel/contracts'; type ClipboardAction = 'read' | 'write'; diff --git a/packages/daemon/src/execution/handlers/session-selector-dispatch.ts b/packages/daemon/src/execution/handlers/session-selector-dispatch.ts index 4b4605185d..963dbaa97d 100644 --- a/packages/daemon/src/execution/handlers/session-selector-dispatch.ts +++ b/packages/daemon/src/execution/handlers/session-selector-dispatch.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import { PUBLIC_COMMANDS } from '@agent-device/command-registry/catalog'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../core/session-state.ts'; import type { SessionStore } from '../../core/session-store.ts'; import { contextFromFlags } from '../../core/context.ts'; diff --git a/packages/daemon/src/execution/handlers/snapshot-alert.ts b/packages/daemon/src/execution/handlers/snapshot-alert.ts index bb914de475..3c67413983 100644 --- a/packages/daemon/src/execution/handlers/snapshot-alert.ts +++ b/packages/daemon/src/execution/handlers/snapshot-alert.ts @@ -13,7 +13,7 @@ import { } from '@agent-device/contracts/platform-runtime-operations'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { contextFromFlags } from '../../core/context.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../core/session-state.ts'; import { SessionStore } from '../../core/session-store.ts'; import { recordSessionAction } from '../../core/session-action-recorder.ts'; @@ -26,7 +26,7 @@ import type { } from '../../core/request-runtime-binding.ts'; import { admitRuntimeUse, type RuntimeAdmissionBindings } from '../../core/runtime-admission.ts'; import { runtimeExecutionFromContext } from '../../core/snapshot-runtime-capture-input.ts'; -import type { DaemonFailureResponse } from '@agent-device/kernel/contracts'; +import type { DaemonFailureResponse, DaemonResponse } from '@agent-device/kernel/contracts'; type HandleAlertCommandParams = { req: DaemonRequest; diff --git a/packages/daemon/src/execution/handlers/snapshot-settings.ts b/packages/daemon/src/execution/handlers/snapshot-settings.ts index 375d056d73..2b238b5258 100644 --- a/packages/daemon/src/execution/handlers/snapshot-settings.ts +++ b/packages/daemon/src/execution/handlers/snapshot-settings.ts @@ -29,7 +29,7 @@ import { import type { BoundDeviceRuntime } from '@agent-device/contracts/platform-runtime'; import { contextFromFlags } from '../../core/context.ts'; import { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../core/session-state.ts'; import { recordSessionAction } from '../../core/session-action-recorder.ts'; import { expireRefFrame } from '../../core/ref-frame.ts'; @@ -44,7 +44,11 @@ import type { } from '../../core/request-runtime-binding.ts'; import { admitRuntimeUse } from '../../core/runtime-admission.ts'; import { runtimeExecutionFromContext } from '../../core/snapshot-runtime-capture-input.ts'; -import { type DaemonFailureResponse, errorResponse } from '@agent-device/kernel/contracts'; +import { + type DaemonFailureResponse, + errorResponse, + type DaemonResponse, +} from '@agent-device/kernel/contracts'; type ParsedSettingsArgs = { setting: string; diff --git a/packages/daemon/src/execution/interaction/internal/__tests__/find-handler-fixture.ts b/packages/daemon/src/execution/interaction/internal/__tests__/find-handler-fixture.ts index 9bb69ef83e..744631cc2f 100644 --- a/packages/daemon/src/execution/interaction/internal/__tests__/find-handler-fixture.ts +++ b/packages/daemon/src/execution/interaction/internal/__tests__/find-handler-fixture.ts @@ -1,5 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import { handleFindCommands } from '../find.ts'; import { getRuntimeBindings } from '../../../__tests__/interaction-get-runtime-fixture.ts'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; diff --git a/packages/daemon/src/execution/interaction/internal/__tests__/find-single-bind.test.ts b/packages/daemon/src/execution/interaction/internal/__tests__/find-single-bind.test.ts index 0190dfcfa1..72b4c5e225 100644 --- a/packages/daemon/src/execution/interaction/internal/__tests__/find-single-bind.test.ts +++ b/packages/daemon/src/execution/interaction/internal/__tests__/find-single-bind.test.ts @@ -1,5 +1,5 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test, expect, vi, beforeEach } from 'vitest'; -import type { DaemonResponse } from '../../../../core/daemon-request.ts'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; import { makeIosSession } from '../../../../__tests__/support/session-factories.ts'; import { diff --git a/packages/daemon/src/execution/interaction/internal/__tests__/find-target-activation-disclosure.test.ts b/packages/daemon/src/execution/interaction/internal/__tests__/find-target-activation-disclosure.test.ts index 662ddf25b8..11ac23bd2b 100644 --- a/packages/daemon/src/execution/interaction/internal/__tests__/find-target-activation-disclosure.test.ts +++ b/packages/daemon/src/execution/interaction/internal/__tests__/find-target-activation-disclosure.test.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { beforeEach, expect, test, vi } from 'vitest'; import type { IosTargetActivation, PostGestureOutcome } from '@agent-device/kernel/snapshot'; import { iosTargetActivationDisclosure } from '@agent-device/contracts/ios-target-activation'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; import { makeIosSession } from '../../../../__tests__/support/session-factories.ts'; -import type { DaemonResponse } from '../../../../core/daemon-request.ts'; import { legacyDispatchCapture } from '../../../../__tests__/support/legacy-snapshot-capture-fixture.ts'; import { getRuntimeBindings } from '../../../__tests__/interaction-get-runtime-fixture.ts'; import { handleFindCommands } from '../../index.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/__tests__/find-touch-runtime-fixture.ts b/packages/daemon/src/execution/interaction/internal/__tests__/find-touch-runtime-fixture.ts index 46f439138d..6bcc4259fa 100644 --- a/packages/daemon/src/execution/interaction/internal/__tests__/find-touch-runtime-fixture.ts +++ b/packages/daemon/src/execution/interaction/internal/__tests__/find-touch-runtime-fixture.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { expect } from 'vitest'; import { legacyDispatchCapture } from '../../../../__tests__/support/legacy-snapshot-capture-fixture.ts'; import { IOS_SIMULATOR } from '@agent-device/test-kit/device-fixtures'; @@ -10,7 +11,7 @@ import { } from '../../../__tests__/interaction-get-runtime-fixture.ts'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; import { makeIosSession as makeSession } from '../../../../__tests__/support/session-factories.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; import type { handleFindCommands } from '../find.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/find-match-resolution.ts b/packages/daemon/src/execution/interaction/internal/find-match-resolution.ts index 3184388f78..171fa9b5c4 100644 --- a/packages/daemon/src/execution/interaction/internal/find-match-resolution.ts +++ b/packages/daemon/src/execution/interaction/internal/find-match-resolution.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { findBestMatchesByLocator, type FindLocator, @@ -8,7 +9,7 @@ import { SELECTOR_PIPELINE_POLICIES } from '@agent-device/selectors/selector-pip import type { SnapshotState } from '@agent-device/kernel/snapshot'; import { isRootInteractionContainer } from '@agent-device/selectors/interaction-targeting'; import { preferOnscreenMatches } from './find-match-ranking.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { buildAmbiguousMatchError } from '../../selector-match-errors.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; diff --git a/packages/daemon/src/execution/interaction/internal/find-target-capture.ts b/packages/daemon/src/execution/interaction/internal/find-target-capture.ts index 69336e81f7..228c55f317 100644 --- a/packages/daemon/src/execution/interaction/internal/find-target-capture.ts +++ b/packages/daemon/src/execution/interaction/internal/find-target-capture.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { FindLocator } from '@agent-device/selectors'; import type { BoundSelectorCapture } from '../../selector-capture-binding.ts'; import type { SnapshotQualityVerdict, SnapshotState } from '@agent-device/kernel/snapshot'; import type { CaptureProvenance, RequestCaptureProof } from '../../../core/capture-disclosure.ts'; import { createSelectorCaptureRuntime } from '../../selector-capture-runtime.ts'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; diff --git a/packages/daemon/src/execution/interaction/internal/find.ts b/packages/daemon/src/execution/interaction/internal/find.ts index 144163a0b9..6f06edcc98 100644 --- a/packages/daemon/src/execution/interaction/internal/find.ts +++ b/packages/daemon/src/execution/interaction/internal/find.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { PreresolvedInteractionTarget, SurfaceScopedNodes, @@ -19,11 +20,7 @@ import { type SnapshotState, } from '@agent-device/kernel/snapshot'; import { expireRefFrame } from '../../../core/ref-frame.ts'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '../../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { contextFromFlags } from '../../../core/context.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-common.ts b/packages/daemon/src/execution/interaction/internal/interaction-common.ts index fcbb012248..e468ddc10b 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-common.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-common.ts @@ -1,7 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { SettleObservation, SurfaceScopedNodes } from '@agent-device/contracts/interaction'; import type { SnapshotState } from '@agent-device/kernel/snapshot'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { stripInternalInteractionFlags } from '../../../core/deferred-interaction-outcome.ts'; import { computeTargetEvidence, diff --git a/packages/daemon/src/execution/interaction/internal/interaction-flags.ts b/packages/daemon/src/execution/interaction/internal/interaction-flags.ts index 075bc4352b..45abb96482 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-flags.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-flags.ts @@ -1,6 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { SettleParams } from '@agent-device/contracts/interaction'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { interactionErrorResponse } from './interaction-response.ts'; export function settleFlagGuardResponse( diff --git a/packages/daemon/src/execution/interaction/internal/interaction-gesture.ts b/packages/daemon/src/execution/interaction/internal/interaction-gesture.ts index a7e990ed3f..f03133b872 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-gesture.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-gesture.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { bindInteractionSession } from './interaction-session.ts'; import { readOptionalInteger } from '@agent-device/contracts/command'; import { type GesturePayload, readGesturePayload } from '@agent-device/contracts/gesture-input'; @@ -35,7 +36,6 @@ import { type AndroidBlockingDialogReadinessResult, } from '../../android-system-dialog.ts'; import { readRefMutationFrame } from '../../../core/ref-frame.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { thrownBeforeDispatch } from '../../request-dispatch-disclosure.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { assertRefMutationAdmitted } from './interaction-ref-policy.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-ref-policy.ts b/packages/daemon/src/execution/interaction/internal/interaction-ref-policy.ts index 2e100ffd8b..4eec72e488 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-ref-policy.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-ref-policy.ts @@ -1,5 +1,5 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError } from '@agent-device/kernel/errors'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { RefFrameRejectReason, RefMutationFrame } from '../../../core/ref-frame.ts'; import { interactionErrorResponse } from './interaction-response.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-response.ts b/packages/daemon/src/execution/interaction/internal/interaction-response.ts index 71658fa8e2..f408342794 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-response.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-response.ts @@ -1,4 +1,4 @@ -import type { DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; export function interactionErrorResponse( code: string, diff --git a/packages/daemon/src/execution/interaction/internal/interaction-runtime.ts b/packages/daemon/src/execution/interaction/internal/interaction-runtime.ts index d62c4a488c..b6ab6f21d2 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-runtime.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { bindInteractionSession } from './interaction-session.ts'; import { publicPlatformString } from '@agent-device/kernel/device'; import { AppError as KernelAppError } from '@agent-device/kernel/errors'; @@ -27,7 +28,6 @@ import { markDeferredInteractionOutcome } from '../../../core/deferred-interacti import { isSessionRecording } from '../../../core/session-script-publication-capability.ts'; import { recordTouchVisualizationEvent } from '../../../core/recording-gestures.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionRef } from '../../../core/session-state.ts'; import type { BoundTouchExecutor } from '../../../core/touch-runtime.ts'; import type { BoundGestureExecutor } from '../../../core/gesture-runtime.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-android-readiness.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-android-readiness.ts index 30d684558e..9019dca07e 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-android-readiness.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-android-readiness.ts @@ -1,8 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { ensureAndroidBlockingSystemDialogReady, type AndroidBlockingDialogReadinessResult, } from '../../android-system-dialog.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { readRefMutationFrame } from '../../../core/ref-frame.ts'; import { refMutationAdmissionResponse } from './interaction-ref-policy.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-direct-ios.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-direct-ios.ts index 9ad8f23ae6..f470e366ed 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-direct-ios.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-direct-ios.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { GestureReferenceFrame } from '@agent-device/contracts/scroll-gesture'; import { normalizeError } from '@agent-device/kernel/errors'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; @@ -6,7 +7,6 @@ import { type DirectIosSelectorTarget, } from '../../../core/direct-ios-selector.ts'; import { expireRefFrame } from '../../../core/ref-frame.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { finalizeTouchInteraction } from './interaction-runtime.ts'; import type { diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-fill.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-fill.ts index e2ef365ce5..a5e114df65 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-fill.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-fill.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { bindInteractionSession } from './interaction-session.ts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { FillCommandResult, InteractionTarget } from '@agent-device/contracts/interaction'; import { issueSettleRefs, resolveRefStalenessWarning } from '../../session-snapshot.ts'; import { readRefMutationFrame } from '../../../core/ref-frame.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import type { SessionStore } from '../../../core/session-store.ts'; import { isSessionRecording } from '../../../core/session-script-publication-capability.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-policy.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-policy.ts index ff7d7049a0..587ca4d3d9 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-policy.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-policy.ts @@ -1,5 +1,5 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isMacOs } from '@agent-device/kernel/device'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-press-admission.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-press-admission.ts index 63232dfa26..7172f514f0 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-press-admission.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-press-admission.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { InteractionTarget } from '@agent-device/contracts/interaction'; import { @@ -8,7 +9,6 @@ import { import { publicPlatformString } from '@agent-device/kernel/device'; import { resolveRefStalenessWarning } from '../../session-snapshot.ts'; import { readRefMutationFrame } from '../../../core/ref-frame.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { refMutationAdmissionResponse } from './interaction-ref-policy.ts'; import { refusedBeforeDispatch } from '../../request-dispatch-disclosure.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-press.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-press.ts index 24a2e7f247..fbabc12f51 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-press.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-press.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { bindInteractionSession } from './interaction-session.ts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { @@ -6,7 +7,6 @@ import type { } from '@agent-device/contracts/interaction'; import type { resolveClickButton } from '@agent-device/contracts/click-button'; import type { ReplayTargetGuardDenotation } from '@agent-device/contracts/replay'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { assertAndroidPressStayedInApp } from './interaction-android-escape.ts'; import { createInteractionRuntimeForRoute } from './interaction-runtime.ts'; import { readSettleRequest } from './interaction-flags.ts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-runtime.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-runtime.ts index fd17b3d4eb..d6269dcc64 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-runtime.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { bindInteractionSession } from './interaction-session.ts'; import type { FillCommandResult, @@ -12,7 +13,6 @@ import { asAppError, normalizeError } from '@agent-device/kernel/errors'; import { readResolvedInteractionTarget } from '@agent-device/host-kit/interaction-outcome'; import { publishAmbiguousMatchCandidateRefs } from '../../session-snapshot.ts'; import { isSessionRecording } from '../../../core/session-script-publication-capability.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { createInteractionRuntimeForRoute, diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-targets.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-targets.ts index 100dee27a2..7e87b66394 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-targets.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-targets.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { FillCommandResult, InteractionTarget, @@ -9,7 +10,6 @@ import { stripAtPrefix, type DecodedFillTarget, } from '@agent-device/selectors/interaction-positionals'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { parseCoordinateTarget } from './interaction-targeting.ts'; import { parseVersionedRefPositional } from '../../ref-positionals.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; diff --git a/packages/daemon/src/execution/interaction/internal/interaction.ts b/packages/daemon/src/execution/interaction/internal/interaction.ts index 35593f4039..13e68242b7 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction.ts @@ -1,4 +1,4 @@ -import type { DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { type RequestCaptureProof, diff --git a/packages/daemon/src/execution/ref-positionals.ts b/packages/daemon/src/execution/ref-positionals.ts index 1a8689edc1..369b0f0592 100644 --- a/packages/daemon/src/execution/ref-positionals.ts +++ b/packages/daemon/src/execution/ref-positionals.ts @@ -1,5 +1,5 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { REF_GRAMMAR_HINT, splitRefGenerationSuffix } from '@agent-device/kernel/snapshot'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; /** diff --git a/packages/daemon/src/execution/ref-snapshot-flag-policy.ts b/packages/daemon/src/execution/ref-snapshot-flag-policy.ts index e112ded6c8..bfd4bf07fc 100644 --- a/packages/daemon/src/execution/ref-snapshot-flag-policy.ts +++ b/packages/daemon/src/execution/ref-snapshot-flag-policy.ts @@ -1,5 +1,5 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; const REF_UNSUPPORTED_FLAG_MAP: ReadonlyArray<[keyof CommandFlags, string]> = [ diff --git a/packages/daemon/src/execution/request-dispatch-disclosure.ts b/packages/daemon/src/execution/request-dispatch-disclosure.ts index 35e331d587..a521cdd605 100644 --- a/packages/daemon/src/execution/request-dispatch-disclosure.ts +++ b/packages/daemon/src/execution/request-dispatch-disclosure.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { type AppError, asAppError, @@ -6,7 +7,7 @@ import { type ErrorWireDetails, } from '@agent-device/kernel/errors'; import { resolveCommandRecordingEffect } from '@agent-device/command-registry/registry'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { RequestDispatchLedger } from '../core/request-dispatch-ledger.ts'; type RecordingEffect = ReturnType; diff --git a/packages/daemon/src/execution/request-generic-dispatch.ts b/packages/daemon/src/execution/request-generic-dispatch.ts index ebb1d5bbcf..09dc5099aa 100644 --- a/packages/daemon/src/execution/request-generic-dispatch.ts +++ b/packages/daemon/src/execution/request-generic-dispatch.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { SettleObservation } from '@agent-device/contracts/interaction'; import { commandSupportsSettleObservation } from '@agent-device/command-registry/registry'; import type { SessionStore } from '../core/session-store.ts'; import type { DaemonCommandContext } from '../core/context.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import { diff --git a/packages/daemon/src/execution/screenshot-runtime-binding.ts b/packages/daemon/src/execution/screenshot-runtime-binding.ts index c015562910..cdab47eedb 100644 --- a/packages/daemon/src/execution/screenshot-runtime-binding.ts +++ b/packages/daemon/src/execution/screenshot-runtime-binding.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import type { RuntimeOperationFact } from '@agent-device/contracts/platform-runtime'; import { @@ -26,7 +27,6 @@ import type { BindDeviceRuntime, InspectDeviceRuntimeFacts, } from '../core/request-runtime-binding.ts'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; export type ScreenshotRuntimeBindings = Readonly<{ diff --git a/packages/daemon/src/execution/selector-capture-binding.ts b/packages/daemon/src/execution/selector-capture-binding.ts index 6b206eef25..2ffd92aff3 100644 --- a/packages/daemon/src/execution/selector-capture-binding.ts +++ b/packages/daemon/src/execution/selector-capture-binding.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import type { ElementTextRuntimeOperations } from '@agent-device/contracts/element-text-runtime'; import { resolveSelectorCaptureRuntimePlan } from '@agent-device/contracts/platform-runtime-operations'; @@ -11,7 +12,6 @@ import type { InspectDeviceRuntimeFacts, } from '../core/request-runtime-binding.ts'; import { admitAndBindSnapshotCapture } from '../core/snapshot-runtime-binding.ts'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; /** The selector commands that resolve their targets from the shared request-bound capture seam. */ diff --git a/packages/daemon/src/execution/selector-match-errors.ts b/packages/daemon/src/execution/selector-match-errors.ts index cbfa9b7c8a..500773a527 100644 --- a/packages/daemon/src/execution/selector-match-errors.ts +++ b/packages/daemon/src/execution/selector-match-errors.ts @@ -1,7 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { FindLocator } from '@agent-device/selectors'; import type { SnapshotState } from '@agent-device/kernel/snapshot'; import { elementMatchCandidateDetails } from '@agent-device/capture-kit/snapshot-lines'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; // #1597: an agent reading an ambiguous-match error must be able to act on the diff --git a/packages/daemon/src/execution/selector-runtime-backend.ts b/packages/daemon/src/execution/selector-runtime-backend.ts index 9679e98ff6..c158c83ee5 100644 --- a/packages/daemon/src/execution/selector-runtime-backend.ts +++ b/packages/daemon/src/execution/selector-runtime-backend.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import type { AgentDeviceBackend, @@ -15,7 +16,7 @@ import { readTextForNode } from './selector-text-runtime.ts'; import { setSessionSnapshot } from './session-snapshot.ts'; import { markSessionSnapshotOutdated } from '../core/ref-frame.ts'; import { SessionStore } from '../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; import { createSelectorCaptureRuntime } from './selector-capture-runtime.ts'; import { buildRuntimeCaptureInput } from '../core/snapshot-runtime-capture-input.ts'; diff --git a/packages/daemon/src/execution/selector-runtime.ts b/packages/daemon/src/execution/selector-runtime.ts index b011a40871..be3d9accb8 100644 --- a/packages/daemon/src/execution/selector-runtime.ts +++ b/packages/daemon/src/execution/selector-runtime.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { asAppError } from '@agent-device/kernel/errors'; import type { SnapshotNode, SnapshotState } from '@agent-device/kernel/snapshot'; import { absenceCaptureOptionError } from '@agent-device/selectors/absence-observation-errors'; import { absenceCaptureOptionRefusal } from '@agent-device/selectors/absence-observation'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef } from '../core/session-state.ts'; import type { SessionStore } from '../core/session-store.ts'; import { diff --git a/packages/daemon/src/execution/wait-current-surface.ts b/packages/daemon/src/execution/wait-current-surface.ts index d5f23e715c..f02d5ef352 100644 --- a/packages/daemon/src/execution/wait-current-surface.ts +++ b/packages/daemon/src/execution/wait-current-surface.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { WAIT_REASONS } from '@agent-device/contracts/wait'; import type { SnapshotNode } from '@agent-device/kernel/snapshot'; import { recordCaptureProof } from '../core/capture-disclosure.ts'; import type { RequestCaptureProof } from '../core/capture-disclosure.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; import { captureSnapshot } from '../core/snapshot-capture.ts'; import { normalizeType } from '@agent-device/contracts/snapshot'; diff --git a/packages/daemon/src/execution/wait-runtime.ts b/packages/daemon/src/execution/wait-runtime.ts index c2e3e285cb..c08f6711cf 100644 --- a/packages/daemon/src/execution/wait-runtime.ts +++ b/packages/daemon/src/execution/wait-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { waitObservesDevice } from '@agent-device/contracts/wait-runtime-plan'; import type { TargetAnnotationV1 } from '@agent-device/contracts/replay'; import { AppError } from '@agent-device/kernel/errors'; @@ -28,7 +29,7 @@ import type { BindDeviceRuntime, InspectDeviceRuntimeFacts, } from '../core/request-runtime-binding.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; import { maybeWaitTimeoutSurfaceResponse } from './wait-current-surface.ts'; import { withCaptureDisclosures } from '../core/capture-disclosure.ts'; diff --git a/packages/daemon/src/resources/__tests__/macos-app-lease.test.ts b/packages/daemon/src/resources/__tests__/macos-app-lease.test.ts index 44d1421f8c..714cdcf5b6 100644 --- a/packages/daemon/src/resources/__tests__/macos-app-lease.test.ts +++ b/packages/daemon/src/resources/__tests__/macos-app-lease.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { afterEach, beforeEach, test, vi } from 'vitest'; import type { DeviceLease } from '@agent-device/contracts/device'; @@ -9,7 +10,7 @@ import { redactMacOsAppLeaseResponse, } from '../macos-app-lease.ts'; import { buildOpenResult } from '../../sessions/session-lifecycle/internal/session-open-surface.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; const lease: Pick = { backend: 'macos-app', diff --git a/packages/daemon/src/resources/device/device-claim-conflict.ts b/packages/daemon/src/resources/device/device-claim-conflict.ts index 98411aa30a..c4f0c6cb55 100644 --- a/packages/daemon/src/resources/device/device-claim-conflict.ts +++ b/packages/daemon/src/resources/device/device-claim-conflict.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isApplePlatform, publicPlatformString, @@ -11,7 +12,6 @@ import { type DeviceClaimClassification, type InspectedDeviceClaim, } from './device-claim-inspection.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; import type { DeviceClaimConflictReason } from '@agent-device/contracts/device'; diff --git a/packages/daemon/src/resources/macos-app-lease.ts b/packages/daemon/src/resources/macos-app-lease.ts index b21d082895..e9f92ab44e 100644 --- a/packages/daemon/src/resources/macos-app-lease.ts +++ b/packages/daemon/src/resources/macos-app-lease.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse, DaemonResponseData } from '@agent-device/kernel/contracts'; import os from 'node:os'; import { normalizeBatchCommandName } from '@agent-device/command-registry/batch-policy'; import { isRemoteTempArtifactPath } from '@agent-device/contracts/daemon-http'; @@ -8,7 +9,7 @@ import { isProcessAlive, readHostEnvironmentVariable } from '@agent-device/host- import { isMacOs } from '@agent-device/kernel/device'; import { AppError, type DaemonError } from '@agent-device/kernel/errors'; import { isAppLeaseAllowed } from '../core/daemon-command-registry.ts'; -import type { DaemonRequest, DaemonResponse, DaemonResponseData } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { LeaseRegistry } from './lease-registry.ts'; import type { SessionState } from '../core/session-state.ts'; diff --git a/packages/daemon/src/resources/session-device-resolution.ts b/packages/daemon/src/resources/session-device-resolution.ts index c2bdbcf842..ad5380d51c 100644 --- a/packages/daemon/src/resources/session-device-resolution.ts +++ b/packages/daemon/src/resources/session-device-resolution.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isIosFamily, type DeviceInfo } from '@agent-device/kernel/device'; import { AppError, sessionOrDeviceSelectorRequiredDetails } from '@agent-device/kernel/errors'; import { isActiveProviderDevice } from '../core/provider-device-admission.ts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import { resolveTargetDevice } from '@agent-device/device-selection/dispatch-resolve'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; import { hasDeviceSelectionInput, diff --git a/packages/daemon/src/server/__tests__/http-server-artifacts.test.ts b/packages/daemon/src/server/__tests__/http-server-artifacts.test.ts index ecd0d66d0a..ec8fbd2e59 100644 --- a/packages/daemon/src/server/__tests__/http-server-artifacts.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-artifacts.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -8,7 +9,6 @@ import { listDownloadableArtifacts, trackDownloadableArtifact, } from '../../resources/artifact-tracking.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { runCmdSync, withCommandExecutorOverride } from '@agent-device/host-kit/command'; import { closeLoopbackServer, diff --git a/packages/daemon/src/server/__tests__/http-server-rpc-admission.test.ts b/packages/daemon/src/server/__tests__/http-server-rpc-admission.test.ts index 4b42af92f8..350a9ee1e1 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc-admission.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc-admission.test.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { closeLoopbackServer, skipWhenLoopbackUnavailable } from '@agent-device/test-kit/loopback'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { restoreEnv } from '@agent-device/test-kit/env'; diff --git a/packages/daemon/src/server/__tests__/http-server-rpc-invalid-body.test.ts b/packages/daemon/src/server/__tests__/http-server-rpc-invalid-body.test.ts index 67c132e20a..98033484f4 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc-invalid-body.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc-invalid-body.test.ts @@ -1,8 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import { closeLoopbackServer, skipWhenLoopbackUnavailable } from '@agent-device/test-kit/loopback'; import { postRpcCommand, postRpcRaw, startRpcServer } from './http-server-rpc.fixtures.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; const TOKEN = 'invalid-body-token'; diff --git a/packages/daemon/src/server/__tests__/http-server-rpc-lifetime.test.ts b/packages/daemon/src/server/__tests__/http-server-rpc-lifetime.test.ts index cbd8e00276..ad4198c377 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc-lifetime.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc-lifetime.test.ts @@ -1,6 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { getRequestSignal } from '@agent-device/host-kit/request'; import { closeLoopbackServer, skipWhenLoopbackUnavailable } from '@agent-device/test-kit/loopback'; import { postRpcCommand, startRpcServer } from './http-server-rpc.fixtures.ts'; diff --git a/packages/daemon/src/server/__tests__/http-server-rpc-unowned-failure.test.ts b/packages/daemon/src/server/__tests__/http-server-rpc-unowned-failure.test.ts index bf92849592..098a21ef8e 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc-unowned-failure.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc-unowned-failure.test.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import type { NormalizedError } from '@agent-device/kernel/errors'; import { closeLoopbackServer, skipWhenLoopbackUnavailable } from '@agent-device/test-kit/loopback'; import { postRpcCommand, startRpcServer } from './http-server-rpc.fixtures.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; const TOKEN = 'unowned-failure-token'; diff --git a/packages/daemon/src/server/__tests__/http-server-rpc-validation.test.ts b/packages/daemon/src/server/__tests__/http-server-rpc-validation.test.ts index e41affb867..9f630caaf3 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc-validation.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc-validation.test.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import { createDaemonHttpServer } from '../http/http-server.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { cleanupUploadedArtifact, trackUploadedArtifact, diff --git a/packages/daemon/src/server/__tests__/http-server-rpc.fixtures.ts b/packages/daemon/src/server/__tests__/http-server-rpc.fixtures.ts index bb41d46408..656ba2a3e6 100644 --- a/packages/daemon/src/server/__tests__/http-server-rpc.fixtures.ts +++ b/packages/daemon/src/server/__tests__/http-server-rpc.fixtures.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { Server } from 'node:http'; import http from 'node:http'; import { createDaemonHttpServer } from '../http/http-server.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { listenOnLoopback } from '@agent-device/test-kit/loopback'; const RPC_ANSWER_DEADLINE_MS = 1_000; diff --git a/packages/daemon/src/server/__tests__/http-server-tenant-trust.test.ts b/packages/daemon/src/server/__tests__/http-server-tenant-trust.test.ts index 0616652fbb..5518dd867a 100644 --- a/packages/daemon/src/server/__tests__/http-server-tenant-trust.test.ts +++ b/packages/daemon/src/server/__tests__/http-server-tenant-trust.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -6,7 +7,7 @@ import { createDaemonHttpServer } from '../http/http-server.ts'; import { resolveSessionRequestLogPath } from '../../core/session-artifact-paths.ts'; import { safeSessionName } from '@agent-device/host-kit/session-paths'; import { DAEMON_HTTP_TENANT_HEADER } from '@agent-device/contracts/daemon-http'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { closeLoopbackServer, listenOnLoopback, diff --git a/packages/daemon/src/server/__tests__/request-diagnostics-http.test.ts b/packages/daemon/src/server/__tests__/request-diagnostics-http.test.ts index 6340c17409..ce24826e5d 100644 --- a/packages/daemon/src/server/__tests__/request-diagnostics-http.test.ts +++ b/packages/daemon/src/server/__tests__/request-diagnostics-http.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -6,7 +7,6 @@ import path from 'node:path'; import { createDaemonHttpServer } from '../http/http-server.ts'; import { resolveSessionRequestLogPath } from '../../core/session-artifact-paths.ts'; import { safeSessionName } from '@agent-device/host-kit/session-paths'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { LeaseRegistry } from '../../resources/lease-registry.ts'; import { closeLoopbackServer, diff --git a/packages/daemon/src/server/__tests__/request-finalization.test.ts b/packages/daemon/src/server/__tests__/request-finalization.test.ts index b0580debd7..cc2f37d816 100644 --- a/packages/daemon/src/server/__tests__/request-finalization.test.ts +++ b/packages/daemon/src/server/__tests__/request-finalization.test.ts @@ -1,8 +1,8 @@ import { test, expect } from 'vitest'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import { finalizeDaemonResponse } from '../request-finalization.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; -import type { DaemonArtifactType } from '@agent-device/kernel/contracts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; +import type { DaemonArtifactType, DaemonResponse } from '@agent-device/kernel/contracts'; import type { DownloadableArtifactRegistration } from '../../resources/artifact-tracking.ts'; test('finalizeDaemonResponse preserves handler error hints from details', () => { diff --git a/packages/daemon/src/server/__tests__/request-router-session-address.test.ts b/packages/daemon/src/server/__tests__/request-router-session-address.test.ts index daa9018de8..29ff73da97 100644 --- a/packages/daemon/src/server/__tests__/request-router-session-address.test.ts +++ b/packages/daemon/src/server/__tests__/request-router-session-address.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { createTestDeviceInventoryGateways } from '@agent-device/device-selection/inventory-gateways-fixtures'; import { legacyDispatchCapture } from '../../__tests__/support/legacy-snapshot-capture-fixture.ts'; import { test, expect, vi, beforeEach } from 'vitest'; @@ -31,7 +32,7 @@ import { ensureDeviceReady } from '../../core/device/device-ready.ts'; import { awaitFixtureReadiness } from '../../__tests__/support/application-lifecycle-runtime-fixture.ts'; import { makeSessionStore } from '../../__tests__/support/store-factory.ts'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; /** diff --git a/packages/daemon/src/server/__tests__/request-save-script-transports.test.ts b/packages/daemon/src/server/__tests__/request-save-script-transports.test.ts index 8b36f99b98..78376c36e0 100644 --- a/packages/daemon/src/server/__tests__/request-save-script-transports.test.ts +++ b/packages/daemon/src/server/__tests__/request-save-script-transports.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { storeSessionForTest } from '../../__tests__/support/store-factory.ts'; import { isSessionRecording } from '../../core/session-script-publication-capability.ts'; import { createTestDeviceInventoryGateways } from '@agent-device/device-selection/inventory-gateways-fixtures'; @@ -27,7 +28,7 @@ import { createRequestHandler } from '../../__tests__/support/test-device-runtim import { SessionStore } from '../../core/session-store.ts'; import { createDaemonHttpServer } from '../http/http-server.ts'; import { createSocketServer, listenNetServer } from '../http/transport.ts'; -import type { DaemonInvokeFn, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonInvokeFn } from '../../core/daemon-request.ts'; import type { SessionState } from '../../core/session-state.ts'; import { makeIosSession } from '../../__tests__/support/session-factories.ts'; import { diff --git a/packages/daemon/src/server/__tests__/response-views.test.ts b/packages/daemon/src/server/__tests__/response-views.test.ts index 78641a513a..97eb9e30f1 100644 --- a/packages/daemon/src/server/__tests__/response-views.test.ts +++ b/packages/daemon/src/server/__tests__/response-views.test.ts @@ -1,6 +1,6 @@ +import type { DaemonResponseData } from '@agent-device/kernel/contracts'; import { test, expect } from 'vitest'; import { RESPONSE_VIEWS } from '../response-views.ts'; -import type { DaemonResponseData } from '../../core/daemon-request.ts'; const snapshotView = RESPONSE_VIEWS.snapshot; const screenshotView = RESPONSE_VIEWS.screenshot; diff --git a/packages/daemon/src/server/http/http-authorization.test.ts b/packages/daemon/src/server/http/http-authorization.test.ts index 7560029c9f..734112cfcf 100644 --- a/packages/daemon/src/server/http/http-authorization.test.ts +++ b/packages/daemon/src/server/http/http-authorization.test.ts @@ -1,9 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import { createDaemonHttpServer } from './http-server.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { closeLoopbackServer, listenOnLoopback, diff --git a/packages/daemon/src/server/http/http-server.ts b/packages/daemon/src/server/http/http-server.ts index f1187f61b8..e5e5d878f6 100644 --- a/packages/daemon/src/server/http/http-server.ts +++ b/packages/daemon/src/server/http/http-server.ts @@ -5,13 +5,14 @@ // request's cancellation lifetime, and invocation. The envelope framing lives // in `http-rpc-envelope.ts`, the authorization decisions in // `http-authorization.ts`, and the RPC method vocabulary in `http-rpc-methods.ts`. +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import http from 'node:http'; import { randomUUID } from 'node:crypto'; import type { DiagnosticsRecordRef, NormalizedError } from '@agent-device/kernel/errors'; import { normalizeError } from '@agent-device/kernel/errors'; import { LEASE_BACKENDS } from '@agent-device/kernel/contracts'; import { isRecord } from '@agent-device/kernel/record'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../core/daemon-request.ts'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import { clearRequestAbortRegistration, diff --git a/packages/daemon/src/server/http/transport.ts b/packages/daemon/src/server/http/transport.ts index 9d86702b99..c5e22a6329 100644 --- a/packages/daemon/src/server/http/transport.ts +++ b/packages/daemon/src/server/http/transport.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError, normalizeError, createRequestCanceledError } from '@agent-device/kernel/errors'; import net from 'node:net'; import type { Server as HttpServer } from 'node:http'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../core/daemon-request.ts'; import { clearRequestAbortRegistration, isRequestCanceled, diff --git a/packages/daemon/src/server/request-execution-scope.ts b/packages/daemon/src/server/request-execution-scope.ts index c7a045c788..e789c5d867 100644 --- a/packages/daemon/src/server/request-execution-scope.ts +++ b/packages/daemon/src/server/request-execution-scope.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { ProviderAppCatalog } from '@agent-device/contracts/device'; import type { TrackDownloadableArtifact } from '../resources/artifact-tracking.ts'; @@ -60,7 +61,7 @@ import { resolveSessionRequestLog, resolveSessionRunnerLogPath, } from '../core/session-artifact-paths.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; import { teardownSessionResources } from '../sessions/session-teardown.ts'; import { finalizeBoundSessionApplicationLifecycle } from './application-lifecycle-recovery.ts'; diff --git a/packages/daemon/src/server/request-finalization.ts b/packages/daemon/src/server/request-finalization.ts index 3311cd8171..e88afe6d90 100644 --- a/packages/daemon/src/server/request-finalization.ts +++ b/packages/daemon/src/server/request-finalization.ts @@ -5,8 +5,12 @@ import { flushDiagnosticsToSessionFile, getDiagnosticsMeta, } from '@agent-device/host-kit/diagnostics'; -import type { DaemonRequest, DaemonResponse, DaemonResponseData } from '../core/daemon-request.ts'; -import type { DaemonArtifact } from '@agent-device/kernel/contracts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; +import type { + DaemonArtifact, + DaemonResponse, + DaemonResponseData, +} from '@agent-device/kernel/contracts'; import { isDeviceRotation, type DeviceRotation } from '@agent-device/contracts/device'; import type { TrackDownloadableArtifact } from '../resources/artifact-tracking.ts'; diff --git a/packages/daemon/src/server/request-router.ts b/packages/daemon/src/server/request-router.ts index 3d8441c89a..5dcd2c78d5 100644 --- a/packages/daemon/src/server/request-router.ts +++ b/packages/daemon/src/server/request-router.ts @@ -16,6 +16,8 @@ import { type ResponseCost, errorResponse, noActiveSessionError, + type DaemonResponse, + type DaemonResponseData, } from '@agent-device/kernel/contracts'; import type { CloudArtifactProvider } from '@agent-device/contracts/observability'; import type { TrackDownloadableArtifact } from '../resources/artifact-tracking.ts'; @@ -23,12 +25,7 @@ import type { RequestPlatformProviderScope, RequestPlatformProviders, } from '@agent-device/contracts/platform-providers'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, - DaemonResponseData, -} from '../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../core/daemon-request.ts'; import { RESPONSE_VIEWS } from './response-views.ts'; import { SessionStore } from '../core/session-store.ts'; import { resolvePlatformProviderRequestContext } from './request-platform-provider-context.ts'; diff --git a/packages/daemon/src/server/request-save-script-policy.ts b/packages/daemon/src/server/request-save-script-policy.ts index c18d350989..4148d7bf55 100644 --- a/packages/daemon/src/server/request-save-script-policy.ts +++ b/packages/daemon/src/server/request-save-script-policy.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import { emitDiagnostic, @@ -8,7 +9,7 @@ import { listSaveScriptFlagOwnerCommands, ownsSaveScriptFlag, } from '../core/daemon-command-registry.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; /** * #1478: the released `--save-script` flag owners, read from the command diff --git a/packages/daemon/src/server/response-views.ts b/packages/daemon/src/server/response-views.ts index feae4b7374..d4a5759b07 100644 --- a/packages/daemon/src/server/response-views.ts +++ b/packages/daemon/src/server/response-views.ts @@ -1,7 +1,6 @@ import { isDeviceRotation } from '@agent-device/contracts/device'; -import type { ResponseLevel } from '@agent-device/kernel/contracts'; +import type { DaemonResponseData, ResponseLevel } from '@agent-device/kernel/contracts'; import type { ScreenshotOverlayRef, SnapshotNode } from '@agent-device/kernel/snapshot'; -import type { DaemonResponseData } from '../core/daemon-request.ts'; /** * Phase 4 leveled response views. A view maps a command's `default` result data diff --git a/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro-dispatch.test.ts b/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro-dispatch.test.ts index 716db66dee..a823635996 100644 --- a/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro-dispatch.test.ts +++ b/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro-dispatch.test.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { maestroReplayFixture } from './session-replay-runtime-maestro.fixtures.ts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import { test } from 'vitest'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { replayScriptSourceBundleFor } from '@agent-device/replay-port/replay-script-source-fixtures'; import { makeIosSession } from '../../../__tests__/support/session-factories.ts'; diff --git a/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro.fixtures.ts b/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro.fixtures.ts index de05698ac3..ef7485a331 100644 --- a/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro.fixtures.ts +++ b/packages/daemon/src/sessions/__tests__/replay-maestro/session-replay-runtime-maestro.fixtures.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { vi } from 'vitest'; // The Maestro replay engine resolves a real device and — through the ADR 0012 @@ -43,11 +44,7 @@ import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import type { CommandFlags } from '@agent-device/contracts/command'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '../../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../../core/daemon-request.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { SessionStore } from '../../../core/session-store.ts'; import { runReplayForTest } from '../replay-runtime/replay-command-fixture.ts'; diff --git a/packages/daemon/src/sessions/__tests__/replay-repair/session-replay-repair.fixtures.ts b/packages/daemon/src/sessions/__tests__/replay-repair/session-replay-repair.fixtures.ts index cce16e1dfc..f853a06201 100644 --- a/packages/daemon/src/sessions/__tests__/replay-repair/session-replay-repair.fixtures.ts +++ b/packages/daemon/src/sessions/__tests__/replay-repair/session-replay-repair.fixtures.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { storeSessionForTest } from '../../../__tests__/support/store-factory.ts'; import { isSessionRecording } from '../../../core/session-script-publication-capability.ts'; import { NO_SCRIPT_PUBLICATION } from '../../../core/session-script-publication-state.ts'; @@ -9,11 +10,7 @@ import { NO_SCRIPT_PUBLICATION } from '../../../core/session-script-publication- * session.actions." This factory keeps the per-test mock declarative (a config * object, no inline branching) so each test body stays linear. */ -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '../../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../../core/daemon-request.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { isInteractiveObservation } from '../../../core/session-action-recorder.ts'; import { makeIosSession } from '../../../__tests__/support/session-factories.ts'; diff --git a/packages/daemon/src/sessions/__tests__/replay-runtime/application.test.ts b/packages/daemon/src/sessions/__tests__/replay-runtime/application.test.ts index 577958c7ef..388ddc2c83 100644 --- a/packages/daemon/src/sessions/__tests__/replay-runtime/application.test.ts +++ b/packages/daemon/src/sessions/__tests__/replay-runtime/application.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import fs from 'node:fs'; import path from 'node:path'; import { beforeEach, expect, test, vi } from 'vitest'; @@ -11,7 +12,7 @@ import { import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { makeIosSession } from '../../../__tests__/support/session-factories.ts'; import { withClientReplayScriptSources } from '@agent-device/replay-port/replay-script-source-fixtures'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { createReplaySession, diff --git a/packages/daemon/src/sessions/__tests__/replay-runtime/replay-command-fixture.ts b/packages/daemon/src/sessions/__tests__/replay-runtime/replay-command-fixture.ts index fd2962ae8d..22bd5ad86c 100644 --- a/packages/daemon/src/sessions/__tests__/replay-runtime/replay-command-fixture.ts +++ b/packages/daemon/src/sessions/__tests__/replay-runtime/replay-command-fixture.ts @@ -1,9 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { ReplayTestAttemptStepSink } from '@agent-device/replay-test'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '../../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionStore } from '../../../core/session-store.ts'; import { createReplaySession, diff --git a/packages/daemon/src/sessions/__tests__/replay-runtime/session-replay-runtime-failure.test.ts b/packages/daemon/src/sessions/__tests__/replay-runtime/session-replay-runtime-failure.test.ts index d861669006..59465b6119 100644 --- a/packages/daemon/src/sessions/__tests__/replay-runtime/session-replay-runtime-failure.test.ts +++ b/packages/daemon/src/sessions/__tests__/replay-runtime/session-replay-runtime-failure.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test, expect, vi, beforeEach } from 'vitest'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; @@ -13,7 +14,6 @@ import fs from 'node:fs'; import path from 'node:path'; import { runReplayForTest } from './replay-command-fixture.ts'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { makeIosSession } from '../../../__tests__/support/session-factories.ts'; import { formatReplayDivergenceReport } from '@agent-device/ad-replay/divergence'; import { maestroScriptSourceBundleFor } from '@agent-device/replay-port/replay-script-source-fixtures'; diff --git a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-command-video.test.ts b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-command-video.test.ts index dc5a42019d..293fd84e04 100644 --- a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-command-video.test.ts +++ b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-command-video.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; /** Per-attempt recording is finalized exactly once after cancellation. */ import assert from 'node:assert/strict'; @@ -5,7 +6,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { beforeEach, test, vi } from 'vitest'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { makeIosSession } from '../../../__tests__/support/session-factories.ts'; import { runReplayTestCommand } from '@agent-device/replay-port/test-command'; import { diff --git a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-infrastructure.test.ts b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-infrastructure.test.ts index 03e8fca614..49ab1ce64e 100644 --- a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-infrastructure.test.ts +++ b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite-infrastructure.test.ts @@ -1,10 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import { expect, test, vi } from 'vitest'; import fs from 'node:fs'; import path from 'node:path'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import { handleSessionCommands } from '../../../__tests__/support/handlers/session-command-harness.ts'; import { expectOkData, makeSessionStore } from './session-test-suite.fixtures.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; diff --git a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite.fixtures.ts b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite.fixtures.ts index b62ee513fd..0c94eb1137 100644 --- a/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite.fixtures.ts +++ b/packages/daemon/src/sessions/__tests__/replay-suite/session-test-suite.fixtures.ts @@ -1,8 +1,8 @@ +import type { DaemonResponse, DaemonResponseData } from '@agent-device/kernel/contracts'; import { expect } from 'vitest'; import path from 'node:path'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonResponse, DaemonResponseData } from '../../../core/daemon-request.ts'; export function makeSessionStore(): SessionStore { const root = mkdtempForTestSync('agent-device-session-test-suite-'); diff --git a/packages/daemon/src/sessions/__tests__/replay-target/session-replay-scenario.fixtures.ts b/packages/daemon/src/sessions/__tests__/replay-target/session-replay-scenario.fixtures.ts index 487f47031c..c057c2baa4 100644 --- a/packages/daemon/src/sessions/__tests__/replay-target/session-replay-scenario.fixtures.ts +++ b/packages/daemon/src/sessions/__tests__/replay-target/session-replay-scenario.fixtures.ts @@ -1,12 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import path from 'node:path'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { makeIosAppSession } from '../../../__tests__/support/session-factories.ts'; import { SessionStore } from '../../../core/session-store.ts'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '../../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../../core/daemon-request.ts'; import { runReplayForTest } from '../replay-runtime/replay-command-fixture.ts'; import { baseReplayRequest, diff --git a/packages/daemon/src/sessions/__tests__/request-handler-catalog.test.ts b/packages/daemon/src/sessions/__tests__/request-handler-catalog.test.ts index 79df2bf107..f680d970cc 100644 --- a/packages/daemon/src/sessions/__tests__/request-handler-catalog.test.ts +++ b/packages/daemon/src/sessions/__tests__/request-handler-catalog.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../__tests__/support/platform-services-fixture.ts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -30,7 +31,7 @@ import { unavailableBindExactDevice, unavailableInspectFacts, } from '../../__tests__/support/unavailable-device-runtime-gateway.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { createAudioProbeAdmissionLedger } from '@agent-device/capture-kit/audio-probe-admission-ledger'; import { createPerfCaptureAdmissionLedger } from '@agent-device/capture-kit/perf-capture-admission-ledger'; diff --git a/packages/daemon/src/sessions/handlers/__tests__/lease-artifacts.test.ts b/packages/daemon/src/sessions/handlers/__tests__/lease-artifacts.test.ts index 6216a9663c..e84b45ed54 100644 --- a/packages/daemon/src/sessions/handlers/__tests__/lease-artifacts.test.ts +++ b/packages/daemon/src/sessions/handlers/__tests__/lease-artifacts.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import type { CloudArtifactsQuery } from '@agent-device/contracts/observability'; @@ -5,7 +6,7 @@ import type { DeviceLease } from '@agent-device/contracts/device'; import { AppError, isRequestCanceledError } from '@agent-device/kernel/errors'; import { clearRequestCanceled, markRequestCanceled } from '@agent-device/host-kit/request'; import { makeSessionStore } from '../../../__tests__/support/store-factory.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { handleLeaseCommands } from '../lease.ts'; import { LeaseRegistry } from '../../../resources/lease-registry.ts'; diff --git a/packages/daemon/src/sessions/handlers/__tests__/session-boot-shutdown-device-claims.test.ts b/packages/daemon/src/sessions/handlers/__tests__/session-boot-shutdown-device-claims.test.ts index 24e6eb0a17..318cdb8d9a 100644 --- a/packages/daemon/src/sessions/handlers/__tests__/session-boot-shutdown-device-claims.test.ts +++ b/packages/daemon/src/sessions/handlers/__tests__/session-boot-shutdown-device-claims.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture, daemonClaimRecoveryGatewayFixture, @@ -24,7 +25,7 @@ import { inspectDeviceClaims } from '../../../resources/device/device-claim-insp import { createRequestExecutionScope } from '../../../server/request-execution-scope.ts'; import { handleBootCommand } from '../session-boot.ts'; import { handleShutdownCommand } from '../session-shutdown.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; // #1799: `boot`/`shutdown` route through a daemon that need not own the target // device. Two daemons on one host each keep their own state directory, so the diff --git a/packages/daemon/src/sessions/handlers/__tests__/session-push.test.ts b/packages/daemon/src/sessions/handlers/__tests__/session-push.test.ts index 9a847df5d7..bee662b540 100644 --- a/packages/daemon/src/sessions/handlers/__tests__/session-push.test.ts +++ b/packages/daemon/src/sessions/handlers/__tests__/session-push.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import fs from 'node:fs'; import path from 'node:path'; @@ -7,7 +8,7 @@ import type { BindDeviceRuntime, } from '../../../core/request-runtime-binding.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { makeSessionStore } from '../../../__tests__/support/store-factory.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { diff --git a/packages/daemon/src/sessions/handlers/__tests__/session-reinstall.test.ts b/packages/daemon/src/sessions/handlers/__tests__/session-reinstall.test.ts index f429546ef5..830fd82d80 100644 --- a/packages/daemon/src/sessions/handlers/__tests__/session-reinstall.test.ts +++ b/packages/daemon/src/sessions/handlers/__tests__/session-reinstall.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import fs from 'node:fs'; import path from 'node:path'; @@ -9,7 +10,7 @@ import type { InspectDeviceRuntimeFacts, } from '../../../core/request-runtime-binding.ts'; import { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { fakeCreateCommandSurface } from '../../../__tests__/support/command-surface-fake.ts'; diff --git a/packages/daemon/src/sessions/handlers/__tests__/session-trigger.test.ts b/packages/daemon/src/sessions/handlers/__tests__/session-trigger.test.ts index c777ef042e..45e9c01767 100644 --- a/packages/daemon/src/sessions/handlers/__tests__/session-trigger.test.ts +++ b/packages/daemon/src/sessions/handlers/__tests__/session-trigger.test.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import { test, expect } from 'vitest'; import { handleSessionCommands } from '../../../__tests__/support/handlers/session-command-harness.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { makeSessionStore } from '../../../__tests__/support/store-factory.ts'; import { fakeCreateCommandSurface } from '../../../__tests__/support/command-surface-fake.ts'; diff --git a/packages/daemon/src/sessions/handlers/human-control.ts b/packages/daemon/src/sessions/handlers/human-control.ts index 6102fb04cd..65d339f505 100644 --- a/packages/daemon/src/sessions/handlers/human-control.ts +++ b/packages/daemon/src/sessions/handlers/human-control.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError } from '@agent-device/kernel/errors'; import { getRequestSignal } from '@agent-device/host-kit/request'; import { parseHumanControlHoldInput } from '../../resources/human-control-contract.ts'; import type { LeaseRegistry } from '../../resources/lease-registry.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; export async function handleHumanControlCommand(params: { req: DaemonRequest; diff --git a/packages/daemon/src/sessions/handlers/lease.ts b/packages/daemon/src/sessions/handlers/lease.ts index 30cceedc5c..b15e7112e9 100644 --- a/packages/daemon/src/sessions/handlers/lease.ts +++ b/packages/daemon/src/sessions/handlers/lease.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DeviceLease, LeaseLifecycleContext, @@ -8,7 +9,7 @@ import type { AgentArtifactsResult, CloudArtifactProvider, } from '@agent-device/contracts/observability'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { LeaseRegistry } from '../../resources/lease-registry.ts'; import { leaseReleaseRequestFor, diff --git a/packages/daemon/src/sessions/handlers/record-runtime-response.ts b/packages/daemon/src/sessions/handlers/record-runtime-response.ts index c9c97eadb7..b0a182a8a8 100644 --- a/packages/daemon/src/sessions/handlers/record-runtime-response.ts +++ b/packages/daemon/src/sessions/handlers/record-runtime-response.ts @@ -1,3 +1,4 @@ +import type { DaemonArtifact, DaemonResponse } from '@agent-device/kernel/contracts'; import path from 'node:path'; import type { RecordingCommandResult } from '@agent-device/contracts/recording'; import type { @@ -5,7 +6,6 @@ import type { ScreenRecordingLiveSnapshot, } from '@agent-device/contracts/screen-recording-runtime'; import type { RuntimeOperationUnavailability } from '@agent-device/contracts/platform-runtime'; -import type { DaemonArtifact, DaemonResponse } from '../../core/daemon-request.ts'; import { deriveRecordingTelemetryPath } from '@agent-device/capture-kit/recording-telemetry'; export function buildRecordingStartResponse( diff --git a/packages/daemon/src/sessions/handlers/record-runtime.ts b/packages/daemon/src/sessions/handlers/record-runtime.ts index 3f5d4c5273..a211f436e9 100644 --- a/packages/daemon/src/sessions/handlers/record-runtime.ts +++ b/packages/daemon/src/sessions/handlers/record-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import path from 'node:path'; import type { PlatformRequestScope } from '@agent-device/contracts/platform-runtime-host'; @@ -37,7 +38,7 @@ import type { BindDeviceRuntime, BindExactDeviceRuntime, } from '../../core/request-runtime-binding.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../core/session-state.ts'; import { recordSessionAction } from '../../core/session-action-recorder.ts'; import { diff --git a/packages/daemon/src/sessions/handlers/record-trace.ts b/packages/daemon/src/sessions/handlers/record-trace.ts index 80594c6624..c0d90c1348 100644 --- a/packages/daemon/src/sessions/handlers/record-trace.ts +++ b/packages/daemon/src/sessions/handlers/record-trace.ts @@ -1,5 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { SessionStore } from '../../core/session-store.ts'; import { handleRecordCommand } from './record-runtime.ts'; import type { diff --git a/packages/daemon/src/sessions/handlers/session-app-deployment-route.ts b/packages/daemon/src/sessions/handlers/session-app-deployment-route.ts index 8e14acb8a0..494f60701c 100644 --- a/packages/daemon/src/sessions/handlers/session-app-deployment-route.ts +++ b/packages/daemon/src/sessions/handlers/session-app-deployment-route.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import type { BindDeviceRuntime, InspectDeviceRuntimeFacts, } from '../../core/request-runtime-binding.ts'; import { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { handleAppDeploymentCommand, handlePushNotificationCommand, diff --git a/packages/daemon/src/sessions/handlers/session-app-deployment.ts b/packages/daemon/src/sessions/handlers/session-app-deployment.ts index 5adc81fb20..cb6a09e7f4 100644 --- a/packages/daemon/src/sessions/handlers/session-app-deployment.ts +++ b/packages/daemon/src/sessions/handlers/session-app-deployment.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import { expandSessionPath } from '@agent-device/host-kit/session-paths'; import fs from 'node:fs'; @@ -18,7 +19,7 @@ import type { InspectDeviceRuntimeFacts, } from '../../core/request-runtime-binding.ts'; import type { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../core/session-state.ts'; import { resolvePayloadInput } from '../payload-input.ts'; import { resolveDeployResultTarget } from '@agent-device/contracts/deploy-result-target'; diff --git a/packages/daemon/src/sessions/handlers/session-app-source-deployment.ts b/packages/daemon/src/sessions/handlers/session-app-source-deployment.ts index 169722d4e5..a7e5f6717f 100644 --- a/packages/daemon/src/sessions/handlers/session-app-source-deployment.ts +++ b/packages/daemon/src/sessions/handlers/session-app-source-deployment.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import type { AppDeploymentResult, @@ -23,7 +24,7 @@ import type { InspectDeviceRuntimeFacts, } from '../../core/request-runtime-binding.ts'; import { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionState } from '../../core/session-state.ts'; import { resolveInstallFromSourceResultTarget } from '@agent-device/contracts/deploy-result-target'; import { withSuccessText } from '@agent-device/kernel/success-text'; diff --git a/packages/daemon/src/sessions/handlers/session-appstate-apple-session.ts b/packages/daemon/src/sessions/handlers/session-appstate-apple-session.ts index d8091de675..ce22e11c7f 100644 --- a/packages/daemon/src/sessions/handlers/session-appstate-apple-session.ts +++ b/packages/daemon/src/sessions/handlers/session-appstate-apple-session.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { AppleApplicationState } from '@agent-device/kernel/snapshot'; import { isMacOs, @@ -12,7 +13,6 @@ import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import { appStateUse } from '@agent-device/contracts/platform-runtime-operations'; import { admitRuntimeUse } from '../../core/runtime-admission.ts'; import type { RuntimeCommandHandlerParams } from '../../core/session-runtime-admission.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; /** * The session facts this answer is built from, as a structural view: the handler reads exactly diff --git a/packages/daemon/src/sessions/handlers/session-appstate-device-runtime.ts b/packages/daemon/src/sessions/handlers/session-appstate-device-runtime.ts index 854da580cf..0e28cb005a 100644 --- a/packages/daemon/src/sessions/handlers/session-appstate-device-runtime.ts +++ b/packages/daemon/src/sessions/handlers/session-appstate-device-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { appStateUse } from '@agent-device/contracts/platform-runtime-operations'; import { isIosFamily, @@ -8,7 +9,6 @@ import { import { resolveAndroidSerialAllowlist } from '@agent-device/kernel/device-isolation'; import { admitRuntimeUse } from '../../core/runtime-admission.ts'; import type { RuntimeCommandHandlerParams } from '../../core/session-runtime-admission.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { appleSessionRequiredRefusal } from './session-appstate-apple-session.ts'; function sortedAndroidSerialAllowlist(value: string | undefined): string[] | undefined { diff --git a/packages/daemon/src/sessions/handlers/session-appstate.ts b/packages/daemon/src/sessions/handlers/session-appstate.ts index dacdab15ec..d9aff811f5 100644 --- a/packages/daemon/src/sessions/handlers/session-appstate.ts +++ b/packages/daemon/src/sessions/handlers/session-appstate.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isApplePlatform, type PlatformSelector } from '@agent-device/kernel/device'; import { errorResponse } from '@agent-device/kernel/contracts'; import { @@ -7,7 +8,6 @@ import { selectorTargetsSessionDevice, } from '../../resources/session-device-resolution.ts'; import type { RuntimeCommandHandlerParams } from '../../core/session-runtime-admission.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { appleSessionAppStateResponse, appleSessionRequiredRefusal, diff --git a/packages/daemon/src/sessions/handlers/session-batch.ts b/packages/daemon/src/sessions/handlers/session-batch.ts index 8b785ec196..b7277d3477 100644 --- a/packages/daemon/src/sessions/handlers/session-batch.ts +++ b/packages/daemon/src/sessions/handlers/session-batch.ts @@ -1,5 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { runBatch } from '@agent-device/command-registry/batch'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../core/daemon-request.ts'; export async function runBatchCommands( req: DaemonRequest, diff --git a/packages/daemon/src/sessions/handlers/session-boot.ts b/packages/daemon/src/sessions/handlers/session-boot.ts index 2cf8216bf3..c71200b8a0 100644 --- a/packages/daemon/src/sessions/handlers/session-boot.ts +++ b/packages/daemon/src/sessions/handlers/session-boot.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { resolveDeviceReadinessRuntimePlan } from '@agent-device/contracts/platform-runtime-operations'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { asAppError } from '@agent-device/kernel/errors'; @@ -13,7 +14,6 @@ import { } from '../../core/runtime-admission.ts'; import { startupDeadlineAtMs } from '../startup-deadline.ts'; import type { RuntimeCommandHandlerParams } from '../../core/session-runtime-admission.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { deviceStatusReportResponse } from './session-device-status-response.ts'; /** `boot --headless` reports an unsupported cell as a request error, not a device capability gap. */ diff --git a/packages/daemon/src/sessions/handlers/session-command-input.ts b/packages/daemon/src/sessions/handlers/session-command-input.ts index e99d840813..87b0f088f2 100644 --- a/packages/daemon/src/sessions/handlers/session-command-input.ts +++ b/packages/daemon/src/sessions/handlers/session-command-input.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import type { LeaseLifecycleProvider, ProviderAppCatalog } from '@agent-device/contracts/device'; import type { HostDiagnostics } from '@agent-device/contracts/host-diagnostics'; import type { PlatformResourceCleanup } from '../../core/platform-resource-cleanup.ts'; import type { PlatformRequestScope } from '@agent-device/contracts/platform-runtime-host'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../../core/daemon-request.ts'; import type { AppLogAdmissionLedger } from '../../resources/app-log-admission-ledger.ts'; import { type AudioProbeAdmissionLedger } from '@agent-device/capture-kit/audio-probe-admission-ledger'; import { type PerfCaptureAdmissionLedger } from '@agent-device/capture-kit/perf-capture-admission-ledger'; diff --git a/packages/daemon/src/sessions/handlers/session-device-status-response.ts b/packages/daemon/src/sessions/handlers/session-device-status-response.ts index 3042a82880..4f220e666b 100644 --- a/packages/daemon/src/sessions/handlers/session-device-status-response.ts +++ b/packages/daemon/src/sessions/handlers/session-device-status-response.ts @@ -1,10 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { TargetShutdownResult } from '@agent-device/contracts/device'; import { isApplePlatform, publicPlatformString, type DeviceInfo, } from '@agent-device/kernel/device'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; /** The per-command status field a device-status report carries beside the device identity. */ export type DeviceStatusReport = Readonly<{ booted: true } | { shutdown: TargetShutdownResult }>; diff --git a/packages/daemon/src/sessions/handlers/session-doctor.ts b/packages/daemon/src/sessions/handlers/session-doctor.ts index ca6be82f68..dbb5cbb0f0 100644 --- a/packages/daemon/src/sessions/handlers/session-doctor.ts +++ b/packages/daemon/src/sessions/handlers/session-doctor.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import path from 'node:path'; import { PUBLIC_COMMANDS } from '@agent-device/command-registry/catalog'; import { isIosFamily, publicPlatformString, type DeviceInfo } from '@agent-device/kernel/device'; @@ -9,7 +10,7 @@ import { shouldPropagateDeviceInventoryProbeError, } from '@agent-device/device-selection/device-inventory-context'; import { readVersion } from '@agent-device/host-kit/version'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionState } from '../../core/session-state.ts'; import { SessionStore } from '../../core/session-store.ts'; import { appendAppChecks, type DoctorAppInventory } from './session-doctor-app.ts'; diff --git a/packages/daemon/src/sessions/handlers/session-prepare.ts b/packages/daemon/src/sessions/handlers/session-prepare.ts index aef1f77e15..c79ae3f3f7 100644 --- a/packages/daemon/src/sessions/handlers/session-prepare.ts +++ b/packages/daemon/src/sessions/handlers/session-prepare.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import { prepareAppleRunnerRuntimeUse } from '@agent-device/contracts/application-lifecycle-runtime-plan'; import type { BoundDeviceRuntime } from '@agent-device/contracts/platform-runtime'; @@ -5,7 +6,7 @@ import { PUBLIC_COMMANDS } from '@agent-device/command-registry/catalog'; import { PREPARE_STARTUP_BUDGET_MS } from '@agent-device/command-registry/timeout-policy'; import { publicPlatformString, type DeviceInfo } from '@agent-device/kernel/device'; import { resolveRunnerLogicalLeaseContext } from '../../core/lease-context.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { SessionStore } from '../../core/session-store.ts'; import type { BindDeviceRuntime, diff --git a/packages/daemon/src/sessions/handlers/session-runtime-command.ts b/packages/daemon/src/sessions/handlers/session-runtime-command.ts index c5a1aa9927..865cd77f90 100644 --- a/packages/daemon/src/sessions/handlers/session-runtime-command.ts +++ b/packages/daemon/src/sessions/handlers/session-runtime-command.ts @@ -1,5 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { publicPlatformString } from '@agent-device/kernel/device'; import { clearRuntimeHintsRuntimeUse } from '@agent-device/contracts/application-lifecycle-runtime-plan'; import { SessionStore } from '../../core/session-store.ts'; diff --git a/packages/daemon/src/sessions/handlers/session-runtime-port-reverse.ts b/packages/daemon/src/sessions/handlers/session-runtime-port-reverse.ts index 2c45150bf1..3107e0402d 100644 --- a/packages/daemon/src/sessions/handlers/session-runtime-port-reverse.ts +++ b/packages/daemon/src/sessions/handlers/session-runtime-port-reverse.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; import type { ProviderPortReverseOptions } from '@agent-device/contracts/device'; import { configureProviderPortReverseRuntimeUse } from '@agent-device/contracts/application-lifecycle-runtime-plan'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionStore } from '../../core/session-store.ts'; import type { BindDeviceRuntime, diff --git a/packages/daemon/src/sessions/handlers/session-script-publication.ts b/packages/daemon/src/sessions/handlers/session-script-publication.ts index 68f7a27820..b5d1c99e1f 100644 --- a/packages/daemon/src/sessions/handlers/session-script-publication.ts +++ b/packages/daemon/src/sessions/handlers/session-script-publication.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { INTERNAL_COMMANDS } from '@agent-device/command-registry/catalog'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import { successText } from '@agent-device/kernel/success-text'; @@ -9,7 +10,7 @@ import { } from '../../core/session-script-publication-capability.ts'; import { isRepairArmedSession } from '../../core/session-replay-transaction.ts'; import { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionState } from '../../core/session-state.ts'; export function handleSessionScriptPublication(params: { diff --git a/packages/daemon/src/sessions/handlers/session-shutdown.ts b/packages/daemon/src/sessions/handlers/session-shutdown.ts index 3683569735..0621be2fc7 100644 --- a/packages/daemon/src/sessions/handlers/session-shutdown.ts +++ b/packages/daemon/src/sessions/handlers/session-shutdown.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { RuntimeOperationFact } from '@agent-device/contracts/platform-runtime'; import type { TargetShutdownResult } from '@agent-device/contracts/device'; import { shutdownTargetUse } from '@agent-device/contracts/platform-runtime-operations'; @@ -12,7 +13,6 @@ import { requireRuntimeFacts, type RuntimeCommandHandlerParams, } from '../../core/session-runtime-admission.ts'; -import type { DaemonResponse } from '../../core/daemon-request.ts'; import { deviceStatusReportResponse } from './session-device-status-response.ts'; function shutdownUnavailableResponse(fact: RuntimeOperationFact) { diff --git a/packages/daemon/src/sessions/handlers/session.ts b/packages/daemon/src/sessions/handlers/session.ts index b732cf07bc..d6cf629619 100644 --- a/packages/daemon/src/sessions/handlers/session.ts +++ b/packages/daemon/src/sessions/handlers/session.ts @@ -1,4 +1,4 @@ -import type { DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { handleReleaseMaterializedPathsCommand } from './session-app-source-deployment.ts'; import { handleRuntimeCommand } from './session-runtime-command.ts'; import { diff --git a/packages/daemon/src/sessions/handlers/snapshot.ts b/packages/daemon/src/sessions/handlers/snapshot.ts index 796001fc5f..2377b23363 100644 --- a/packages/daemon/src/sessions/handlers/snapshot.ts +++ b/packages/daemon/src/sessions/handlers/snapshot.ts @@ -1,5 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../core/platform-services.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import { SessionStore } from '../../core/session-store.ts'; import { handleAlertCommand } from '../../execution/handlers/snapshot-alert.ts'; import { diff --git a/packages/daemon/src/sessions/handlers/trace-runtime.ts b/packages/daemon/src/sessions/handlers/trace-runtime.ts index af7eb84206..bbb4cb3319 100644 --- a/packages/daemon/src/sessions/handlers/trace-runtime.ts +++ b/packages/daemon/src/sessions/handlers/trace-runtime.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { expandSessionPath } from '@agent-device/host-kit/session-paths'; import fs from 'node:fs'; import path from 'node:path'; import type { TraceCommandResult } from '@agent-device/contracts/recording'; import type { SessionStore } from '../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../core/daemon-request.ts'; import type { SessionRef } from '../../core/session-state.ts'; import { recordSessionAction } from '../../core/session-action-recorder.ts'; import { errorResponse } from '@agent-device/kernel/contracts'; diff --git a/packages/daemon/src/sessions/request-handler-chain.ts b/packages/daemon/src/sessions/request-handler-chain.ts index a0645bce75..61fb8e2a71 100644 --- a/packages/daemon/src/sessions/request-handler-chain.ts +++ b/packages/daemon/src/sessions/request-handler-chain.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../core/platform-services.ts'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { CloudArtifactProvider } from '@agent-device/contracts/observability'; @@ -9,7 +10,7 @@ import type { DaemonCommandContext } from '../core/context.ts'; import type { LeaseLifecycleProvider, ProviderAppCatalog } from '@agent-device/contracts/device'; import type { LeaseRegistry } from '../resources/lease-registry.ts'; import type { SessionStore } from '../core/session-store.ts'; -import type { DaemonInvokeFn, DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonInvokeFn, DaemonRequest } from '../core/daemon-request.ts'; import type { BindDeviceRuntime, BindExactDeviceRuntime, diff --git a/packages/daemon/src/sessions/session-lifecycle/__tests__/application.test.ts b/packages/daemon/src/sessions/session-lifecycle/__tests__/application.test.ts index ac9f2f2c55..98377819ed 100644 --- a/packages/daemon/src/sessions/session-lifecycle/__tests__/application.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/__tests__/application.test.ts @@ -1,6 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { makeSessionStore } from '../../../__tests__/support/store-factory.ts'; import { sessionOrDeviceSelectorRequiredDetails } from '@agent-device/kernel/errors'; import { fakeCreateCommandSurface } from '../../../__tests__/support/command-surface-fake.ts'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-ended-lease.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-ended-lease.test.ts index b10e1ab0a7..3fa0dfbc3f 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-ended-lease.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-ended-lease.test.ts @@ -4,7 +4,8 @@ import path from 'node:path'; import { AppError } from '@agent-device/kernel/errors'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import { LeaseRegistry } from '../../../../resources/lease-registry.ts'; import { fakeCreateCommandSurface } from '../../../../__tests__/support/command-surface-fake.ts'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-lifecycle-runtime.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-lifecycle-runtime.test.ts index 3f371f5f31..bab09d947d 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-lifecycle-runtime.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-lifecycle-runtime.test.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; import path from 'node:path'; import { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import type { CloseApplicationInput } from '@agent-device/contracts/application-lifecycle-runtime'; import { diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-shutdown.fixtures.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-shutdown.fixtures.ts index f768e962de..db7a4f83be 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-shutdown.fixtures.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-shutdown.fixtures.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { vi } from 'vitest'; import fs from 'node:fs'; import path from 'node:path'; import { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import { AppError } from '@agent-device/kernel/errors'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-without-session-mode.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-without-session-mode.test.ts index b440292745..7a5d438407 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-without-session-mode.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-close-without-session-mode.test.ts @@ -4,7 +4,8 @@ import { test, expect, vi } from 'vitest'; import path from 'node:path'; import type { DeviceInfo } from '@agent-device/kernel/device'; import type { CloseApplicationInput } from '@agent-device/contracts/application-lifecycle-runtime'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import { SessionStore } from '../../../../core/session-store.ts'; import { fakeCreateCommandSurface } from '../../../../__tests__/support/command-surface-fake.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-devices-batch-runtime.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-devices-batch-runtime.test.ts index 4a70c78ad1..46ee6b307d 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-devices-batch-runtime.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-devices-batch-runtime.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { test, expect, vi } from 'vitest'; import * as fs from 'node:fs'; @@ -19,7 +20,7 @@ import { handleReleaseMaterializedPathsCommand } from '../../../handlers/session import { handleSessionCommands } from '../../../../__tests__/support/handlers/session-command-harness.ts'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; import { makeSession } from '../../../../__tests__/support/session-factories.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import { withTestDeviceInventory } from '@agent-device/device-selection/inventory-gateways-fixtures'; import type { DeviceInfo } from '@agent-device/kernel/device'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-appleos.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-appleos.test.ts index c344801d28..f137a3f0f5 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-appleos.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-appleos.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { test, expect, vi, beforeEach } from 'vitest'; @@ -15,7 +16,7 @@ vi.mock('@agent-device/device-selection/device-inventory-context', async (import import { handleSessionInventoryCommands } from '../inventory.ts'; import { listDeviceInventory } from '@agent-device/device-selection/device-inventory-context'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { AppleOS, DeviceInfo } from '@agent-device/kernel/device'; import { AppError } from '@agent-device/kernel/errors'; import { diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-harmonyos.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-harmonyos.test.ts index 38eb673a13..97bc83893a 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-harmonyos.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-harmonyos.test.ts @@ -1,6 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import { makeSession, makeSessionStore, diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-scoped-paths.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-scoped-paths.test.ts index a108a1928d..ebe65005c5 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-scoped-paths.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-inventory-scoped-paths.test.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { test, expect } from 'vitest'; import path from 'node:path'; import { handleSessionInventoryCommands } from '../inventory.ts'; import { makeSessionStore } from '../../../../__tests__/support/store-factory.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import { IOS_SIMULATOR } from '@agent-device/test-kit/device-fixtures'; import { resolveImplicitSessionScope } from '../../../session-routing.ts'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-foreground.test.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-foreground.test.ts index d10d15fff1..68f32315f7 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-foreground.test.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-foreground.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../../__tests__/support/platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; import { fakeCreateCommandSurface } from '../../../../__tests__/support/command-surface-fake.ts'; @@ -12,7 +13,7 @@ import { makeAndroidEmulator, } from './session-open-runtime.fixtures.ts'; import { AppError } from '@agent-device/kernel/errors'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import { composeOpenWithInitialSnapshot, resolveForegroundOpenRequest, diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-runtime.fixtures.ts b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-runtime.fixtures.ts index 73c7ec5162..e4c6fc8122 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-runtime.fixtures.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/__tests__/session-open-runtime.fixtures.ts @@ -1,6 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import path from 'node:path'; import { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../../core/daemon-request.ts'; import type { SessionState } from '../../../../core/session-state.ts'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/inventory.ts b/packages/daemon/src/sessions/session-lifecycle/internal/inventory.ts index a1f85b2b5a..bcb985a1bd 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/inventory.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/inventory.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; import { commandRuntimeUseRequirements, @@ -27,7 +28,7 @@ import { } from '../../../resources/device/device-claim-inspection.ts'; import { canonicalLocalDeviceKey } from '../../../resources/device/device-claim-paths.ts'; import { deviceClaimIdentity } from '../../../resources/device/device-claims.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef } from '../../../core/session-state.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { resolveSessionRunnerLogPath } from '../../../core/session-artifact-paths.ts'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-close-runtime-admission.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-close-runtime-admission.ts index fec244230a..0658ec43fb 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-close-runtime-admission.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-close-runtime-admission.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; import { closeApplicationRuntimeUse, @@ -5,7 +6,6 @@ import { } from '@agent-device/contracts/application-lifecycle-runtime-plan'; import type { BoundDeviceRuntime } from '@agent-device/contracts/platform-runtime'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { DaemonResponse } from '../../../core/daemon-request.ts'; import type { BindDeviceRuntime, InspectDeviceRuntimeFacts, diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-close-script.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-close-script.ts index 55c31057fb..edc0c978b8 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-close-script.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-close-script.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import { successText } from '@agent-device/kernel/success-text'; import type { CommandFlags } from '@agent-device/contracts/command'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { NO_SCRIPT_PUBLICATION, diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-close.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-close.ts index ca7f0ed6db..286f46fc03 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-close.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-close.ts @@ -1,8 +1,9 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import type { LeaseLifecycleProvider, TargetShutdownResult } from '@agent-device/contracts/device'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { successText, withSuccessText } from '@agent-device/kernel/success-text'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-execution.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-execution.ts index 6b1831ac7a..4057ef8038 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-execution.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-execution.ts @@ -12,7 +12,7 @@ import type { SessionSurface } from '@agent-device/contracts/session'; import type { OpenApplicationTiming } from '@agent-device/contracts/application-lifecycle-runtime'; import type { DeviceInfo } from '@agent-device/kernel/device'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { abortAuthoringOnSecondOpen, @@ -63,7 +63,11 @@ import type { TakenOverDeviceClaim } from '../../../resources/device/device-clai import { appendResponseWarning } from './session-open-warnings.ts'; import { buildDeviceClaimConflictError } from '../../../resources/device/device-claim-conflict.ts'; import { deviceClaimRuleForOwner } from '../../../resources/device/device-claim-rule.ts'; -import { errorResponse, type DaemonFailureResponse } from '@agent-device/kernel/contracts'; +import { + errorResponse, + type DaemonFailureResponse, + type DaemonResponse, +} from '@agent-device/kernel/contracts'; export type SessionOpenResult = | Readonly<{ type: 'opened'; response: DaemonResponse; ref: SessionRef }> diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-foreground.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-foreground.ts index fd3791ecf9..ec96f79bd1 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-foreground.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-foreground.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; import { normalizeError, type NormalizedError } from '@agent-device/kernel/errors'; import type { CreateDaemonCommandSurface } from '@agent-device/contracts/daemon-command-surface'; import { dispatchSnapshotViaRuntime } from '../../snapshot-runtime.ts'; import type { SessionRef } from '../../../core/session-state.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { BindDeviceRuntime, InspectDeviceRuntimeFacts, diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-prepare.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-prepare.ts index 5d3cd350de..5eaf3171e5 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-open-prepare.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-open-prepare.ts @@ -1,9 +1,10 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { isDeepLinkTarget } from '@agent-device/contracts/command'; import type { RuntimeHintsApplicationInput } from '@agent-device/contracts/application-lifecycle-runtime'; import { openApplicationRuntimeUse } from '@agent-device/contracts/application-lifecycle-runtime-plan'; import type { BoundDeviceRuntime } from '@agent-device/contracts/platform-runtime'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { startupDeadlineAtMs } from '../../startup-deadline.ts'; import type { SessionRuntimeHints, SessionState } from '../../../core/session-state.ts'; import { SessionStore } from '../../../core/session-store.ts'; diff --git a/packages/daemon/src/sessions/session-lifecycle/internal/session-open.ts b/packages/daemon/src/sessions/session-lifecycle/internal/session-open.ts index df5afa0467..4f716d0c27 100644 --- a/packages/daemon/src/sessions/session-lifecycle/internal/session-open.ts +++ b/packages/daemon/src/sessions/session-lifecycle/internal/session-open.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { DaemonPlatformServices } from '../../../core/platform-services.ts'; import { resolveTargetDeviceSelection } from '@agent-device/device-selection/dispatch-resolve'; import { @@ -8,7 +9,7 @@ import { resolveOpenApplicationRuntimePlan, } from '@agent-device/contracts/application-lifecycle-runtime-plan'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionState } from '../../../core/session-state.ts'; import { SessionStore } from '../../../core/session-store.ts'; import { refreshSessionDeviceIfNeeded } from '../../../resources/session-device-resolution.ts'; diff --git a/packages/daemon/src/sessions/session-observability/__tests__/application.test.ts b/packages/daemon/src/sessions/session-observability/__tests__/application.test.ts index 271e198305..acbd73af4d 100644 --- a/packages/daemon/src/sessions/session-observability/__tests__/application.test.ts +++ b/packages/daemon/src/sessions/session-observability/__tests__/application.test.ts @@ -1,6 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '../../../__tests__/support/platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import { makeSessionStore } from '../../../__tests__/support/store-factory.ts'; import { fakeCreateCommandSurface } from '../../../__tests__/support/command-surface-fake.ts'; diff --git a/packages/daemon/src/sessions/session-observability/internal/__tests__/session-audio.test.ts b/packages/daemon/src/sessions/session-observability/internal/__tests__/session-audio.test.ts index 04d75ef1e3..f62eb95c2a 100644 --- a/packages/daemon/src/sessions/session-observability/internal/__tests__/session-audio.test.ts +++ b/packages/daemon/src/sessions/session-observability/internal/__tests__/session-audio.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test, vi } from 'vitest'; import { PendingTransferGuard } from '@agent-device/contracts/async-lifecycle'; @@ -24,7 +25,6 @@ import { import { createAudioProbeAdmissionLedger } from '@agent-device/capture-kit/audio-probe-admission-ledger'; import { audioProbeDurableResource } from '@agent-device/capture-kit/audio-probe-session-resource'; import type { SessionStore } from '../../../../core/session-store.ts'; -import type { DaemonResponse } from '../../../../core/daemon-request.ts'; import { handleSessionObservabilityCommands } from '../../index.ts'; import { ANDROID_AUDIO_CONTRACT_EVIDENCE } from '../../__tests__/session-audio.coverage.ts'; import { encodeHostAudioProbeDescriptor } from '@agent-device/capture-kit/audio-probe-descriptor-fixtures'; diff --git a/packages/daemon/src/sessions/session-observability/internal/session-audio.ts b/packages/daemon/src/sessions/session-observability/internal/session-audio.ts index 747e66a3f3..c50a460794 100644 --- a/packages/daemon/src/sessions/session-observability/internal/session-audio.ts +++ b/packages/daemon/src/sessions/session-observability/internal/session-audio.ts @@ -20,10 +20,14 @@ import type { InspectDeviceRuntimeFacts, } from '../../../core/request-runtime-binding.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef } from '../../../core/session-state.ts'; import { bindSessionAudioProbe } from '../../../core/session-capture-binding.ts'; -import { type DaemonFailureResponse, errorResponse } from '@agent-device/kernel/contracts'; +import { + type DaemonFailureResponse, + errorResponse, + type DaemonResponse, +} from '@agent-device/kernel/contracts'; type AudioParams = { req: DaemonRequest; diff --git a/packages/daemon/src/sessions/session-observability/internal/session-network.ts b/packages/daemon/src/sessions/session-observability/internal/session-network.ts index 2c0a5fc8b3..95e1f73328 100644 --- a/packages/daemon/src/sessions/session-observability/internal/session-network.ts +++ b/packages/daemon/src/sessions/session-observability/internal/session-network.ts @@ -9,11 +9,12 @@ import { NETWORK_INCLUDE_MODES, type NetworkIncludeMode, errorResponse, + type DaemonResponse, } from '@agent-device/kernel/contracts'; import { AppError, normalizeError } from '@agent-device/kernel/errors'; import type { BindDeviceRuntime } from '../../../core/request-runtime-binding.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; const NETWORK_ACTIONS = ['dump', 'log'] as const; const NETWORK_ACTIONS_MESSAGE = `network requires ${NETWORK_ACTIONS.join(' or ')}`; diff --git a/packages/daemon/src/sessions/session-observability/internal/session-observability.ts b/packages/daemon/src/sessions/session-observability/internal/session-observability.ts index 1e28817db2..093c44e09a 100644 --- a/packages/daemon/src/sessions/session-observability/internal/session-observability.ts +++ b/packages/daemon/src/sessions/session-observability/internal/session-observability.ts @@ -32,12 +32,16 @@ import type { InspectDeviceRuntimeFacts, } from '../../../core/request-runtime-binding.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { handleAudioCommand } from './session-audio.ts'; import { handlePerfRuntimeCommand } from './session-perf-runtime.ts'; import { handleNetworkCommand } from './session-network.ts'; -import { type DaemonFailureResponse, errorResponse } from '@agent-device/kernel/contracts'; +import { + type DaemonFailureResponse, + errorResponse, + type DaemonResponse, +} from '@agent-device/kernel/contracts'; export type SessionObservabilityCommandInput = { req: DaemonRequest; diff --git a/packages/daemon/src/sessions/session-observability/internal/session-perf-runtime.ts b/packages/daemon/src/sessions/session-observability/internal/session-perf-runtime.ts index d7a4020057..ffbc844541 100644 --- a/packages/daemon/src/sessions/session-observability/internal/session-perf-runtime.ts +++ b/packages/daemon/src/sessions/session-observability/internal/session-perf-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { expandSessionPath } from '@agent-device/host-kit/session-paths'; import path from 'node:path'; import { type PerfCaptureAdmissionLedger } from '@agent-device/capture-kit/perf-capture-admission-ledger'; @@ -31,7 +32,7 @@ import type { InspectDeviceRuntimeFacts, } from '../../../core/request-runtime-binding.ts'; import type { SessionStore } from '../../../core/session-store.ts'; -import type { DaemonRequest, DaemonResponse } from '../../../core/daemon-request.ts'; +import type { DaemonRequest } from '../../../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../../../core/session-state.ts'; import { bindSessionPerfCapture } from '../../../core/session-capture-binding.ts'; import { recordSessionAction } from '../../../core/session-action-recorder.ts'; diff --git a/packages/daemon/src/sessions/session-replay-coordinator.ts b/packages/daemon/src/sessions/session-replay-coordinator.ts index 12edab7596..befc95330f 100644 --- a/packages/daemon/src/sessions/session-replay-coordinator.ts +++ b/packages/daemon/src/sessions/session-replay-coordinator.ts @@ -1,7 +1,7 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { SessionAction } from '@agent-device/contracts/session'; import type { ReplayDivergenceResume, ReplayRepairHint } from '@agent-device/contracts/divergence'; import { readReplayDivergenceResume } from '@agent-device/ad-replay/divergence'; -import type { DaemonResponse } from '../core/daemon-request.ts'; import type { SessionRuntimeHints, SessionState } from '../core/session-state.ts'; import { armRepairStep, diff --git a/packages/daemon/src/sessions/snapshot-command-runtime.ts b/packages/daemon/src/sessions/snapshot-command-runtime.ts index cd2c54df48..c159254a7d 100644 --- a/packages/daemon/src/sessions/snapshot-command-runtime.ts +++ b/packages/daemon/src/sessions/snapshot-command-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse, DaemonResponseData } from '@agent-device/kernel/contracts'; import { copySnapshotClickabilityEvidence, snapshotCaptureAnnotationsFrom, @@ -29,7 +30,7 @@ import { resolveBoundSnapshotCaptureRuntime, type SnapshotRuntimeRouteParams, } from '../core/snapshot-runtime-binding.ts'; -import type { DaemonRequest, DaemonResponse, DaemonResponseData } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionRef, SessionState } from '../core/session-state.ts'; export type SnapshotRuntimeRecord = diff --git a/packages/daemon/src/sessions/snapshot-diff-runtime.ts b/packages/daemon/src/sessions/snapshot-diff-runtime.ts index 7fdc2e1ad5..354e6980d0 100644 --- a/packages/daemon/src/sessions/snapshot-diff-runtime.ts +++ b/packages/daemon/src/sessions/snapshot-diff-runtime.ts @@ -1,6 +1,6 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { dispatchSnapshotRuntimeCommand } from './snapshot-command-runtime.ts'; import type { SnapshotRuntimeRouteParams } from '../core/snapshot-runtime-binding.ts'; -import type { DaemonResponse } from '../core/daemon-request.ts'; /** Canonical `diff snapshot` route over one facts-first, request-bound capture runtime. */ export async function dispatchSnapshotDiffViaRuntime( diff --git a/packages/daemon/src/sessions/snapshot-quality-latch.ts b/packages/daemon/src/sessions/snapshot-quality-latch.ts index ec9840e110..4a5358d8b0 100644 --- a/packages/daemon/src/sessions/snapshot-quality-latch.ts +++ b/packages/daemon/src/sessions/snapshot-quality-latch.ts @@ -1,7 +1,7 @@ +import type { DaemonResponseData } from '@agent-device/kernel/contracts'; import type { SnapshotQualityVerdict } from '@agent-device/kernel/snapshot'; import { readResponseWarnings } from '@agent-device/kernel/success-text'; import { recoveredSnapshotQualityWarning } from '@agent-device/capture-kit/quality-warnings'; -import type { DaemonResponseData } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; type RecoveredWarningLatch = NonNullable; diff --git a/packages/daemon/src/sessions/snapshot-runtime.ts b/packages/daemon/src/sessions/snapshot-runtime.ts index 72576bbf45..e2a58ffb9a 100644 --- a/packages/daemon/src/sessions/snapshot-runtime.ts +++ b/packages/daemon/src/sessions/snapshot-runtime.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { stripAndroidSystemChromeProvenance } from '@agent-device/contracts/android-system-chrome'; import { copySnapshotClickabilityEvidence } from '@agent-device/contracts/capture'; import { @@ -9,7 +10,7 @@ import { withTargetActivationDisclosure } from '../core/capture-disclosure.ts'; import { dispatchSnapshotRuntimeCommand } from './snapshot-command-runtime.ts'; import { captureSparseFallbackScreenshot } from '../execution/sparse-fallback-screenshot.ts'; import type { SnapshotRuntimeRouteParams } from '../core/snapshot-runtime-binding.ts'; -import type { DaemonRequest, DaemonResponse } from '../core/daemon-request.ts'; +import type { DaemonRequest } from '../core/daemon-request.ts'; import type { SessionState } from '../core/session-state.ts'; export async function dispatchSnapshotViaRuntime( diff --git a/src/__tests__/cli-remote-diagnostics.test.ts b/src/__tests__/cli-remote-diagnostics.test.ts index 155c35f7dc..5e12df5cf2 100644 --- a/src/__tests__/cli-remote-diagnostics.test.ts +++ b/src/__tests__/cli-remote-diagnostics.test.ts @@ -5,6 +5,8 @@ * locator → fetch → rendered line) is observable end to end. */ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -13,7 +15,6 @@ import { normalizeError, AppError } from '@agent-device/kernel/errors'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; import { resolveSessionRequestLogPath } from '@agent-device/daemon/session-artifact-paths'; import { safeSessionName } from '@agent-device/host-kit/session-paths'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { runCliCapture, type CapturedCliRun } from './cli-capture.ts'; import { closeLoopbackServer, @@ -51,7 +52,7 @@ async function runAgainstRemoteDaemon( let requestId = ''; let daemonLogPath = ''; - const handleRequest = async (req: DaemonRequest): Promise => { + const handleRequest = async (req: DaemonWireRequest): Promise => { requestId = req.meta?.requestId ?? ''; daemonLogPath = resolveRecordPath(DAEMON_SESSION, requestId); fs.mkdirSync(path.dirname(daemonLogPath), { recursive: true }); diff --git a/src/__tests__/command-descriptor-ref-frame-effect.test.ts b/src/__tests__/command-descriptor-ref-frame-effect.test.ts index 92a0bd56bf..1c9736bfe3 100644 --- a/src/__tests__/command-descriptor-ref-frame-effect.test.ts +++ b/src/__tests__/command-descriptor-ref-frame-effect.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import type { RefFrameEffect } from '@agent-device/contracts/replay'; import assert from 'node:assert/strict'; import { test } from 'vitest'; @@ -6,14 +7,13 @@ import { DAEMON_COMMAND_DESCRIPTORS, resolveRefFrameEffect, } from '@agent-device/daemon/daemon-command-registry'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; // ADR 0014 migration step 2: the ref-frame-effect classification is an // honesty/completeness guard. Every command that reaches a session-owning daemon // leaf must classify how it relates to the authorized ref frame, so a device // mutation cannot be added on a path that silently leaves stale refs admissible. -function makeRequest(command: string, positionals: string[] = []): DaemonRequest { +function makeRequest(command: string, positionals: string[] = []): DaemonWireRequest { return { command, token: 'gate-token', session: 'gate-session', positionals, flags: {} }; } diff --git a/src/__tests__/daemon-client-progress.test.ts b/src/__tests__/daemon-client-progress.test.ts index 6f14366a95..cbad7b3cbd 100644 --- a/src/__tests__/daemon-client-progress.test.ts +++ b/src/__tests__/daemon-client-progress.test.ts @@ -1,9 +1,10 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { RequestProgressEvent } from '@agent-device/contracts/progress'; import assert from 'node:assert/strict'; import { EventEmitter } from 'node:events'; import type { Socket } from 'node:net'; import { test } from 'vitest'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { readDaemonSocketProgressResponse } from '../daemon-client/daemon-client-progress.ts'; import { beginStderrCapture } from './test-utils/stream-capture.ts'; import { AppError } from '@agent-device/kernel/errors'; @@ -34,7 +35,7 @@ function createMockSocket(): MockSocket { function readSocketProgressResponse( socket: MockSocket, - req: DaemonRequest, + req: DaemonWireRequest, onProgress?: (event: RequestProgressEvent) => void, ): Promise { let settled = false; @@ -105,7 +106,7 @@ function replayTestEvent(event: RequestProgressEvent | undefined): ReplayTestPro test('readDaemonSocketProgressResponse forwards split progress lines before response envelopes', async () => { const socket = createMockSocket(); - const req: DaemonRequest = { + const req: DaemonWireRequest = { session: 'default', command: 'test', positionals: ['/tmp/replays'], @@ -159,7 +160,7 @@ test('readDaemonSocketProgressResponse forwards split progress lines before resp test('readDaemonSocketProgressResponse hands generic command progress to the sink, rendering none itself', async () => { const socket = createMockSocket(); - const req: DaemonRequest = { + const req: DaemonWireRequest = { session: 'default', command: 'snapshot', positionals: [], @@ -205,7 +206,7 @@ test('readDaemonSocketProgressResponse hands generic command progress to the sin test('readDaemonSocketProgressResponse forwards replay progress events to the sink', async () => { const socket = createMockSocket(); - const req: DaemonRequest = { + const req: DaemonWireRequest = { session: 'default', command: 'test', positionals: ['/tmp/replays'], @@ -244,7 +245,7 @@ test('readDaemonSocketProgressResponse forwards replay progress events to the si test('readDaemonSocketProgressResponse renders nothing without a sink', async () => { const socket = createMockSocket(); - const req: DaemonRequest = { + const req: DaemonWireRequest = { session: 'default', command: 'test', positionals: ['/tmp/replays'], @@ -309,7 +310,7 @@ test('readDaemonSocketProgressResponse renders nothing without a sink', async () test('readDaemonSocketProgressResponse rejects invalid response lines with request context', async () => { const socket = createMockSocket(); - const req: DaemonRequest = { + const req: DaemonWireRequest = { session: 'default', command: 'snapshot', positionals: [], diff --git a/src/__tests__/daemon-composition/capture-disclosure.test.ts b/src/__tests__/daemon-composition/capture-disclosure.test.ts index 0bf36a4971..886851e4a5 100644 --- a/src/__tests__/daemon-composition/capture-disclosure.test.ts +++ b/src/__tests__/daemon-composition/capture-disclosure.test.ts @@ -1,10 +1,11 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test, expect, vi, beforeEach } from 'vitest'; import { legacyDispatchCapture } from '@agent-device/daemon/testing/__tests__/legacy-snapshot-capture-fixture'; import { handleFindCommands } from '@agent-device/daemon/testing/interaction/index'; import { getRuntimeBindings } from '@agent-device/daemon/testing/__tests__/interaction-get-runtime-fixture'; import { dispatchFindReadOnlyViaRuntime } from '@agent-device/daemon/testing/selector-runtime'; import { dispatchWaitViaRuntime } from '@agent-device/daemon/testing/wait-runtime'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import { ANDROID_SYSTEM_SURFACE_DISCLOSURE } from '@agent-device/contracts/android-system-surface-disclosure'; import { iosSystemSurfaceDisclosure } from '@agent-device/contracts/ios-system-surface'; import { snapshotRuntimeFixture } from '@agent-device/daemon/testing/__tests__/snapshot-runtime-fixture'; @@ -115,7 +116,7 @@ test('read-only find exists on a system-surface capture discloses the occlusion' command: 'find', positionals: ['Internet', 'exists'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, @@ -142,7 +143,7 @@ test('wait timeout for app text hidden behind a system surface discloses the occ command: 'wait', positionals: ['Bakery list', '250'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, @@ -168,7 +169,7 @@ test('sessionless read-only find still discloses the occluding system surface', command: 'find', positionals: ['Internet', 'exists'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, @@ -230,7 +231,7 @@ test('sessionless wait success on shade content still discloses the occluding sy command: 'wait', positionals: ['Internet', '250'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, @@ -258,7 +259,7 @@ test('sessionless wait timeout still discloses the occluding system surface', as command: 'wait', positionals: ['Bakery list', '250'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, @@ -413,7 +414,7 @@ test('wait timeout whose polls required a foreground repair discloses the repair command: 'wait', positionals: ['Bakery list', '250'], flags: {}, - } as DaemonRequest, + } as DaemonWireRequest, sessionName: 'default', logPath: '/tmp/test.log', sessionStore, diff --git a/src/__tests__/daemon-composition/generic-settle.test.ts b/src/__tests__/daemon-composition/generic-settle.test.ts index f472a548cb..002eaee8b3 100644 --- a/src/__tests__/daemon-composition/generic-settle.test.ts +++ b/src/__tests__/daemon-composition/generic-settle.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { composedPlatformServicesFixture } from './platform-services-fixture.ts'; import { beforeEach, expect, test, vi } from 'vitest'; import type { CommandFlags } from '@agent-device/contracts/command'; @@ -23,7 +24,7 @@ import { } from '@agent-device/daemon/testing/ref-frame'; import { setSessionSnapshot } from '@agent-device/daemon/testing/session-snapshot'; import type { SessionStore } from '@agent-device/daemon/testing/session-store'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { SessionRef, SessionState } from '@agent-device/daemon/testing/session-state'; import { buildSnapshotState } from '@agent-device/capture-kit/snapshot-state'; import { selectorCaptureFixture } from '@agent-device/daemon/testing/__tests__/selector-capture-fixture'; diff --git a/src/__tests__/daemon-composition/handlers/session-doctor-warmup.test.ts b/src/__tests__/daemon-composition/handlers/session-doctor-warmup.test.ts index 0cef4c405d..52e754dd51 100644 --- a/src/__tests__/daemon-composition/handlers/session-doctor-warmup.test.ts +++ b/src/__tests__/daemon-composition/handlers/session-doctor-warmup.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { beforeEach, expect, test, vi } from 'vitest'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { isActiveProviderDevice } from '@agent-device/daemon/testing/provider-device-admission'; @@ -5,7 +6,6 @@ import { handleDoctorCommand } from '@agent-device/daemon/testing/handlers/sessi import { createHostDiagnostics } from '../../../platform-runtime-host-diagnostics.ts'; import { makeSessionStore } from '@agent-device/daemon/testing/__tests__/support/store-factory'; import { withTestDeviceInventory } from '@agent-device/device-selection/inventory-gateways-fixtures'; -import type { DaemonResponse } from '@agent-device/daemon/daemon-request'; const { mockAppleRunnerWarmupCheck } = vi.hoisted(() => ({ mockAppleRunnerWarmupCheck: vi.fn(), diff --git a/src/__tests__/daemon-composition/handlers/snapshot-handler.test.ts b/src/__tests__/daemon-composition/handlers/snapshot-handler.test.ts index 19fb34d8fd..2be3f3812e 100644 --- a/src/__tests__/daemon-composition/handlers/snapshot-handler.test.ts +++ b/src/__tests__/daemon-composition/handlers/snapshot-handler.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { composedPlatformServicesFixture } from '../platform-services-fixture.ts'; import { test, expect, vi, afterEach, beforeEach } from 'vitest'; import { legacyDispatchCapture } from '@agent-device/daemon/testing/__tests__/legacy-snapshot-capture-fixture'; @@ -13,7 +14,6 @@ import { testCreateCommandSurface } from '../command-surface-fixture.ts'; // The daemon reads provider ownership through its own typed admission seam; production // installs it from root composition, and these tests compose it the same way. installProviderDeviceAdmission({ isActive: isActiveProviderDevice }); -import type { DaemonResponse } from '@agent-device/daemon/daemon-request'; import type { SessionState } from '@agent-device/daemon/testing/session-state'; import { androidCapture, diff --git a/src/__tests__/daemon-composition/interaction/find-production-route.test.ts b/src/__tests__/daemon-composition/interaction/find-production-route.test.ts index a0c6ead9b8..4c8af2fe6d 100644 --- a/src/__tests__/daemon-composition/interaction/find-production-route.test.ts +++ b/src/__tests__/daemon-composition/interaction/find-production-route.test.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { test, expect, vi, beforeEach } from 'vitest'; import { handleInteractionCommands } from '@agent-device/daemon/testing/interaction/index'; import type { CommandFlags } from '@agent-device/contracts/command'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { makeSessionStore } from '@agent-device/daemon/testing/__tests__/support/store-factory'; import { makeIosSession as makeSession } from '@agent-device/daemon/testing/__tests__/support/session-factories'; import { testCreateCommandSurface } from '../command-surface-fixture.ts'; diff --git a/src/__tests__/daemon-composition/request-handler-chain.test.ts b/src/__tests__/daemon-composition/request-handler-chain.test.ts index b69e98b6de..845030aa2d 100644 --- a/src/__tests__/daemon-composition/request-handler-chain.test.ts +++ b/src/__tests__/daemon-composition/request-handler-chain.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { composedPlatformServicesFixture } from './platform-services-fixture.ts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; @@ -7,7 +8,7 @@ import { INTERNAL_COMMANDS } from '@agent-device/command-registry/catalog'; import { LeaseRegistry } from '@agent-device/daemon/testing/lease-registry'; import { runRequestHandlerChain } from '@agent-device/daemon/testing/request-handler-chain'; import { getDaemonRouteOwnerFiles } from '@agent-device/daemon/route-owner-files'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { LINUX_DEVICE } from '@agent-device/test-kit/device-fixtures'; import { makeIosSession, diff --git a/src/__tests__/daemon-composition/request-router-macos-app-lease.test.ts b/src/__tests__/daemon-composition/request-router-macos-app-lease.test.ts index feefc65631..f239dd2137 100644 --- a/src/__tests__/daemon-composition/request-router-macos-app-lease.test.ts +++ b/src/__tests__/daemon-composition/request-router-macos-app-lease.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { afterEach, beforeEach, expect, test, vi } from 'vitest'; import path from 'node:path'; import { createTestDeviceInventoryGateways } from '@agent-device/device-selection/inventory-gateways-fixtures'; @@ -5,7 +6,7 @@ import { MACOS_DEVICE } from '@agent-device/test-kit/device-fixtures'; import { makeSessionStore } from '@agent-device/daemon/testing/__tests__/support/store-factory'; import { makeMacOsSession } from '@agent-device/daemon/testing/__tests__/support/session-factories'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { LeaseRegistry } from '@agent-device/daemon/testing/lease-registry'; import { createRequestHandler } from '@agent-device/daemon/testing/__tests__/test-device-runtime-gateway'; import { screenshotRuntimeFixture } from '@agent-device/daemon/testing/__tests__/screenshot-runtime-fixture'; diff --git a/src/__tests__/daemon-composition/session-lifecycle/session-close-runtime-hints.test.ts b/src/__tests__/daemon-composition/session-lifecycle/session-close-runtime-hints.test.ts index b8fcbbf956..8b433816dc 100644 --- a/src/__tests__/daemon-composition/session-lifecycle/session-close-runtime-hints.test.ts +++ b/src/__tests__/daemon-composition/session-lifecycle/session-close-runtime-hints.test.ts @@ -1,7 +1,8 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { beforeEach, expect, test, vi } from 'vitest'; import path from 'node:path'; import { SessionStore } from '@agent-device/daemon/testing/session-store'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { SessionState } from '@agent-device/daemon/testing/session-state'; import { fakeCreateCommandSurface } from '@agent-device/daemon/testing/__tests__/support/command-surface-fake'; diff --git a/src/cli/replay-test/__tests__/session-test-reporter-values-maestro.test.ts b/src/cli/replay-test/__tests__/session-test-reporter-values-maestro.test.ts index b45523f2e6..aab45ce77d 100644 --- a/src/cli/replay-test/__tests__/session-test-reporter-values-maestro.test.ts +++ b/src/cli/replay-test/__tests__/session-test-reporter-values-maestro.test.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '@agent-device/daemon/testing/__tests__/platform-services-fixture'; // Characterization of the shipped reporter contract for the MAESTRO adapter (#1478 P3). // @@ -43,7 +45,6 @@ import path from 'node:path'; import type { ReplaySuiteResult } from '@agent-device/contracts/replay'; import { handleSessionCommands } from '@agent-device/daemon/testing/handlers/__tests__/session-command-harness'; import { SessionStore } from '@agent-device/daemon/testing/session-store'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { withRequestProgressSink } from '@agent-device/host-kit/request'; import { getReplayTestReporterExitCode, @@ -105,8 +106,8 @@ function makeSessionStore(root: string): SessionStore { async function runMaestroSuiteThroughReporter(params: { root: string; requestId: string; - flags?: DaemonRequest['flags']; - invoke: (req: DaemonRequest) => Promise; + flags?: DaemonWireRequest['flags']; + invoke: (req: DaemonWireRequest) => Promise; }): Promise<{ hooks: RecordedHook[]; suite: ReplaySuiteResult; exitCode: number }> { const { reporter, hooks } = createRecordingReporter(); const reporters = [reporter]; @@ -139,7 +140,7 @@ async function runMaestroSuiteThroughReporter(params: { } /** `snapshot` returns an empty hierarchy; every other command succeeds. */ -function maestroInvoke(req: DaemonRequest): DaemonResponse { +function maestroInvoke(req: DaemonWireRequest): DaemonResponse { if (req.command === 'snapshot') return { ok: true, data: { createdAt: 0, nodes: [] } }; if (req.command === 'runtime') { return { ok: true, data: { viewport: { x: 0, y: 0, width: 400, height: 800 } } }; diff --git a/src/cli/replay-test/__tests__/session-test-reporter-values.test.ts b/src/cli/replay-test/__tests__/session-test-reporter-values.test.ts index 4713fbd261..e790148a7c 100644 --- a/src/cli/replay-test/__tests__/session-test-reporter-values.test.ts +++ b/src/cli/replay-test/__tests__/session-test-reporter-values.test.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { daemonPlatformServicesFixture } from '@agent-device/daemon/testing/__tests__/platform-services-fixture'; // Characterization of the shipped reporter contract across the scheduler seam (#1478 P3). // @@ -26,7 +28,6 @@ import path from 'node:path'; import type { ReplaySuiteResult } from '@agent-device/contracts/replay'; import { handleSessionCommands } from '@agent-device/daemon/testing/handlers/__tests__/session-command-harness'; import { SessionStore } from '@agent-device/daemon/testing/session-store'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { withRequestProgressSink } from '@agent-device/host-kit/request'; import { withTestDeviceInventoryProvider as withDeviceInventoryProvider } from '@agent-device/device-selection/inventory-gateways-fixtures'; import type { DeviceInfo } from '@agent-device/kernel/device'; @@ -93,8 +94,8 @@ async function runSuiteThroughReporter(params: { root: string; requestId: string; inputs?: string[]; - flags?: DaemonRequest['flags']; - invoke: (req: DaemonRequest) => Promise; + flags?: DaemonWireRequest['flags']; + invoke: (req: DaemonWireRequest) => Promise; devices?: DeviceInfo[]; }): Promise<{ hooks: RecordedHook[]; suite: ReplaySuiteResult; exitCode: number }> { const { reporter, hooks } = createRecordingReporter(); diff --git a/src/client/client-normalizers.ts b/src/client/client-normalizers.ts index 73edc29077..08f067b561 100644 --- a/src/client/client-normalizers.ts +++ b/src/client/client-normalizers.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest, InternalRequestOptions } from '@agent-device/contracts/command'; import type { AgentDeviceDevice, AgentDeviceSession, @@ -8,7 +9,6 @@ import type { StartupPerfSample, DeviceSelectionMetadata, } from '@agent-device/contracts/client'; -import type { InternalRequestOptions } from '@agent-device/contracts/command'; import type { TargetShutdownResult } from '@agent-device/contracts/device'; import { isAppleOs, @@ -25,7 +25,6 @@ import { leaseScopeFromOptions, leaseScopeToRequestMeta, } from '@agent-device/contracts/lease-scope'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { asRecord, isRecord, @@ -385,7 +384,7 @@ export function readSnapshotNodes(value: unknown): SnapshotNode[] { return Array.isArray(value) ? (value as SnapshotNode[]) : []; } -export function buildMeta(options: InternalRequestOptions): DaemonRequest['meta'] { +export function buildMeta(options: InternalRequestOptions): DaemonWireRequest['meta'] { const leaseScope = leaseScopeFromOptions(options); return stripUndefined({ requestId: options.requestId, diff --git a/src/daemon-client/__tests__/boundary-fault-acceptance.test.ts b/src/daemon-client/__tests__/boundary-fault-acceptance.test.ts index 01ef1d94d7..4a624209a4 100644 --- a/src/daemon-client/__tests__/boundary-fault-acceptance.test.ts +++ b/src/daemon-client/__tests__/boundary-fault-acceptance.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import http from 'node:http'; import path from 'node:path'; @@ -6,7 +7,6 @@ import { AppError } from '@agent-device/kernel/errors'; import { assertRejectsAppError } from '@agent-device/test-kit/app-error'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import type { DaemonPaths } from '@agent-device/daemon-contracts/daemon-resolution'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { sendRequest } from '../daemon-client-transport.ts'; type ProcessDeathCommand = 'press' | 'fill' | 'snapshot' | 'screenshot' | 'open' | 'close'; @@ -115,7 +115,7 @@ async function startEndpointThatDiesAfterRequest(): Promise { }; } -function buildRequest(row: ProcessDeathRow): DaemonRequest { +function buildRequest(row: ProcessDeathRow): DaemonWireRequest { return { token: 'test-token', session: 'acceptance', diff --git a/src/daemon-client/__tests__/boundary-fault-transport.test.ts b/src/daemon-client/__tests__/boundary-fault-transport.test.ts index a8e266f213..503e3fae83 100644 --- a/src/daemon-client/__tests__/boundary-fault-transport.test.ts +++ b/src/daemon-client/__tests__/boundary-fault-transport.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import http from 'node:http'; import net from 'node:net'; @@ -12,7 +13,6 @@ import { } from '@agent-device/test-kit/loopback'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; import type { DaemonPaths } from '@agent-device/daemon-contracts/daemon-resolution'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { sendRequest } from '../daemon-client-transport.ts'; const { mockRunCmdSync } = vi.hoisted(() => ({ mockRunCmdSync: vi.fn() })); @@ -236,7 +236,7 @@ test('socket malformed response stays typed at the daemon client seam', async () function buildRequest( row: { command: string; positionals: readonly string[] }, suffix: string, -): DaemonRequest { +): DaemonWireRequest { return { token: 'test-token', session: 'boundary-faults', diff --git a/src/daemon-client/__tests__/daemon-client-abort-default-transport.test.ts b/src/daemon-client/__tests__/daemon-client-abort-default-transport.test.ts index caf8ed643b..4a98d54da8 100644 --- a/src/daemon-client/__tests__/daemon-client-abort-default-transport.test.ts +++ b/src/daemon-client/__tests__/daemon-client-abort-default-transport.test.ts @@ -15,6 +15,8 @@ * the caller's rejection is the id the daemon canceled, which is what lets a caller correlate a * canceled call with the daemon's own diagnostics. */ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import { test } from 'vitest'; @@ -22,11 +24,7 @@ import { isRequestCanceledError } from '@agent-device/kernel/errors'; import { getRequestSignal, isRequestCanceled } from '@agent-device/host-kit/request'; import { readProcessStartTime } from '@agent-device/host-kit/process'; import { readVersion } from '@agent-device/host-kit/version'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '@agent-device/daemon/daemon-request'; +import type { DaemonInvokeFn } from '@agent-device/daemon/daemon-request'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; import { createSocketServer, listenNetServer } from '@agent-device/daemon/testing/server/transport'; import { createAgentDeviceClient } from '../../agent-device-client.ts'; @@ -47,7 +45,7 @@ type SeenRequest = { started: boolean; canceled: boolean[]; requestId?: string } // `wait` is the long request the caller abandons; it never answers on its own, so only the client's // disconnect ends it — through the daemon's own request-scoped cancellation. function hangingWaitHandler(seen: SeenRequest): DaemonInvokeFn { - return async (req: DaemonRequest): Promise => { + return async (req: DaemonWireRequest): Promise => { const requestId = req.meta?.requestId; seen.started = true; seen.requestId = requestId; diff --git a/src/daemon-client/__tests__/daemon-client-abort-timeout.test.ts b/src/daemon-client/__tests__/daemon-client-abort-timeout.test.ts index cdb98ef8fb..2a7f4a00c3 100644 --- a/src/daemon-client/__tests__/daemon-client-abort-timeout.test.ts +++ b/src/daemon-client/__tests__/daemon-client-abort-timeout.test.ts @@ -10,17 +10,15 @@ * makes the abort case's empty-calls assertion evidence instead of an absent hook: delete the * abort path's `clearTimeout` and only the abort case fails. */ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import http from 'node:http'; import { DAEMON_HTTP_INSTANCE_MISMATCH_HEADER } from '@agent-device/contracts/daemon-http'; import { test, vi } from 'vitest'; import { AppError, isRequestCanceledError } from '@agent-device/kernel/errors'; import { getRequestSignal } from '@agent-device/host-kit/request'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '@agent-device/daemon/daemon-request'; +import type { DaemonInvokeFn } from '@agent-device/daemon/daemon-request'; import { createSocketServer, listenNetServer } from '@agent-device/daemon/testing/server/transport'; import { sendRequest } from '../daemon-client-transport.ts'; import { resolveDaemonPaths } from '@agent-device/daemon-contracts/daemon-resolution'; @@ -54,7 +52,7 @@ const OUTLIVE_MS = 80; // A request the daemon never answers: the only things that can end it are the client's abort and // the transport's own budget, which is what makes the timer's fate observable. function hangingHandler(): DaemonInvokeFn { - return async (req: DaemonRequest): Promise => { + return async (req: DaemonWireRequest): Promise => { const signal = getRequestSignal(req.meta?.requestId); return await new Promise((_resolve, reject) => { signal?.addEventListener('abort', () => reject(signal.reason), { once: true }); diff --git a/src/daemon-client/__tests__/daemon-client-abort.test.ts b/src/daemon-client/__tests__/daemon-client-abort.test.ts index 8cd014e46f..5bce33d414 100644 --- a/src/daemon-client/__tests__/daemon-client-abort.test.ts +++ b/src/daemon-client/__tests__/daemon-client-abort.test.ts @@ -8,15 +8,13 @@ * the client rejects with the typed canceled-request error — and the daemon itself stays alive to * serve a follow-up request. */ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { isRequestCanceledError } from '@agent-device/kernel/errors'; import { getRequestSignal, isRequestCanceled } from '@agent-device/host-kit/request'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '@agent-device/daemon/daemon-request'; +import type { DaemonInvokeFn } from '@agent-device/daemon/daemon-request'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; import { createSocketServer, listenNetServer } from '@agent-device/daemon/testing/server/transport'; import { sendRequest } from '../daemon-client-transport.ts'; @@ -43,7 +41,7 @@ type SeenRequest = { // `wait` models the long request the caller abandons; every other command answers immediately, so // the same handler also proves the daemon still serves requests after one was canceled. function canceledAwareHandler(seen: SeenRequest): DaemonInvokeFn { - return async (req: DaemonRequest): Promise => { + return async (req: DaemonWireRequest): Promise => { const requestId = req.meta?.requestId; seen.requestId = requestId; if (req.command !== 'wait') { diff --git a/src/daemon-client/__tests__/daemon-client-address-hints.test.ts b/src/daemon-client/__tests__/daemon-client-address-hints.test.ts index 0a3b5f8145..df23d02b0c 100644 --- a/src/daemon-client/__tests__/daemon-client-address-hints.test.ts +++ b/src/daemon-client/__tests__/daemon-client-address-hints.test.ts @@ -1,4 +1,4 @@ -import type { DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { shellQuoteIfNeeded } from '@agent-device/kernel/device-shell'; import assert from 'node:assert/strict'; import { test } from 'vitest'; diff --git a/src/daemon-client/__tests__/daemon-client-lease-beat.test.ts b/src/daemon-client/__tests__/daemon-client-lease-beat.test.ts index c100855bae..de8193e0c1 100644 --- a/src/daemon-client/__tests__/daemon-client-lease-beat.test.ts +++ b/src/daemon-client/__tests__/daemon-client-lease-beat.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import { afterEach, describe, test, vi } from 'vitest'; import assert from 'node:assert/strict'; import net from 'node:net'; @@ -10,7 +11,6 @@ import { runProtectedLeaseWork, } from '../daemon-client-lease-beat.ts'; import { leaseScopeFromRequest } from '@agent-device/contracts/lease-scope'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; function lostLeaseError(reason: string): AppError { return new AppError('UNAUTHORIZED', 'Lease is not active', { reason }); @@ -529,13 +529,13 @@ describe('buildLeaseHeartbeatRequest', () => { // would re-send a 449 MB artifact every interval. assert.equal(beat.flags, undefined); assert.equal('installSource' in (beat.meta ?? {}), false); - assert.equal(beat.internal, undefined); + assert.equal('internal' in beat, false); }); test('sends no ttl for an install, whose scope never carried one, so the lease keeps its own window', () => { // connection-runtime passes the TTL to `leases.allocate` only, so an install request's scope has // none. A beat that invented one would shorten a lease allocated longer. - const installRequest: Pick = { + const installRequest: Pick = { flags: { leaseId: 'lease-1', platform: 'android' }, meta: { leaseId: 'lease-1', tenantId: 'acme' }, }; diff --git a/src/daemon-client/__tests__/daemon-client-timeout-route.test.ts b/src/daemon-client/__tests__/daemon-client-timeout-route.test.ts index bdd5f6133c..7ed4e35c46 100644 --- a/src/daemon-client/__tests__/daemon-client-timeout-route.test.ts +++ b/src/daemon-client/__tests__/daemon-client-timeout-route.test.ts @@ -2,6 +2,7 @@ // RPC from the fresh liveness probe. Confirmed reset controls use owned registration children; // missing or superseded identity must retain state. No control signals an unrelated process. +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import net from 'node:net'; import http from 'node:http'; @@ -38,7 +39,6 @@ vi.mock('@agent-device/host-kit/command', async () => { import { AppError } from '@agent-device/kernel/errors'; import { PUBLIC_COMMANDS } from '@agent-device/command-registry/catalog'; import { sendRequest } from '../daemon-client-transport.ts'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { DaemonInfo } from '../daemon-client-metadata.ts'; import type { DaemonPaths } from '@agent-device/daemon-contracts/daemon-resolution'; import { mkdtempForTestSync } from '@agent-device/test-kit/tmp-dir'; @@ -127,7 +127,7 @@ function buildRequest( command: string, platform: 'android' | 'ios' | undefined, positionals: readonly string[] = [], -): DaemonRequest { +): DaemonWireRequest { return { token: 'test-token', session: 'default', diff --git a/src/daemon-client/daemon-client-lease-beat.ts b/src/daemon-client/daemon-client-lease-beat.ts index d000720491..35ea71afbb 100644 --- a/src/daemon-client/daemon-client-lease-beat.ts +++ b/src/daemon-client/daemon-client-lease-beat.ts @@ -1,4 +1,4 @@ -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import { AppError } from '@agent-device/kernel/errors'; import { createRequestId, emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import { INTERNAL_COMMANDS } from '@agent-device/command-registry/catalog'; @@ -272,11 +272,11 @@ export function buildLeaseHeartbeatRequest( leaseScope: LeaseScope, context: Readonly<{ session: string; - sessionIsolation?: NonNullable['sessionIsolation']; + sessionIsolation?: NonNullable['sessionIsolation']; requestId: string; token: string; }>, -): DaemonRequest { +): DaemonWireRequest { return { command: INTERNAL_COMMANDS.leaseHeartbeat, positionals: [], @@ -302,7 +302,7 @@ export function buildLeaseHeartbeatRequest( export function buildUploadLeaseHeartbeat( info: DaemonInfo, settings: DaemonClientSettings, - request: Omit, + request: Omit, ): ((budgetMs: number, signal: AbortSignal) => Promise) | undefined { if (!isRemoteDaemon(info)) return undefined; const leaseScope = leaseScopeFromRequest(request); diff --git a/src/daemon-client/daemon-client-lifecycle.ts b/src/daemon-client/daemon-client-lifecycle.ts index 8af7232888..205f4784b3 100644 --- a/src/daemon-client/daemon-client-lifecycle.ts +++ b/src/daemon-client/daemon-client-lifecycle.ts @@ -1,10 +1,11 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { attachActiveSessionAddressHint } from './daemon-client-address-hints.ts'; import fs from 'node:fs'; import { processLockHoldsDaemonIdentity } from '@agent-device/daemon-contracts/daemon-registration'; import net from 'node:net'; import { AppError, normalizeError, type NormalizedError } from '@agent-device/kernel/errors'; import { readReplayDivergenceResume } from '@agent-device/ad-replay/divergence'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { type ExecDetachedExit } from '@agent-device/host-kit/command'; import { shellQuoteIfNeeded } from '@agent-device/kernel/device-shell'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; @@ -83,7 +84,7 @@ LOOPBACK_BLOCK_LIST.addAddress('::1', 'ipv6'); LOOPBACK_BLOCK_LIST.addSubnet('::ffff:127.0.0.0', 104, 'ipv6'); export function resolveClientSettings( - req: Omit, + req: Omit, suppliedAuthToken?: string, ): DaemonClientSettings { const explicitStateDir = resolveExplicitStateDir(req); @@ -102,12 +103,12 @@ export function resolveClientSettings( }; } -function resolveExplicitStateDir(req: Omit): string | undefined { +function resolveExplicitStateDir(req: Omit): string | undefined { return req.flags?.stateDir ?? process.env.AGENT_DEVICE_STATE_DIR; } function resolveRemoteClientSettings( - req: Omit, + req: Omit, suppliedAuthToken: string | undefined, ): { rawBaseUrl: string | undefined; @@ -122,7 +123,7 @@ function resolveRemoteClientSettings( } function resolveTransportClientSettings( - req: Omit, + req: Omit, remoteBaseUrl: string | undefined, ): { preference: DaemonTransportPreference; serverMode: DaemonServerMode } { const rawTransport = req.flags?.daemonTransport ?? process.env.AGENT_DEVICE_DAEMON_TRANSPORT; @@ -145,7 +146,7 @@ function resolveTransportClientSettings( } function shouldUseOwnedReplayStateDir( - req: Omit, + req: Omit, explicitStateDir: string | undefined, rawRemoteBaseUrl: string | undefined, ): boolean { @@ -522,7 +523,7 @@ function isRegistrationAvailable(inspection: ProcessLockInspection): boolean { * overridden to surface it. */ export async function cleanupDaemonAfterRequest( - req: Omit, + req: Omit, daemon: EnsuredDaemon, settings: DaemonClientSettings, response: DaemonResponse | undefined, @@ -699,7 +700,7 @@ function isOneShotReplayCommand(command: string | undefined): boolean { * rather than an accident of the response shape. */ function isActiveReplaySessionResponse( - req: Omit, + req: Omit, response: DaemonResponse | undefined, ): boolean { if (req.command !== PUBLIC_COMMANDS.replay) return false; @@ -902,7 +903,7 @@ function isLoopbackHostname(hostname: string): boolean { export function attachSessionAddressHints( response: DaemonResponse, - req: Omit, + req: Omit, settings: DaemonClientSettings, ): DaemonResponse { if (!response.ok) { diff --git a/src/daemon-client/daemon-client-liveness-probe.ts b/src/daemon-client/daemon-client-liveness-probe.ts index ac12e1e9e1..8d5762eab1 100644 --- a/src/daemon-client/daemon-client-liveness-probe.ts +++ b/src/daemon-client/daemon-client-liveness-probe.ts @@ -1,8 +1,8 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import net from 'node:net'; import { INTERNAL_COMMANDS } from '@agent-device/command-registry/catalog'; import { createRequestId } from '@agent-device/host-kit/diagnostics'; import { loadNodeHttpRequester, consumeTextLines } from '@agent-device/host-kit/transport'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { DaemonInfo } from './daemon-client-metadata.ts'; // The post-timeout liveness probe (#3177): the question a daemon reset may no longer assume. The @@ -158,7 +158,7 @@ function probeSocketRpc( * device locks the timed-out request's work may still hold. The `session` field is required on * the wire; an omitted one falls back to the daemon's own routing default. */ -function buildLivenessProbeRequest(token: string, session: string | undefined): DaemonRequest { +function buildLivenessProbeRequest(token: string, session: string | undefined): DaemonWireRequest { return { token, session: session || 'default', diff --git a/src/daemon-client/daemon-client-progress.ts b/src/daemon-client/daemon-client-progress.ts index 016b255281..e07059cfee 100644 --- a/src/daemon-client/daemon-client-progress.ts +++ b/src/daemon-client/daemon-client-progress.ts @@ -1,10 +1,11 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { RequestProgressSink } from '@agent-device/contracts/progress'; // Type-only: importing `node:http` for a value eagerly initializes undici // (~9ms in a fresh process), which the default socket transport never needs. import type http from 'node:http'; import type { Socket } from 'node:net'; import { AppError } from '@agent-device/kernel/errors'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { consumeTextLines } from '@agent-device/host-kit/transport'; import { isDaemonProgressEnvelope, @@ -19,7 +20,7 @@ type ProgressLineReader = { type ProgressResponseFormat = 'socket-legacy' | 'ndjson-envelope'; function createInvalidDaemonResponseError( - req: DaemonRequest, + req: DaemonWireRequest, line: string, cause?: unknown, ): AppError { @@ -35,7 +36,7 @@ function createInvalidDaemonResponseError( } function createProgressLineReader(options: { - req: DaemonRequest; + req: DaemonWireRequest; onProgress?: RequestProgressSink; responseFormat: ProgressResponseFormat; onResponse(response: DaemonResponse): void; @@ -86,7 +87,7 @@ function createProgressLineReader(options: { } export function shouldReadDaemonProgressStream( - req: DaemonRequest, + req: DaemonWireRequest, contentType: string | string[] | undefined, ): boolean { return ( @@ -100,7 +101,7 @@ export function shouldReadDaemonProgressStream( export function readDaemonSocketProgressResponse( socket: Socket, options: { - req: DaemonRequest; + req: DaemonWireRequest; onProgress?: RequestProgressSink; isSettled: () => boolean; resolve: (response: DaemonResponse) => void; @@ -146,7 +147,7 @@ export function readDaemonSocketProgressResponse( export function readDaemonHttpProgressResponse( res: http.IncomingMessage, options: { - req: DaemonRequest; + req: DaemonWireRequest; onProgress?: RequestProgressSink; handleResponseBody: (body: string) => void; reject: (error: unknown) => void; diff --git a/src/daemon-client/daemon-client-rpc.ts b/src/daemon-client/daemon-client-rpc.ts index b632d61f04..26c3b0c081 100644 --- a/src/daemon-client/daemon-client-rpc.ts +++ b/src/daemon-client/daemon-client-rpc.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { AppError, readDiagnosticsRecordRef, @@ -6,7 +8,6 @@ import { } from '@agent-device/kernel/errors'; import { sanitizeErrorCause } from '@agent-device/kernel/redaction'; import { createRequestId } from '@agent-device/host-kit/diagnostics'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { materializeRemoteArtifacts } from '../remote/daemon-artifacts.ts'; import { localizeRemoteDaemonError } from '../remote/remote-request-diagnostics.ts'; import type { DaemonInfo } from './daemon-client-metadata.ts'; @@ -21,7 +22,7 @@ export function handleDaemonHttpResponseBody( body: string, options: { info: DaemonInfo; - req: DaemonRequest; + req: DaemonWireRequest; stateDir: string; resolve: (response: DaemonResponse | PromiseLike) => void; reject: (error: unknown) => void; @@ -78,7 +79,7 @@ async function rejectDaemonHttpRpcError( error: { message?: string; data?: Record }, options: { info: DaemonInfo; - req: DaemonRequest; + req: DaemonWireRequest; stateDir: string; reject: (error: unknown) => void; }, @@ -151,7 +152,7 @@ function appErrorFromDaemonError(error: DaemonError, requestId: string | undefin async function resolveDaemonHttpResult( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, result: DaemonResponse, resolve: (response: DaemonResponse | PromiseLike) => void, reject: (error: unknown) => void, @@ -166,13 +167,13 @@ async function resolveDaemonHttpResult( } export function buildHttpRpcPayload( - req: DaemonRequest, + req: DaemonWireRequest, options: { includeTokenParam: boolean }, ): { jsonrpc: '2.0'; id: string; method: string; - params: DaemonRequest | Record; + params: DaemonWireRequest | Record; } { const id = req.meta?.requestId ?? createRequestId(); if (!isLeaseRpcCommand(req.command)) { @@ -215,7 +216,7 @@ function leaseRpcMethodForCommand(command: LeaseRpcCommand): string { } function buildLeaseRpcParams( - req: DaemonRequest, + req: DaemonWireRequest, command: LeaseRpcCommand, options: { includeTokenParam: boolean }, ): Record { diff --git a/src/daemon-client/daemon-client-transport.ts b/src/daemon-client/daemon-client-transport.ts index 26bf8695ac..ff146929b5 100644 --- a/src/daemon-client/daemon-client-transport.ts +++ b/src/daemon-client/daemon-client-transport.ts @@ -1,8 +1,9 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import type { RequestProgressSink } from '@agent-device/contracts/progress'; import net from 'node:net'; import { AppError, createRequestCanceledError } from '@agent-device/kernel/errors'; import { loadNodeHttpRequester, readNodeHttpResponseBody } from '@agent-device/host-kit/transport'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import type { DaemonPaths, @@ -367,7 +368,7 @@ function readHealthLink(parsed: Record): RemoteDaemonHealthLink export async function sendRequest( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, preference: DaemonTransportPreference, statePaths: DaemonPaths, timeoutMs: number | undefined, @@ -390,7 +391,7 @@ export async function sendRequest( async function sendRequestWithFallback( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, preference: DaemonTransportPreference, statePaths: DaemonPaths, timeoutMs: number | undefined, @@ -424,7 +425,7 @@ async function sendRequestWithFallback( async function retryAfterRemoteInstanceMismatch( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, statePaths: DaemonPaths, timeoutMs: number | undefined, deadline: number | undefined, @@ -458,7 +459,7 @@ async function retryAfterRemoteInstanceMismatch( } function remainingRemoteRequestTimeoutMs( - req: DaemonRequest, + req: DaemonWireRequest, timeoutMs: number | undefined, deadline: number | undefined, timedOutProbeMs?: number, @@ -489,7 +490,7 @@ function isRemoteTransportFailure(error: unknown): boolean { async function sendRequestWithTransport( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, statePaths: DaemonPaths, timeoutMs: number | undefined, transport: ResolvedDaemonTransport, @@ -591,7 +592,7 @@ function handleTransportError( async function sendSocketRequest( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, timeoutMs: number | undefined, options: SendRequestOptions, ): Promise { @@ -689,7 +690,7 @@ function requestTimeoutError(timeoutMs: number, requestId: string | undefined): type TimeoutRequestFields = Omit[0], 'info' | 'statePaths'>; function timeoutRequestContext( - req: DaemonRequest, + req: DaemonWireRequest, remote: boolean, timeoutMs: number, ): TimeoutRequestFields { @@ -722,7 +723,7 @@ function isRemoteInstanceMismatchResponse( async function sendHttpRequest( info: DaemonInfo, - req: DaemonRequest, + req: DaemonWireRequest, statePaths: DaemonPaths, timeoutMs: number | undefined, options: SendRequestOptions, diff --git a/src/daemon-client/daemon-client.ts b/src/daemon-client/daemon-client.ts index 6c8aa52418..694076098a 100644 --- a/src/daemon-client/daemon-client.ts +++ b/src/daemon-client/daemon-client.ts @@ -1,8 +1,6 @@ +import type { DaemonResponse as SharedDaemonResponse } from '@agent-device/kernel/contracts'; import type { RequestProgressSink } from '@agent-device/contracts/progress'; -import type { - DaemonRequest as SharedDaemonRequest, - DaemonResponse as SharedDaemonResponse, -} from '@agent-device/daemon/daemon-request'; +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import type { AgentDeviceDaemonTransportContext } from '@agent-device/contracts/client'; import { AppError } from '@agent-device/kernel/errors'; import { @@ -22,7 +20,7 @@ import { createRequestGuard, sendRequest } from './daemon-client-transport.ts'; import { isRemoteDaemon, type DaemonInfo } from './daemon-client-metadata.ts'; import { leaseScopeFromRequest } from '@agent-device/contracts/lease-scope'; -export type DaemonRequest = SharedDaemonRequest; +export type DaemonRequest = DaemonWireRequest; export type DaemonResponse = SharedDaemonResponse; type DaemonTransportOptions = AgentDeviceDaemonTransportContext & { onProgress?: RequestProgressSink; diff --git a/src/remote/daemon-artifacts.ts b/src/remote/daemon-artifacts.ts index 0e072284e1..39aaee1395 100644 --- a/src/remote/daemon-artifacts.ts +++ b/src/remote/daemon-artifacts.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonArtifact, DaemonResponse } from '@agent-device/kernel/contracts'; import fs from 'node:fs'; import path from 'node:path'; import { @@ -6,11 +8,6 @@ import { } from '@agent-device/contracts/daemon-http'; import { AppError } from '@agent-device/kernel/errors'; import { leaseScopeFromRequest } from '@agent-device/contracts/lease-scope'; -import type { - DaemonArtifact, - DaemonRequest, - DaemonResponse, -} from '@agent-device/daemon/daemon-request'; import { appendRecordingExtensionWhenMissing, recordingExtensionForPlatform, @@ -31,14 +28,14 @@ export type DaemonArtifactEndpoint = { export type PreparedRemoteRequest = { positionals: string[]; - flags?: DaemonRequest['flags']; - installSource?: NonNullable['installSource']; + flags?: DaemonWireRequest['flags']; + installSource?: NonNullable['installSource']; uploadedArtifactId?: string; clientArtifactPaths?: Record; }; export async function prepareRemoteRequestArtifacts( - req: Omit, + req: Omit, info: DaemonArtifactEndpoint, signal: AbortSignal, ): Promise { @@ -97,7 +94,7 @@ export async function prepareRemoteRequestArtifacts( * see is refused here instead of appearing to succeed. Tracked for the return-the-healed-script * response plumbing. */ -function assertRemoteDaemonSupportsSaveScript(req: Omit): void { +function assertRemoteDaemonSupportsSaveScript(req: Omit): void { if (req.flags?.saveScript === undefined) return; throw new AppError( 'INVALID_ARGS', @@ -110,7 +107,7 @@ function assertRemoteDaemonSupportsSaveScript(req: Omit) } async function prepareRemoteInstallPackage( - req: Omit, + req: Omit, info: DaemonArtifactEndpoint, positionals: string[], onProgress: UploadProgressSink | undefined, @@ -139,11 +136,11 @@ async function prepareRemoteInstallPackage( } function applyRemoteArtifactCommand( - req: Omit, + req: Omit, positionals: string[], - flags: DaemonRequest['flags'] | undefined, + flags: DaemonWireRequest['flags'] | undefined, clientArtifactPaths: Record, -): DaemonRequest['flags'] | undefined { +): DaemonWireRequest['flags'] | undefined { const remoteArtifact = prepareRemoteArtifactCommand(req, positionals); if (!remoteArtifact) return flags; if (remoteArtifact.positionalIndex !== undefined && remoteArtifact.positionalPath !== undefined) { @@ -159,10 +156,10 @@ function applyRemoteArtifactCommand( } function applyRemoteArtifactFlag( - flags: DaemonRequest['flags'] | undefined, + flags: DaemonWireRequest['flags'] | undefined, flagKey: string, flagPath: string | undefined, -): DaemonRequest['flags'] | undefined { +): DaemonWireRequest['flags'] | undefined { if (flagPath === undefined) return flags; return { ...(flags ?? {}), [flagKey]: flagPath }; } @@ -189,12 +186,12 @@ function createPreparedRemoteRequest( } async function prepareRemoteInstallSource( - req: Omit, + req: Omit, info: DaemonArtifactEndpoint, onProgress: UploadProgressSink | undefined, signal: AbortSignal, ): Promise<{ - installSource: NonNullable['installSource']; + installSource: NonNullable['installSource']; uploadedArtifactId?: string; } | null> { const source = req.meta?.installSource; @@ -246,7 +243,7 @@ async function prepareRemoteInstallSource( } function prepareRemoteArtifactCommand( - req: Omit, + req: Omit, positionals: string[], ): { field: string; @@ -307,30 +304,30 @@ function prepareRemoteArtifactCommand( return null; } -function resolveClientArtifactOutputRoot(req: Omit): string { +function resolveClientArtifactOutputRoot(req: Omit): string { const requested = req.flags?.artifactsDir; const rawPath = hasNonEmptyString(requested) ? requested : DEFAULT_TEST_ARTIFACTS_ROOT; return resolveAbsoluteClientPath(rawPath, req.meta?.cwd); } -function recordingFallbackExtension(req: Omit): string { +function recordingFallbackExtension(req: Omit): string { return recordingExtensionForPlatform(req.flags?.platform); } -function recordingHasRequestedClientPath(req: Omit): boolean { +function recordingHasRequestedClientPath(req: Omit): boolean { return hasNonEmptyString(req.positionals?.[1]) || hasNonEmptyString(req.flags?.out); } function normalizeRecordingClientArtifactPath( localPath: string, - req: Omit, + req: Omit, ): string { if (req.flags?.platform !== 'web') return localPath; return appendRecordingExtensionWhenMissing(localPath, recordingFallbackExtension(req)); } function resolveClientArtifactOutputPath( - req: Omit, + req: Omit, field: 'path' | 'outPath', fallbackExtension: string, positionalIndex: number = 0, @@ -354,7 +351,7 @@ function hasNonEmptyString(value: unknown): value is string { export async function materializeRemoteArtifacts( info: DaemonArtifactEndpoint, - req: DaemonRequest, + req: DaemonWireRequest, response: Extract, ): Promise { const artifacts = Array.isArray(response.data?.artifacts) ? response.data.artifacts : []; @@ -392,7 +389,7 @@ export async function materializeRemoteArtifacts( return { ok: true, data: nextData }; } -function resolveMaterializedArtifactPath(artifact: DaemonArtifact, req: DaemonRequest): string { +function resolveMaterializedArtifactPath(artifact: DaemonArtifact, req: DaemonWireRequest): string { if (artifact.localPath && artifact.localPath.trim().length > 0) { return artifact.localPath; } @@ -409,7 +406,7 @@ type DownloadRemoteArtifactParams = { token: string; artifactId: string; destinationPath: string; - requestScope: DaemonRequest['meta']; + requestScope: DaemonWireRequest['meta']; timeoutMs?: number; /** Whether `destinationPath` is a caller-owned root rather than one file to create. */ isDirectory?: boolean; diff --git a/test/integration/nightly/concurrency-torture/bindings.ts b/test/integration/nightly/concurrency-torture/bindings.ts index 55beaeb40e..c2f18b0842 100644 --- a/test/integration/nightly/concurrency-torture/bindings.ts +++ b/test/integration/nightly/concurrency-torture/bindings.ts @@ -18,9 +18,8 @@ // (by the deterministic scheduler) because `withKeyedLock`'s native microtask // hand-off cannot be reproduced from a seed. +import type { CommandFlags, DaemonWireRequest } from '@agent-device/contracts/command'; import type { DeviceInfo } from '@agent-device/kernel/device'; -import type { CommandFlags } from '@agent-device/contracts/command'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { SessionRef } from '@agent-device/daemon/testing/session-state'; import type { SessionStore } from '@agent-device/daemon/testing/session-store'; import { resolveRequestExecutionLockPlan } from '@agent-device/daemon/testing/request-binding'; @@ -97,24 +96,24 @@ function selectorFlagsForDevice(device: DeviceInfo): CommandFlags { : ({ platform: 'ios', udid: device.id } as CommandFlags); } -function openRequest(device: DeviceInfo, sessionName: string): DaemonRequest { +function openRequest(device: DeviceInfo, sessionName: string): DaemonWireRequest { return { command: OPEN_COMMAND, positionals: [], token: 'torture', session: sessionName, flags: selectorFlagsForDevice(device), - } as DaemonRequest; + } as DaemonWireRequest; } -function existingSessionRequest(command: string, sessionName: string): DaemonRequest { +function existingSessionRequest(command: string, sessionName: string): DaemonWireRequest { return { command, positionals: [], token: 'torture', session: sessionName, flags: {} as CommandFlags, - } as DaemonRequest; + } as DaemonWireRequest; } async function withPool(task: () => Promise): Promise { @@ -128,7 +127,7 @@ async function withPool(task: () => Promise): Promise { * decision changes what this returns. */ async function resolveExecutionLockPlan( - req: DaemonRequest, + req: DaemonWireRequest, sessionName: string, sessionStore: SessionStore, ): Promise { diff --git a/test/integration/nightly/concurrency-torture/real-scope-serialization.ts b/test/integration/nightly/concurrency-torture/real-scope-serialization.ts index 6d4e46606f..8644b84ade 100644 --- a/test/integration/nightly/concurrency-torture/real-scope-serialization.ts +++ b/test/integration/nightly/concurrency-torture/real-scope-serialization.ts @@ -1,4 +1,6 @@ // Real-scope same-device serialization guard for the concurrency torture lane + +import type { CommandFlags, DaemonWireRequest } from '@agent-device/contracts/command'; import { composedPlatformServicesFixture, composedClaimRecoveryGatewayFixture, @@ -23,19 +25,17 @@ import { createRequestExecutionScope } from '@agent-device/daemon/testing/reques import { LeaseRegistry } from '@agent-device/daemon/testing/lease-registry'; import { SessionStore } from '@agent-device/daemon/testing/session-store'; import { withTestDeviceInventoryProvider as withDeviceInventoryProvider } from '@agent-device/device-selection/inventory-gateways-fixtures'; -import type { CommandFlags } from '@agent-device/contracts/command'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { DEVICE_POOL } from './bindings.ts'; -function openRequest(sessionName: string, deviceId: string): DaemonRequest { +function openRequest(sessionName: string, deviceId: string): DaemonWireRequest { return { command: 'open', positionals: [], token: 'torture', session: sessionName, flags: { platform: 'ios', udid: deviceId } as CommandFlags, - } as DaemonRequest; + } as DaemonWireRequest; } /** diff --git a/test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts b/test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts index cf60b13699..742e6b566d 100644 --- a/test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts +++ b/test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts @@ -1,9 +1,9 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { createBundledCloudWebDriverRuntimes } from '@agent-device/provider-webdriver'; import type { DeviceLease } from '@agent-device/contracts/device'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { assertRpcOk } from './assertions.ts'; import { createProviderScenarioHarness, @@ -462,7 +462,7 @@ function contains( ); } -function leaseFlags(leaseId?: string): DaemonRequest['flags'] { +function leaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'ios', tenant: 'team-a', @@ -478,7 +478,7 @@ function leaseFlags(leaseId?: string): DaemonRequest['flags'] { }; } -function leaseMeta(leaseId?: string): DaemonRequest['meta'] { +function leaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', diff --git a/test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts b/test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts index 61e9d4810e..21c87b1cb8 100644 --- a/test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts +++ b/test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; @@ -10,7 +11,6 @@ import type { CaptureSnapshotResult } from '@agent-device/contracts/client'; import type { DeviceLease } from '@agent-device/contracts/device'; import type { PlatformRuntimeHost } from '@agent-device/contracts/platform-runtime-operations'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import * as iosSnapshotRuntime from '@agent-device/capture-kit/ios-snapshot-runtime'; import { createProviderScenarioHarness, @@ -318,7 +318,7 @@ const unexpectedHostCommand: RunHostCommand = async () => { throw new Error('unexpected host command'); }; -function browserStackIosFlags(leaseId?: string): DaemonRequest['flags'] { +function browserStackIosFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'ios', tenant: 'team-a', @@ -334,7 +334,7 @@ function browserStackIosFlags(leaseId?: string): DaemonRequest['flags'] { }; } -function browserStackIosMeta(leaseId?: string): DaemonRequest['meta'] { +function browserStackIosMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', diff --git a/test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts b/test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts index 24ba1fe073..dedc081143 100644 --- a/test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts +++ b/test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; @@ -12,7 +13,6 @@ import type { CloudArtifact } from '@agent-device/contracts/observability'; import type { DeviceLease } from '@agent-device/contracts/device'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; import { createExpiredProviderLeaseReleaser } from '@agent-device/daemon/testing/provider-lease-expiry'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { assertRpcOk } from './assertions.ts'; import { createProviderScenarioHarness, @@ -617,7 +617,7 @@ function fakeWebDriverSource(): string { ); } -function leaseFlags(leaseId?: string): DaemonRequest['flags'] { +function leaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'android', tenant: 'team-a', @@ -633,7 +633,7 @@ function leaseFlags(leaseId?: string): DaemonRequest['flags'] { }; } -function leaseMeta(leaseId?: string): DaemonRequest['meta'] { +function leaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', diff --git a/test/integration/provider-scenarios/daemon-http-boundary-cancellation.test.ts b/test/integration/provider-scenarios/daemon-http-boundary-cancellation.test.ts index 7e592b0c65..f8264f785f 100644 --- a/test/integration/provider-scenarios/daemon-http-boundary-cancellation.test.ts +++ b/test/integration/provider-scenarios/daemon-http-boundary-cancellation.test.ts @@ -1,9 +1,10 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import http from 'node:http'; import { test } from 'vitest'; import { getRequestSignal } from '@agent-device/host-kit/request'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, @@ -33,7 +34,7 @@ for (const [commandClass, row] of Object.entries(CANCELLATION_ROWS)) { const server = await createDaemonHttpServer({ token: 'boundary-cancellation-token', - handleRequest: async (request: DaemonRequest): Promise => { + handleRequest: async (request: DaemonWireRequest): Promise => { assert.equal(request.command, row.command); const signal = getRequestSignal(requestId); assert.ok(signal, 'request signal should be registered before the handler runs'); diff --git a/test/integration/provider-scenarios/daemon-http-disconnect.test.ts b/test/integration/provider-scenarios/daemon-http-disconnect.test.ts index 968d33495a..1551450eac 100644 --- a/test/integration/provider-scenarios/daemon-http-disconnect.test.ts +++ b/test/integration/provider-scenarios/daemon-http-disconnect.test.ts @@ -1,9 +1,10 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import http from 'node:http'; import { test } from 'vitest'; import { getRequestSignal } from '@agent-device/host-kit/request'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, @@ -136,7 +137,7 @@ test('disconnecting one HTTP request leaves another request uncanceled', async ( const server = await createDaemonHttpServer({ token: 'provider-scenario-token', - handleRequest: async (req: DaemonRequest): Promise => { + handleRequest: async (req: DaemonWireRequest): Promise => { if (req.meta?.requestId === disconnectedRequestId) { const signal = getRequestSignal(disconnectedRequestId); assert.ok(signal); diff --git a/test/integration/provider-scenarios/daemon-http-lease-allocate.test.ts b/test/integration/provider-scenarios/daemon-http-lease-allocate.test.ts index 36fa67e882..b988bd6f5d 100644 --- a/test/integration/provider-scenarios/daemon-http-lease-allocate.test.ts +++ b/test/integration/provider-scenarios/daemon-http-lease-allocate.test.ts @@ -1,7 +1,8 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, @@ -15,7 +16,7 @@ import { test('Provider-backed integration daemon HTTP lease allocate forwards provider allocation flags as request flags', async (t) => { if (await skipWhenLoopbackUnavailable(t, 'daemon HTTP lease allocate coverage')) return; - const observedRequests: DaemonRequest[] = []; + const observedRequests: DaemonWireRequest[] = []; const server = await createDaemonHttpServer({ token: 'provider-scenario-token', handleRequest: async (req): Promise => { diff --git a/test/integration/provider-scenarios/daemon-http-resumable-upload.test.ts b/test/integration/provider-scenarios/daemon-http-resumable-upload.test.ts index 0e07866b00..a94dea45a7 100644 --- a/test/integration/provider-scenarios/daemon-http-resumable-upload.test.ts +++ b/test/integration/provider-scenarios/daemon-http-resumable-upload.test.ts @@ -1,3 +1,4 @@ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import crypto from 'node:crypto'; import fs from 'node:fs'; @@ -8,7 +9,6 @@ import { prepareUploadedArtifact, } from '@agent-device/daemon/testing/artifact-tracking'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; -import type { DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, diff --git a/test/integration/provider-scenarios/daemon-http-server.test.ts b/test/integration/provider-scenarios/daemon-http-server.test.ts index e367be1049..643ff5a46a 100644 --- a/test/integration/provider-scenarios/daemon-http-server.test.ts +++ b/test/integration/provider-scenarios/daemon-http-server.test.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import crypto from 'node:crypto'; import fs from 'node:fs'; @@ -19,7 +21,6 @@ import { isRequestCanceled, } from '@agent-device/host-kit/request'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, @@ -60,7 +61,7 @@ test('Provider-backed integration daemon HTTP server maps RPC methods, auth, and return; } - const observedRequests: DaemonRequest[] = []; + const observedRequests: DaemonWireRequest[] = []; let observedCanceled: boolean | undefined; const server = await createDaemonHttpServer({ token: 'provider-scenario-token', @@ -770,7 +771,7 @@ test('Provider-backed integration daemon HTTP auth hook can scope tenants and re const previousHook = process.env.AGENT_DEVICE_HTTP_AUTH_HOOK; process.env.AGENT_DEVICE_HTTP_AUTH_HOOK = hookPath; - let observedRequest: DaemonRequest | undefined; + let observedRequest: DaemonWireRequest | undefined; let server: Awaited> | undefined; try { diff --git a/test/integration/provider-scenarios/daemon-transport.test.ts b/test/integration/provider-scenarios/daemon-transport.test.ts index 633a0bf877..bc303cf3fa 100644 --- a/test/integration/provider-scenarios/daemon-transport.test.ts +++ b/test/integration/provider-scenarios/daemon-transport.test.ts @@ -1,8 +1,9 @@ +import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import http from 'node:http'; import net from 'node:net'; import { test } from 'vitest'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { createSocketServer, listenHttpServer, diff --git a/test/integration/provider-scenarios/harness.ts b/test/integration/provider-scenarios/harness.ts index 4ff1df5c2c..e5787e352e 100644 --- a/test/integration/provider-scenarios/harness.ts +++ b/test/integration/provider-scenarios/harness.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import os from 'node:os'; @@ -24,11 +26,7 @@ import type { AppleSimulatorScreenRecordingProcess } from '../../../src/platform import { trackDownloadableArtifact } from '@agent-device/daemon/testing/artifact-tracking'; import { LeaseRegistry } from '@agent-device/daemon/testing/lease-registry'; import { SessionStore } from '@agent-device/daemon/testing/session-store'; -import type { - DaemonInvokeFn, - DaemonRequest, - DaemonResponse, -} from '@agent-device/daemon/daemon-request'; +import type { DaemonInvokeFn } from '@agent-device/daemon/daemon-request'; import type { SessionState } from '@agent-device/daemon/testing/session-state'; import { runCmdBackground } from '@agent-device/host-kit/command'; import { createOwnedProcessRecordStore } from '@agent-device/host-kit/process'; @@ -73,11 +71,11 @@ export type ProviderScenarioHarness = { callCommand: ( command: string, positionals?: string[], - flags?: DaemonRequest['flags'], + flags?: DaemonWireRequest['flags'], options?: { - input?: DaemonRequest['input']; - meta?: DaemonRequest['meta']; - runtime?: DaemonRequest['runtime']; + input?: DaemonWireRequest['input']; + meta?: DaemonWireRequest['meta']; + runtime?: DaemonWireRequest['runtime']; session?: string; }, ) => Promise; @@ -224,7 +222,7 @@ export async function createProviderScenarioHarness( input: req.input, flags: req.flags, runtime: req.runtime, - meta: req.meta as DaemonRequest['meta'], + meta: req.meta as DaemonWireRequest['meta'], }); return { @@ -331,14 +329,14 @@ function atom(type: string, payload = Buffer.alloc(0)): Buffer { function commandRequest( command: string, positionals: string[] = [], - flags: DaemonRequest['flags'] = {}, + flags: DaemonWireRequest['flags'] = {}, options: { - input?: DaemonRequest['input']; - meta?: DaemonRequest['meta']; - runtime?: DaemonRequest['runtime']; + input?: DaemonWireRequest['input']; + meta?: DaemonWireRequest['meta']; + runtime?: DaemonWireRequest['runtime']; session?: string; } = {}, -): DaemonRequest { +): DaemonWireRequest { return { token: PROVIDER_SCENARIO_TOKEN, session: options.session ?? 'default', diff --git a/test/integration/provider-scenarios/provider-device-runtime.fixtures.ts b/test/integration/provider-scenarios/provider-device-runtime.fixtures.ts index 5380f4b8bf..908eb221ad 100644 --- a/test/integration/provider-scenarios/provider-device-runtime.fixtures.ts +++ b/test/integration/provider-scenarios/provider-device-runtime.fixtures.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; import type { DeviceInventoryProvider, @@ -45,7 +46,6 @@ import type { } from '@agent-device/contracts/platform-runtime-operations'; import { bindAdmittedProviderInteractorOperations } from '@agent-device/contracts/interactor-operation-catalog'; import { unavailableDeploymentSnapshotAndShutdownOperationFacts } from '@agent-device/test-kit/runtime-operation-facts'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { deviceShape, hasAppleActionButton, type DeviceInfo } from '@agent-device/kernel/device'; import { AppError } from '@agent-device/kernel/errors'; import { createProviderScenarioHarness } from './harness.ts'; @@ -483,7 +483,7 @@ function createFakeProviderInteractor(device: DeviceInfo, calls: FakeProviderCal ) as Interactor; } -export function leaseFlags(leaseId?: string): DaemonRequest['flags'] { +export function leaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'android', tenant: 'team-a', @@ -493,7 +493,7 @@ export function leaseFlags(leaseId?: string): DaemonRequest['flags'] { }; } -export function leaseMeta(leaseId?: string): DaemonRequest['meta'] { +export function leaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', @@ -505,11 +505,11 @@ export function leaseMeta(leaseId?: string): DaemonRequest['meta'] { }; } -export function iosLeaseFlags(leaseId?: string): DaemonRequest['flags'] { +export function iosLeaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { ...leaseFlags(leaseId), platform: 'ios' }; } -export function iosLeaseMeta(leaseId?: string): DaemonRequest['meta'] { +export function iosLeaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { ...leaseMeta(leaseId), leaseBackend: 'ios-instance', deviceKey: 'ios-a' }; } diff --git a/test/integration/provider-scenarios/provider-ios-runner-transport.test.ts b/test/integration/provider-scenarios/provider-ios-runner-transport.test.ts index cf72fc577b..dc438b5648 100644 --- a/test/integration/provider-scenarios/provider-ios-runner-transport.test.ts +++ b/test/integration/provider-scenarios/provider-ios-runner-transport.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; @@ -8,7 +9,6 @@ import type { ProviderDeviceRuntime, } from '@agent-device/contracts/device'; import type { Interactor, RunnerContext } from '@agent-device/contracts/interactor-types'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { applePlugin } from '@agent-device/platform-apple'; import type { @@ -357,7 +357,7 @@ function runnerResultFor(command: RunnerCommand): Record { } } -function leaseFlags(leaseId?: string): DaemonRequest['flags'] { +function leaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'ios', tenant: 'team-a', @@ -367,7 +367,7 @@ function leaseFlags(leaseId?: string): DaemonRequest['flags'] { }; } -function leaseMeta(leaseId?: string): DaemonRequest['meta'] { +function leaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', diff --git a/test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts b/test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts index c4a3d03052..22ae49f396 100644 --- a/test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts +++ b/test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import { test } from 'vitest'; import { createProviderDeviceRuntimeRequestProviders } from '../../../src/provider-device-runtime.ts'; @@ -9,7 +10,6 @@ import type { } from '@agent-device/contracts/device'; import type { Interactor, SnapshotResult } from '@agent-device/contracts/interactor-types'; import { providerRuntimeOwner } from '@agent-device/contracts/platform-runtime'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { DeviceInfo } from '@agent-device/kernel/device'; import { assertRpcOk } from './assertions.ts'; import { createProviderScenarioHarness, withProviderScenarioResource } from './harness.ts'; @@ -210,7 +210,7 @@ function createProviderInteractor(calls: { ) as Interactor; } -function leaseFlags(leaseId?: string): DaemonRequest['flags'] { +function leaseFlags(leaseId?: string): DaemonWireRequest['flags'] { return { platform: 'ios', tenant: 'team-a', @@ -220,7 +220,7 @@ function leaseFlags(leaseId?: string): DaemonRequest['flags'] { }; } -function leaseMeta(leaseId?: string): DaemonRequest['meta'] { +function leaseMeta(leaseId?: string): DaemonWireRequest['meta'] { return { tenantId: 'team-a', runId: 'run-a', diff --git a/test/integration/provider-scenarios/remote-proxy-artifact-tenant.test.ts b/test/integration/provider-scenarios/remote-proxy-artifact-tenant.test.ts index 9f50230440..fc418f33e2 100644 --- a/test/integration/provider-scenarios/remote-proxy-artifact-tenant.test.ts +++ b/test/integration/provider-scenarios/remote-proxy-artifact-tenant.test.ts @@ -10,7 +10,8 @@ import { } from '@agent-device/daemon/testing/artifact-tracking'; import { finalizeDaemonResponse } from '@agent-device/daemon/testing/request-finalization'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import { normalizeAgentDeviceError } from '@agent-device/kernel/errors'; import { downloadRemoteArtifact } from '../../../src/remote/daemon-artifacts.ts'; import { createDaemonProxyServer } from '@agent-device/proxy'; @@ -108,7 +109,7 @@ test('Provider-backed integration local proxy materializes tenant-scoped screens test('Provider-backed integration authenticated proxy sends every admitted RPC method as the caller tenant', async (t) => { if (await skipWhenLoopbackUnavailable(t, 'authenticated proxy rpc tenant coverage')) return; - const observed: DaemonRequest[] = []; + const observed: DaemonWireRequest[] = []; const upstream = await createDaemonHttpServer({ token: 'upstream-token', handleRequest: async (req): Promise => { diff --git a/test/integration/provider-scenarios/remote-proxy-parity.test.ts b/test/integration/provider-scenarios/remote-proxy-parity.test.ts index edefdab9e3..992d824cf0 100644 --- a/test/integration/provider-scenarios/remote-proxy-parity.test.ts +++ b/test/integration/provider-scenarios/remote-proxy-parity.test.ts @@ -1,3 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import http from 'node:http'; @@ -8,7 +10,6 @@ import { sendToDaemon } from '../../../src/daemon-client/daemon-client.ts'; import { LeaseRegistry } from '@agent-device/daemon/testing/lease-registry'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; import { resolveSessionRequestLogPath } from '@agent-device/daemon/session-artifact-paths'; -import type { DaemonRequest, DaemonResponse } from '@agent-device/daemon/daemon-request'; import { createDaemonProxyServer } from '@agent-device/proxy'; import { AppError, type DaemonError } from '@agent-device/kernel/errors'; import { @@ -33,7 +34,7 @@ import { createProviderTranscript, type ProviderScenarioTranscript } from './tra * differ are transport timing and request identity. */ -type ScenarioRequest = Omit; +type ScenarioRequest = Omit; type ScenarioLeg = (request: ScenarioRequest) => Promise; const SIM = PROVIDER_SCENARIO_IOS_SIMULATOR; @@ -568,7 +569,7 @@ test( command: string, positionals: string[], leaseId: string, - stepFlags: DaemonRequest['flags'] = flags, + stepFlags: DaemonWireRequest['flags'] = flags, ) => await proxied({ session, @@ -648,7 +649,7 @@ test( const run = async ( command: string, positionals: string[], - stepFlags: DaemonRequest['flags'], + stepFlags: DaemonWireRequest['flags'], ) => await proxied({ session, command, positionals, flags: stepFlags, meta }); assert.equal((await run('open', [APP], flags)).ok, true); diff --git a/test/integration/provider-scenarios/remote-proxy-request-diagnostics.test.ts b/test/integration/provider-scenarios/remote-proxy-request-diagnostics.test.ts index 778eb854c2..2ed03f1904 100644 --- a/test/integration/provider-scenarios/remote-proxy-request-diagnostics.test.ts +++ b/test/integration/provider-scenarios/remote-proxy-request-diagnostics.test.ts @@ -11,6 +11,7 @@ * over `/rpc`. */ +import type { DaemonResponse } from '@agent-device/kernel/contracts'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; @@ -21,7 +22,6 @@ import { localizeRemoteDaemonError } from '../../../src/remote/remote-request-di import { resolveSessionRequestLogPath } from '@agent-device/daemon/session-artifact-paths'; import { safeSessionName } from '@agent-device/host-kit/session-paths'; import type { DaemonError } from '@agent-device/kernel/errors'; -import type { DaemonResponse } from '@agent-device/daemon/daemon-request'; import { closeLoopbackServer, listenOnLoopback, diff --git a/test/integration/provider-scenarios/remote-test-artifacts-materialization.test.ts b/test/integration/provider-scenarios/remote-test-artifacts-materialization.test.ts index 12acdc0ee1..52a66e4230 100644 --- a/test/integration/provider-scenarios/remote-test-artifacts-materialization.test.ts +++ b/test/integration/provider-scenarios/remote-test-artifacts-materialization.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import http from 'node:http'; @@ -9,7 +10,6 @@ import { cleanupDownloadableArtifact, trackDownloadableArtifact, } from '@agent-device/daemon/testing/artifact-tracking'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { createDaemonHttpServer } from '@agent-device/daemon/testing/server/http-server'; import { attachRemoteReplayTestArtifacts } from '@agent-device/replay-port/test-command'; import { @@ -37,7 +37,7 @@ test('the composed daemon and client path owners report the directory that was m fs.writeFileSync(path.join(daemonAttemptDir, 'replay.ad'), 'open "Demo"\n'); fs.writeFileSync(path.join(daemonAttemptDir, 'result.txt'), 'status: passed\n'); - const request: DaemonRequest = { + const request: DaemonWireRequest = { token: 'daemon-token', session: 'default', command: 'test', diff --git a/test/integration/provider-scenarios/remote-upload-lease-beat.test.ts b/test/integration/provider-scenarios/remote-upload-lease-beat.test.ts index 5b29cc0ab9..387793407c 100644 --- a/test/integration/provider-scenarios/remote-upload-lease-beat.test.ts +++ b/test/integration/provider-scenarios/remote-upload-lease-beat.test.ts @@ -1,3 +1,4 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import http from 'node:http'; @@ -11,7 +12,6 @@ import { withDiagnosticsScope, } from '@agent-device/host-kit/diagnostics'; import { sendToDaemon } from '../../../src/daemon-client/daemon-client.ts'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import { listenOnLoopback, skipWhenLoopbackUnavailable } from '@agent-device/test-kit/loopback'; import { PARALLEL_PROVIDER_SCENARIO_TIMEOUT_MS } from './test-timeouts.ts'; @@ -282,7 +282,7 @@ function writeLeaseLostError(res: http.ServerResponse, id: unknown): void { } /** An install of `apkPath` against a remote daemon, under the lease the beat has to renew. */ -function installRequest(baseUrl: string, apkPath: string): Omit { +function installRequest(baseUrl: string, apkPath: string): Omit { return { session: 'upload-beat', command: 'install', diff --git a/test/integration/provider-scenarios/scenario.ts b/test/integration/provider-scenarios/scenario.ts index 9da2bfc031..c073bf30c7 100644 --- a/test/integration/provider-scenarios/scenario.ts +++ b/test/integration/provider-scenarios/scenario.ts @@ -1,5 +1,5 @@ +import type { DaemonWireRequest } from '@agent-device/contracts/command'; import assert from 'node:assert/strict'; -import type { DaemonRequest } from '@agent-device/daemon/daemon-request'; import type { ProviderScenarioHarness, ProviderScenarioRpcResult } from './harness.ts'; export type ProviderScenarioState = { @@ -8,17 +8,17 @@ export type ProviderScenarioState = { }; export type ProviderScenarioDefaults = { - flags?: DaemonRequest['flags']; - meta?: DaemonRequest['meta']; + flags?: DaemonWireRequest['flags']; + meta?: DaemonWireRequest['meta']; }; export type ProviderScenarioStep = { name: string; command: string; - input?: DaemonRequest['input']; + input?: DaemonWireRequest['input']; positionals?: string[]; - flags?: DaemonRequest['flags']; - meta?: DaemonRequest['meta']; + flags?: DaemonWireRequest['flags']; + meta?: DaemonWireRequest['meta']; expectStatus?: number; expectData?: Record; assert?: ( diff --git a/test/output-economy/fixtures.ts b/test/output-economy/fixtures.ts index fd52759964..5e060461da 100644 --- a/test/output-economy/fixtures.ts +++ b/test/output-economy/fixtures.ts @@ -1,7 +1,7 @@ +import type { DaemonResponseData } from '@agent-device/kernel/contracts'; import type { CaptureSnapshotResult, CommandRequestResult } from '@agent-device/contracts/client'; import { AppError } from '@agent-device/kernel/errors'; import { attachRefs, type RawSnapshotNode } from '@agent-device/kernel/snapshot'; -import type { DaemonResponseData } from '@agent-device/daemon/daemon-request'; const SNAPSHOT_NODES: RawSnapshotNode[] = [ { diff --git a/test/output-economy/selection-fixtures.ts b/test/output-economy/selection-fixtures.ts index b67c019849..cbbc27c17f 100644 --- a/test/output-economy/selection-fixtures.ts +++ b/test/output-economy/selection-fixtures.ts @@ -1,5 +1,5 @@ +import type { DaemonResponseData } from '@agent-device/kernel/contracts'; import type { DebugSymbolsResult } from '@agent-device/contracts/observability'; -import type { DaemonResponseData } from '@agent-device/daemon/daemon-request'; const requestBody = JSON.stringify({ cartId: 'cart-economy-fixture', From 824077b38573ce2ed5e206725c7627b62adcab2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 14 Oct 2026 19:43:51 +0200 Subject: [PATCH 2/2] chore(gates): declare the daemon client ban as a logical-module policy The client's edges into the daemon package are a flat ban, so the daemon-client policy in LOGICAL_MODULE_POLICIES carries it instead of a separate rule, and R10 leaves the importers that policy covers to it. The wire-compat ledger acks the type-name-only digest changes and waives the DaemonWireRequest narrowing in the closure policy. Co-Authored-By: Claude Sonnet 5.5 --- docs/adr/0033-collocation-decision-table.md | 4 +- scripts/layering/architecture-ownership.ts | 5 + scripts/layering/check.ts | 3 - scripts/layering/daemon-client-entry.test.ts | 128 --------------- scripts/layering/daemon-client-entry.ts | 159 ------------------- scripts/layering/daemon-modularity.test.ts | 77 ++++----- scripts/layering/daemon-modularity.ts | 57 +++---- scripts/layering/root-module-zones.ts | 4 +- test/wire-compat/closure-policy.ts | 8 +- test/wire-compat/ledger.json | 65 +++++--- 10 files changed, 109 insertions(+), 401 deletions(-) delete mode 100644 scripts/layering/daemon-client-entry.test.ts delete mode 100644 scripts/layering/daemon-client-entry.ts diff --git a/docs/adr/0033-collocation-decision-table.md b/docs/adr/0033-collocation-decision-table.md index f1ed258c1c..adaf8bb0fe 100644 --- a/docs/adr/0033-collocation-decision-table.md +++ b/docs/adr/0033-collocation-decision-table.md @@ -133,8 +133,8 @@ the whole `daemon-contracts` zone has moved into `packages/daemon-contracts` — package derive the zone, so every moved file's `ROOT_MODULE_ZONES` row is gone. The daemon ⇄ client shared files that remain here (`provider-credential-fingerprint.ts`) trace to #2559, which relocated the shared contracts **to the process root** so the client stops -importing `packages/daemon/src/` at all; R78 keeps any client→daemon -edge at zero runtime and a five-line recorded type-only residue, and #3288's `daemon-contracts` +importing `packages/daemon/src/` at all; the `daemon-client` logical-module policy bans every edge from `src/daemon-client/` into +`packages/daemon/src/`, and #3288's `daemon-contracts` zone was the declaration of that shared-below-both ownership — the extraction makes it physical, with R11 and the package's dependency edges holding the same boundary. Rows on path-keyed evidence alone (the `platform-runtime-*` seams) say "retain for this batch": a guard's diff --git a/scripts/layering/architecture-ownership.ts b/scripts/layering/architecture-ownership.ts index 0dd73dbe2d..be365093c8 100644 --- a/scripts/layering/architecture-ownership.ts +++ b/scripts/layering/architecture-ownership.ts @@ -112,6 +112,11 @@ export const SNAPSHOT_EXECUTION_RETIRED_HANDLER_PATHS = [ ] as const; export const LOGICAL_MODULE_POLICIES = [ + { + name: 'daemon-client', + roots: ['src/daemon-client/'], + forbiddenTargetRoots: [DAEMON_SOURCE_ROOT], + }, { name: 'ad-replay', roots: ['packages/ad-replay/src/'], diff --git a/scripts/layering/check.ts b/scripts/layering/check.ts index d08c7e13dd..f34a288ed0 100644 --- a/scripts/layering/check.ts +++ b/scripts/layering/check.ts @@ -133,7 +133,6 @@ import { recordRuntimeDaemonMechanicsViolations } from './record-runtime-mechani import { checkDaemonPlatformBoundary } from './daemon-platform-boundary.ts'; import { checkDaemonPlatformRuntimeInventory } from './daemon-platform-runtime-inventory.ts'; import { checkDaemonProcessReach } from './daemon-process-reach.ts'; -import { checkDaemonClientEntry } from './daemon-client-entry.ts'; import { checkDaemonLayers, DAEMON_ROOT } from './daemon-layers.ts'; import { checkSessionAuthorityOverlay, handlerOwnedOverlay } from './session-authority-overlay.ts'; import { @@ -519,7 +518,6 @@ export const LAYERING_RULE_IDS = [ 'snapshot-assembly-presentation-neutrality', 'daemon-platform-runtime-inventory', 'daemon-process-reach', - 'daemon-client-entry', 'session-authority-overlay', 'daemon-layers', ] as const; @@ -584,7 +582,6 @@ export const LAYERING_RULES: Readonly> = { 'daemon-platform-runtime-inventory': (context) => checkDaemonPlatformRuntimeInventory(context.edges), 'daemon-process-reach': (context) => checkDaemonProcessReach(context.sourceFiles, context.edges), - 'daemon-client-entry': (context) => checkDaemonClientEntry(context.edges), 'session-authority-overlay': (context) => checkSessionAuthorityOverlay( context.ratchets.sessionAuthority, diff --git a/scripts/layering/daemon-client-entry.test.ts b/scripts/layering/daemon-client-entry.test.ts deleted file mode 100644 index 19091b8ce3..0000000000 --- a/scripts/layering/daemon-client-entry.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import assert from 'node:assert/strict'; -import { test } from 'node:test'; -import { - checkDaemonClientEntry, - DAEMON_CLIENT_ENTRY_EDGES, - DAEMON_CLIENT_ENTRY_RULE, -} from './daemon-client-entry.ts'; -import { targetDagZone, type ResolvedImportEdge } from './model.ts'; - -function clientEdge( - file: string, - target: string, - kind: 'type' | 'value' | 'dynamic' = 'type', -): ResolvedImportEdge { - return { - file, - target, - spec: target, - line: 1, - dynamic: kind === 'dynamic', - typeOnly: kind === 'type', - symbols: [], - fromZone: targetDagZone(file), - toZone: targetDagZone(target), - }; -} - -function recordedWireEdges(): ResolvedImportEdge[] { - return DAEMON_CLIENT_ENTRY_EDGES.map((edge) => clientEdge(edge.file, edge.target, 'type')); -} - -test('the recorded wire-only edges are the accepted residue', () => { - assert.deepEqual(checkDaemonClientEntry(recordedWireEdges()), []); -}); - -test('a client import of a non-daemon module is not daemon-client entry surface', () => { - const edges = [ - ...recordedWireEdges(), - clientEdge( - 'src/daemon-client/daemon-client-metadata.ts', - 'packages/daemon-contracts/src/daemon-process.ts', - 'value', - ), - clientEdge('src/daemon-client/daemon-client-lifecycle.ts', 'src/config.ts', 'value'), - ]; - assert.deepEqual(checkDaemonClientEntry(edges), []); -}); - -test('a planted runtime import of daemon internals by the client is red', () => { - const violations = checkDaemonClientEntry([ - ...recordedWireEdges(), - clientEdge( - 'src/daemon-client/daemon-client-metadata.ts', - 'packages/daemon/src/core/config.ts', - 'value', - ), - ]); - assert.equal(violations.length, 1); - assert.equal(violations[0]!.rule, DAEMON_CLIENT_ENTRY_RULE); - assert.match(violations[0]!.message, /value-imports daemon internals/); - assert.match( - violations[0]!.message, - /daemon-client-metadata\.ts -> packages\/daemon\/src\/core\/config\.ts/, - ); -}); - -test('a planted dynamic import of daemon internals by the client is red', () => { - const violations = checkDaemonClientEntry([ - ...recordedWireEdges(), - clientEdge( - 'src/daemon-client/daemon-client-progress.ts', - 'packages/daemon/src/core/config.ts', - 'dynamic', - ), - ]); - assert.equal(violations.length, 1); - assert.match(violations[0]!.message, /dynamic-imports daemon internals/); -}); - -test('a runtime import is red even when the same pair is a recorded type edge', () => { - const violations = checkDaemonClientEntry([ - ...recordedWireEdges(), - clientEdge( - 'src/daemon-client/daemon-client-rpc.ts', - 'packages/daemon/src/core/daemon-request.ts', - 'value', - ), - ]); - assert.equal(violations.length, 1); - assert.match(violations[0]!.message, /value-imports daemon internals/); -}); - -test('an unrecorded type import of daemon internals is red', () => { - const violations = checkDaemonClientEntry([ - ...recordedWireEdges(), - clientEdge( - 'src/daemon-client/daemon-launch-spec.ts', - 'packages/daemon/src/core/daemon-request.ts', - ), - ]); - assert.equal(violations.length, 1); - assert.match(violations[0]!.message, /unclassified daemon-client import of daemon internals/); - assert.match( - violations[0]!.message, - /daemon-launch-spec\.ts -> packages\/daemon\/src\/core\/daemon-request\.ts/, - ); -}); - -test('a type import of a daemon module other than the recorded type is red', () => { - const recorded = DAEMON_CLIENT_ENTRY_EDGES.map((edge) => - edge.file === 'src/daemon-client/daemon-client.ts' - ? clientEdge(edge.file, 'packages/daemon/src/core/session-state.ts', 'type') - : clientEdge(edge.file, edge.target, 'type'), - ); - const violations = checkDaemonClientEntry(recorded); - // The moved edge is undeclared (unclassified) and its recorded edge is now gone (stale). - assert.equal(violations.length, 2); - assert.ok(violations.some((v) => /unclassified daemon-client import/.test(v.message))); - assert.ok(violations.some((v) => /stale declared edge/.test(v.message))); -}); - -test('a recorded edge the tree no longer imports is stale', () => { - const dropped = recordedWireEdges().slice(1); - const violations = checkDaemonClientEntry(dropped); - assert.equal(violations.length, 1); - assert.match(violations[0]!.message, /stale declared edge/); - assert.match(violations[0]!.message, new RegExp(DAEMON_CLIENT_ENTRY_EDGES[0]!.file)); -}); diff --git a/scripts/layering/daemon-client-entry.ts b/scripts/layering/daemon-client-entry.ts deleted file mode 100644 index 4e5f5516ec..0000000000 --- a/scripts/layering/daemon-client-entry.ts +++ /dev/null @@ -1,159 +0,0 @@ -import type { LayeringViolation, ResolvedImportEdge } from './model.ts'; -import { DAEMON_SOURCE_ROOT } from './tracked-sources.ts'; - -// The declared daemon-entry surface for the client (#2559). `src/daemon-client/**` composes the -// daemon over the network, not over its module graph, so it is NOT an entry point into daemon -// internals: the process root composition is. Every on-disk or protocol contract the client shares -// with the daemon (state-dir/transport resolution, pidfile liveness, the repair tombstone, the -// progress framing) therefore lives below both sides — since the daemon-contracts extraction, in -// `packages/daemon-contracts` — not under `packages/daemon/src/`, and the client -// reaches it there. What remains is the client reading the daemon's request/response vocabulary — -// the `DaemonRequest`/`DaemonResponse` types that anchor the ADR 0006 wire surface — recorded here, -// per measured `file -> target` edge, and only as a type-only import. A runtime (value or dynamic) -// import of a -// daemon module by the client is always a violation, an undeclared type import is a violation, and -// a recorded edge that no longer exists is stale; all three fail, so the set cannot grow, and a -// repair cannot leave a stale entry that would let the edge back in unnoticed. - -export const DAEMON_CLIENT_ENTRY_RULE = 'R78 daemon-client-entry'; - -const REQUEST_RATIONALE = - 'the client names the request and response it sends and reads across the socket — the same ' + - 'DaemonRequest/DaemonResponse vocabulary that anchors the ADR 0006 wire surface and is gated by ' + - 'test/wire-compat. Reading it as a type is unavoidable and closes the wire surface; a value import ' + - 'would drag the daemon-private request half (#2318/#2322) into the client.'; - -export type DaemonClientEntryEdge = Readonly<{ - file: string; - target: string; - rationale: string; -}>; - -/** - * The residual client→daemon imports, every one of them a type-only read of the canonical - * DaemonRequest/DaemonResponse vocabulary. It names measured edges, never a directory, so a new - * client module reaching the daemon — even for the same type — fails until it is recorded here. - */ -export const DAEMON_CLIENT_ENTRY_EDGES: readonly DaemonClientEntryEdge[] = [ - { - file: 'src/daemon-client/daemon-client.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-lifecycle.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-lease-beat.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-liveness-probe.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-progress.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-rpc.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, - { - file: 'src/daemon-client/daemon-client-transport.ts', - target: 'packages/daemon/src/core/daemon-request.ts', - rationale: REQUEST_RATIONALE, - }, -] as const; - -function keyOf(file: string, target: string): string { - return `${file} -> ${target}`; -} - -type MeasuredEdge = { file: string; target: string; line: number; runtimeKind: string | null }; - -/** - * Catches: the client reaching daemon internals again — a runtime import of any daemon module, or a - * new type-only import that was not measured and recorded. The runtime half is the regression this - * gate exists for: #2559 relocated the shared contracts to the process root specifically so the - * client stops value-importing `config.ts` or the shared contracts now owned by - * `packages/daemon-contracts`. The mirror failure — a recorded edge whose import is gone — - * is caught too, so a repair cannot leave the door open. - * Evidence: #2559 measured 13 client→daemon pairs (8 runtime) at the #2557 tip; the runtime half is - * now 0 and the 5 wire-only type edges are the residue recorded above. - * Cost: one rule registered in check.ts's whole-graph pass; not a standalone CI job. - * Kill criterion: the client reaches the daemon only through its network protocol (the inventory - * empty), or a maintainer decision that the client may compose daemon internals directly. - */ -export function checkDaemonClientEntry(edges: readonly ResolvedImportEdge[]): LayeringViolation[] { - const measured = new Map(); - for (const edge of edges) { - if (!edge.file.startsWith('src/daemon-client/')) continue; - if (!edge.target.startsWith(DAEMON_SOURCE_ROOT)) continue; - const key = keyOf(edge.file, edge.target); - const entry = measured.get(key) ?? { - file: edge.file, - target: edge.target, - line: edge.line, - runtimeKind: null, - }; - if (entry.runtimeKind === null && !edge.typeOnly) { - entry.runtimeKind = edge.dynamic ? 'dynamic-imports' : 'value-imports'; - } - measured.set(key, entry); - } - - const declared = new Set(DAEMON_CLIENT_ENTRY_EDGES.map((edge) => keyOf(edge.file, edge.target))); - const violations: LayeringViolation[] = []; - const seen = new Set(); - - for (const [key, entry] of measured) { - if (entry.runtimeKind !== null) { - violations.push({ - rule: DAEMON_CLIENT_ENTRY_RULE, - file: entry.file, - line: entry.line, - message: - `the daemon client ${entry.runtimeKind} daemon internals: ${key}. The client composes the ` + - `daemon over the network, not its module graph. Move the shared contract to ` + - `packages/daemon-contracts (or read the DaemonRequest/DaemonResponse types in ` + - `packages/daemon/src/core/daemon-request.ts as a type).`, - }); - seen.add(key); - continue; - } - if (!declared.has(key)) { - violations.push({ - rule: DAEMON_CLIENT_ENTRY_RULE, - file: entry.file, - line: entry.line, - message: - `unclassified daemon-client import of daemon internals: ${key}. If the client legitimately ` + - `reads a request/response type, record the measured edge in DAEMON_CLIENT_ENTRY_EDGES ` + - `(${DAEMON_CLIENT_ENTRY_RULE}) with its rationale; otherwise reach the shared root contract.`, - }); - } - seen.add(key); - } - - for (const edge of DAEMON_CLIENT_ENTRY_EDGES) { - const key = keyOf(edge.file, edge.target); - if (seen.has(key)) continue; - violations.push({ - rule: DAEMON_CLIENT_ENTRY_RULE, - file: 'scripts/layering/daemon-client-entry.ts', - line: 1, - message: - `stale declared edge: ${key} no longer exists. Remove it from DAEMON_CLIENT_ENTRY_EDGES so ` + - `the client dependency cannot return unclassified.`, - }); - } - - return violations; -} diff --git a/scripts/layering/daemon-modularity.test.ts b/scripts/layering/daemon-modularity.test.ts index 74da976528..77492bc706 100644 --- a/scripts/layering/daemon-modularity.test.ts +++ b/scripts/layering/daemon-modularity.test.ts @@ -6,34 +6,13 @@ import { checkRetiredSessionLifecyclePaths, checkRetiredSessionObservabilityPaths, checkRetiredSnapshotExecutionPaths, - DAEMON_MODULARITY_BASELINE, } from './daemon-modularity.ts'; -import { resolveImportEdges, targetDagZone, type ResolvedImportEdge } from './model.ts'; +import { resolveImportEdges, type ResolvedImportEdge } from './model.ts'; import type { LayeringRatchets } from './ratchet-reference.ts'; -function importEdge(file: string, target: string): ResolvedImportEdge { - return { - file, - target, - spec: target, - line: 1, - dynamic: false, - typeOnly: true, - symbols: [], - fromZone: targetDagZone(file), - toZone: targetDagZone(target), - }; -} - -function baselineDaemonTypesEdges(): ResolvedImportEdge[] { - return DAEMON_MODULARITY_BASELINE.externalDaemonTypesImporters.map((file) => - importEdge(file, 'packages/daemon/src/core/daemon-request.ts'), - ); -} - -/** Every baseline edge is present and nothing else is forbidden: the quiet state of the ratchets. */ +/** The quiet state of the ratchets: no forbidden edge present. */ function baselineEdges(): ResolvedImportEdge[] { - return baselineDaemonTypesEdges(); + return []; } /** Where a member of `zone` lives, so a zone count can be turned back into file paths. */ @@ -105,39 +84,23 @@ test('R10 banks an R7 shrink with no edit anywhere', () => { ); }); -test('external daemon request/session-state importer membership changes require the baseline to change', () => { +test('a production import of the daemon request/session-state modules outside the daemon is red', () => { const edges = resolveImportEdges( new Map([ [ - 'src/client/new-importer.ts', + 'src/remote/daemon-artifacts.ts', "import type { SessionState } from '../../packages/daemon/src/core/session-state.ts';", ], ['packages/daemon/src/core/session-state.ts', 'export type SessionState = { name: string };'], ]), ); - const violations = checkDaemonModularityRatchets( - [...baselineEdges(), ...edges], - REFERENCE, - REFERENCE, - ); + const violations = checkDaemonModularityRatchets(edges, REFERENCE, REFERENCE); assert.equal(violations.length, 1); - // The recorded list owns its own size (#2342 relocated five client files into it), so the - // message assertion reads it rather than pinning a literal that the baseline would outgrow. assert.match( violations[0]!.message, - new RegExp( - `may only shrink from the recorded ${DAEMON_MODULARITY_BASELINE.externalDaemonTypesImporters.length}`, - ), - ); - - const removed = checkDaemonModularityRatchets( - baselineDaemonTypesEdges().slice(1), - REFERENCE, - REFERENCE, + /src\/remote\/daemon-artifacts\.ts imports a daemon request/, ); - assert.equal(removed.length, 1); - assert.match(removed[0]!.message, /delete it from externalDaemonTypesImporters/); }); test('logical modules reject forbidden imports', () => { @@ -692,3 +655,29 @@ test('R9 banks a shrink with no edit anywhere', () => { [], ); }); + +for (const [kind, source] of [ + [ + 'type-only', + "import type { DaemonRequest } from '../../packages/daemon/src/core/daemon-request.ts';", + ], + ['value', "import { handle } from '../../packages/daemon/src/server/daemon-stop.ts';"], + [ + 'dynamic', + "export const load = () => import('../../packages/daemon/src/server/daemon-stop.ts');", + ], +] as const) { + test(`the daemon client importing the daemon package is red (${kind})`, () => { + const edges = resolveImportEdges( + new Map([ + ['src/daemon-client/daemon-client.ts', source], + ['packages/daemon/src/core/daemon-request.ts', 'export type DaemonRequest = object;'], + ['packages/daemon/src/server/daemon-stop.ts', 'export const handle = 1;'], + ]), + ); + + const violations = checkDaemonModularityRatchets(edges, REFERENCE, REFERENCE); + assert.equal(violations.length, 1); + assert.match(violations[0]!.message, /daemon-client must not import packages\/daemon\/src/); + }); +} diff --git a/scripts/layering/daemon-modularity.ts b/scripts/layering/daemon-modularity.ts index 5ba649d419..204ac41d0c 100644 --- a/scripts/layering/daemon-modularity.ts +++ b/scripts/layering/daemon-modularity.ts @@ -13,24 +13,12 @@ import { targetDagZone, type LayeringViolation, type ResolvedImportEdge } from ' import type { LayeringRatchets } from './ratchet-reference.ts'; // R7 ownership pressure and the largest type cycle (whole and per zone) are ratcheted against the -// merge-base with origin/main (`ratchet-reference.ts`); the importer membership below stays a -// recorded list, because it names files rather than counting them. -export const DAEMON_MODULARITY_BASELINE = { - externalDaemonTypesImporters: [ - 'src/client/client-normalizers.ts', - // #2559 drove the `src/daemon-client/**` half of this list to zero value edges and moved its - // residual wire-only type reads to R78 (`daemon-client-entry.ts`), which names each measured - // edge and forbids any runtime import. The daemon-client files are skipped below so the two - // gates never own the same edge; the importers left here are zones the client-entry rule - // does not cover. - 'src/remote/daemon-artifacts.ts', - ], -} as const; +// merge-base with origin/main (`ratchet-reference.ts`). // The modules that own the daemon's dispatch vocabulary since #2338 split `daemon/types.ts`: // the request shape and the live session record (the wire-only half moved to -// `@agent-device/contracts/command` as `DaemonWireRequest`). Both are ratcheted -// together, so moving a symbol between them cannot reopen the boundary to a new outside zone. +// `@agent-device/contracts/command` as `DaemonWireRequest`). Production code +// outside the daemon may import neither. const DAEMON_TYPE_MODULES: readonly string[] = [ 'packages/daemon/src/core/daemon-request.ts', 'packages/daemon/src/core/session-state.ts', @@ -216,34 +204,22 @@ function checkTypeCycleBaseline( } function checkDaemonTypesImporters(edges: readonly ResolvedImportEdge[]): LayeringViolation[] { - const allowed = new Set(DAEMON_MODULARITY_BASELINE.externalDaemonTypesImporters); - const importers = new Map(); + const violations: LayeringViolation[] = []; + const reported = new Set(); for (const edge of edges) { if (!DAEMON_TYPE_MODULES.includes(edge.target) || edge.file.startsWith(DAEMON_SOURCE_ROOT)) continue; - // #2559: the client's daemon-request/session-state reads are owned by the stricter - // R78 `daemon-client-entry` gate, which also bans runtime imports and names each edge. - if (edge.file.startsWith('src/daemon-client/')) continue; - importers.set(edge.file, edge); - } - const violations = [...importers] - .filter(([file]) => !allowed.has(file)) - .map(([file, edge]) => ({ + // A module whose policy forbids the whole daemon package is held to that, not to this list. + if (forbidsDaemonPackage(edge.file) || reported.has(edge.file)) continue; + reported.add(edge.file); + violations.push({ rule: 'R10 daemon-modularity', - file, + file: edge.file, line: edge.line, message: - `external production imports of the daemon request/session-state modules may only shrink ` + - `from the recorded ${allowed.size}. ` + - 'Use an existing neutral contract; do not move DaemonRequest into contracts to satisfy this gate.', - })); - for (const file of allowed) { - if (importers.has(file)) continue; - violations.push({ - rule: 'R10 daemon-modularity', - file: 'scripts/layering/daemon-modularity.ts', - line: 1, - message: `${file} no longer imports a daemon request/session-state module — delete it from externalDaemonTypesImporters in the same change so the dependency cannot return.`, + `${edge.file} imports a daemon request/session-state module. Production code outside the ` + + 'daemon reads the wire shapes in @agent-device/contracts/command (DaemonWireRequest) and ' + + '@agent-device/kernel/contracts (DaemonResponse).', }); } return violations; @@ -308,6 +284,10 @@ function checkLogicalModuleImports(edges: readonly ResolvedImportEdge[]): Layeri return violations; } +function forbidsDaemonPackage(file: string): boolean { + return moduleForFile(file)?.forbiddenTargetRoots.includes(DAEMON_SOURCE_ROOT) ?? false; +} + function moduleForFile(file: string): LogicalModulePolicy | undefined { return LOGICAL_MODULE_POLICIES.find((module) => module.roots.some((root) => matchesDeclaredRoot(file, root)), @@ -348,7 +328,6 @@ export function daemonModularitySummary(reference: LayeringRatchets): string { return ( `R10 holds R7 at the merge-base's ${session.writerOwnedFields} writer-owned fields / ` + `${session.ownerFileClaims} owner claims, R9 at its ${reference.largestTypeCycle.length} files per zone, ` + - `${DAEMON_MODULARITY_BASELINE.externalDaemonTypesImporters.length} external daemon request/session-state importers, ` + - 'and zero forbidden logical-module imports' + 'no external daemon request/session-state importers, and zero forbidden logical-module imports' ); } diff --git a/scripts/layering/root-module-zones.ts b/scripts/layering/root-module-zones.ts index 40e119875e..5b3ee18d51 100644 --- a/scripts/layering/root-module-zones.ts +++ b/scripts/layering/root-module-zones.ts @@ -14,8 +14,8 @@ * while a forbidden dependency still fails R5 or R80. * * Zone membership is a layering fact only. Rules keyed on physical paths — R2's `topFolder` - * zones, R13's composition files, R76's daemon-to-root inventory, R78's `src/daemon-client/**` - * scope — keep reading the path, not this declaration. + * zones, R13's composition files, R76's daemon-to-root inventory, the `daemon-client` logical-module policy's + * `src/daemon-client/` root — keep reading the path, not this declaration. */ export const ROOT_MODULE_ZONES: Readonly> = { '(root)': ['src/bin.ts', 'src/cli.ts', 'src/daemon.ts'], diff --git a/test/wire-compat/closure-policy.ts b/test/wire-compat/closure-policy.ts index f89b582184..92d0d3b415 100644 --- a/test/wire-compat/closure-policy.ts +++ b/test/wire-compat/closure-policy.ts @@ -45,10 +45,10 @@ export const WIRE_CLOSURE_WAIVERS: Readonly> = { 'Client-side record of where a daemon is listening (pid, ports, state dir). Never serialized into a request or response.', 'packages/daemon/src/core/daemon-request.ts#DaemonRequest': 'Server-side narrowing of the listed kernel DaemonRequest; the declaration that fixes the shape is packages/kernel/src/contracts.ts#DaemonRequest.', - 'packages/daemon/src/core/daemon-request.ts#DaemonResponse': - 'Re-export alias of the listed kernel DaemonResponse; the shape is fixed by packages/kernel/src/contracts.ts#DaemonResponse.', - 'packages/daemon/src/core/daemon-request.ts#DaemonArtifact': - 'Re-export alias of the listed kernel DaemonArtifact; the shape is fixed by packages/kernel/src/contracts.ts#DaemonArtifact.', + 'packages/contracts/src/daemon-wire-request.ts#DaemonWireRequest': + 'Client-side narrowing of the listed kernel DaemonRequest (token and session required, flags typed as CommandFlags); the declaration that fixes the shape is packages/kernel/src/contracts.ts#DaemonRequest.', + 'packages/contracts/src/daemon-wire-request.ts#DaemonWireRequestMeta': + 'Narrowing of the listed kernel DaemonRequestMeta (installSource, lockPlatform and the lease coordinates); the declaration that fixes the shape is packages/kernel/src/contracts.ts#DaemonRequestMeta.', 'src/remote/upload-stream.ts#UploadStreamProgressOptions': 'Byte-progress callback options for local upload rendering. The bytes counted are digested through the request/response declarations; these options never cross the wire.', 'src/remote/upload-progress.ts#UploadProgressSink': diff --git a/test/wire-compat/ledger.json b/test/wire-compat/ledger.json index 16846f6193..eb1371b85e 100644 --- a/test/wire-compat/ledger.json +++ b/test/wire-compat/ledger.json @@ -54,17 +54,17 @@ "src/commands/cli-grammar/types.ts#DaemonCommandRequest": "sha256:ea3f4118244711f0eaec0e471f62b0de42ca97181c085df165d37b63301a4619", "packages/contracts/src/lease-scope.ts#LeaseRpcCommand": "sha256:714f66efa725a5d0654e492a76daeb4059caad31b79562cfc9133029ea95bfe5", "src/daemon-client/daemon-client-progress.ts#ProgressResponseFormat": "sha256:6d7a99ac13fd422671fd86f8fe093efa40ca369f4ae1f97c98d40a7132543637", - "src/daemon-client/daemon-client-progress.ts#createInvalidDaemonResponseError": "sha256:0af812346b667a23fdfef641b242cd86d07edaa05eb928c4c531628c09a4031b", - "src/daemon-client/daemon-client-progress.ts#shouldReadDaemonProgressStream": "sha256:6811404f41d8db3fa6fc751332c7186a2399ec7ecbc4e9c547d9cb9f14dbb350", + "src/daemon-client/daemon-client-progress.ts#createInvalidDaemonResponseError": "sha256:807eb96ca26de118a8e678f2ec776d17c207db4eec86ff23cfaec9cd2476b60f", + "src/daemon-client/daemon-client-progress.ts#shouldReadDaemonProgressStream": "sha256:27ac0a5299324aab39fa2c4fe0e0d32b1eb1515df47c7f4aa75a75d66b8b5a3e", "src/daemon-client/daemon-client-rpc.ts#appErrorFromDaemonError": "sha256:ac4761006c71d93ccba9f8e37cbd4cf48283dbb22737c163dc9c1a878e154eea", - "src/daemon-client/daemon-client-rpc.ts#buildHttpRpcPayload": "sha256:a8311d02126c51c0205be29d5deae68298b5dca223851a68f03aac95a4add5c6", - "src/daemon-client/daemon-client-rpc.ts#buildLeaseRpcParams": "sha256:1755f46be8c62e7a8eb409e9a94d61781c96ccbef3306702121aa94264d63267", - "src/daemon-client/daemon-client-rpc.ts#handleDaemonHttpResponseBody": "sha256:8f1c4bba1918545db6296ad29b95f0baa9f949e7c23bc04d59e261130f14611e", + "src/daemon-client/daemon-client-rpc.ts#buildHttpRpcPayload": "sha256:bbcf00e71d3975caba4add0e85537396b5831796f1af52cc8c62a4688882ebd7", + "src/daemon-client/daemon-client-rpc.ts#buildLeaseRpcParams": "sha256:365490a0fe1833d7ce8b0d3f5425462608a85119b12c1a2c4f16bb83b5d28e06", + "src/daemon-client/daemon-client-rpc.ts#handleDaemonHttpResponseBody": "sha256:8d5849a4e573d6bb8fbd4ee0259755b76116a65f4abe41705cf84bfab5834ce4", "src/daemon-client/daemon-client-rpc.ts#isLeaseRpcCommand": "sha256:955dc1b73462d40593e5728dbcbaeec1307944b08262a22627e84cc5dc507e8f", "src/daemon-client/daemon-client-rpc.ts#leaseRpcMethodForCommand": "sha256:3613555c6002c23ab5bec4b98bc1b4d6947014b52fa100176177f955cf762881", "src/daemon-client/daemon-client-rpc.ts#parseDaemonHttpResponseBody": "sha256:0cbe39dbd09e321ec00854a1626a7d89b6344e59c6faabe2fe02504268b2d886", - "src/daemon-client/daemon-client-rpc.ts#rejectDaemonHttpRpcError": "sha256:1272b06f13da00e05923cbb1aed15ab8fdf96e9caeb697fac52f78b0a2ba69e1", - "src/daemon-client/daemon-client-rpc.ts#resolveDaemonHttpResult": "sha256:296f9d376ce67c8cb20209bdf1c59c2423ffcfa35b5565a99e70271263149048", + "src/daemon-client/daemon-client-rpc.ts#rejectDaemonHttpRpcError": "sha256:a5cf6fd4a9abea34ec051f03d6e45e5aa248f480371fdf22f93de06622a57b47", + "src/daemon-client/daemon-client-rpc.ts#resolveDaemonHttpResult": "sha256:9432fffc59c11ff7ccf8c9ce7076559e5c043264045737f24cc4b8e67d76c3d7", "src/daemon-client/daemon-client-rpc.ts#toDaemonHttpRpcError": "sha256:888246763c48670e7da893054d025744654f8715c3b4906312617a2b5028316b", "src/daemon-client/daemon-client-transport.ts#RemoteDaemonHealth": "sha256:3bac36fa97090b273afe1128103e1bf476d05441fd9de41317f1b78775b88304", "src/daemon-client/daemon-client-transport.ts#RemoteDaemonHealthLink": "sha256:7702598468b4c82b4ffa93064cd6bdfec938c1c527f7e6007c0584f3884a6eea", @@ -147,12 +147,12 @@ "src/remote/artifact-download.ts#RemoteArtifactDownload": "sha256:f73a888f4f8c9d603701c505bb342787b1ca6559a13b15da2385e60349ecea8e", "src/remote/artifact-download.ts#downloadRemoteArtifactFromUrl": "sha256:cde1ed3649d73da51a0413216aa24a561a2ec57d08ed533ffa985b95b1941cf6", "src/remote/daemon-artifacts.ts#DaemonArtifactEndpoint": "sha256:45226717ac52c0af2a62f74e91549582d95f4a4abc49be87989e026291a88c82", - "src/remote/daemon-artifacts.ts#DownloadRemoteArtifactParams": "sha256:3ec63be2dbdb542e30b19d1500bc16874607823afb7ae392e92b0b535865859e", + "src/remote/daemon-artifacts.ts#DownloadRemoteArtifactParams": "sha256:ba6d2f6ac51e05ccc5e0c940b355d62374e018b1ae6f6f744becf6e1760cbb63", "src/remote/daemon-artifacts.ts#buildDaemonArtifactUrl": "sha256:06dcde057809b507f70f7bb5cdef9bde6515be84b67e45865cf19e70b8636208", "src/remote/daemon-artifacts.ts#downloadRemoteArtifact": "sha256:f3ab09ce387577073ecc5bcd2528963e45f91b2c1e4cc57847c3e2732ccbb300", "src/remote/daemon-artifacts.ts#isRemoteDaemon": "sha256:0f6a714c5f60ce4e8548d811b516d8b6241eca9f7e5414733732da395b8a00e7", - "src/remote/daemon-artifacts.ts#materializeRemoteArtifacts": "sha256:6a62429723f52231951ef263950f4b304529bad984ab216b73db1750f58c7f84", - "src/remote/daemon-artifacts.ts#resolveMaterializedArtifactPath": "sha256:db5c44effc41ff9fa40bd094945e56ac60fac89a42fa68c65c9293e6de6fb1dc", + "src/remote/daemon-artifacts.ts#materializeRemoteArtifacts": "sha256:c3ea70cc9a218acfaa30f6c4ba55b80224c96aba10e4e9c7a17828fc851de77e", + "src/remote/daemon-artifacts.ts#resolveMaterializedArtifactPath": "sha256:cad37beddeb03ba70bc92118a5e45f552edfc00feec789758e390d1ea4c7d879", "src/remote/remote-request-diagnostics.ts#RemoteDaemonErrorPayload": "sha256:8fbcbcdf4bae7b66a08e465a72593794f36364759f18f1a814cd39dfdb76f309", "src/remote/remote-request-diagnostics.ts#RemoteDiagnosticsEndpoint": "sha256:c1d5fe2fe90c425502cf8b7c87d6606374d6af65b4e9faf942a416f683930bdc", "src/remote/remote-request-diagnostics.ts#buildRemoteRequestDiagnosticsUrl": "sha256:30a1a9bf0df24d3564a616699916a3bb4360c2b4d21c4ad0562fb0c1e738d0a9", @@ -206,8 +206,8 @@ }, { "declaration": "src/remote/daemon-artifacts.ts#DownloadRemoteArtifactParams", - "digest": "sha256:3ec63be2dbdb542e30b19d1500bc16874607823afb7ae392e92b0b535865859e", - "rationale": "#2246 adds the optional isDirectory field. It is pure client-local state — never serialized, never sent to the daemon — that tells the CLIENT'S OWN download logic to extract a tar body instead of writing it verbatim; the GET /artifacts/:id request and response framing are unchanged. Every existing call site (screenshot, recording) omits it and keeps writing a single file exactly as before." + "digest": "sha256:ba6d2f6ac51e05ccc5e0c940b355d62374e018b1ae6f6f744becf6e1760cbb63", + "rationale": "#2246 adds the optional isDirectory field. It is pure client-local state — never serialized, never sent to the daemon — that tells the CLIENT'S OWN download logic to extract a tar body instead of writing it verbatim; the GET /artifacts/:id request and response framing are unchanged. Every existing call site (screenshot, recording) omits it and keeps writing a single file exactly as before. The signature also names the client request as DaemonWireRequest and the response as the kernel DaemonResponse instead of the daemon package aliases; only compile-time type names moved." }, { "declaration": "src/remote/daemon-artifacts.ts#downloadRemoteArtifact", @@ -216,13 +216,13 @@ }, { "declaration": "src/remote/daemon-artifacts.ts#materializeRemoteArtifacts", - "digest": "sha256:6a62429723f52231951ef263950f4b304529bad984ab216b73db1750f58c7f84", - "rationale": "#2246 passes isDirectory only for the new test-artifacts type and uses the exact path the client materializer published. Existing screenshot and recording artifacts still report their requested file path; only the new directory response gains its suite-invocation segment." + "digest": "sha256:c3ea70cc9a218acfaa30f6c4ba55b80224c96aba10e4e9c7a17828fc851de77e", + "rationale": "#2246 passes isDirectory only for the new test-artifacts type and uses the exact path the client materializer published. Existing screenshot and recording artifacts still report their requested file path; only the new directory response gains its suite-invocation segment. The signature also names the client request as DaemonWireRequest and the response as the kernel DaemonResponse instead of the daemon package aliases; only compile-time type names moved." }, { "declaration": "src/daemon-client/daemon-client-rpc.ts#buildHttpRpcPayload", - "digest": "sha256:a8311d02126c51c0205be29d5deae68298b5dca223851a68f03aac95a4add5c6", - "rationale": "Adds the optional providerCredentialFingerprint parameter to agent_device.lease.allocate, forwarded only when the request meta carries one, which the client sets only for a local daemon. A released protocol-2 daemon ignores unknown JSON-RPC parameters, and a request without a fingerprint keeps the previous payload byte-for-byte." + "digest": "sha256:bbcf00e71d3975caba4add0e85537396b5831796f1af52cc8c62a4688882ebd7", + "rationale": "Adds the optional providerCredentialFingerprint parameter to agent_device.lease.allocate, forwarded only when the request meta carries one, which the client sets only for a local daemon. A released protocol-2 daemon ignores unknown JSON-RPC parameters, and a request without a fingerprint keeps the previous payload byte-for-byte. The signature also names the client request as DaemonWireRequest and the response as the kernel DaemonResponse instead of the daemon package aliases; only compile-time type names moved." }, { "declaration": "packages/daemon/src/server/http/http-rpc-methods.ts#toLeaseDaemonRequest", @@ -241,8 +241,8 @@ }, { "declaration": "src/daemon-client/daemon-client-rpc.ts#handleDaemonHttpResponseBody", - "digest": "sha256:8f1c4bba1918545db6296ad29b95f0baa9f949e7c23bc04d59e261130f14611e", - "rationale": "#1801 client-side only: the RPC error branch now runs through `rejectDaemonHttpRpcError`, which reads a superset of the fields it read before and, for a remote daemon, replaces the daemon-host `logPath` with a caller-local copy. Every field a released daemon sends is still accepted; nothing new is required of the daemon." + "digest": "sha256:8d5849a4e573d6bb8fbd4ee0259755b76116a65f4abe41705cf84bfab5834ce4", + "rationale": "#1801 client-side only: the RPC error branch now runs through `rejectDaemonHttpRpcError`, which reads a superset of the fields it read before and, for a remote daemon, replaces the daemon-host `logPath` with a caller-local copy. Every field a released daemon sends is still accepted; nothing new is required of the daemon. The signature also names the client request as DaemonWireRequest and the response as the kernel DaemonResponse instead of the daemon package aliases; only compile-time type names moved." }, { "declaration": "src/daemon-client/daemon-client-rpc.ts#toDaemonHttpRpcError", @@ -421,8 +421,8 @@ }, { "declaration": "src/daemon-client/daemon-client-rpc.ts#rejectDaemonHttpRpcError", - "digest": "sha256:1272b06f13da00e05923cbb1aed15ab8fdf96e9caeb697fac52f78b0a2ba69e1", - "rationale": "Clients name a held agent-device lease in an optional x-agent-device-lease-id request header on upload, artifact download and request diagnostics HTTP calls, so a gateway can route them. Released daemons ignore unknown request headers and the proxy forwards only its allowlist, so routes, bodies and responses parse as before; with no lease held the request is unchanged (ADR 0006)." + "digest": "sha256:a5cf6fd4a9abea34ec051f03d6e45e5aa248f480371fdf22f93de06622a57b47", + "rationale": "Clients name a held agent-device lease in an optional x-agent-device-lease-id request header on upload, artifact download and request diagnostics HTTP calls, so a gateway can route them. Released daemons ignore unknown request headers and the proxy forwards only its allowlist, so routes, bodies and responses parse as before; with no lease held the request is unchanged (ADR 0006). The signature also names the client request as DaemonWireRequest and the kernel DaemonResponse instead of the daemon package aliases; only compile-time type names moved." }, { "declaration": "src/remote/upload-client.ts#requestUploadPreflight", @@ -453,6 +453,31 @@ "declaration": "src/remote/artifact-download.ts#downloadRemoteArtifactFromUrl", "digest": "sha256:cde1ed3649d73da51a0413216aa24a561a2ec57d08ed533ffa985b95b1941cf6", "rationale": "Clients name a held agent-device lease in an optional x-agent-device-lease-id request header on upload, artifact download and request diagnostics HTTP calls, so a gateway can route them. Released daemons ignore unknown request headers and the proxy forwards only its allowlist, so routes, bodies and responses parse as before; with no lease held the request is unchanged (ADR 0006)." + }, + { + "declaration": "src/daemon-client/daemon-client-progress.ts#createInvalidDaemonResponseError", + "digest": "sha256:807eb96ca26de118a8e678f2ec776d17c207db4eec86ff23cfaec9cd2476b60f", + "rationale": "The client names its request as DaemonWireRequest (packages/contracts/src/daemon-wire-request.ts, a narrowing of the listed kernel DaemonRequest) and its response as the kernel DaemonResponse, instead of the daemon package's DaemonRequest/DaemonResponse aliases, so the daemon package is no longer a client import. The declaration's serialized fields, method names and framing are unchanged; only the compile-time type names in its signature moved, so a peer on protocol 2 parses exactly what it did." + }, + { + "declaration": "src/daemon-client/daemon-client-progress.ts#shouldReadDaemonProgressStream", + "digest": "sha256:27ac0a5299324aab39fa2c4fe0e0d32b1eb1515df47c7f4aa75a75d66b8b5a3e", + "rationale": "The client names its request as DaemonWireRequest (packages/contracts/src/daemon-wire-request.ts, a narrowing of the listed kernel DaemonRequest) and its response as the kernel DaemonResponse, instead of the daemon package's DaemonRequest/DaemonResponse aliases, so the daemon package is no longer a client import. The declaration's serialized fields, method names and framing are unchanged; only the compile-time type names in its signature moved, so a peer on protocol 2 parses exactly what it did." + }, + { + "declaration": "src/daemon-client/daemon-client-rpc.ts#buildLeaseRpcParams", + "digest": "sha256:365490a0fe1833d7ce8b0d3f5425462608a85119b12c1a2c4f16bb83b5d28e06", + "rationale": "The client names its request as DaemonWireRequest (packages/contracts/src/daemon-wire-request.ts, a narrowing of the listed kernel DaemonRequest) and its response as the kernel DaemonResponse, instead of the daemon package's DaemonRequest/DaemonResponse aliases, so the daemon package is no longer a client import. The declaration's serialized fields, method names and framing are unchanged; only the compile-time type names in its signature moved, so a peer on protocol 2 parses exactly what it did." + }, + { + "declaration": "src/daemon-client/daemon-client-rpc.ts#resolveDaemonHttpResult", + "digest": "sha256:9432fffc59c11ff7ccf8c9ce7076559e5c043264045737f24cc4b8e67d76c3d7", + "rationale": "The client names its request as DaemonWireRequest (packages/contracts/src/daemon-wire-request.ts, a narrowing of the listed kernel DaemonRequest) and its response as the kernel DaemonResponse, instead of the daemon package's DaemonRequest/DaemonResponse aliases, so the daemon package is no longer a client import. The declaration's serialized fields, method names and framing are unchanged; only the compile-time type names in its signature moved, so a peer on protocol 2 parses exactly what it did." + }, + { + "declaration": "src/remote/daemon-artifacts.ts#resolveMaterializedArtifactPath", + "digest": "sha256:cad37beddeb03ba70bc92118a5e45f552edfc00feec789758e390d1ea4c7d879", + "rationale": "The client names its request as DaemonWireRequest (packages/contracts/src/daemon-wire-request.ts, a narrowing of the listed kernel DaemonRequest) and its response as the kernel DaemonResponse, instead of the daemon package's DaemonRequest/DaemonResponse aliases, so the daemon package is no longer a client import. The declaration's serialized fields, method names and framing are unchanged; only the compile-time type names in its signature moved, so a peer on protocol 2 parses exactly what it did." } ] }