Skip to content

Commit 7d40552

Browse files
committed
fix(replay): preserve deep-link target resolution
1 parent 8032443 commit 7d40552

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { test, expect } from 'vitest';
2+
import fs from 'node:fs';
3+
import os from 'node:os';
4+
import path from 'node:path';
5+
import { buildReplayTargetDeviceResolutionOptions } from '../replay-device-selection.ts';
6+
7+
test('replay leaves deep-link opens to normal device resolution', () => {
8+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-device-replay-device-selection-'));
9+
const replayPath = path.join(root, 'deep-link.ad');
10+
fs.writeFileSync(replayPath, 'open demo://checkout\n');
11+
12+
expect(
13+
buildReplayTargetDeviceResolutionOptions({
14+
token: 'test-token',
15+
session: 'default',
16+
command: 'replay',
17+
positionals: [replayPath],
18+
meta: { cwd: root },
19+
}),
20+
).toBeUndefined();
21+
});

src/daemon/open-device-selection.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ export function buildOpenTargetDeviceResolutionOptions(
55
openTarget: string | undefined,
66
): ResolveTargetDeviceOptions {
77
return {
8-
appleSimulatorAppTarget: openTarget && !isDeepLinkTarget(openTarget) ? openTarget : undefined,
8+
appleSimulatorAppTarget: appleSimulatorAppTargetForOpenTarget(openTarget),
99
};
1010
}
11+
12+
export function appleSimulatorAppTargetForOpenTarget(
13+
openTarget: string | undefined,
14+
): string | undefined {
15+
return openTarget && !isDeepLinkTarget(openTarget) ? openTarget : undefined;
16+
}

src/daemon/replay-device-selection.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { parseReplayInput } from '../compat/replay-input.ts';
33
import { parseMaestroProgram } from '../compat/maestro/program-ir-parser.ts';
44
import type { ResolveTargetDeviceOptions } from '../core/dispatch-resolve.ts';
55
import type { MaestroProgram } from '../compat/maestro/program-ir.ts';
6+
import { appleSimulatorAppTargetForOpenTarget } from './open-device-selection.ts';
67
import { SessionStore } from './session-store.ts';
78
import type { DaemonRequest, SessionAction } from './types.ts';
89

@@ -23,7 +24,7 @@ export function buildReplayTargetDeviceResolutionOptions(
2324
const appTarget = isMaestroReplay(req, resolved)
2425
? readMaestroReplayAppTarget(parseMaestroProgram(source, { sourcePath: resolved }))
2526
: readScriptReplayAppTarget(parseReplayInput(source, req.flags).actions);
26-
return appTarget ? { appleSimulatorAppTarget: appTarget } : undefined;
27+
return appTargetResolutionOptions(appTarget);
2728
} catch {
2829
// Parsing and validation stay in the replay handler. Lock binding is only
2930
// advisory, so an unreadable/invalid plan must not mask its real error.
@@ -35,7 +36,7 @@ export function buildMaestroReplayTargetDeviceResolutionOptions(
3536
program: MaestroProgram,
3637
): ResolveTargetDeviceOptions {
3738
const appTarget = readMaestroReplayAppTarget(program);
38-
return appTarget ? { appleSimulatorAppTarget: appTarget } : {};
39+
return appTargetResolutionOptions(appTarget) ?? {};
3940
}
4041

4142
function isMaestroReplay(req: DaemonRequest, filePath: string): boolean {
@@ -62,3 +63,10 @@ function readMaestroReplayAppTarget(program: MaestroProgram): string | undefined
6263
function isStaticAppTarget(value: string | undefined): value is string {
6364
return Boolean(value && value.trim() && !value.includes('$'));
6465
}
66+
67+
function appTargetResolutionOptions(
68+
openTarget: string | undefined,
69+
): ResolveTargetDeviceOptions | undefined {
70+
const appTarget = appleSimulatorAppTargetForOpenTarget(openTarget);
71+
return appTarget ? { appleSimulatorAppTarget: appTarget } : undefined;
72+
}

0 commit comments

Comments
 (0)