codeloop-mcp-server 0.1.74 → 0.1.76

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 (46) hide show
  1. package/dist/evidence/backend_verification.d.ts +27 -0
  2. package/dist/evidence/backend_verification.d.ts.map +1 -1
  3. package/dist/evidence/backend_verification.js +22 -0
  4. package/dist/evidence/backend_verification.js.map +1 -1
  5. package/dist/evidence/runtime_log_scan.d.ts.map +1 -1
  6. package/dist/evidence/runtime_log_scan.js +10 -0
  7. package/dist/evidence/runtime_log_scan.js.map +1 -1
  8. package/dist/index.js +54 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/runners/app_launcher.d.ts +41 -0
  11. package/dist/runners/app_launcher.d.ts.map +1 -0
  12. package/dist/runners/app_launcher.js +172 -0
  13. package/dist/runners/app_launcher.js.map +1 -0
  14. package/dist/runners/backend_runtime.d.ts +21 -0
  15. package/dist/runners/backend_runtime.d.ts.map +1 -1
  16. package/dist/runners/backend_runtime.js +157 -6
  17. package/dist/runners/backend_runtime.js.map +1 -1
  18. package/dist/runners/cli_auth.d.ts +35 -0
  19. package/dist/runners/cli_auth.d.ts.map +1 -0
  20. package/dist/runners/cli_auth.js +127 -0
  21. package/dist/runners/cli_auth.js.map +1 -0
  22. package/dist/runners/device_probe.d.ts +41 -0
  23. package/dist/runners/device_probe.d.ts.map +1 -1
  24. package/dist/runners/device_probe.js +162 -1
  25. package/dist/runners/device_probe.js.map +1 -1
  26. package/dist/runners/interaction_engine.d.ts +59 -0
  27. package/dist/runners/interaction_engine.d.ts.map +1 -0
  28. package/dist/runners/interaction_engine.js +272 -0
  29. package/dist/runners/interaction_engine.js.map +1 -0
  30. package/dist/tools/diagnose.js +8 -0
  31. package/dist/tools/diagnose.js.map +1 -1
  32. package/dist/tools/gate_check.d.ts.map +1 -1
  33. package/dist/tools/gate_check.js +15 -1
  34. package/dist/tools/gate_check.js.map +1 -1
  35. package/dist/tools/plan_user_journey.d.ts +8 -0
  36. package/dist/tools/plan_user_journey.d.ts.map +1 -1
  37. package/dist/tools/plan_user_journey.js +20 -7
  38. package/dist/tools/plan_user_journey.js.map +1 -1
  39. package/dist/tools/run_journey.d.ts +69 -0
  40. package/dist/tools/run_journey.d.ts.map +1 -0
  41. package/dist/tools/run_journey.js +365 -0
  42. package/dist/tools/run_journey.js.map +1 -0
  43. package/dist/tools/verify.d.ts.map +1 -1
  44. package/dist/tools/verify.js +56 -2
  45. package/dist/tools/verify.js.map +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,127 @@
