agent-device 0.7.21 → 0.7.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +42 -0
  2. package/dist/src/224.js +2 -0
  3. package/dist/src/274.js +1 -0
  4. package/dist/src/331.js +3 -0
  5. package/dist/src/bin.d.ts +1 -0
  6. package/dist/src/bin.js +63 -59
  7. package/dist/src/cli-client-commands.d.ts +8 -0
  8. package/dist/src/cli.d.ts +6 -0
  9. package/dist/src/client-normalizers.d.ts +21 -0
  10. package/dist/src/client-types.d.ts +265 -0
  11. package/dist/src/client.d.ts +5 -0
  12. package/dist/src/core/app-events.d.ts +8 -0
  13. package/dist/src/core/batch.d.ts +17 -0
  14. package/dist/src/core/capabilities.d.ts +3 -0
  15. package/dist/src/core/dispatch-payload.d.ts +1 -0
  16. package/dist/src/core/dispatch-resolve.d.ts +28 -0
  17. package/dist/src/core/dispatch-series.d.ts +7 -0
  18. package/dist/src/core/dispatch.d.ts +34 -0
  19. package/dist/src/core/open-target.d.ts +4 -0
  20. package/dist/src/core/settings-contract.d.ts +8 -0
  21. package/dist/src/daemon/action-utils.d.ts +3 -0
  22. package/dist/src/daemon/app-log-android.d.ts +4 -0
  23. package/dist/src/daemon/app-log-ios.d.ts +6 -0
  24. package/dist/src/daemon/app-log-process.d.ts +15 -0
  25. package/dist/src/daemon/app-log-stream.d.ts +19 -0
  26. package/dist/src/daemon/app-log.d.ts +28 -0
  27. package/dist/src/daemon/artifact-archive.d.ts +12 -0
  28. package/dist/src/daemon/artifact-download.d.ts +12 -0
  29. package/dist/src/daemon/artifact-materialization.d.ts +17 -0
  30. package/dist/src/daemon/artifact-registry.d.ts +12 -0
  31. package/dist/src/daemon/config.d.ts +16 -0
  32. package/dist/src/daemon/context.d.ts +22 -0
  33. package/dist/src/daemon/device-ready.d.ts +6 -0
  34. package/dist/src/daemon/handlers/find.d.ts +40 -0
  35. package/dist/src/daemon/handlers/install-source.d.ts +10 -0
  36. package/dist/src/daemon/handlers/interaction.d.ts +14 -0
  37. package/dist/src/daemon/handlers/lease.d.ts +8 -0
  38. package/dist/src/daemon/handlers/parse-utils.d.ts +3 -0
  39. package/dist/src/daemon/handlers/record-trace.d.ts +15 -0
  40. package/dist/src/daemon/handlers/session-replay-heal.d.ts +8 -0
  41. package/dist/src/daemon/handlers/session-replay-script.d.ts +3 -0
  42. package/dist/src/daemon/handlers/session.d.ts +67 -0
  43. package/dist/src/daemon/handlers/snapshot.d.ts +32 -0
  44. package/dist/src/daemon/http-server.d.ts +26 -0
  45. package/dist/src/daemon/is-predicates.d.ts +14 -0
  46. package/dist/src/daemon/lease-context.d.ts +9 -0
  47. package/dist/src/daemon/lease-registry.d.ts +63 -0
  48. package/dist/src/daemon/materialized-path-registry.d.ts +15 -0
  49. package/dist/src/daemon/network-log.d.ts +32 -0
  50. package/dist/src/daemon/request-cancel.d.ts +9 -0
  51. package/dist/src/daemon/request-router.d.ts +17 -0
  52. package/dist/src/daemon/runtime-hints.d.ts +19 -0
  53. package/dist/src/daemon/script-utils.d.ts +15 -0
  54. package/dist/src/daemon/scroll-planner.d.ts +12 -0
  55. package/dist/src/daemon/selectors.d.ts +65 -0
  56. package/dist/src/daemon/server-lifecycle.d.ts +23 -0
  57. package/dist/src/daemon/session-routing.d.ts +3 -0
  58. package/dist/src/daemon/session-selector.d.ts +3 -0
  59. package/dist/src/daemon/session-store.d.ts +32 -0
  60. package/dist/src/daemon/snapshot-diff.d.ts +20 -0
  61. package/dist/src/daemon/snapshot-processing.d.ts +8 -0
  62. package/dist/src/daemon/transport.d.ts +6 -0
  63. package/dist/src/daemon/types.d.ts +115 -0
  64. package/dist/src/daemon/upload-registry.d.ts +7 -0
  65. package/dist/src/daemon/upload.d.ts +5 -0
  66. package/dist/src/daemon-client.d.ts +38 -0
  67. package/dist/src/daemon.d.ts +1 -0
  68. package/dist/src/daemon.js +36 -36
  69. package/dist/src/index.d.ts +4 -0
  70. package/dist/src/index.js +1 -0
  71. package/dist/src/platforms/android/adb.d.ts +5 -0
  72. package/dist/src/platforms/android/app-lifecycle.d.ts +30 -0
  73. package/dist/src/platforms/android/device-input-state.d.ts +19 -0
  74. package/dist/src/platforms/android/devices.d.ts +22 -0
  75. package/dist/src/platforms/android/index.d.ts +7 -0
  76. package/dist/src/platforms/android/input-actions.d.ts +12 -0
  77. package/dist/src/platforms/android/install-artifact.d.ts +11 -0
  78. package/dist/src/platforms/android/manifest.d.ts +1 -0
  79. package/dist/src/platforms/android/notifications.d.ts +11 -0
  80. package/dist/src/platforms/android/open-target.d.ts +4 -0
  81. package/dist/src/platforms/android/settings.d.ts +3 -0
  82. package/dist/src/platforms/android/snapshot.d.ts +8 -0
  83. package/dist/src/platforms/android/ui-hierarchy.d.ts +21 -0
  84. package/dist/src/platforms/appearance.d.ts +2 -0
  85. package/dist/src/platforms/boot-diagnostics.d.ts +14 -0
  86. package/dist/src/platforms/install-source.d.ts +26 -0
  87. package/dist/src/platforms/ios/apps.d.ts +34 -0
  88. package/dist/src/platforms/ios/config.d.ts +9 -0
  89. package/dist/src/platforms/ios/devicectl.d.ts +13 -0
  90. package/dist/src/platforms/ios/devices.d.ts +39 -0
  91. package/dist/src/platforms/ios/ensure-simulator.d.ts +18 -0
  92. package/dist/src/platforms/ios/index.d.ts +3 -0
  93. package/dist/src/platforms/ios/install-artifact.d.ts +18 -0
  94. package/dist/src/platforms/ios/launch-diagnostics.d.ts +11 -0
  95. package/dist/src/platforms/ios/plist.d.ts +1 -0
  96. package/dist/src/platforms/ios/runner-client.d.ts +36 -0
  97. package/dist/src/platforms/ios/runner-errors.d.ts +20 -0
  98. package/dist/src/platforms/ios/runner-session.d.ts +25 -0
  99. package/dist/src/platforms/ios/runner-transport.d.ts +10 -0
  100. package/dist/src/platforms/ios/runner-xctestrun.d.ts +18 -0
  101. package/dist/src/platforms/ios/screenshot.d.ts +13 -0
  102. package/dist/src/platforms/ios/simctl.d.ts +7 -0
  103. package/dist/src/platforms/ios/simulator.d.ts +11 -0
  104. package/dist/src/platforms/permission-utils.d.ts +9 -0
  105. package/dist/src/upload-client.d.ts +7 -0
  106. package/dist/src/utils/args.d.ts +15 -0
  107. package/dist/src/utils/command-schema.d.ts +93 -0
  108. package/dist/src/utils/device-isolation.d.ts +3 -0
  109. package/dist/src/utils/device.d.ts +27 -0
  110. package/dist/src/utils/diagnostics.d.ts +30 -0
  111. package/dist/src/utils/errors.d.ts +26 -0
  112. package/dist/src/utils/exec.d.ts +32 -0
  113. package/dist/src/utils/finders.d.ts +12 -0
  114. package/dist/src/utils/interactive.d.ts +1 -0
  115. package/dist/src/utils/interactors.d.ts +31 -0
  116. package/dist/src/utils/json-input.d.ts +1 -0
  117. package/dist/src/utils/keyed-lock.d.ts +1 -0
  118. package/dist/src/utils/output.d.ts +25 -0
  119. package/dist/src/utils/payload-input.d.ts +12 -0
  120. package/dist/src/utils/process-identity.d.ts +11 -0
  121. package/dist/src/utils/retry.d.ts +54 -0
  122. package/dist/src/utils/snapshot-lines.d.ts +12 -0
  123. package/dist/src/utils/snapshot.d.ts +42 -0
  124. package/dist/src/utils/timeouts.d.ts +3 -0
  125. package/dist/src/utils/version.d.ts +2 -0
  126. package/package.json +9 -1
  127. package/skills/agent-device/references/session-management.md +1 -1
  128. package/dist/src/678.js +0 -3
