codex-orchestrator 0.1.31 → 0.1.36
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.
- package/CHANGELOG.md +84 -0
- package/README.md +150 -174
- package/dist/src/cli.js +88 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex/command-adapter.d.ts +2 -1
- package/dist/src/codex/command-adapter.d.ts.map +1 -1
- package/dist/src/codex/command-adapter.js +13 -2
- package/dist/src/codex/command-adapter.js.map +1 -1
- package/dist/src/codex/mobile-device-guard.d.ts +7 -0
- package/dist/src/codex/mobile-device-guard.d.ts.map +1 -0
- package/dist/src/codex/mobile-device-guard.js +63 -0
- package/dist/src/codex/mobile-device-guard.js.map +1 -0
- package/dist/src/config/constants.d.ts +1 -1
- package/dist/src/config/constants.d.ts.map +1 -1
- package/dist/src/config/constants.js +1 -0
- package/dist/src/config/constants.js.map +1 -1
- package/dist/src/config/schema.d.ts +21 -2
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +41 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/github/gh-pull-request-adapter.d.ts +1 -0
- package/dist/src/github/gh-pull-request-adapter.d.ts.map +1 -1
- package/dist/src/github/gh-pull-request-adapter.js +20 -0
- package/dist/src/github/gh-pull-request-adapter.js.map +1 -1
- package/dist/src/github/pull-requests.d.ts +2 -0
- package/dist/src/github/pull-requests.d.ts.map +1 -1
- package/dist/src/github/pull-requests.js +9 -0
- package/dist/src/github/pull-requests.js.map +1 -1
- package/dist/src/runner/acceptance-proof-runner.d.ts +54 -0
- package/dist/src/runner/acceptance-proof-runner.d.ts.map +1 -0
- package/dist/src/runner/acceptance-proof-runner.js +229 -0
- package/dist/src/runner/acceptance-proof-runner.js.map +1 -0
- package/dist/src/runner/acceptance-proof.d.ts +121 -0
- package/dist/src/runner/acceptance-proof.d.ts.map +1 -0
- package/dist/src/runner/acceptance-proof.js +405 -0
- package/dist/src/runner/acceptance-proof.js.map +1 -0
- package/dist/src/runner/android-visual-proof-command.d.ts +26 -0
- package/dist/src/runner/android-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/android-visual-proof-command.js +598 -0
- package/dist/src/runner/android-visual-proof-command.js.map +1 -0
- package/dist/src/runner/auto-visual-proof-command.d.ts +15 -0
- package/dist/src/runner/auto-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/auto-visual-proof-command.js +41 -0
- package/dist/src/runner/auto-visual-proof-command.js.map +1 -0
- package/dist/src/runner/browser-proof-contract.d.ts +134 -0
- package/dist/src/runner/browser-proof-contract.d.ts.map +1 -0
- package/dist/src/runner/browser-proof-contract.js +400 -0
- package/dist/src/runner/browser-proof-contract.js.map +1 -0
- package/dist/src/runner/browser-visual-proof-command.d.ts +101 -0
- package/dist/src/runner/browser-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/browser-visual-proof-command.js +532 -0
- package/dist/src/runner/browser-visual-proof-command.js.map +1 -0
- package/dist/src/runner/command-utils.d.ts.map +1 -1
- package/dist/src/runner/command-utils.js +55 -6
- package/dist/src/runner/command-utils.js.map +1 -1
- package/dist/src/runner/completion-report.d.ts +3 -1
- package/dist/src/runner/completion-report.d.ts.map +1 -1
- package/dist/src/runner/completion-report.js +2 -1
- package/dist/src/runner/completion-report.js.map +1 -1
- package/dist/src/runner/daemon-command.d.ts.map +1 -1
- package/dist/src/runner/daemon-command.js +20 -0
- package/dist/src/runner/daemon-command.js.map +1 -1
- package/dist/src/runner/doctor-command.js +3 -3
- package/dist/src/runner/doctor-command.js.map +1 -1
- package/dist/src/runner/durable-run-summary.d.ts +3 -0
- package/dist/src/runner/durable-run-summary.d.ts.map +1 -1
- package/dist/src/runner/durable-run-summary.js +2 -0
- package/dist/src/runner/durable-run-summary.js.map +1 -1
- package/dist/src/runner/handoff-evidence.d.ts +5 -0
- package/dist/src/runner/handoff-evidence.d.ts.map +1 -1
- package/dist/src/runner/handoff-evidence.js +22 -0
- package/dist/src/runner/handoff-evidence.js.map +1 -1
- package/dist/src/runner/ios-visual-proof-command.d.ts +25 -0
- package/dist/src/runner/ios-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/ios-visual-proof-command.js +355 -0
- package/dist/src/runner/ios-visual-proof-command.js.map +1 -0
- package/dist/src/runner/lifecycle-events.d.ts +1 -1
- package/dist/src/runner/lifecycle-events.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.d.ts +19 -6
- package/dist/src/runner/local-execution-session.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.js +93 -11
- package/dist/src/runner/local-execution-session.js.map +1 -1
- package/dist/src/runner/local-state.d.ts +6 -0
- package/dist/src/runner/local-state.d.ts.map +1 -1
- package/dist/src/runner/local-state.js +14 -0
- package/dist/src/runner/local-state.js.map +1 -1
- package/dist/src/runner/mobile-device-lease.d.ts +11 -0
- package/dist/src/runner/mobile-device-lease.d.ts.map +1 -0
- package/dist/src/runner/mobile-device-lease.js +121 -0
- package/dist/src/runner/mobile-device-lease.js.map +1 -0
- package/dist/src/runner/mobile-visual-proof-command.d.ts +17 -0
- package/dist/src/runner/mobile-visual-proof-command.d.ts.map +1 -0
- package/dist/src/runner/mobile-visual-proof-command.js +168 -0
- package/dist/src/runner/mobile-visual-proof-command.js.map +1 -0
- package/dist/src/runner/plan-auto-command.d.ts.map +1 -1
- package/dist/src/runner/plan-auto-command.js +57 -6
- package/dist/src/runner/plan-auto-command.js.map +1 -1
- package/dist/src/runner/prompt.js +2 -2
- package/dist/src/runner/prompt.js.map +1 -1
- package/dist/src/runner/recovery.d.ts +2 -1
- package/dist/src/runner/recovery.d.ts.map +1 -1
- package/dist/src/runner/recovery.js +24 -0
- package/dist/src/runner/recovery.js.map +1 -1
- package/dist/src/runner/review-gate-policy.d.ts +19 -0
- package/dist/src/runner/review-gate-policy.d.ts.map +1 -1
- package/dist/src/runner/review-gate-policy.js +116 -20
- package/dist/src/runner/review-gate-policy.js.map +1 -1
- package/dist/src/runner/review-gates.d.ts.map +1 -1
- package/dist/src/runner/review-gates.js +44 -11
- package/dist/src/runner/review-gates.js.map +1 -1
- package/dist/src/runner/rework-policy.d.ts +1 -0
- package/dist/src/runner/rework-policy.d.ts.map +1 -1
- package/dist/src/runner/rework-policy.js +7 -0
- package/dist/src/runner/rework-policy.js.map +1 -1
- package/dist/src/runner/scoped-auto-command.d.ts +46 -1
- package/dist/src/runner/scoped-auto-command.d.ts.map +1 -1
- package/dist/src/runner/scoped-auto-command.js +147 -47
- package/dist/src/runner/scoped-auto-command.js.map +1 -1
- package/dist/src/runner/scoped-recovery.d.ts +65 -0
- package/dist/src/runner/scoped-recovery.d.ts.map +1 -0
- package/dist/src/runner/scoped-recovery.js +484 -0
- package/dist/src/runner/scoped-recovery.js.map +1 -0
- package/dist/src/runner/status-command.d.ts.map +1 -1
- package/dist/src/runner/status-command.js +1 -0
- package/dist/src/runner/status-command.js.map +1 -1
- package/dist/src/runner/visual-proof-runner.d.ts +1 -0
- package/dist/src/runner/visual-proof-runner.d.ts.map +1 -1
- package/dist/src/runner/visual-proof-runner.js +158 -19
- package/dist/src/runner/visual-proof-runner.js.map +1 -1
- package/dist/src/setup/project-config.d.ts +5 -0
- package/dist/src/setup/project-config.d.ts.map +1 -1
- package/dist/src/setup/project-config.js +146 -9
- package/dist/src/setup/project-config.js.map +1 -1
- package/dist/src/setup/setup-command.d.ts.map +1 -1
- package/dist/src/setup/setup-command.js +2 -2
- package/dist/src/setup/setup-command.js.map +1 -1
- package/dist/src/setup/workflows.d.ts.map +1 -1
- package/dist/src/setup/workflows.js +5 -0
- package/dist/src/setup/workflows.js.map +1 -1
- package/docs/deep-dive.md +239 -28
- package/package.json +4 -1
- package/prompts/workflows/acceptance-proof.md +29 -0
- package/prompts/workflows/scoped-implementation.md +12 -3
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import { access, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { join, relative, resolve, win32, posix, delimiter as hostPathDelimiter } from 'node:path';
|
|
5
|
+
import { homedir, platform as hostPlatform } from 'node:os';
|
|
6
|
+
import { acquireMobileDeviceLease } from './mobile-device-lease.js';
|
|
7
|
+
export async function runAndroidVisualProofCommand(input) {
|
|
8
|
+
const env = input.env ?? process.env;
|
|
9
|
+
const platform = input.platform ?? hostPlatform();
|
|
10
|
+
const worktreePath = resolve(input.worktreePath ?? env.CODEX_ORCHESTRATOR_WORKTREE_PATH ?? process.cwd());
|
|
11
|
+
const artifactDir = input.artifactDir ?? env.CODEX_ORCHESTRATOR_ARTIFACT_DIR ?? '.codex-orchestrator/proofs';
|
|
12
|
+
const proofDir = resolve(worktreePath, artifactDir, `issue-${input.issueNumber}`);
|
|
13
|
+
const runtimeDir = resolve(worktreePath, '.codex-orchestrator/runtime/android-visual-proof');
|
|
14
|
+
const projectType = await resolveProjectType(worktreePath, input.projectType ?? androidProjectTypeFromEnv(env.CODEX_ORCHESTRATOR_ANDROID_PROJECT_TYPE));
|
|
15
|
+
const tools = await resolveAndroidProofTools({ env, platform, needsFlutter: projectType === 'flutter' });
|
|
16
|
+
const commandEnv = await androidProofCommandEnv({ env, sdkRoot: tools.sdkRoot, runtimeDir });
|
|
17
|
+
const lease = await acquireMobileDeviceLease({
|
|
18
|
+
worktreePath,
|
|
19
|
+
env: commandEnv,
|
|
20
|
+
issueNumber: input.issueNumber,
|
|
21
|
+
resourceName: 'android-device',
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
const device = await selectAndroidDevice({ adb: tools.adb, emulator: tools.emulator, env: commandEnv });
|
|
25
|
+
await mkdir(proofDir, { recursive: true });
|
|
26
|
+
await mkdir(runtimeDir, { recursive: true });
|
|
27
|
+
await waitForBoot({ adb: tools.adb, serial: device.serial, env: commandEnv });
|
|
28
|
+
const packageName = await buildAndInstall({
|
|
29
|
+
worktreePath,
|
|
30
|
+
projectType,
|
|
31
|
+
input,
|
|
32
|
+
env: commandEnv,
|
|
33
|
+
tools,
|
|
34
|
+
device,
|
|
35
|
+
platform,
|
|
36
|
+
});
|
|
37
|
+
const activity = await resolveMainActivity({ adb: tools.adb, serial: device.serial, packageName, env: commandEnv });
|
|
38
|
+
await runCommand(tools.adb, ['-s', device.serial, 'shell', 'am', 'start', '-n', activity], { env: commandEnv, platform });
|
|
39
|
+
await delay(input.launchSettleMs ?? numberFromEnv(env.CODEX_ORCHESTRATOR_ANDROID_LAUNCH_SETTLE_MS) ?? 5000);
|
|
40
|
+
const screenshot = await runCommand(tools.adb, ['-s', device.serial, 'exec-out', 'screencap', '-p'], {
|
|
41
|
+
env: commandEnv,
|
|
42
|
+
encoding: 'buffer',
|
|
43
|
+
platform,
|
|
44
|
+
});
|
|
45
|
+
await writeFile(join(proofDir, 'android-launch.png'), screenshot.stdout);
|
|
46
|
+
const uiDump = await runCommand(tools.adb, ['-s', device.serial, 'exec-out', 'uiautomator', 'dump', '/dev/tty'], {
|
|
47
|
+
env: commandEnv,
|
|
48
|
+
allowFailure: true,
|
|
49
|
+
platform,
|
|
50
|
+
});
|
|
51
|
+
await writeFile(join(proofDir, 'android-ui.xml'), String(uiDump.stdout || uiDump.stderr || ''));
|
|
52
|
+
const logcat = await runCommand(tools.adb, ['-s', device.serial, 'logcat', '-d', '-t', '300'], {
|
|
53
|
+
env: commandEnv,
|
|
54
|
+
allowFailure: true,
|
|
55
|
+
platform,
|
|
56
|
+
});
|
|
57
|
+
await writeFile(join(proofDir, 'android-logcat.txt'), String(logcat.stdout || logcat.stderr || ''));
|
|
58
|
+
await writeFile(join(proofDir, 'android-ui-summary.txt'), [
|
|
59
|
+
'Android visual proof',
|
|
60
|
+
`issue: ${input.issueNumber}`,
|
|
61
|
+
`projectType: ${projectType}`,
|
|
62
|
+
`serial: ${device.serial}`,
|
|
63
|
+
`target: ${device.kind}`,
|
|
64
|
+
`adb: ${tools.adb}`,
|
|
65
|
+
`package: ${packageName}`,
|
|
66
|
+
`activity: ${activity}`,
|
|
67
|
+
'screenshot: android-launch.png',
|
|
68
|
+
].join('\n'));
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
await lease.release();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function parseAndroidVisualProofArgs(args, env = process.env) {
|
|
75
|
+
const parsed = {
|
|
76
|
+
issueNumber: Number(env.CODEX_ORCHESTRATOR_ISSUE_NUMBER),
|
|
77
|
+
worktreePath: env.CODEX_ORCHESTRATOR_WORKTREE_PATH ?? process.cwd(),
|
|
78
|
+
artifactDir: env.CODEX_ORCHESTRATOR_ARTIFACT_DIR,
|
|
79
|
+
launchConfigName: env.CODEX_ORCHESTRATOR_FLUTTER_LAUNCH_CONFIG,
|
|
80
|
+
flutterTarget: env.CODEX_ORCHESTRATOR_FLUTTER_TARGET,
|
|
81
|
+
flutterFlavor: env.CODEX_ORCHESTRATOR_ANDROID_FLAVOR,
|
|
82
|
+
androidPackage: env.CODEX_ORCHESTRATOR_ANDROID_PACKAGE,
|
|
83
|
+
gradleInstallTask: env.CODEX_ORCHESTRATOR_ANDROID_GRADLE_INSTALL_TASK,
|
|
84
|
+
launchSettleMs: numberFromEnv(env.CODEX_ORCHESTRATOR_ANDROID_LAUNCH_SETTLE_MS),
|
|
85
|
+
};
|
|
86
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
87
|
+
const arg = args[index];
|
|
88
|
+
const next = () => {
|
|
89
|
+
const value = args[index + 1];
|
|
90
|
+
if (!value || value.startsWith('--')) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
index += 1;
|
|
94
|
+
return value;
|
|
95
|
+
};
|
|
96
|
+
switch (arg) {
|
|
97
|
+
case '--issue': {
|
|
98
|
+
const value = next();
|
|
99
|
+
if (!value || !Number.isInteger(Number(value)) || Number(value) < 1) {
|
|
100
|
+
return { ok: false, error: 'visual-proof android requires --issue <number>' };
|
|
101
|
+
}
|
|
102
|
+
parsed.issueNumber = Number(value);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case '--target':
|
|
106
|
+
case '--worktree': {
|
|
107
|
+
const value = next();
|
|
108
|
+
if (!value)
|
|
109
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
110
|
+
parsed.worktreePath = value;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case '--artifact-dir': {
|
|
114
|
+
const value = next();
|
|
115
|
+
if (!value)
|
|
116
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
117
|
+
parsed.artifactDir = value;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case '--project': {
|
|
121
|
+
const value = next();
|
|
122
|
+
if (value !== 'auto' && value !== 'flutter' && value !== 'android') {
|
|
123
|
+
return { ok: false, error: '--project must be auto, flutter, or android' };
|
|
124
|
+
}
|
|
125
|
+
parsed.projectType = value;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case '--launch-config': {
|
|
129
|
+
const value = next();
|
|
130
|
+
if (!value)
|
|
131
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
132
|
+
parsed.launchConfigName = value;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case '--flutter-target': {
|
|
136
|
+
const value = next();
|
|
137
|
+
if (!value)
|
|
138
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
139
|
+
parsed.flutterTarget = value;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case '--flavor': {
|
|
143
|
+
const value = next();
|
|
144
|
+
if (!value)
|
|
145
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
146
|
+
parsed.flutterFlavor = value;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case '--package': {
|
|
150
|
+
const value = next();
|
|
151
|
+
if (!value)
|
|
152
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
153
|
+
parsed.androidPackage = value;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case '--gradle-install-task': {
|
|
157
|
+
const value = next();
|
|
158
|
+
if (!value)
|
|
159
|
+
return { ok: false, error: `${arg} requires a value` };
|
|
160
|
+
parsed.gradleInstallTask = value;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case '--launch-settle-ms': {
|
|
164
|
+
const value = next();
|
|
165
|
+
if (!value || !Number.isFinite(Number(value)) || Number(value) < 0) {
|
|
166
|
+
return { ok: false, error: '--launch-settle-ms must be a non-negative number' };
|
|
167
|
+
}
|
|
168
|
+
parsed.launchSettleMs = Number(value);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
default:
|
|
172
|
+
return { ok: false, error: `Unknown visual-proof android option: ${arg ?? ''}` };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (!Number.isInteger(parsed.issueNumber) || parsed.issueNumber < 1) {
|
|
176
|
+
return { ok: false, error: 'visual-proof android requires --issue <number>' };
|
|
177
|
+
}
|
|
178
|
+
return { ok: true, value: parsed };
|
|
179
|
+
}
|
|
180
|
+
export function androidSdkDefaultRoots(env, platform) {
|
|
181
|
+
const pathApi = pathApiForPlatform(platform);
|
|
182
|
+
if (platform === 'win32') {
|
|
183
|
+
return [
|
|
184
|
+
env.LOCALAPPDATA ? pathApi.join(env.LOCALAPPDATA, 'Android', 'Sdk') : undefined,
|
|
185
|
+
env.USERPROFILE ? pathApi.join(env.USERPROFILE, 'AppData', 'Local', 'Android', 'Sdk') : undefined,
|
|
186
|
+
].filter((value) => Boolean(value));
|
|
187
|
+
}
|
|
188
|
+
const home = env.HOME ?? homedir();
|
|
189
|
+
if (platform === 'darwin') {
|
|
190
|
+
return [pathApi.join(home, 'Library', 'Android', 'sdk')];
|
|
191
|
+
}
|
|
192
|
+
return [pathApi.join(home, 'Android', 'Sdk')];
|
|
193
|
+
}
|
|
194
|
+
async function resolveAndroidProofTools(input) {
|
|
195
|
+
const { env, platform, needsFlutter } = input;
|
|
196
|
+
const sdkRoots = [
|
|
197
|
+
env.ANDROID_HOME,
|
|
198
|
+
env.ANDROID_SDK_ROOT,
|
|
199
|
+
...androidSdkDefaultRoots(env, platform),
|
|
200
|
+
].filter((value) => Boolean(value));
|
|
201
|
+
const adb = await firstExecutable([
|
|
202
|
+
env.CODEX_ORCHESTRATOR_ADB,
|
|
203
|
+
env.ADB,
|
|
204
|
+
...sdkRoots.map((root) => sdkTool(root, platform, 'platform-tools', executableName('adb', platform))),
|
|
205
|
+
await pathExecutable('adb', env, platform),
|
|
206
|
+
], platform);
|
|
207
|
+
const emulator = await firstExecutable([
|
|
208
|
+
env.CODEX_ORCHESTRATOR_EMULATOR,
|
|
209
|
+
...sdkRoots.map((root) => sdkTool(root, platform, 'emulator', executableName('emulator', platform))),
|
|
210
|
+
await pathExecutable('emulator', env, platform),
|
|
211
|
+
], platform);
|
|
212
|
+
const flutter = await firstExecutable([
|
|
213
|
+
env.CODEX_ORCHESTRATOR_FLUTTER_BIN,
|
|
214
|
+
env.CODEX_ORCHESTRATOR_FLUTTER_ROOT
|
|
215
|
+
? sdkTool(env.CODEX_ORCHESTRATOR_FLUTTER_ROOT, platform, 'bin', executableName('flutter', platform))
|
|
216
|
+
: undefined,
|
|
217
|
+
env.FLUTTER_ROOT ? sdkTool(env.FLUTTER_ROOT, platform, 'bin', executableName('flutter', platform)) : undefined,
|
|
218
|
+
await pathExecutable('flutter', env, platform),
|
|
219
|
+
], platform);
|
|
220
|
+
if (!adb) {
|
|
221
|
+
throw new Error([
|
|
222
|
+
'Android platform tools were not found.',
|
|
223
|
+
'Set ANDROID_HOME or ANDROID_SDK_ROOT, install Android SDK in the OS default location, or put adb on PATH.',
|
|
224
|
+
'Defaults checked: macOS ~/Library/Android/sdk, Linux ~/Android/Sdk, Windows %LOCALAPPDATA%\\Android\\Sdk.',
|
|
225
|
+
].join(' '));
|
|
226
|
+
}
|
|
227
|
+
if (needsFlutter && !flutter) {
|
|
228
|
+
throw new Error([
|
|
229
|
+
'Flutter was not found for Flutter Android visual proof.',
|
|
230
|
+
'Set CODEX_ORCHESTRATOR_FLUTTER_BIN, CODEX_ORCHESTRATOR_FLUTTER_ROOT, FLUTTER_ROOT, or put flutter on PATH.',
|
|
231
|
+
].join(' '));
|
|
232
|
+
}
|
|
233
|
+
return { adb, emulator, flutter, sdkRoot: sdkRootFromAdb(adb, platform) };
|
|
234
|
+
}
|
|
235
|
+
async function buildAndInstall(input) {
|
|
236
|
+
if (input.projectType === 'flutter') {
|
|
237
|
+
if (!input.tools.flutter) {
|
|
238
|
+
throw new Error('Flutter Android visual proof requires flutter.');
|
|
239
|
+
}
|
|
240
|
+
const launchConfig = await readFlutterLaunchConfig(input.worktreePath, input.input.launchConfigName);
|
|
241
|
+
const build = flutterBuildPlan(launchConfig, input.input);
|
|
242
|
+
await runCommand(input.tools.flutter, build.args, { cwd: input.worktreePath, env: input.env, platform: input.platform });
|
|
243
|
+
const apk = await findBuiltApk(input.worktreePath, build.flavor);
|
|
244
|
+
await runCommand(input.tools.adb, ['-s', input.device.serial, 'install', '-r', '-t', relative(input.worktreePath, apk)], {
|
|
245
|
+
cwd: input.worktreePath,
|
|
246
|
+
env: input.env,
|
|
247
|
+
platform: input.platform,
|
|
248
|
+
});
|
|
249
|
+
return input.input.androidPackage
|
|
250
|
+
?? await inferAndroidPackageName(input.worktreePath, build.flavor)
|
|
251
|
+
?? fail('Could not infer Android applicationId. Pass --package or set CODEX_ORCHESTRATOR_ANDROID_PACKAGE.');
|
|
252
|
+
}
|
|
253
|
+
const gradle = await resolveGradleWrapper(input.worktreePath, input.platform);
|
|
254
|
+
const gradleInstallTask = input.input.gradleInstallTask ?? 'installDebug';
|
|
255
|
+
await runCommand(gradle, [gradleInstallTask], { cwd: input.worktreePath, env: input.env, platform: input.platform });
|
|
256
|
+
return input.input.androidPackage
|
|
257
|
+
?? await inferAndroidPackageName(input.worktreePath)
|
|
258
|
+
?? fail('Native Android visual proof requires --package or CODEX_ORCHESTRATOR_ANDROID_PACKAGE when applicationId cannot be inferred.');
|
|
259
|
+
}
|
|
260
|
+
async function selectAndroidDevice(input) {
|
|
261
|
+
const existing = await listAndroidDevices(input.adb, input.env);
|
|
262
|
+
if (input.env.ANDROID_SERIAL) {
|
|
263
|
+
const requested = existing.find((device) => device.serial === input.env.ANDROID_SERIAL);
|
|
264
|
+
if (!requested) {
|
|
265
|
+
throw new Error(`ANDROID_SERIAL=${input.env.ANDROID_SERIAL} is set, but adb did not report that device as connected.`);
|
|
266
|
+
}
|
|
267
|
+
return requested;
|
|
268
|
+
}
|
|
269
|
+
const connected = existing.find((device) => device.kind === 'device') ?? existing.find((device) => device.kind === 'emulator');
|
|
270
|
+
if (connected) {
|
|
271
|
+
return connected;
|
|
272
|
+
}
|
|
273
|
+
if (!input.emulator) {
|
|
274
|
+
throw new Error('No Android device is connected and emulator was not found. Connect a device or install the Android emulator tool.');
|
|
275
|
+
}
|
|
276
|
+
const avds = String((await runCommand(input.emulator, ['-list-avds'], { env: input.env })).stdout)
|
|
277
|
+
.split(/\r?\n/u)
|
|
278
|
+
.map((line) => line.trim())
|
|
279
|
+
.filter(Boolean);
|
|
280
|
+
if (avds.length === 0) {
|
|
281
|
+
throw new Error('No Android device is connected and emulator -list-avds returned no AVDs.');
|
|
282
|
+
}
|
|
283
|
+
const child = spawn(input.emulator, ['-avd', avds[0], '-no-snapshot-save'], {
|
|
284
|
+
env: input.env,
|
|
285
|
+
detached: true,
|
|
286
|
+
stdio: 'ignore',
|
|
287
|
+
});
|
|
288
|
+
child.unref();
|
|
289
|
+
await runCommand(input.adb, ['wait-for-device'], { env: input.env, timeoutMs: 120_000 });
|
|
290
|
+
const deadline = Date.now() + 120_000;
|
|
291
|
+
while (Date.now() < deadline) {
|
|
292
|
+
const started = (await listAndroidDevices(input.adb, input.env))[0];
|
|
293
|
+
if (started)
|
|
294
|
+
return started;
|
|
295
|
+
await delay(2_000);
|
|
296
|
+
}
|
|
297
|
+
throw new Error(`Started AVD ${avds[0]}, but adb did not report a usable device.`);
|
|
298
|
+
}
|
|
299
|
+
async function listAndroidDevices(adb, env) {
|
|
300
|
+
const result = await runCommand(adb, ['devices', '-l'], { env });
|
|
301
|
+
return String(result.stdout)
|
|
302
|
+
.split(/\r?\n/u)
|
|
303
|
+
.slice(1)
|
|
304
|
+
.map((line) => line.trim())
|
|
305
|
+
.filter(Boolean)
|
|
306
|
+
.map((line) => {
|
|
307
|
+
const [serial, state] = line.split(/\s+/u);
|
|
308
|
+
return {
|
|
309
|
+
serial,
|
|
310
|
+
state,
|
|
311
|
+
kind: serial?.startsWith('emulator-') ? 'emulator' : 'device',
|
|
312
|
+
};
|
|
313
|
+
})
|
|
314
|
+
.filter((device) => Boolean(device.serial) && device.state === 'device');
|
|
315
|
+
}
|
|
316
|
+
async function waitForBoot(input) {
|
|
317
|
+
await runCommand(input.adb, ['-s', input.serial, 'wait-for-device'], { env: input.env, timeoutMs: 120_000 });
|
|
318
|
+
const deadline = Date.now() + 120_000;
|
|
319
|
+
while (Date.now() < deadline) {
|
|
320
|
+
const result = await runCommand(input.adb, ['-s', input.serial, 'shell', 'getprop', 'sys.boot_completed'], {
|
|
321
|
+
env: input.env,
|
|
322
|
+
allowFailure: true,
|
|
323
|
+
});
|
|
324
|
+
if (String(result.stdout).trim() === '1') {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
await delay(2_000);
|
|
328
|
+
}
|
|
329
|
+
throw new Error(`Android device ${input.serial} did not finish booting.`);
|
|
330
|
+
}
|
|
331
|
+
async function resolveMainActivity(input) {
|
|
332
|
+
const result = await runCommand(input.adb, ['-s', input.serial, 'shell', 'cmd', 'package', 'resolve-activity', '--brief', input.packageName], {
|
|
333
|
+
env: input.env,
|
|
334
|
+
});
|
|
335
|
+
const activity = String(result.stdout)
|
|
336
|
+
.split(/\r?\n/u)
|
|
337
|
+
.map((line) => line.trim())
|
|
338
|
+
.filter((line) => line.includes('/'))
|
|
339
|
+
.at(-1);
|
|
340
|
+
if (!activity) {
|
|
341
|
+
throw new Error(`Could not resolve launch activity for ${input.packageName}.`);
|
|
342
|
+
}
|
|
343
|
+
return activity;
|
|
344
|
+
}
|
|
345
|
+
async function resolveProjectType(worktreePath, configured) {
|
|
346
|
+
if (configured && configured !== 'auto') {
|
|
347
|
+
return configured;
|
|
348
|
+
}
|
|
349
|
+
if (await isFile(join(worktreePath, 'pubspec.yaml')) && await isDirectory(join(worktreePath, 'android'))) {
|
|
350
|
+
return 'flutter';
|
|
351
|
+
}
|
|
352
|
+
if (await isFile(join(worktreePath, 'gradlew')) || await isFile(join(worktreePath, 'gradlew.bat'))) {
|
|
353
|
+
return 'android';
|
|
354
|
+
}
|
|
355
|
+
throw new Error('Could not detect an Android project. Use --project flutter or --project android from a Flutter/native Android repo.');
|
|
356
|
+
}
|
|
357
|
+
async function readFlutterLaunchConfig(worktreePath, launchConfigName) {
|
|
358
|
+
const fallback = { name: 'default flutter build', args: [] };
|
|
359
|
+
if (!launchConfigName) {
|
|
360
|
+
return fallback;
|
|
361
|
+
}
|
|
362
|
+
const contents = await readFile(join(worktreePath, '.vscode', 'launch.json'), 'utf8');
|
|
363
|
+
const launch = JSON.parse(stripJsonComments(contents));
|
|
364
|
+
const config = launch.configurations?.find((entry) => entry.name === launchConfigName);
|
|
365
|
+
if (!config) {
|
|
366
|
+
throw new Error(`Flutter launch config '${launchConfigName}' was not found in .vscode/launch.json.`);
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
name: config.name,
|
|
370
|
+
program: config.program,
|
|
371
|
+
args: Array.isArray(config.args) ? config.args.map(String) : [],
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
function flutterBuildPlan(launchConfig, input) {
|
|
375
|
+
const launchArgs = [...launchConfig.args];
|
|
376
|
+
const flavor = input.flutterFlavor ?? valueAfter(launchArgs, '--flavor');
|
|
377
|
+
const target = input.flutterTarget ?? launchConfig.program;
|
|
378
|
+
const args = ['build', 'apk', '--debug'];
|
|
379
|
+
if (target) {
|
|
380
|
+
args.push('-t', target);
|
|
381
|
+
}
|
|
382
|
+
if (flavor && !launchArgs.includes('--flavor')) {
|
|
383
|
+
args.push('--flavor', flavor);
|
|
384
|
+
}
|
|
385
|
+
args.push(...launchArgs);
|
|
386
|
+
return { args, flavor };
|
|
387
|
+
}
|
|
388
|
+
async function inferAndroidPackageName(worktreePath, flavor) {
|
|
389
|
+
const candidates = [
|
|
390
|
+
join(worktreePath, 'android', 'app', 'build.gradle'),
|
|
391
|
+
join(worktreePath, 'android', 'app', 'build.gradle.kts'),
|
|
392
|
+
join(worktreePath, 'app', 'build.gradle'),
|
|
393
|
+
join(worktreePath, 'app', 'build.gradle.kts'),
|
|
394
|
+
];
|
|
395
|
+
for (const candidate of candidates) {
|
|
396
|
+
if (!await isFile(candidate))
|
|
397
|
+
continue;
|
|
398
|
+
const contents = await readFile(candidate, 'utf8');
|
|
399
|
+
const flavorPackage = flavor ? applicationIdFromNamedBlock(contents, flavor) : undefined;
|
|
400
|
+
const packageName = flavorPackage ?? applicationIdFromNamedBlock(contents, 'defaultConfig') ?? applicationIdFromText(contents);
|
|
401
|
+
if (packageName)
|
|
402
|
+
return packageName;
|
|
403
|
+
}
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
function applicationIdFromNamedBlock(contents, blockName) {
|
|
407
|
+
const start = contents.indexOf(blockName);
|
|
408
|
+
if (start < 0)
|
|
409
|
+
return undefined;
|
|
410
|
+
const block = contents.slice(start, start + 4000);
|
|
411
|
+
return applicationIdFromText(block);
|
|
412
|
+
}
|
|
413
|
+
function applicationIdFromText(contents) {
|
|
414
|
+
const match = /\bapplicationId\s*(?:=|\()\s*["']([^"']+)["']/u.exec(contents)
|
|
415
|
+
?? /\bapplicationId\s+["']([^"']+)["']/u.exec(contents);
|
|
416
|
+
return match?.[1];
|
|
417
|
+
}
|
|
418
|
+
async function findBuiltApk(worktreePath, flavor) {
|
|
419
|
+
const expected = flavor
|
|
420
|
+
? join(worktreePath, 'build', 'app', 'outputs', 'flutter-apk', `app-${flavor}-debug.apk`)
|
|
421
|
+
: join(worktreePath, 'build', 'app', 'outputs', 'flutter-apk', 'app-debug.apk');
|
|
422
|
+
if (await isFile(expected))
|
|
423
|
+
return expected;
|
|
424
|
+
const root = join(worktreePath, 'build', 'app', 'outputs', 'flutter-apk');
|
|
425
|
+
const files = await listFiles(root);
|
|
426
|
+
const apks = await Promise.all(files
|
|
427
|
+
.filter((path) => path.endsWith('.apk'))
|
|
428
|
+
.map(async (path) => ({ path, info: await stat(path) })));
|
|
429
|
+
apks.sort((left, right) => right.info.mtimeMs - left.info.mtimeMs);
|
|
430
|
+
if (apks[0])
|
|
431
|
+
return apks[0].path;
|
|
432
|
+
throw new Error(`Flutter build did not produce an APK under ${relative(worktreePath, root)}.`);
|
|
433
|
+
}
|
|
434
|
+
async function resolveGradleWrapper(worktreePath, platform) {
|
|
435
|
+
const wrapper = platform === 'win32' ? join(worktreePath, 'gradlew.bat') : join(worktreePath, 'gradlew');
|
|
436
|
+
if (await isExecutable(wrapper, platform))
|
|
437
|
+
return wrapper;
|
|
438
|
+
throw new Error(`Native Android visual proof expected Gradle wrapper at ${relative(worktreePath, wrapper)}.`);
|
|
439
|
+
}
|
|
440
|
+
async function androidProofCommandEnv(input) {
|
|
441
|
+
const home = input.env.HOME ?? input.env.USERPROFILE;
|
|
442
|
+
const pubCache = input.env.PUB_CACHE ?? (home ? join(home, '.pub-cache') : join(input.runtimeDir, 'pub-cache'));
|
|
443
|
+
const gradleHome = input.env.GRADLE_USER_HOME ?? (home ? join(home, '.gradle') : join(input.runtimeDir, 'gradle-home'));
|
|
444
|
+
await mkdir(pubCache, { recursive: true });
|
|
445
|
+
await mkdir(gradleHome, { recursive: true });
|
|
446
|
+
return {
|
|
447
|
+
...input.env,
|
|
448
|
+
ANDROID_HOME: input.env.ANDROID_HOME ?? input.sdkRoot,
|
|
449
|
+
ANDROID_SDK_ROOT: input.env.ANDROID_SDK_ROOT ?? input.sdkRoot,
|
|
450
|
+
PUB_CACHE: pubCache,
|
|
451
|
+
GRADLE_USER_HOME: gradleHome,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
async function runCommand(command, args, options = {}) {
|
|
455
|
+
return new Promise((resolvePromise, reject) => {
|
|
456
|
+
const child = spawn(command, args, {
|
|
457
|
+
cwd: options.cwd,
|
|
458
|
+
env: options.env,
|
|
459
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
460
|
+
shell: options.platform === 'win32' && /\.(?:bat|cmd)$/iu.test(command),
|
|
461
|
+
});
|
|
462
|
+
const stdout = [];
|
|
463
|
+
const stderr = [];
|
|
464
|
+
const timer = options.timeoutMs
|
|
465
|
+
? setTimeout(() => child.kill('SIGTERM'), options.timeoutMs)
|
|
466
|
+
: undefined;
|
|
467
|
+
child.stdout.on('data', (chunk) => stdout.push(chunk));
|
|
468
|
+
child.stderr.on('data', (chunk) => stderr.push(chunk));
|
|
469
|
+
child.on('error', reject);
|
|
470
|
+
child.on('close', (code, signal) => {
|
|
471
|
+
if (timer)
|
|
472
|
+
clearTimeout(timer);
|
|
473
|
+
const stdoutBuffer = Buffer.concat(stdout);
|
|
474
|
+
const stderrText = Buffer.concat(stderr).toString('utf8');
|
|
475
|
+
const result = {
|
|
476
|
+
code,
|
|
477
|
+
signal,
|
|
478
|
+
stdout: options.encoding === 'buffer' ? stdoutBuffer : stdoutBuffer.toString('utf8'),
|
|
479
|
+
stderr: stderrText,
|
|
480
|
+
};
|
|
481
|
+
if (code === 0 || options.allowFailure) {
|
|
482
|
+
resolvePromise(result);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
reject(new Error([
|
|
486
|
+
`Command failed (${code ?? signal}): ${command} ${args.join(' ')}`,
|
|
487
|
+
stderrText || String(result.stdout),
|
|
488
|
+
].filter(Boolean).join('\n')));
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
async function firstExecutable(candidates, platform) {
|
|
493
|
+
for (const candidate of candidates.filter((value) => Boolean(value))) {
|
|
494
|
+
if (await isExecutable(candidate, platform)) {
|
|
495
|
+
return candidate;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return undefined;
|
|
499
|
+
}
|
|
500
|
+
async function pathExecutable(name, env, platform) {
|
|
501
|
+
const pathValue = env.PATH ?? '';
|
|
502
|
+
const pathDelimiter = platform === hostPlatform() ? hostPathDelimiter : platform === 'win32' ? ';' : ':';
|
|
503
|
+
const extensions = platform === 'win32' ? ['.exe', '.cmd', '.bat', ''] : [''];
|
|
504
|
+
for (const entry of pathValue.split(pathDelimiter).filter(Boolean)) {
|
|
505
|
+
for (const extension of extensions) {
|
|
506
|
+
const candidate = join(entry, `${name}${extension}`);
|
|
507
|
+
if (await isExecutable(candidate, platform))
|
|
508
|
+
return candidate;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return undefined;
|
|
512
|
+
}
|
|
513
|
+
async function isExecutable(path, platform) {
|
|
514
|
+
try {
|
|
515
|
+
await access(path, platform === 'win32' ? constants.F_OK : constants.X_OK);
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
async function isFile(path) {
|
|
523
|
+
try {
|
|
524
|
+
return (await stat(path)).isFile();
|
|
525
|
+
}
|
|
526
|
+
catch {
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
async function isDirectory(path) {
|
|
531
|
+
try {
|
|
532
|
+
return (await stat(path)).isDirectory();
|
|
533
|
+
}
|
|
534
|
+
catch {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
async function listFiles(root) {
|
|
539
|
+
let entries;
|
|
540
|
+
try {
|
|
541
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
542
|
+
}
|
|
543
|
+
catch {
|
|
544
|
+
return [];
|
|
545
|
+
}
|
|
546
|
+
const files = [];
|
|
547
|
+
for (const entry of entries) {
|
|
548
|
+
const path = join(root, entry.name);
|
|
549
|
+
if (entry.isDirectory()) {
|
|
550
|
+
files.push(...await listFiles(path));
|
|
551
|
+
}
|
|
552
|
+
else if (entry.isFile()) {
|
|
553
|
+
files.push(path);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return files;
|
|
557
|
+
}
|
|
558
|
+
function sdkTool(root, platform, ...parts) {
|
|
559
|
+
return pathApiForPlatform(platform).join(root, ...parts);
|
|
560
|
+
}
|
|
561
|
+
function sdkRootFromAdb(adb, platform) {
|
|
562
|
+
const pathApi = pathApiForPlatform(platform);
|
|
563
|
+
return pathApi.dirname(pathApi.dirname(adb));
|
|
564
|
+
}
|
|
565
|
+
function executableName(name, platform) {
|
|
566
|
+
return platform === 'win32' ? `${name}.exe` : name;
|
|
567
|
+
}
|
|
568
|
+
function pathApiForPlatform(platform) {
|
|
569
|
+
return platform === 'win32' ? win32 : posix;
|
|
570
|
+
}
|
|
571
|
+
function valueAfter(args, key) {
|
|
572
|
+
const index = args.findIndex((arg) => arg === key);
|
|
573
|
+
return index >= 0 ? args[index + 1] : undefined;
|
|
574
|
+
}
|
|
575
|
+
function stripJsonComments(contents) {
|
|
576
|
+
return contents
|
|
577
|
+
.replace(/\/\*[\s\S]*?\*\//gu, '')
|
|
578
|
+
.replace(/(^|\s)\/\/.*$/gmu, '$1');
|
|
579
|
+
}
|
|
580
|
+
function numberFromEnv(value) {
|
|
581
|
+
if (value === undefined)
|
|
582
|
+
return undefined;
|
|
583
|
+
const number = Number(value);
|
|
584
|
+
return Number.isFinite(number) ? number : undefined;
|
|
585
|
+
}
|
|
586
|
+
function androidProjectTypeFromEnv(value) {
|
|
587
|
+
if (value === 'auto' || value === 'flutter' || value === 'android') {
|
|
588
|
+
return value;
|
|
589
|
+
}
|
|
590
|
+
return undefined;
|
|
591
|
+
}
|
|
592
|
+
function fail(message) {
|
|
593
|
+
throw new Error(message);
|
|
594
|
+
}
|
|
595
|
+
function delay(ms) {
|
|
596
|
+
return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));
|
|
597
|
+
}
|
|
598
|
+
//# sourceMappingURL=android-visual-proof-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-visual-proof-command.js","sourceRoot":"","sources":["../../../src/runner/android-visual-proof-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type VisualProofDispatchTarget } from './review-gate-policy.js';
|
|
2
|
+
import { type BrowserVisualProofCommandInput } from './browser-visual-proof-command.js';
|
|
3
|
+
import { type MobileVisualProofCommandInput } from './mobile-visual-proof-command.js';
|
|
4
|
+
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
5
|
+
export interface AutoVisualProofCommandInput {
|
|
6
|
+
args: string[];
|
|
7
|
+
config: CodexOrchestratorConfig;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
browserRunner?: (input: BrowserVisualProofCommandInput) => Promise<unknown>;
|
|
10
|
+
mobileRunner?: (input: MobileVisualProofCommandInput) => Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare function runAutoVisualProofCommand(input: AutoVisualProofCommandInput): Promise<{
|
|
13
|
+
target: VisualProofDispatchTarget;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=auto-visual-proof-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-visual-proof-command.d.ts","sourceRoot":"","sources":["../../../src/runner/auto-visual-proof-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EAA6D,KAAK,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACnJ,OAAO,EAA2D,KAAK,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAC/I,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC,CAsBlI"}
|