diff --git a/src/native/CommandRunner.ts b/src/native/CommandRunner.ts index 17be0fadff..696cc08f33 100644 --- a/src/native/CommandRunner.ts +++ b/src/native/CommandRunner.ts @@ -19,11 +19,6 @@ import type { import { boundedUtf8Text } from "../process/boundedUtf8Text.js"; import { DEFAULT_NATIVE_COMMAND_TIMEOUT_MS } from "../domain/native/nativeDeadlines.js"; -/** - * Omitted `native_command_timeout_ms`. Distinct from objdump/rizin - * `command_timeout_ms`, which is a separate 120000 ms one-shot budget. - */ -export const NATIVE_COMMAND_TIMEOUT_MS = DEFAULT_NATIVE_COMMAND_TIMEOUT_MS; /** Retain complete command output up to a bounded aggregate size. */ export const NATIVE_COMMAND_OUTPUT_BUDGET_BYTES = 64 * 1024 * 1024; /** @@ -131,7 +126,7 @@ export interface NativeCommandFailureCapture { export interface NativeCommandOptions { readonly signal?: AbortSignal; readonly acceptNonZero?: boolean; - /** Selected wall clock; omitted uses `NATIVE_COMMAND_TIMEOUT_MS`. */ + /** Selected wall clock; omitted uses `DEFAULT_NATIVE_COMMAND_TIMEOUT_MS`. */ readonly timeoutMs?: number; } @@ -155,7 +150,7 @@ export type NativeToolResolver = ( tool: string, signal?: AbortSignal, launcher?: NativeCommandLauncher, - /** Selected command deadline. Omitted uses `NATIVE_COMMAND_TIMEOUT_MS`. */ + /** Selected command deadline. Omitted uses `DEFAULT_NATIVE_COMMAND_TIMEOUT_MS`. */ timeoutMs?: number, ) => Promise>; @@ -533,7 +528,7 @@ const captureProcess = async ( ...(options.signal === undefined ? {} : { signal: options.signal }), }, { - timeoutMs: options.timeoutMs ?? NATIVE_COMMAND_TIMEOUT_MS, + timeoutMs: options.timeoutMs ?? DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, diagnosticBytes: NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, acceptNonZeroExit: options.acceptNonZero === true, }, diff --git a/src/native/NativeCommandDeadline.test.ts b/src/native/NativeCommandDeadline.test.ts index 589d331ea6..9fdc616d39 100644 --- a/src/native/NativeCommandDeadline.test.ts +++ b/src/native/NativeCommandDeadline.test.ts @@ -14,10 +14,8 @@ import type { NativeCommandOptions, NativeCommandRunner, } from "./CommandRunner.js"; -import { - NATIVE_COMMAND_TIMEOUT_MS, - XcrunCommandRunner, -} from "./CommandRunner.js"; +import { XcrunCommandRunner } from "./CommandRunner.js"; +import { DEFAULT_NATIVE_COMMAND_TIMEOUT_MS } from "../domain/native/nativeDeadlines.js"; import { NativeMacOSProvider } from "./NativeMacOSProvider.js"; vi.mock("../process/OwnedCommand.js", async (original) => ({ @@ -59,7 +57,7 @@ describe("native_command_timeout_ms", () => { const result = await execute(runner, {}); expect(result.ok, JSON.stringify(result)).toBe(true); expect(runner.timeouts.every((timeout) => timeout === 60_000)).toBe(true); - expect(NATIVE_COMMAND_TIMEOUT_MS).toBe(60_000); + expect(DEFAULT_NATIVE_COMMAND_TIMEOUT_MS).toBe(60_000); expect(runner.timeouts.length).toBeGreaterThan(0); }); diff --git a/src/native/NativeMacOSProvider.ts b/src/native/NativeMacOSProvider.ts index ef6947f286..bbc4ba5b2e 100644 --- a/src/native/NativeMacOSProvider.ts +++ b/src/native/NativeMacOSProvider.ts @@ -59,6 +59,7 @@ import { AnalysisTimeoutError, } from "../domain/analysisErrorCore.js"; import { + DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, DEFAULT_NATIVE_UI_DEADLINE_MS, MAX_NATIVE_TIMER_MS, fixedNativeAllowance, @@ -95,7 +96,6 @@ import { } from "../domain/native/nativeInspection.js"; import { err, ok, type Result } from "../domain/result.js"; import { - NATIVE_COMMAND_TIMEOUT_MS, NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, NATIVE_FAILURE_DIAGNOSTIC_BYTES, NativeCommandFailure, @@ -603,7 +603,7 @@ class NativeMacOSClient implements AnalysisClient { ): Promise> { const timeout = readNativeDeadline( parameters.native_command_timeout_ms, - NATIVE_COMMAND_TIMEOUT_MS, + DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, ); if (!timeout.ok) return Promise.resolve( @@ -1295,7 +1295,7 @@ const isNativeOperation = ( const translateCommandFailure = ( operation: NativeToolName, failure: NativeCommandFailure, - timeoutMs = NATIVE_COMMAND_TIMEOUT_MS, + timeoutMs = DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, ): AnalysisError => { const cleanupOwners = [ ...failure.cleanupFailures, @@ -1367,7 +1367,7 @@ const translateCommandFailure = ( timeoutMs, setting: "native_command_timeout_ms", cliFlag: "--native-command-timeout-ms", - defaultMs: NATIVE_COMMAND_TIMEOUT_MS, + defaultMs: DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, phase: "macOS native command deadline", unchanged: `The ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)}-byte command output allowance and the ${String(NATIVE_FAILURE_DIAGNOSTIC_BYTES)}-byte failure-diagnostic excerpt have no runtime override.`, }), @@ -1429,7 +1429,7 @@ const translateCommandFailure = ( timeoutMs, setting: "native_command_timeout_ms", cliFlag: "--native-command-timeout-ms", - defaultMs: NATIVE_COMMAND_TIMEOUT_MS, + defaultMs: DEFAULT_NATIVE_COMMAND_TIMEOUT_MS, phase: "macOS native command deadline", unchanged: `The ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)}-byte command output allowance and the ${String(NATIVE_FAILURE_DIAGNOSTIC_BYTES)}-byte failure-diagnostic excerpt have no runtime override.`, }), diff --git a/src/native/NativeUiHelperRuntime.test.ts b/src/native/NativeUiHelperRuntime.test.ts index cfacab9b73..775072a4d3 100644 --- a/src/native/NativeUiHelperRuntime.test.ts +++ b/src/native/NativeUiHelperRuntime.test.ts @@ -1,7 +1,7 @@ import { expect, it, vi } from "vitest"; import { execFileOutput } from "../process/ExecFileOutput.js"; import { createNativeUiHelperRuntime } from "./NativeUiHelperRuntime.js"; -import { NATIVE_UI_DEADLINE_MS } from "./NativeUiInterruptionControl.js"; +import { DEFAULT_NATIVE_UI_DEADLINE_MS } from "../domain/native/nativeDeadlines.js"; vi.mock("../process/ExecFileOutput.js", async (importOriginal) => ({ ...(await importOriginal()), @@ -37,7 +37,7 @@ it.each([250_000, undefined])( } finally { await runtime.close(); } - const expected = deadlineMs ?? NATIVE_UI_DEADLINE_MS; + const expected = deadlineMs ?? DEFAULT_NATIVE_UI_DEADLINE_MS; const calls = vi.mocked(execFileOutput).mock.calls; expect(calls).toHaveLength(2); expect(calls[0]?.[0]).toBe("/usr/bin/xcrun"); diff --git a/src/native/NativeUiHelperRuntime.ts b/src/native/NativeUiHelperRuntime.ts index a7ecb87d87..f7bacb2225 100644 --- a/src/native/NativeUiHelperRuntime.ts +++ b/src/native/NativeUiHelperRuntime.ts @@ -8,9 +8,9 @@ import { fileURLToPath } from "node:url"; import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js"; import { execFileOutput } from "../process/ExecFileOutput.js"; import { safeParseJson } from "../domain/safeJson.js"; +import { DEFAULT_NATIVE_UI_DEADLINE_MS } from "../domain/native/nativeDeadlines.js"; import type { NativeUiHelper } from "./NativeUiObservation.js"; import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js"; -import { NATIVE_UI_DEADLINE_MS } from "./NativeUiInterruptionControl.js"; export interface NativeUiHelperRuntime { readonly invoke: NativeUiHelper; @@ -25,7 +25,7 @@ export interface NativeUiHelperRuntime { /** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */ export const createNativeUiHelperRuntime = ( environment: Readonly, - deadlineMs = NATIVE_UI_DEADLINE_MS, + deadlineMs = DEFAULT_NATIVE_UI_DEADLINE_MS, ): NativeUiHelperRuntime => { const selectedEnvironment = snapshotEnvironment(environment); const deadlineSignal = AbortSignal.timeout(deadlineMs); diff --git a/src/native/NativeUiInterruptionControl.ts b/src/native/NativeUiInterruptionControl.ts index bb529032a4..9d94fbec00 100644 --- a/src/native/NativeUiInterruptionControl.ts +++ b/src/native/NativeUiInterruptionControl.ts @@ -8,9 +8,6 @@ import { nativeDeadlineRecovery, } from "../domain/native/nativeDeadlines.js"; -/** Omitted `native_ui_deadline_ms`. */ -export const NATIVE_UI_DEADLINE_MS = DEFAULT_NATIVE_UI_DEADLINE_MS; - type Interruption = | { readonly kind: "caller"; readonly reason: unknown } | { readonly kind: "deadline"; readonly reason: unknown }; @@ -38,7 +35,7 @@ export class NativeUiInterruptionControl { constructor( caller: AbortSignal | undefined, deadline: AbortSignal, - deadlineMs = NATIVE_UI_DEADLINE_MS, + deadlineMs = DEFAULT_NATIVE_UI_DEADLINE_MS, ) { this.#caller = caller; this.#deadline = deadline; @@ -86,7 +83,7 @@ export class NativeUiInterruptionControl { timeoutMs: this.#deadlineMs, setting: "native_ui_deadline_ms", cliFlag: "--native-ui-deadline-ms", - defaultMs: NATIVE_UI_DEADLINE_MS, + defaultMs: DEFAULT_NATIVE_UI_DEADLINE_MS, phase: "native UI observation deadline", detail: " A partial observation may already be retained.", unchanged: diff --git a/src/native/NativeUiObservation.ts b/src/native/NativeUiObservation.ts index 0667352603..e785e8a368 100644 --- a/src/native/NativeUiObservation.ts +++ b/src/native/NativeUiObservation.ts @@ -34,10 +34,7 @@ import { NATIVE_UI_OUTPUT_BUDGET_BYTES, NATIVE_UI_OUTPUT_WEIGHT, } from "./NativeUiOutputBudget.js"; -import { - NATIVE_UI_DEADLINE_MS, - NativeUiInterruptionControl, -} from "./NativeUiInterruptionControl.js"; +import { NativeUiInterruptionControl } from "./NativeUiInterruptionControl.js"; const helper = fileURLToPath( new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url), @@ -79,7 +76,7 @@ export const observeNativeUi = async ( new NativeUiInterruptionControl( options.signal, runtime.signal, - runtime.deadlineMs ?? NATIVE_UI_DEADLINE_MS, + runtime.deadlineMs ?? DEFAULT_NATIVE_UI_DEADLINE_MS, ); const ownsInterruption = options.interruption === undefined; let result: Result, AnalysisError>;