diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 6f4f771742..2400823457 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -248,6 +248,10 @@ "types": "./src/keyboard-runtime.ts", "default": "./src/keyboard-runtime.ts" }, + "./lease-scope": { + "types": "./src/lease-scope.ts", + "default": "./src/lease-scope.ts" + }, "./local-interactor-operation-set": { "types": "./src/local-interactor-operation-set.ts", "default": "./src/local-interactor-operation-set.ts" diff --git a/src/core/__tests__/lease-scope.test.ts b/packages/contracts/src/__tests__/lease-scope.test.ts similarity index 100% rename from src/core/__tests__/lease-scope.test.ts rename to packages/contracts/src/__tests__/lease-scope.test.ts diff --git a/src/core/lease-scope.ts b/packages/contracts/src/lease-scope.ts similarity index 100% rename from src/core/lease-scope.ts rename to packages/contracts/src/lease-scope.ts diff --git a/scripts/layering/contracts-exports.snapshot.json b/scripts/layering/contracts-exports.snapshot.json index 988c6d6d21..7581e80c04 100644 --- a/scripts/layering/contracts-exports.snapshot.json +++ b/scripts/layering/contracts-exports.snapshot.json @@ -59,6 +59,7 @@ "@agent-device/contracts/is-predicate", "@agent-device/contracts/keyboard", "@agent-device/contracts/keyboard-runtime", + "@agent-device/contracts/lease-scope", "@agent-device/contracts/local-interactor-operation-set", "@agent-device/contracts/logs-runtime-plan", "@agent-device/contracts/managed-device-allocation", diff --git a/src/client/client-normalizers.ts b/src/client/client-normalizers.ts index 7dd9056a2f..38a302068c 100644 --- a/src/client/client-normalizers.ts +++ b/src/client/client-normalizers.ts @@ -21,7 +21,10 @@ import type { SessionRuntimeHints } from '@agent-device/kernel/contracts'; import { AppError, type DaemonError } from '@agent-device/kernel/errors'; import { sanitizeErrorCause } from '@agent-device/kernel/redaction'; import type { SnapshotNode } from '@agent-device/kernel/snapshot'; -import { leaseScopeFromOptions, leaseScopeToRequestMeta } from '../core/lease-scope.ts'; +import { + leaseScopeFromOptions, + leaseScopeToRequestMeta, +} from '@agent-device/contracts/lease-scope'; import type { DaemonRequest } from '../daemon/daemon-request.ts'; import { asRecord, diff --git a/src/commands/command-flags.ts b/src/commands/command-flags.ts index 21f3d9b8ea..adb428d14c 100644 --- a/src/commands/command-flags.ts +++ b/src/commands/command-flags.ts @@ -1,6 +1,9 @@ import type { CommandFlags } from '@agent-device/contracts/command'; import { screenshotFlagsFromOptions } from '@agent-device/contracts/capture'; -import { leaseScopeFromOptions, leaseScopeToCommandFlags } from '../core/lease-scope.ts'; +import { + leaseScopeFromOptions, + leaseScopeToCommandFlags, +} from '@agent-device/contracts/lease-scope'; import { stripUndefined } from '@agent-device/kernel/record'; import { getFlagDefinitions } from './cli-grammar/flag-registry.ts'; import type { InternalRequestOptions } from '@agent-device/contracts/client'; diff --git a/src/daemon-client/daemon-client-rpc.ts b/src/daemon-client/daemon-client-rpc.ts index fd6a93adb4..d58f48ebec 100644 --- a/src/daemon-client/daemon-client-rpc.ts +++ b/src/daemon-client/daemon-client-rpc.ts @@ -14,7 +14,7 @@ import { leaseScopeFromRequest, leaseScopeToLeaseRpcParams, type LeaseRpcCommand, -} from '../core/lease-scope.ts'; +} from '@agent-device/contracts/lease-scope'; export function handleDaemonHttpResponseBody( body: string, diff --git a/src/daemon/__tests__/lease-context.test.ts b/src/daemon/__tests__/lease-context.test.ts index 28b2af8ee2..ad5ea05a69 100644 --- a/src/daemon/__tests__/lease-context.test.ts +++ b/src/daemon/__tests__/lease-context.test.ts @@ -6,7 +6,7 @@ import { resolveRequestOrSessionLeaseScope, type SessionLease, } from '../lease-context.ts'; -import { buildLeaseDiagnosticsContext } from '../../core/lease-scope.ts'; +import { buildLeaseDiagnosticsContext } from '@agent-device/contracts/lease-scope'; import type { DaemonRequest } from '../daemon-request.ts'; test('buildSessionLeaseFromRequest captures complete request lease scope', () => { diff --git a/src/daemon/handlers/lease.ts b/src/daemon/handlers/lease.ts index 6ca0f10362..fa597823e2 100644 --- a/src/daemon/handlers/lease.ts +++ b/src/daemon/handlers/lease.ts @@ -21,7 +21,7 @@ import { leaseScopeToAllocateRequest, leaseScopeToHeartbeatRequest, leaseScopeToReleaseRequest, -} from '../../core/lease-scope.ts'; +} from '@agent-device/contracts/lease-scope'; import { AppError, createRequestCanceledError, errorMessage } from '@agent-device/kernel/errors'; import { LEASE_ALLOCATION_BUDGET_MS } from '@agent-device/command-registry/timeout-policy'; import { getRequestSignal, isRequestCanceled } from '@agent-device/host-kit/request'; diff --git a/src/daemon/lease-context.ts b/src/daemon/lease-context.ts index 15451f0317..73d6c229f0 100644 --- a/src/daemon/lease-context.ts +++ b/src/daemon/lease-context.ts @@ -9,7 +9,7 @@ import { isProxyLeaseScope, leaseScopeFromRequest, type LeaseScope, -} from '../core/lease-scope.ts'; +} from '@agent-device/contracts/lease-scope'; export { DEFAULT_PROXY_LEASE_TTL_MS, findMissingProxyLeaseFields, isProxyLeaseScope }; export type { LeaseScope }; diff --git a/src/daemon/lease-lifecycle.ts b/src/daemon/lease-lifecycle.ts index 2b62017808..1a77a4f626 100644 --- a/src/daemon/lease-lifecycle.ts +++ b/src/daemon/lease-lifecycle.ts @@ -1,5 +1,5 @@ import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; -import { leaseScopeToReleaseRequest } from '../core/lease-scope.ts'; +import { leaseScopeToReleaseRequest } from '@agent-device/contracts/lease-scope'; import { clearDeviceClaim } from './device-claims.ts'; import type { LeaseRegistry } from './lease-registry.ts'; import type { diff --git a/src/daemon/request-admission.ts b/src/daemon/request-admission.ts index e57979140d..12e8117b91 100644 --- a/src/daemon/request-admission.ts +++ b/src/daemon/request-admission.ts @@ -14,7 +14,7 @@ import { resolveLeaseScope, resolveRequestOrSessionLeaseScope, } from './lease-context.ts'; -import { leaseScopeToHeartbeatRequest } from '../core/lease-scope.ts'; +import { leaseScopeToHeartbeatRequest } from '@agent-device/contracts/lease-scope'; import type { LeaseRegistry } from './lease-registry.ts'; import type { DaemonRequest } from './daemon-request.ts'; import type { SessionState } from './session-state.ts'; diff --git a/src/daemon/server/daemon-session-lease-finalizer.ts b/src/daemon/server/daemon-session-lease-finalizer.ts index ee50776e7f..c7a93bcfda 100644 --- a/src/daemon/server/daemon-session-lease-finalizer.ts +++ b/src/daemon/server/daemon-session-lease-finalizer.ts @@ -1,4 +1,4 @@ -import { leaseScopeToReleaseRequest } from '../../core/lease-scope.ts'; +import { leaseScopeToReleaseRequest } from '@agent-device/contracts/lease-scope'; import { emitDiagnostic } from '@agent-device/host-kit/diagnostics'; import type { ExpiredProviderLeaseReleaser } from '../provider-lease-expiry.ts'; import type { LeaseRegistry } from '../lease-registry.ts'; diff --git a/src/remote/remote-connection-state.ts b/src/remote/remote-connection-state.ts index 7ed28766dc..29dbba7fa2 100644 --- a/src/remote/remote-connection-state.ts +++ b/src/remote/remote-connection-state.ts @@ -11,7 +11,7 @@ import { leaseScopeFromOptions, leaseScopeToCommandFlags, leaseScopeToConnectionMetadata, -} from '../core/lease-scope.ts'; +} from '@agent-device/contracts/lease-scope'; export type RemoteConnectionState = { version: 1; diff --git a/test/integration/provider-scenarios/remote-proxy-parity.test.ts b/test/integration/provider-scenarios/remote-proxy-parity.test.ts index ee13555bcd..0cd8b69191 100644 --- a/test/integration/provider-scenarios/remote-proxy-parity.test.ts +++ b/test/integration/provider-scenarios/remote-proxy-parity.test.ts @@ -4,7 +4,7 @@ import http from 'node:http'; import os from 'node:os'; import path from 'node:path'; import { test } from 'vitest'; -import { DEFAULT_PROXY_LEASE_TTL_MS } from '../../../src/core/lease-scope.ts'; +import { DEFAULT_PROXY_LEASE_TTL_MS } from '@agent-device/contracts/lease-scope'; import { sendToDaemon } from '../../../src/daemon-client/daemon-client.ts'; import { LeaseRegistry } from '../../../src/daemon/lease-registry.ts'; import { createDaemonHttpServer } from '../../../src/daemon/server/http-server.ts'; diff --git a/test/wire-compat/ledger.json b/test/wire-compat/ledger.json index 63f0071c03..ae4902c0d5 100644 --- a/test/wire-compat/ledger.json +++ b/test/wire-compat/ledger.json @@ -47,7 +47,7 @@ "packages/kernel/src/errors.ts#normalizeError": "sha256:5d9f906fd326676b4c3095cd6bd675c784cb26f36f4b8344a108cf5f7628f9dc", "packages/kernel/src/errors.ts#readDiagnosticsRecordRef": "sha256:3a210f401221c0a15eb75d488450034885c7b73be39f5e93424c72874d14c395", "src/commands/cli-grammar/types.ts#DaemonCommandRequest": "sha256:ea3f4118244711f0eaec0e471f62b0de42ca97181c085df165d37b63301a4619", - "src/core/lease-scope.ts#LeaseRpcCommand": "sha256:714f66efa725a5d0654e492a76daeb4059caad31b79562cfc9133029ea95bfe5", + "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", diff --git a/test/wire-compat/surface.ts b/test/wire-compat/surface.ts index 1fcf84081f..a3e576162d 100644 --- a/test/wire-compat/surface.ts +++ b/test/wire-compat/surface.ts @@ -195,7 +195,7 @@ export const WIRE_SURFACE: readonly WireSurfaceGroup[] = [ // `flags`/`input` bags, and ADR 0006 calls new flags additive. ...from('src/commands/cli-grammar/types.ts', 'DaemonCommandRequest'), // The lease method vocabulary the client and daemon must agree on. - ...from('src/core/lease-scope.ts', 'LeaseRpcCommand'), + ...from('packages/contracts/src/lease-scope.ts', 'LeaseRpcCommand'), // Producer side: the method vocabulary a released client sends, and the // projections that turn each method's params into a DaemonRequest. ...from( diff --git a/test/wire-compat/wire-mutations.test.ts b/test/wire-compat/wire-mutations.test.ts index 6021400a83..bec86f6e96 100644 --- a/test/wire-compat/wire-mutations.test.ts +++ b/test/wire-compat/wire-mutations.test.ts @@ -307,9 +307,10 @@ const CLOSURE_PROBES: readonly { reachedFrom: string; omit: string }[] = [ omit: 'packages/contracts/src/request-progress.ts#RequestProgressEvent', }, { - // Plain relative import inside src/. + // Declaration moved into packages/contracts; the consumer reaches it through the + // package's exports map. reachedFrom: 'buildLeaseRpcParams', - omit: 'src/core/lease-scope.ts#LeaseRpcCommand', + omit: 'packages/contracts/src/lease-scope.ts#LeaseRpcCommand', }, { // Workspace specifier resolved through the package's own exports map.