1
+ /**
2
+ * cli_auth — detect EXPIRED / MISSING provider-CLI logins and push the agent to
3
+ * re-authenticate so the rest of verification (backend emulators, remote logs,
4
+ * and the full visual journey) can proceed.
5
+ *
6
+ * When a developer's `firebase` / `gcloud` / `heroku` / … session has expired,
7
+ * an auto-detected backend (e.g. the Firebase Emulator Suite) can't start and
8
+ * remote-log pulls fail. That is NOT a code bug — it's a one-step auth fix. The
9
+ * right behaviour is to STOP guessing and tell the agent to run the exact login
10
+ * command in an interactive terminal so the USER can complete the browser
11
+ * sign-in, then re-run codeloop_verify and the visual journey.
12
+ */
13
+ /**
14
+ * Provider table. login_command is the canonical interactive re-auth command.
15
+ * Signatures are intentionally provider-specific so we name the right CLI.
16
+ */
17
+ const PROVIDERS = [
18
+ {
19
+ cli: "firebase",
20
+ label: "Firebase",
21
+ login_command: "firebase login --reauth",
22
+ signatures: [
23
+ /firebase login --reauth/i,
24
+ /credentials are no longer valid/i,
25
+ /Failed to (?:list|retrieve) log entries.*Google Cloud/i,
26
+ /run `firebase login`/i,
27
+ /Authentication Error.*firebase/i,
28
+ ],
29
+ },
30
+ {
31
+ cli: "gcloud",
32
+ label: "Google Cloud (gcloud)",
33
+ login_command: "gcloud auth login",
34
+ signatures: [
35
+ /gcloud auth (?:login|application-default login)/i,
36
+ /Your current active account.*does not have any valid credentials/i,
37
+ /Reauthentication failed|invalid_grant/i,
38
+ ],
39
+ },
40
+ {
41
+ cli: "heroku",
42
+ label: "Heroku",
43
+ login_command: "heroku login",
44
+ signatures: [/heroku login/i, /not logged in.*heroku/i, /Invalid credentials.*heroku/i],
45
+ },
46
+ {
47
+ cli: "vercel",
48
+ label: "Vercel",
49
+ login_command: "vercel login",
50
+ signatures: [/vercel login/i, /not authenticated.*vercel/i, /Please log in.*vercel/i],
51
+ },
52
+ {
53
+ cli: "fly",
54
+ label: "Fly.io",
55
+ login_command: "fly auth login",
56
+ signatures: [/fly(?:ctl)? auth login/i, /not logged in.*fly/i],
57
+ },
58
+ {
59
+ cli: "aws",
60
+ label: "AWS",
61
+ login_command: "aws sso login # (or: aws configure)",
62
+ signatures: [/aws sso login/i, /The SSO session.*has expired/i, /ExpiredToken|InvalidClientTokenId/i],
63
+ },
64
+ {
65
+ cli: "gh",
66
+ label: "GitHub CLI",
67
+ login_command: "gh auth login",
68
+ signatures: [/gh auth login/i, /authentication required.*gh/i],
69
+ },
70
+ {
71
+ cli: "az",
72
+ label: "Azure",
73
+ login_command: "az login",
74
+ signatures: [/\baz login\b/i, /az account.*not.*logged in/i, /AADSTS\d+/i],
75
+ },
76
+ {
77
+ cli: "supabase",
78
+ label: "Supabase",
79
+ login_command: "supabase login",
80
+ signatures: [/supabase login/i, /Access token not provided.*supabase/i],
81
+ },
82
+ ];
83
+ /**
84
+ * PURE: scan CLI/log output for expired-auth signatures and return the set of
85
+ * providers that need re-authentication (deduped, in table order).
86
+ */
87
+ export function detectExpiredCliAuth(text) {
88
+ if (!text)
89
+ return [];
90
+ const out = [];
91
+ for (const p of PROVIDERS) {
92
+ if (p.signatures.some((re) => re.test(text))) {
93
+ out.push({ cli: p.cli, label: p.label, login_command: p.login_command });
94
+ }
95
+ }
96
+ return out;
97
+ }
98
+ /** Look up a provider's interactive login command by CLI name. */
99
+ export function loginCommandFor(cli) {
100
+ const p = PROVIDERS.find((x) => x.cli === cli.toLowerCase());
101
+ return p ? p.login_command : null;
102
+ }
103
+ /**
104
+ * Build a HARD directive that pushes the agent to run the re-auth command(s) in
105
+ * an INTERACTIVE terminal so the user can complete sign-in, then re-run so the
106
+ * full verification (incl. visual journey) proceeds. `context` tunes the
107
+ * trailing instruction.
108
+ */
109
+ export function buildCliAuthDirective(issues, context) {
110
+ if (issues.length === 0)
111
+ return "";
112
+ const lines = [];
113
+ lines.push("[CodeLoop AUTH] A provider CLI login has EXPIRED — this is a one-step auth fix, NOT a code bug. " +
114
+ (context === "backend"
115
+ ? "Because of it, the backend (e.g. the Firebase Emulator Suite) could not start, so backend + interactive visual verification were blocked."
116
+ : "Because of it, production/3rd-party logs could not be pulled."));
117
+ lines.push("");
118
+ lines.push("ACTION — run the matching command in an INTERACTIVE terminal so the USER can complete the browser sign-in:");
119
+ for (const i of issues) {
120
+ lines.push(` ${i.login_command} # re-authenticate ${i.label}`);
121
+ }
122
+ lines.push("");
123
+ lines.push("Do NOT skip silently and do NOT 'fix' source code for this. After the user finishes signing in, re-run codeloop_verify; " +
124
+ "then call codeloop_run_journey (fix mode) so CodeLoop launches the app and runs the full visual verification.");
125
+ return lines.join("\n");
126
+ }
127
+ //# sourceMappingURL=cli_auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_auth.js","sourceRoot":"","sources":["../../src/runners/cli_auth.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,47 @@ export interface MobileTargets {
22
22
  */