@@ -0,0 +1,93 @@
1
+ export type CliFlags = {
2
+ json: boolean;
3
+ stateDir?: string;
4
+ daemonBaseUrl?: string;
5
+ daemonAuthToken?: string;
6
+ daemonTransport?: 'auto' | 'socket' | 'http';
7
+ daemonServerMode?: 'socket' | 'http' | 'dual';
8
+ tenant?: string;
9
+ sessionIsolation?: 'none' | 'tenant';
10
+ runId?: string;
11
+ leaseId?: string;
12
+ platform?: 'ios' | 'android' | 'apple';
13
+ target?: 'mobile' | 'tv';
14
+ device?: string;
15
+ udid?: string;
16
+ serial?: string;
17
+ iosSimulatorDeviceSet?: string;
18
+ androidDeviceAllowlist?: string;
19
+ out?: string;
20
+ session?: string;
21
+ runtime?: string;
22
+ metroHost?: string;
23
+ metroPort?: number;
24
+ bundleUrl?: string;
25
+ launchUrl?: string;
26
+ boot?: boolean;
27
+ reuseExisting?: boolean;
28
+ verbose?: boolean;
29
+ snapshotInteractiveOnly?: boolean;
30
+ snapshotCompact?: boolean;
31
+ snapshotDepth?: number;
32
+ snapshotScope?: string;
33
+ snapshotRaw?: boolean;
34
+ appsFilter?: 'user-installed' | 'all';
35
+ count?: number;
36
+ fps?: number;
37
+ intervalMs?: number;
38
+ holdMs?: number;
39
+ jitterPx?: number;
40
+ doubleTap?: boolean;
41
+ pauseMs?: number;
42
+ pattern?: 'one-way' | 'ping-pong';
43
+ activity?: string;
44
+ saveScript?: boolean | string;
45
+ shutdown?: boolean;
46
+ relaunch?: boolean;
47
+ headless?: boolean;
48
+ restart?: boolean;
49
+ noRecord?: boolean;
50
+ replayUpdate?: boolean;
51
+ steps?: string;
52
+ stepsFile?: string;
53
+ batchOnError?: 'stop';
54
+ batchMaxSteps?: number;
55
+ batchSteps?: Array<{
56
+ command: string;
57
+ positionals?: string[];
58
+ flags?: Record<string, unknown>;
59
+ }>;
60
+ help: boolean;
61
+ version: boolean;
62
+ };
63
+ export type FlagKey = keyof CliFlags;
64
+ type FlagType = 'boolean' | 'int' | 'enum' | 'string' | 'booleanOrString';
65
+ export type FlagDefinition = {
66
+ key: FlagKey;
67
+ names: readonly string[];
68
+ type: FlagType;
69
+ enumValues?: readonly string[];
70
+ min?: number;
71
+ max?: number;
72
+ setValue?: CliFlags[FlagKey];
73
+ usageLabel?: string;
74
+ usageDescription?: string;
75
+ };
76
+ type CommandSchema = {
77
+ description: string;
78
+ positionalArgs: readonly string[];
79
+ allowsExtraPositionals?: boolean;
80
+ allowedFlags: readonly FlagKey[];
81
+ defaults?: Partial<CliFlags>;
82
+ skipCapabilityCheck?: boolean;
83
+ usageOverride?: string;
84
+ };
85
+ export declare const GLOBAL_FLAG_KEYS: Set<keyof CliFlags>;
86
+ export declare function getFlagDefinition(token: string): FlagDefinition | undefined;
87
+ export declare function getCommandSchema(command: string | null): CommandSchema | undefined;
88
+ export declare function getCliCommandNames(): string[];
89
+ export declare function getSchemaCapabilityKeys(): string[];
90
+ export declare function isStrictFlagModeEnabled(value: string | undefined): boolean;
91
+ export declare function buildUsageText(): string;
92
+ export declare function buildCommandUsageText(commandName: string): string | null;
93
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function resolveIosSimulatorDeviceSetPath(flagValue: string | undefined, env?: NodeJS.ProcessEnv): string | undefined;
2
+ export declare function parseSerialAllowlist(value: string): Set<string>;
3
+ export declare function resolveAndroidSerialAllowlist(flagValue: string | undefined, env?: NodeJS.ProcessEnv): ReadonlySet<string> | undefined;
@@ -0,0 +1,27 @@
1
+ export type Platform = 'ios' | 'android';
2
+ export type PlatformSelector = Platform | 'apple';
3
+ export type DeviceKind = 'simulator' | 'emulator' | 'device';
4
+ export type DeviceTarget = 'mobile' | 'tv';
5
+ export type DeviceInfo = {
6
+ platform: Platform;
7
+ id: string;
8
+ name: string;
9
+ kind: DeviceKind;
10
+ target?: DeviceTarget;
11
+ booted?: boolean;
12
+ simulatorSetPath?: string;
13
+ };
14
+ type DeviceSelector = {
15
+ platform?: Platform;
16
+ target?: DeviceTarget;
17
+ deviceName?: string;
18
+ udid?: string;
19
+ serial?: string;
20
+ };
21
+ type DeviceSelectionContext = {
22
+ simulatorSetPath?: string;
23
+ };
24
+ export declare function normalizePlatformSelector(platform: PlatformSelector | undefined): Platform | undefined;
25
+ export declare function resolveApplePlatformName(target: DeviceTarget | undefined): 'iOS' | 'tvOS';
26
+ export declare function selectDevice(devices: DeviceInfo[], selector: DeviceSelector, context?: DeviceSelectionContext): Promise<DeviceInfo>;
27
+ export {};
@@ -0,0 +1,30 @@
1
+ type DiagnosticLevel = 'info' | 'warn' | 'error' | 'debug';
2
+ type DiagnosticsScopeOptions = {
3
+ session?: string;
4
+ requestId?: string;
5
+ command?: string;
6
+ debug?: boolean;
7
+ logPath?: string;
8
+ traceLogPath?: string;
9
+ };
10
+ export declare function createRequestId(): string;
11
+ export declare function withDiagnosticsScope<T>(options: DiagnosticsScopeOptions, fn: () => Promise<T> | T): Promise<T>;
12
+ export declare function getDiagnosticsMeta(): {
13
+ diagnosticId?: string;
14
+ requestId?: string;
15
+ session?: string;
16
+ command?: string;
17
+ debug?: boolean;
18
+ };
19
+ export declare function emitDiagnostic(event: {
20
+ level?: DiagnosticLevel;
21
+ phase: string;
22
+ durationMs?: number;
23
+ data?: Record<string, unknown>;
24
+ }): void;
25
+ export declare function withDiagnosticTimer<T>(phase: string, fn: () => Promise<T> | T, data?: Record<string, unknown>): Promise<T>;
26
+ export declare function flushDiagnosticsToSessionFile(options?: {
27
+ force?: boolean;
28
+ }): string | null;
29
+ export declare function redactDiagnosticData<T>(input: T): T;
30
+ export {};
@@ -0,0 +1,26 @@
1
+ type ErrorCode = 'INVALID_ARGS' | 'DEVICE_NOT_FOUND' | 'TOOL_MISSING' | 'APP_NOT_INSTALLED' | 'UNSUPPORTED_PLATFORM' | 'UNSUPPORTED_OPERATION' | 'COMMAND_FAILED' | 'SESSION_NOT_FOUND' | 'UNAUTHORIZED' | 'UNKNOWN';
2
+ type AppErrorDetails = Record<string, unknown> & {
3
+ hint?: string;
4
+ diagnosticId?: string;
5
+ logPath?: string;
6
+ };
7
+ export type NormalizedError = {
8
+ code: string;
9
+ message: string;
10
+ hint?: string;
11
+ diagnosticId?: string;
12
+ logPath?: string;
13
+ details?: Record<string, unknown>;
14
+ };
15
+ export declare class AppError extends Error {
16
+ code: ErrorCode;
17
+ details?: AppErrorDetails;
18
+ cause?: unknown;
19
+ constructor(code: ErrorCode, message: string, details?: AppErrorDetails, cause?: unknown);
20
+ }
21
+ export declare function asAppError(err: unknown): AppError;
22
+ export declare function normalizeError(err: unknown, context?: {
23
+ diagnosticId?: string;
24
+ logPath?: string;
25
+ }): NormalizedError;
26
+ export {};
@@ -0,0 +1,32 @@
1
+ import { spawn } from 'node:child_process';
2
+ export type ExecResult = {
3
+ stdout: string;
4
+ stderr: string;
5
+ exitCode: number;
6
+ stdoutBuffer?: Buffer;
7
+ };
8
+ type ExecOptions = {
9
+ cwd?: string;
10
+ env?: NodeJS.ProcessEnv;
11
+ allowFailure?: boolean;
12
+ binaryStdout?: boolean;
13
+ stdin?: string | Buffer;
14
+ timeoutMs?: number;
15
+ detached?: boolean;
16
+ };
17
+ type ExecStreamOptions = ExecOptions & {
18
+ onStdoutChunk?: (chunk: string) => void;
19
+ onStderrChunk?: (chunk: string) => void;
20
+ onSpawn?: (child: ReturnType<typeof spawn>) => void;
21
+ };
22
+ export type ExecBackgroundResult = {
23
+ child: ReturnType<typeof spawn>;
24
+ wait: Promise<ExecResult>;
25
+ };
26
+ export declare function runCmd(cmd: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
27
+ export declare function whichCmd(cmd: string): Promise<boolean>;
28
+ export declare function runCmdSync(cmd: string, args: string[], options?: ExecOptions): ExecResult;
29
+ export declare function runCmdDetached(cmd: string, args: string[], options?: ExecOptions): void;
30
+ export declare function runCmdStreaming(cmd: string, args: string[], options?: ExecStreamOptions): Promise<ExecResult>;
31
+ export declare function runCmdBackground(cmd: string, args: string[], options?: ExecOptions): ExecBackgroundResult;
32
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { SnapshotNode } from './snapshot.ts';
2
+ export type FindLocator = 'any' | 'text' | 'label' | 'value' | 'role' | 'id';
3
+ type FindMatchOptions = {
4
+ requireRect?: boolean;
5
+ };
6
+ type FindBestMatches = {
7
+ matches: SnapshotNode[];
8
+ score: number;
9
+ };
10
+ export declare function findNodeByLocator(nodes: SnapshotNode[], locator: FindLocator, query: string, options?: FindMatchOptions): SnapshotNode | null;
11
+ export declare function findBestMatchesByLocator(nodes: SnapshotNode[], locator: FindLocator, query: string, options?: FindMatchOptions): FindBestMatches;
12
+ export {};
@@ -0,0 +1 @@
1
+ export declare function isInteractive(): boolean;
@@ -0,0 +1,31 @@
1
+ import type { DeviceInfo } from './device.ts';
2
+ export type RunnerContext = {
3
+ requestId?: string;
4
+ appBundleId?: string;
5
+ verbose?: boolean;
6
+ logPath?: string;
7
+ traceLogPath?: string;
8
+ };
9
+ type Interactor = {
10
+ open(app: string, options?: {
11
+ activity?: string;
12
+ appBundleId?: string;
13
+ url?: string;
14
+ }): Promise<void>;
15
+ openDevice(): Promise<void>;
16
+ close(app: string): Promise<void>;
17
+ tap(x: number, y: number): Promise<void>;
18
+ doubleTap(x: number, y: number): Promise<void>;
19
+ swipe(x1: number, y1: number, x2: number, y2: number, durationMs?: number): Promise<void>;
20
+ longPress(x: number, y: number, durationMs?: number): Promise<void>;
21
+ focus(x: number, y: number): Promise<void>;
22
+ type(text: string): Promise<void>;
23
+ fill(x: number, y: number, text: string): Promise<void>;
24
+ scroll(direction: string, amount?: number): Promise<void>;
25
+ scrollIntoView(text: string): Promise<{
26
+ attempts?: number;
27
+ } | void>;
28
+ screenshot(outPath: string, appBundleId?: string): Promise<void>;
29
+ };
30
+ export declare function getInteractor(device: DeviceInfo, runnerContext: RunnerContext): Interactor;
31
+ export {};
@@ -0,0 +1 @@
1
+ export declare function looksLikeInlineJson(value: string): boolean;
@@ -0,0 +1 @@
1
+ export declare function withKeyedLock<T>(locks: Map<string, Promise<unknown>>, key: string, task: () => Promise<T>): Promise<T>;
@@ -0,0 +1,25 @@
1
+ import { AppError, type NormalizedError } from './errors.ts';
2
+ type JsonResult = {
3
+ success: true;
4
+ data?: Record<string, unknown>;
5
+ } | {
6
+ success: false;
7
+ error: {
8
+ code: string;
9
+ message: string;
10
+ hint?: string;
11
+ diagnosticId?: string;
12
+ logPath?: string;
13
+ details?: Record<string, unknown>;
14
+ };
15
+ };
16
+ export declare function printJson(result: JsonResult): void;
17
+ export declare function printHumanError(err: AppError | NormalizedError, options?: {
18
+ showDetails?: boolean;
19
+ }): void;
20
+ export declare function formatSnapshotText(data: Record<string, unknown>, options?: {
21
+ raw?: boolean;
22
+ flatten?: boolean;
23
+ }): string;
24
+ export declare function formatSnapshotDiffText(data: Record<string, unknown>): string;
25
+ export {};
@@ -0,0 +1,12 @@
1
+ export type ResolvedPayloadInput = {
2
+ kind: 'file';
3
+ path: string;
4
+ } | {
5
+ kind: 'inline';
6
+ text: string;
7
+ };
8
+ export declare function resolvePayloadInput(value: string, options?: {
9
+ subject?: string;
10
+ cwd?: string;
11
+ expandPath?: (value: string, cwd?: string) => string;
12
+ }): ResolvedPayloadInput;
@@ -0,0 +1,11 @@
1
+ export declare function isProcessAlive(pid: number): boolean;
2
+ export declare function readProcessStartTime(pid: number): string | null;
3
+ export declare function readProcessCommand(pid: number): string | null;
4
+ export declare function isAgentDeviceDaemonCommand(command: string): boolean;
5
+ export declare function isAgentDeviceDaemonProcess(pid: number, expectedStartTime?: string): boolean;
6
+ export declare function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean>;
7
+ export declare function stopProcessForTakeover(pid: number, options: {
8
+ termTimeoutMs: number;
9
+ killTimeoutMs: number;
10
+ expectedStartTime?: string;
11
+ }): Promise<void>;
@@ -0,0 +1,54 @@
1
+ type RetryOptions = {
2
+ attempts?: number;
3
+ baseDelayMs?: number;
4
+ maxDelayMs?: number;
5
+ jitter?: number;
6
+ shouldRetry?: (error: unknown, attempt: number) => boolean;
7
+ };
8
+ type RetryPolicy = {
9
+ maxAttempts: number;
10
+ baseDelayMs: number;
11
+ maxDelayMs: number;
12
+ jitter: number;
13
+ shouldRetry?: (error: unknown, attempt: number) => boolean;
14
+ };
15
+ type RetryAttemptContext = {
16
+ attempt: number;
17
+ maxAttempts: number;
18
+ deadline?: Deadline;
19
+ };
20
+ type TimeoutProfile = {
21
+ startupMs: number;
22
+ operationMs: number;
23
+ totalMs: number;
24
+ };
25
+ type RetryTelemetryEvent = {
26
+ phase?: string;
27
+ event: 'attempt_failed' | 'retry_scheduled' | 'succeeded' | 'exhausted';
28
+ attempt: number;
29
+ maxAttempts: number;
30
+ delayMs?: number;
31
+ elapsedMs?: number;
32
+ remainingMs?: number;
33
+ reason?: string;
34
+ };
35
+ export declare function isEnvTruthy(value: string | undefined): boolean;
36
+ export declare const TIMEOUT_PROFILES: Record<string, TimeoutProfile>;
37
+ export declare class Deadline {
38
+ private readonly startedAtMs;
39
+ private readonly expiresAtMs;
40
+ private constructor();
41
+ static fromTimeoutMs(timeoutMs: number, nowMs?: number): Deadline;
42
+ remainingMs(nowMs?: number): number;
43
+ elapsedMs(nowMs?: number): number;
44
+ isExpired(nowMs?: number): boolean;
45
+ }
46
+ export declare function retryWithPolicy<T>(fn: (context: RetryAttemptContext) => Promise<T>, policy?: Partial<RetryPolicy>, options?: {
47
+ deadline?: Deadline;
48
+ phase?: string;
49
+ signal?: AbortSignal;
50
+ classifyReason?: (error: unknown) => string | undefined;
51
+ onEvent?: (event: RetryTelemetryEvent) => void;
52
+ }): Promise<T>;
53
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
54
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { SnapshotNode } from './snapshot.ts';
2
+ type SnapshotDisplayLine = {
3
+ node: SnapshotNode;
4
+ depth: number;
5
+ type: string;
6
+ text: string;
7
+ };
8
+ export declare function buildSnapshotDisplayLines(nodes: SnapshotNode[]): SnapshotDisplayLine[];
9
+ export declare function formatSnapshotLine(node: SnapshotNode, depth: number, hiddenGroup: boolean, normalizedType?: string): string;
10
+ export declare function displayLabel(node: SnapshotNode, type: string): string;
11
+ export declare function formatRole(type: string): string;
12
+ export {};
@@ -0,0 +1,42 @@
1
+ export type Rect = {
2
+ x: number;
3
+ y: number;
4
+ width: number;
5
+ height: number;
6
+ };
7
+ export type SnapshotOptions = {
8
+ interactiveOnly?: boolean;
9
+ compact?: boolean;
10
+ depth?: number;
11
+ scope?: string;
12
+ raw?: boolean;
13
+ };
14
+ export type RawSnapshotNode = {
15
+ index: number;
16
+ type?: string;
17
+ label?: string;
18
+ value?: string;
19
+ identifier?: string;
20
+ rect?: Rect;
21
+ enabled?: boolean;
22
+ selected?: boolean;
23
+ hittable?: boolean;
24
+ depth?: number;
25
+ parentIndex?: number;
26
+ };
27
+ export type SnapshotNode = RawSnapshotNode & {
28
+ ref: string;
29
+ };
30
+ export type SnapshotState = {
31
+ nodes: SnapshotNode[];
32
+ createdAt: number;
33
+ truncated?: boolean;
34
+ backend?: 'xctest' | 'android';
35
+ };
36
+ export declare function attachRefs(nodes: RawSnapshotNode[]): SnapshotNode[];
37
+ export declare function normalizeRef(input: string): string | null;
38
+ export declare function findNodeByRef(nodes: SnapshotNode[], ref: string): SnapshotNode | null;
39
+ export declare function centerOfRect(rect: Rect): {
40
+ x: number;
41
+ y: number;
42
+ };
@@ -0,0 +1,3 @@
1
+ export declare function resolveTimeoutMs(raw: string | undefined, fallback: number, min: number): number;
2
+ /** Alias for `resolveTimeoutMs` — semantically marks the caller expects seconds. */
3
+ export declare const resolveTimeoutSeconds: typeof resolveTimeoutMs;
@@ -0,0 +1,2 @@
1
+ export declare function readVersion(): string;
2
+ export declare function findProjectRoot(): string;
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "agent-device",
3
- "version": "0.7.21",
3
+ "version": "0.7.22",
4
4
  "description": "Unified control plane for physical and virtual devices via an agent-driven CLI.",
5
5
  "license": "MIT",
6
6
  "author": "Callstack",
7
7
  "type": "module",
8
+ "main": "dist/src/index.js",
9
+ "types": "dist/src/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/src/index.js",
13
+ "types": "./dist/src/index.d.ts"
14
+ }
15
+ },
8
16
  "engines": {
9
17
  "node": ">=22"
10
18
  },