23
23
  export declare function detectMobileTargets(cwd: string): MobileTargets;
24
24
  export declare function probeBootedDevices(): Promise<BootedDevices>;
25
+ export interface BootResult {
26
+ /** A device for this platform is now available to drive. */
27
+ booted: boolean;
28
+ /** It was already booted — no boot action was taken. */
29
+ already: boolean;
30
+ platform: "android" | "ios";
31
+ /** The AVD id / simulator udid|name that was (or is) booted. */
32
+ device?: string;
33
+ /** The command used to boot (for logs/diagnostics). */
34
+ command?: string;
35
+ /** Why booting did not happen / failed. */
36
+ reason?: string;
37
+ }
38
+ /**
39
+ * Parse `flutter emulators` output into available emulator ids per platform.
40
+ * Lines look like: `Pixel_7_API_34 • Pixel 7 API 34 • Google • android`.
41
+ */
42
+ export declare function parseFlutterEmulators(output: string): Array<{
43
+ id: string;
44
+ platform: "android" | "ios";
45
+ }>;
46
+ /** Parse `emulator -list-avds` (one AVD name per line). */
47
+ export declare function parseAvdList(output: string): string[];
48
+ /**
49
+ * Parse `xcrun simctl list devices available` for the first bootable iPhone
50
+ * UDID (and its name). Returns null when none are available.
51
+ */
52
+ export declare function parseFirstAvailableIosDevice(output: string): {
53
+ udid: string;
54
+ name: string;
55
+ } | null;
56
+ /**
57
+ * Boot an Android emulator or iOS simulator for the deep-E2E executor.
58
+ * Idempotent (reuses an already-booted device). Never throws.
59
+ */
60
+ export declare function bootDevice(opts: {
61
+ platform: "android" | "ios";
62
+ avd?: string;
63
+ iosDevice?: string;
64
+ timeoutMs?: number;
65
+ }): Promise<BootResult>;
25
66
  /**
26
67
  * Build a HARD directive that pushes the agent to OPEN the missing
27
68
  * simulator(s) before real interactive testing can proceed. Lists exact,
@@ -1 +1 @@
1
- {"version":3,"file":"device_probe.d.ts","sourceRoot":"","sources":["../../src/runners/device_probe.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uDAAuD;IACvD,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,2BAA2B;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAW9D;AAYD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CASjE;AAmDD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAAC;CAC7C,GAAG,MAAM,CAoDT"}
1
+ {"version":3,"file":"device_probe.d.ts","sourceRoot":"","sources":["../../src/runners/device_probe.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uDAAuD;IACvD,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,2BAA2B;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAW9D;AAYD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CASjE;AAgED,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAA;CAAE,CAAC,CAcpD;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQvC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,CAAC,CAItB;AAwGD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAAC;CAC7C,GAAG,MAAM,CAoDT"}
@@ -18,7 +18,7 @@
18
18
  import { existsSync, readdirSync } from "fs";
19
19
  import { join } from "path";
20
20
  import { platform } from "os";
21
- import { runCommand } from "./base.js";
21
+ import { runCommand, checkToolAvailable } from "./base.js";
22
22
  const PROBE_TIMEOUT_MS = 15_000;
23
23
  /**
24
24
  * Inspect a project directory for android/ and ios/ subfolders (Flutter,
@@ -89,6 +89,167 @@ async function probeIos() {
89
89
  .filter(Boolean);
90
90
  return { names, available: true };
91
91
  }
92
+ // ── Device BOOT (deep-E2E only) ─────────────────────────────────────
93
+ //
94
+ // `probeBootedDevices` only DETECTS. The deep-E2E executor (codeloop_run_journey)
95
+ // needs a booted device to drive, so it may BOOT one — but only because the
96
+ // caller explicitly asked for an interactive run (booting is implied consent).
97
+ // Plain `codeloop_verify` must NEVER call these. Booting is heavyweight and
98
+ // takes over the desktop, so we: reuse an already-booted device, honor the
99
+ // configured AVD / simulator, auto-pick the first available otherwise, and
100
+ // degrade with a clear reason when the tooling is absent.
101
+ const BOOT_TIMEOUT_MS = 180_000; // cold emulator/simulator boot can take 1-3 min
102
+ const BOOT_CMD_TIMEOUT_MS = 30_000;
103
+ /**
104
+ * Parse `flutter emulators` output into available emulator ids per platform.
105
+ * Lines look like: `Pixel_7_API_34 • Pixel 7 API 34 • Google • android`.
106
+ */
107
+ export function parseFlutterEmulators(output) {
108
+ const out = [];
109
+ for (const raw of output.split("\n")) {
110
+ const line = raw.trim();
111
+ // id • display • manufacturer • platform
112
+ const parts = line.split("•").map((p) => p.trim());
113
+ if (parts.length < 4)
114
+ continue;
115
+ const id = parts[0];
116
+ const plat = parts[parts.length - 1].toLowerCase();
117
+ if (!id || /available emulators|^\d+\s/i.test(id))
118
+ continue;
119
+ if (plat === "android")
120
+ out.push({ id, platform: "android" });
121
+ else if (plat === "ios")
122
+ out.push({ id, platform: "ios" });
123
+ }
124
+ return out;
125
+ }
126
+ /** Parse `emulator -list-avds` (one AVD name per line). */
127
+ export function parseAvdList(output) {
128
+ return output
129
+ .split("\n")
130
+ .map((l) => l.trim())
131
+ .filter((l) => l.length > 0 && !/^INFO\b|^WARNING\b|^PANIC\b/i.test(l));
132
+ }
133
+ /**
134
+ * Parse `xcrun simctl list devices available` for the first bootable iPhone
135
+ * UDID (and its name). Returns null when none are available.
136
+ */
137
+ export function parseFirstAvailableIosDevice(output) {
138
+ // Lines: " iPhone 15 (UDID) (Shutdown)" — we want a Shutdown iPhone.
139
+ for (const raw of output.split("\n")) {
140
+ const line = raw.trim();
141
+ const m = line.match(/^(iPhone[^()]*?)\s*\(([0-9A-Fa-f-]{36})\)\s*\((Shutdown|Booted)\)/);
142
+ if (m)
143
+ return { udid: m[2], name: m[1].trim() };
144
+ }
145
+ return null;
146
+ }
147
+ /**
148
+ * Boot an Android emulator or iOS simulator for the deep-E2E executor.
149
+ * Idempotent (reuses an already-booted device). Never throws.
150
+ */
151
+ export async function bootDevice(opts) {
152
+ const timeoutMs = opts.timeoutMs ?? BOOT_TIMEOUT_MS;
153
+ if (opts.platform === "android")
154
+ return bootAndroid(opts.avd, timeoutMs);
155
+ return bootIos(opts.iosDevice, timeoutMs);
156
+ }
157
+ async function bootAndroid(avd, timeoutMs) {
158
+ const r = { booted: false, already: false, platform: "android" };
159
+ const pre = await probeBootedDevices();
160
+ if (pre.android.length > 0) {
161
+ return { ...r, booted: true, already: true, device: pre.android[0] };
162
+ }
163
+ if (!pre.adb_available) {
164
+ return { ...r, reason: "adb not on PATH — install Android platform-tools / Android Studio to boot an emulator." };
165
+ }
166
+ // Resolve which AVD to launch + the launch command.
167
+ const hasFlutter = await checkToolAvailable("flutter");
168
+ let launchCmd = null;
169
+ if (hasFlutter) {
170
+ const list = await runCommand("flutter", ["emulators"], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
171
+ const androids = parseFlutterEmulators(list.stdout + list.stderr).filter((e) => e.platform === "android");
172
+ const chosen = avd && androids.some((e) => e.id === avd) ? avd : androids[0]?.id;
173
+ if (chosen)
174
+ launchCmd = { cmd: "flutter", args: ["emulators", "--launch", chosen], chosen };
175
+ }
176
+ if (!launchCmd && (await checkToolAvailable("emulator"))) {
177
+ const list = await runCommand("emulator", ["-list-avds"], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
178
+ const avds = parseAvdList(list.stdout);
179
+ const chosen = avd && avds.includes(avd) ? avd : avds[0];
180
+ if (chosen)
181
+ launchCmd = { cmd: "emulator", args: ["-avd", chosen], chosen };
182
+ }
183
+ if (!launchCmd) {
184
+ return {
185
+ ...r,
186
+ reason: avd
187
+ ? `No Android AVD named "${avd}" found (checked flutter emulators / emulator -list-avds). Create it in Android Studio.`
188
+ : "No Android AVDs found. Create one in Android Studio (Device Manager) first.",
189
+ };
190
+ }
191
+ // Launch async (don't wait for the emulator process to exit) then poll readiness.
192
+ void runCommand(launchCmd.cmd, launchCmd.args, process.cwd(), undefined, undefined, timeoutMs);
193
+ const ready = await waitForAndroidReady(timeoutMs);
194
+ return {
195
+ ...r,
196
+ booted: ready,
197
+ device: ready ? (await probeBootedDevices()).android[0] ?? launchCmd.chosen : launchCmd.chosen,
198
+ command: `${launchCmd.cmd} ${launchCmd.args.join(" ")}`,
199
+ reason: ready ? undefined : `Emulator "${launchCmd.chosen}" did not finish booting within ${Math.round(timeoutMs / 1000)}s.`,
200
+ };
201
+ }
202
+ async function waitForAndroidReady(timeoutMs) {
203
+ const deadline = Date.now() + timeoutMs;
204
+ while (Date.now() < deadline) {
205
+ const booted = await probeBootedDevices();
206
+ if (booted.android.length > 0) {
207
+ // Device is attached; confirm the OS finished booting.
208
+ const prop = await runCommand("adb", ["shell", "getprop", "sys.boot_completed"], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
209
+ if (prop.stdout.trim() === "1")
210
+ return true;
211
+ }
212
+ await new Promise((res) => setTimeout(res, 3000));
213
+ }
214
+ return false;
215
+ }
216
+ async function bootIos(iosDevice, timeoutMs) {
217
+ const r = { booted: false, already: false, platform: "ios" };
218
+ if (platform() !== "darwin") {
219
+ return { ...r, reason: "iOS simulators require macOS." };
220
+ }
221
+ const pre = await probeBootedDevices();
222
+ if (pre.ios.length > 0) {
223
+ return { ...r, booted: true, already: true, device: pre.ios[0] };
224
+ }
225
+ if (!pre.xcrun_available) {
226
+ return { ...r, reason: "xcrun not on PATH — install Xcode + command line tools." };
227
+ }
228
+ // Resolve target simulator: configured name, else first available iPhone.
229
+ let target = iosDevice;
230
+ if (!target) {
231
+ const list = await runCommand("xcrun", ["simctl", "list", "devices", "available"], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
232
+ const dev = parseFirstAvailableIosDevice(list.stdout);
233
+ if (!dev)
234
+ return { ...r, reason: "No available iOS simulators. Add a runtime/device in Xcode > Settings > Platforms." };
235
+ target = dev.udid;
236
+ }
237
+ const boot = await runCommand("xcrun", ["simctl", "boot", target], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
238
+ // "Unable to boot device in current state: Booted" is success-equivalent.
239
+ const alreadyBooted = /current state: Booted/i.test(boot.stderr);
240
+ // Open the Simulator UI so the app is visible for screenshots/video.
241
+ void runCommand("open", ["-a", "Simulator"], process.cwd(), undefined, undefined, BOOT_CMD_TIMEOUT_MS);
242
+ // bootstatus blocks until the device is fully booted (or returns immediately if booted).
243
+ const status = await runCommand("xcrun", ["simctl", "bootstatus", target, "-b"], process.cwd(), undefined, undefined, timeoutMs);
244
+ const ready = status.exit_code === 0 || alreadyBooted;
245
+ return {
246
+ ...r,
247
+ booted: ready,
248
+ device: target,
249
+ command: `xcrun simctl boot ${target}`,
250
+ reason: ready ? undefined : `Simulator "${target}" did not finish booting within ${Math.round(timeoutMs / 1000)}s.`,
251
+ };
252
+ }
92
253
  /**
93
254
  * Build a HARD directive that pushes the agent to OPEN the missing
94
255
  * simulator(s) before real interactive testing can proceed. Lists exact,
@@ -1 +1 @@
1
- {"version":3,"file":"device_probe.js","sourceRoot":"","sources":["../../src/runners/device_probe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device_probe.js","sourceRoot":"","sources":["../../src/runners/device_probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Interaction engine — the reusable core that DRIVES a single UI step against
3
+ * a running app, across all four target types (browser / desktop / Android /
4
+ * iOS). It dispatches the journey-relevant action set to the same low-level
5
+ * primitives the `codeloop_interact` MCP tool uses (browser_interaction.ts +
6
+ * window_manager.ts), so the new server-side orchestrator (codeloop_run_journey)
7
+ * can drive a planned journey end-to-end WITHOUT a per-step MCP round-trip.
8
+ *
9
+ * Scope: this engine intentionally covers the subset of actions a planned
10
+ * journey needs (navigate, click, type, submit, fill, read-back/assert, scroll,
11
+ * wait, simple mobile taps/keys). The full, exhaustive action surface (UIA
12
+ * automation, Maestro flows, biometric, network shaping, drag, etc.) remains in
13
+ * the `codeloop_interact` tool. When the engine hits an action or a missing
14
+ * field it can't satisfy, it returns `{ success: false, unsupported: true }`
15
+ * with a directive so the orchestrator can fall back to the agent instead of
16
+ * failing the whole run.
17
+ */
18
+ export type JourneyTarget = "browser" | "desktop" | "android_emulator" | "ios_simulator";
19
+ export interface InteractionStep {
20
+ action: string;
21
+ selector?: string;
22
+ text?: string;
23
+ url?: string;
24
+ x?: number;
25
+ y?: number;
26
+ x2?: number;
27
+ y2?: number;
28
+ key?: string;
29
+ keys?: string;
30
+ direction?: "up" | "down" | "left" | "right";
31
+ amount?: number;
32
+ duration_ms?: number;
33
+ /** [get_text] assert the read-back text contains this substring (ci). */
34
+ expect_contains?: string;
35
+ /** Semantic label for CRUD/intent classification (logged by the caller). */
36
+ intent?: string;
37
+ }
38
+ export interface InteractionContext {
39
+ target: JourneyTarget;
40
+ /** App name for desktop front-bring (optional). */
41
+ app_name?: string;
42
+ }
43
+ export interface InteractionResult {
44
+ action: string;
45
+ success: boolean;
46
+ detail: string;
47
+ /** Text read back by a get_text action. */
48
+ extractedText?: string | null;
49
+ assertion?: {
50
+ expected: string;
51
+ matched: boolean;
52
+ actual_excerpt: string;
53
+ };
54
+ /** True when the engine can't satisfy this step (caller should fall back). */
55
+ unsupported?: boolean;
56
+ }
57
+ /** Drive a single journey step. Never throws; returns a structured result. */
58
+ export declare function executeInteraction(step: InteractionStep, ctx: InteractionContext): Promise<InteractionResult>;
59
+ //# sourceMappingURL=interaction_engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction_engine.d.ts","sourceRoot":"","sources":["../../src/runners/interaction_engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,SAAS,GACT,kBAAkB,GAClB,eAAe,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA0BD,8EAA8E;AAC9E,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}