@@ -21,7 +21,7 @@ Sessions isolate device context. A device can only be held by one session at a t
21
21
  - On iOS, `appstate` is session-scoped and requires a matching active session on the target device.
22
22
  - For dev loops where runtime state can persist (for example React Native Fast Refresh), use `open <app> --relaunch` to restart the app process in the same session.
23
23
  - Use `--save-script [path]` to record replay scripts on `close`; path is a file path and parent directories are created automatically.
24
- - Use `close --shutdown` (iOS simulator only) to shut down the simulator as part of session teardown, preventing resource leakage in multi-tenant or CI workloads.
24
+ - Use `close --shutdown` on iOS simulators or Android emulators to shut down the target as part of session teardown, preventing resource leakage in multi-tenant or CI workloads.
25
25
  - For ambiguous bare `--save-script` values, prefer `--save-script=workflow.ad` or `./workflow.ad`.
26
26
  - For deterministic replay scripts, prefer selector-based actions and assertions.
27
27
  - Use `replay -u` to update selector drift during maintenance.
package/dist/src/678.js DELETED
@@ -1,3 +0,0 @@
1
- import{AsyncLocalStorage as e}from"node:async_hooks";import t from"node:crypto";import r,{promises as n}from"node:fs";import o from"node:os";import i from"node:path";import{URL as a,fileURLToPath as s,pathToFileURL as c}from"node:url";import{spawn as l,spawnSync as d}from"node:child_process";let u=new e,f=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key)/i,m=/(bearer\s+[a-z0-9._-]+|(?:api[_-]?key|token|secret|password)\s*[=:]\s*\S+)/i;function p(){return t.randomBytes(8).toString("hex")}async function h(e,r){let n={...e,diagnosticId:`${Date.now().toString(36)}-${t.randomBytes(4).toString("hex")}`,events:[]};return await u.run(n,r)}function g(){let e=u.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function w(e){let t=u.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??"info",phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?v(e.data):void 0};if(t.events.push(n),!t.debug)return;let o=`[agent-device][diag] ${JSON.stringify(n)}
2
- `;try{t.logPath&&r.appendFile(t.logPath,o,()=>{}),t.traceLogPath&&r.appendFile(t.traceLogPath,o,()=>{}),t.logPath||t.traceLogPath||process.stderr.write(o)}catch{}}async function S(e,t,r){let n=Date.now();try{let o=await t();return w({level:"info",phase:e,durationMs:Date.now()-n,data:r}),o}catch(t){throw w({level:"error",phase:e,durationMs:Date.now()-n,data:{...r??{},error:t instanceof Error?t.message:String(t)}}),t}}function y(e={}){let t=u.getStore();if(!t||!e.force&&!t.debug||0===t.events.length)return null;try{let e=(t.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),n=new Date().toISOString().slice(0,10),a=i.join(o.homedir(),".agent-device","logs",e,n);r.mkdirSync(a,{recursive:!0});let s=new Date().toISOString().replace(/[:.]/g,"-"),c=i.join(a,`${s}-${t.diagnosticId}.ndjson`),l=t.events.map(e=>JSON.stringify(v(e)));return r.writeFileSync(c,`${l.join("\n")}
3
- `),t.events=[],c}catch{return null}}function v(e){return function e(t,r,n){if(null==t)return t;if("string"==typeof t){var o=t,i=n;let e=o.trim();if(!e)return o;if(i&&f.test(i)||m.test(e))return"[REDACTED]";let r=function(e){try{let t=new URL(e);return t.search&&(t.search="?REDACTED"),(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED"),t.toString()}catch{return null}}(e);return r||(e.length>400?`${e.slice(0,200)}...<truncated>`:e)}if("object"!=typeof t)return t;if(r.has(t))return"[Circular]";if(r.add(t),Array.isArray(t))return t.map(t=>e(t,r));let a={};for(let[n,o]of Object.entries(t)){if(f.test(n)){a[n]="[REDACTED]";continue}a[n]=e(o,r,n)}return a}(e,new WeakSet)}class A extends Error{code;details;cause;constructor(e,t,r,n){super(t),this.code=e,this.details=r,this.cause=n}}function I(e){return e instanceof A?e:e instanceof Error?new A("UNKNOWN",e.message,void 0,e):new A("UNKNOWN","Unknown error",{err:e})}function E(e,t={}){let r=I(e),n=r.details?v(r.details):void 0,o=n&&"string"==typeof n.hint?n.hint:void 0,i=(n&&"string"==typeof n.diagnosticId?n.diagnosticId:void 0)??t.diagnosticId,a=(n&&"string"==typeof n.logPath?n.logPath:void 0)??t.logPath,s=o??function(e){switch(e){case"INVALID_ARGS":return"Check command arguments and run --help for usage examples.";case"SESSION_NOT_FOUND":return"Run open first or pass an explicit device selector.";case"TOOL_MISSING":return"Install required platform tooling and ensure it is available in PATH.";case"DEVICE_NOT_FOUND":return"Verify the target device is booted/connected and selectors match.";case"UNSUPPORTED_OPERATION":return"This command is not available for the selected platform/device.";case"COMMAND_FAILED":default:return"Retry with --debug and inspect diagnostics log for details.";case"UNAUTHORIZED":return"Refresh daemon metadata and retry the command."}}(r.code),c=function(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,Object.keys(t).length>0?t:void 0}(n),l=function(e,t,r){if("COMMAND_FAILED"!==e||r?.processExitError!==!0)return t;let n=function(e){let t=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i];for(let r of e.split("\n")){let e=r.trim();if(e&&!t.some(t=>t.test(e)))return e.length>200?`${e.slice(0,200)}...`:e}return null}("string"==typeof r?.stderr?r.stderr:"");return n||t}(r.code,r.message,n);return{code:r.code,message:l,hint:s,diagnosticId:i,logPath:a,details:c}}let D="<wifi|airplane|location> <on|off>",$="appearance <light|dark|toggle>",b="faceid <match|nonmatch|enroll|unenroll>",N="touchid <match|nonmatch|enroll|unenroll>",_="fingerprint <match|nonmatch>",M="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",L=`settings ${D} | settings ${$} | settings ${b} | settings ${N} | settings ${_} | settings ${M}`,T=`settings requires ${D}, ${$}, ${b}, ${N}, ${_}, or ${M}`;function O(e){let t=[],r=[];for(let n of e){let e=n.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let o=n.label?.trim()||n.value?.trim()||n.identifier?.trim()||"",i=P(n.type??"Element"),a="group"===i&&!o;a&&t.push(e);let s=a?e:Math.max(0,e-t.length);r.push({node:n,depth:s,type:i,text:x(n,s,a,i)})}return r}function x(e,t,r,n){let o=n??P(e.type??"Element"),i=C(e,o),a=" ".repeat(t),s=e.ref?`@${e.ref}`:"",c=[!1===e.enabled?"disabled":null].filter(Boolean).join(", "),l=c?` [${c}]`:"",d=i?` "${i}"`:"";return r?`${a}${s} [${o}]${l}`.trimEnd():`${a}${s} [${o}]${d}${l}`.trimEnd()}function C(e,t){var r,n;let o=e.label?.trim(),i=e.value?.trim();if("text-field"===(r=t)||"text-view"===r||"search"===r){if(i)return i;if(o)return o}else if(o)return o;if(i)return i;let a=e.identifier?.trim();return!a||(n=a,/^[\w.]+:id\/[\w.-]+$/i.test(n)&&("group"===t||"image"===t||"list"===t||"collection"===t))?"":a}function P(e){let t=e.replace(/XCUIElementType/gi,"").toLowerCase(),r=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));switch(t.includes(".")&&(t=t.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,"")),t){case"application":return"application";case"navigationbar":return"navigation-bar";case"tabbar":return"tab-bar";case"button":case"imagebutton":return"button";case"link":return"link";case"cell":return"cell";case"statictext":case"checkedtextview":return"text";case"textfield":case"edittext":return"text-field";case"textview":return r?"text":"text-view";case"textarea":return"text-view";case"switch":return"switch";case"slider":return"slider";case"image":case"imageview":return"image";case"webview":return"webview";case"framelayout":case"linearlayout":case"relativelayout":case"constraintlayout":case"viewgroup":case"view":case"group":return"group";case"listview":case"recyclerview":return"list";case"collectionview":return"collection";case"searchfield":return"search";case"segmentedcontrol":return"segmented-control";case"window":return"window";case"checkbox":return"checkbox";case"radio":return"radio";case"menuitem":return"menu-item";case"toolbar":return"toolbar";case"scrollarea":case"scrollview":case"nestedscrollview":return"scroll-area";case"table":return"table";default:return t||"element"}}function R(){try{let e=k();return JSON.parse(r.readFileSync(i.join(e,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function k(){let e=i.dirname(s(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=i.join(t,"package.json");if(r.existsSync(e))return t;t=i.dirname(t)}return e}async function F(e,t,r={}){return new Promise((n,o)=>{let i=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached}),a="",s=r.binaryStdout?Buffer.alloc(0):void 0,c="",d=!1,u=q(r.timeoutMs),f=u?setTimeout(()=>{d=!0,i.kill("SIGKILL")},u):null;r.binaryStdout||i.stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),void 0!==r.stdin&&i.stdin.write(r.stdin),i.stdin.end(),i.stdout.on("data",e=>{r.binaryStdout?s=Buffer.concat([s??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]):a+=e}),i.stderr.on("data",e=>{c+=e}),i.on("error",r=>{(f&&clearTimeout(f),"ENOENT"===r.code)?o(new A("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):o(new A("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),i.on("close",i=>{f&&clearTimeout(f);let l=i??1;d&&u?o(new A("COMMAND_FAILED",`${e} timed out after ${u}ms`,{cmd:e,args:t,stdout:a,stderr:c,exitCode:l,timeoutMs:u})):0===l||r.allowFailure?n({stdout:a,stderr:c,exitCode:l,stdoutBuffer:s}):o(new A("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:a,stderr:c,exitCode:l,processExitError:!0}))})})}async function B(e){try{var t;let{shell:r,args:n}=(t=e,"win32"===process.platform?{shell:"cmd.exe",args:["/c","where",t]}:{shell:"bash",args:["-lc",`command -v ${t}`]}),o=await F(r,n,{allowFailure:!0});return 0===o.exitCode&&o.stdout.trim().length>0}catch{return!1}}function j(e,t,r={}){let n=d(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:q(r.timeoutMs)});if(n.error){let o=n.error.code;if("ETIMEDOUT"===o)throw new A("COMMAND_FAILED",`${e} timed out after ${q(r.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:q(r.timeoutMs)},n.error);if("ENOENT"===o)throw new A("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},n.error);throw new A("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},n.error)}let o=r.binaryStdout?Buffer.isBuffer(n.stdout)?n.stdout:Buffer.from(n.stdout??""):void 0,i=r.binaryStdout?"":"string"==typeof n.stdout?n.stdout:(n.stdout??"").toString(),a="string"==typeof n.stderr?n.stderr:(n.stderr??"").toString(),s=n.status??1;if(0!==s&&!r.allowFailure)throw new A("COMMAND_FAILED",`${e} exited with code ${s}`,{cmd:e,args:t,stdout:i,stderr:a,exitCode:s,processExitError:!0});return{stdout:i,stderr:a,exitCode:s,stdoutBuffer:o}}function G(e,t,r={}){l(e,t,{cwd:r.cwd,env:r.env,stdio:"ignore",detached:!0}).unref()}async function U(e,t,r={}){return new Promise((n,o)=>{let i=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached});r.onSpawn?.(i);let a="",s="",c=r.binaryStdout?Buffer.alloc(0):void 0;r.binaryStdout||i.stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),void 0!==r.stdin&&i.stdin.write(r.stdin),i.stdin.end(),i.stdout.on("data",e=>{if(r.binaryStdout){c=Buffer.concat([c??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]);return}let t=String(e);a+=t,r.onStdoutChunk?.(t)}),i.stderr.on("data",e=>{let t=String(e);s+=t,r.onStderrChunk?.(t)}),i.on("error",r=>{"ENOENT"===r.code?o(new A("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):o(new A("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),i.on("close",i=>{let l=i??1;0===l||r.allowFailure?n({stdout:a,stderr:s,exitCode:l,stdoutBuffer:c}):o(new A("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:a,stderr:s,exitCode:l,processExitError:!0}))})})}function V(e,t,r={}){let n=l(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"],detached:r.detached}),o="",i="";n.stdout.setEncoding("utf8"),n.stderr.setEncoding("utf8"),n.stdout.on("data",e=>{o+=e}),n.stderr.on("data",e=>{i+=e});let a=new Promise((a,s)=>{n.on("error",r=>{"ENOENT"===r.code?s(new A("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):s(new A("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),n.on("close",n=>{let c=n??1;0===c||r.allowFailure?a({stdout:o,stderr:i,exitCode:c}):s(new A("COMMAND_FAILED",`${e} exited with code ${c}`,{cmd:e,args:t,stdout:o,stderr:i,exitCode:c,processExitError:!0}))})});return{child:n,wait:a}}function q(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}let H=[/(^|[\/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[\/\s"'=])src\/daemon\.ts($|[\s"'])/];function z(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function J(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=j("ps",["-p",String(e),"-o","lstart="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let r=t.stdout.trim();return r.length>0?r:null}catch{return null}}function W(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=j("ps",["-p",String(e),"-o","command="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let r=t.stdout.trim();return r.length>0?r:null}catch{return null}}function K(e,t){let r;if(!z(e))return!1;if(t){let r=J(e);if(!r||r!==t)return!1}let n=W(e);return!!n&&!!(r=n.toLowerCase().replaceAll("\\","/")).includes("agent-device")&&H.some(e=>e.test(r))}function Z(e,t){try{return process.kill(e,t),!0}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return!1;throw t}}async function X(e,t){if(!z(e))return!0;let r=Date.now();for(;Date.now()-r<t;)if(await new Promise(e=>setTimeout(e,50)),!z(e))return!0;return!z(e)}async function Q(e,t){!K(e,t.expectedStartTime)||!Z(e,"SIGTERM")||await X(e,t.termTimeoutMs)||Z(e,"SIGKILL")&&await X(e,t.killTimeoutMs)}function Y(e){let t,r=(t=(e??"").trim())?"~"===t?o.homedir():t.startsWith("~/")?i.join(o.homedir(),t.slice(2)):i.resolve(t):i.join(o.homedir(),".agent-device");return{baseDir:r,infoPath:i.join(r,"daemon.json"),lockPath:i.join(r,"daemon.lock"),logPath:i.join(r,"daemon.log"),sessionsDir:i.join(r,"sessions")}}function ee(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function et(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function er(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function en(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let eo=100,ei=new Set(["batch","replay"]);function ea(e){let t;try{t=JSON.parse(e)}catch{throw new A("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(t)||0===t.length)throw new A("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return t}function es(e,t){if(!Array.isArray(e)||0===e.length)throw new A("INVALID_ARGS","batch requires a non-empty batchSteps array.");if(e.length>t)throw new A("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${t}.`);let r=[];for(let t=0;t<e.length;t+=1){let n=e[t];if(!n||"object"!=typeof n)throw new A("INVALID_ARGS",`Invalid batch step at index ${t}.`);let o="string"==typeof n.command?n.command.trim().toLowerCase():"";if(!o)throw new A("INVALID_ARGS",`Batch step ${t+1} requires command.`);if(ei.has(o))throw new A("INVALID_ARGS",`Batch step ${t+1} cannot run ${o}.`);if(void 0!==n.positionals&&!Array.isArray(n.positionals))throw new A("INVALID_ARGS",`Batch step ${t+1} positionals must be an array.`);let i=n.positionals??[];if(i.some(e=>"string"!=typeof e))throw new A("INVALID_ARGS",`Batch step ${t+1} positionals must contain only strings.`);if(void 0!==n.flags&&("object"!=typeof n.flags||Array.isArray(n.flags)||!n.flags))throw new A("INVALID_ARGS",`Batch step ${t+1} flags must be an object.`);r.push({command:o,positionals:i,flags:n.flags??{}})}return r}export{default as node_net}from"node:net";export{default as node_http}from"node:http";export{A as AppError,eo as DEFAULT_BATCH_MAX_STEPS,T as SETTINGS_INVALID_ARGS_MESSAGE,L as SETTINGS_USAGE_OVERRIDE,I as asAppError,O as buildSnapshotDisplayLines,p as createRequestId,C as displayLabel,w as emitDiagnostic,a as external_node_url_URL,s as fileURLToPath,k as findProjectRoot,y as flushDiagnosticsToSessionFile,P as formatRole,x as formatSnapshotLine,g as getDiagnosticsMeta,K as isAgentDeviceDaemonProcess,z as isProcessAlive,t as node_crypto,r as node_fs,o as node_os,i as node_path,E as normalizeError,en as normalizeTenantId,ea as parseBatchStepsJson,c as pathToFileURL,n as promises,W as readProcessCommand,J as readProcessStartTime,R as readVersion,Y as resolveDaemonPaths,ee as resolveDaemonServerMode,et as resolveDaemonTransportPreference,er as resolveSessionIsolationMode,F as runCmd,V as runCmdBackground,G as runCmdDetached,U as runCmdStreaming,j as runCmdSync,l as spawn,Q as stopProcessForTakeover,es as validateAndNormalizeBatchSteps,B as whichCmd,S as withDiagnosticTimer,h as withDiagnosticsScope};