codeloop-mcp-server 0.1.50 → 0.1.52

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 (71) hide show
  1. package/dist/auth/critical_floors.d.ts.map +1 -1
  2. package/dist/auth/critical_floors.js +8 -0
  3. package/dist/auth/critical_floors.js.map +1 -1
  4. package/dist/evidence/anti_rationalisation.d.ts +34 -0
  5. package/dist/evidence/anti_rationalisation.d.ts.map +1 -0
  6. package/dist/evidence/anti_rationalisation.js +85 -0
  7. package/dist/evidence/anti_rationalisation.js.map +1 -0
  8. package/dist/evidence/change_coverage.d.ts +59 -0
  9. package/dist/evidence/change_coverage.d.ts.map +1 -0
  10. package/dist/evidence/change_coverage.js +422 -0
  11. package/dist/evidence/change_coverage.js.map +1 -0
  12. package/dist/evidence/change_manifest.d.ts +94 -0
  13. package/dist/evidence/change_manifest.d.ts.map +1 -0
  14. package/dist/evidence/change_manifest.js +830 -0
  15. package/dist/evidence/change_manifest.js.map +1 -0
  16. package/dist/evidence/loop_state.d.ts +53 -0
  17. package/dist/evidence/loop_state.d.ts.map +1 -0
  18. package/dist/evidence/loop_state.js +147 -0
  19. package/dist/evidence/loop_state.js.map +1 -0
  20. package/dist/evidence/verify_staleness.d.ts +9 -0
  21. package/dist/evidence/verify_staleness.d.ts.map +1 -0
  22. package/dist/evidence/verify_staleness.js +180 -0
  23. package/dist/evidence/verify_staleness.js.map +1 -0
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +374 -19
  27. package/dist/index.js.map +1 -1
  28. package/dist/runners/empty_state_detector.d.ts +33 -0
  29. package/dist/runners/empty_state_detector.d.ts.map +1 -0
  30. package/dist/runners/empty_state_detector.js +304 -0
  31. package/dist/runners/empty_state_detector.js.map +1 -0
  32. package/dist/runners/maestro.d.ts +13 -0
  33. package/dist/runners/maestro.d.ts.map +1 -1
  34. package/dist/runners/maestro.js +37 -1
  35. package/dist/runners/maestro.js.map +1 -1
  36. package/dist/runners/modal_detector.d.ts +60 -0
  37. package/dist/runners/modal_detector.d.ts.map +1 -0
  38. package/dist/runners/modal_detector.js +160 -0
  39. package/dist/runners/modal_detector.js.map +1 -0
  40. package/dist/runners/python_tests.d.ts +26 -0
  41. package/dist/runners/python_tests.d.ts.map +1 -0
  42. package/dist/runners/python_tests.js +181 -0
  43. package/dist/runners/python_tests.js.map +1 -0
  44. package/dist/runners/rust_tests.d.ts +28 -0
  45. package/dist/runners/rust_tests.d.ts.map +1 -0
  46. package/dist/runners/rust_tests.js +76 -0
  47. package/dist/runners/rust_tests.js.map +1 -0
  48. package/dist/tools/c7_slug.d.ts +14 -0
  49. package/dist/tools/c7_slug.d.ts.map +1 -0
  50. package/dist/tools/c7_slug.js +21 -0
  51. package/dist/tools/c7_slug.js.map +1 -0
  52. package/dist/tools/diagnose.d.ts.map +1 -1
  53. package/dist/tools/diagnose.js +13 -0
  54. package/dist/tools/diagnose.js.map +1 -1
  55. package/dist/tools/gate_check.d.ts +2 -1
  56. package/dist/tools/gate_check.d.ts.map +1 -1
  57. package/dist/tools/gate_check.js +74 -32
  58. package/dist/tools/gate_check.js.map +1 -1
  59. package/dist/tools/is_ui_project.d.ts +23 -0
  60. package/dist/tools/is_ui_project.d.ts.map +1 -0
  61. package/dist/tools/is_ui_project.js +42 -0
  62. package/dist/tools/is_ui_project.js.map +1 -0
  63. package/dist/tools/plan_change_journey.d.ts +41 -0
  64. package/dist/tools/plan_change_journey.d.ts.map +1 -0
  65. package/dist/tools/plan_change_journey.js +131 -0
  66. package/dist/tools/plan_change_journey.js.map +1 -0
  67. package/dist/tools/verify.d.ts +28 -0
  68. package/dist/tools/verify.d.ts.map +1 -1
  69. package/dist/tools/verify.js +272 -8
  70. package/dist/tools/verify.js.map +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ export interface EmptyStateRiskInput {
2
+ cwd: string;
3
+ /** Optional manifest display name the agent passed on the call. */
4
+ target_change_entry?: string;
5
+ action: string;
6
+ args: Record<string, unknown>;
7
+ }
8
+ export interface EmptyStateRiskVerdict {
9
+ is_risky: boolean;
10
+ reason: string;
11
+ }
12
+ /**
13
+ * Heuristic check. Returns is_risky=true when the detector believes the
14
+ * agent is about to interact with an empty region. Always cheap — no
15
+ * subprocesses fired.
16
+ */
17
+ export declare function detectEmptyStateRisk(input: EmptyStateRiskInput): EmptyStateRiskVerdict;
18
+ /**
19
+ * The HARD postscript appended to a codeloop_interact response when
20
+ * detectEmptyStateRisk reports is_risky. Mirrors the H11 modal
21
+ * postscript style — concrete next steps, no ambiguity.
22
+ */
23
+ export declare function buildEmptyStateDirective(verdict: EmptyStateRiskVerdict, target_change_entry: string | undefined): string;
24
+ export declare function detectEmptyStateLive(opts: {
25
+ cwd: string;
26
+ app_name?: string;
27
+ target_type?: "browser" | "desktop_macos" | "desktop_windows" | "desktop_linux";
28
+ }): Promise<{
29
+ likely_empty: boolean;
30
+ matched_phrase: string | null;
31
+ raw?: string;
32
+ }>;
33
+ //# sourceMappingURL=empty_state_detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty_state_detector.d.ts","sourceRoot":"","sources":["../../src/runners/empty_state_detector.ts"],"names":[],"mappings":"AA0DA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqDD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,qBAAqB,CAwFtF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,qBAAqB,EAC9B,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,MAAM,CAkBR;AASD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAAC;CACjF,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBlF"}
@@ -0,0 +1,304 @@
1
+ import { existsSync, readFileSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { exec } from "child_process";
4
+ import { promisify } from "util";
5
+ import { getArtifactsBaseDir, getRunDir, listRuns } from "../evidence/artifacts.js";
6
+ import { loadMostRecentChangeManifest } from "../evidence/change_manifest.js";
7
+ const execAsync = promisify(exec);
8
+ /**
9
+ * 0.1.52 C4 — Empty-state seeding enforcement.
10
+ *
11
+ * Heuristic detector that fires when an agent is about to interact with
12
+ * a UI region whose state is likely EMPTY — typing into a non-existent
13
+ * grid row, clicking a button hidden by an empty-state placeholder, etc.
14
+ *
15
+ * Two signal sources:
16
+ *
17
+ * 1. Heuristic / log-based: cheap, always available. Looks at the
18
+ * change manifest entry the agent claims to be exercising and
19
+ * cross-references it against the recent interaction log. If the
20
+ * target is a row/cell on a DataGrid AND no prior interaction
21
+ * committed a record AND no shell-seed action has run, the
22
+ * detector flags risk.
23
+ *
24
+ * 2. Cross-platform UI probe: optional, called when the caller
25
+ * explicitly asks for live verification. Each platform has a
26
+ * lightweight "is this surface empty" probe:
27
+ * - Windows: PowerShell UIA dump of the foreground window —
28
+ * search for "0 items" / "No items" / DataGrid with
29
+ * ItemCount == 0.
30
+ * - macOS: AXDialog / AXList descendant count via osascript.
31
+ * - Linux: xdotool window-content text scrape.
32
+ * - Web: Playwright is run elsewhere; we don't reach into it
33
+ * here because the codeloop_interact path already has a live
34
+ * page handle and can call detectEmptyStateLive itself when
35
+ * target_type === "browser".
36
+ *
37
+ * The heuristic is the default the post-interact directive uses; the
38
+ * UI probe is reserved for explicit pre-flight checks.
39
+ */
40
+ const ROW_ACTION_HINTS = /\b(row|cell|item|record|line)\b/i;
41
+ const SEED_HINTS = /\b(seed|fixture|insert|preload|sample|sql|sqlite|psql|database|backup|restore)\b/i;
42
+ const COMMIT_HINTS = /\b(save|submit|create|add|new|insert|register|login|signup)\b/i;
43
+ const EMPTY_STATE_TEXT_HINTS = [
44
+ /\bno items\b/i,
45
+ /\b0 items\b/i,
46
+ /\bno records\b/i,
47
+ /\bno data\b/i,
48
+ /\bempty\b/i,
49
+ /\bnothing here\b/i,
50
+ /\bnothing to show\b/i,
51
+ /\badd your first\b/i,
52
+ /\bget started by\b/i,
53
+ /\bcreate your first\b/i,
54
+ ];
55
+ function readJsonl(path) {
56
+ try {
57
+ const out = [];
58
+ for (const line of readFileSync(path, "utf-8").split("\n")) {
59
+ const t = line.trim();
60
+ if (!t)
61
+ continue;
62
+ try {
63
+ out.push(JSON.parse(t));
64
+ }
65
+ catch {
66
+ /* skip */
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ function recentLog(cwd) {
76
+ const baseDir = getArtifactsBaseDir(cwd);
77
+ const out = [];
78
+ for (const rid of listRuns(baseDir).slice(0, 5)) {
79
+ const logFile = join(getRunDir(rid, baseDir), "logs", "interaction_log.jsonl");
80
+ if (!existsSync(logFile))
81
+ continue;
82
+ out.push(...readJsonl(logFile));
83
+ }
84
+ return out;
85
+ }
86
+ function entryIsRowShaped(target_change_entry) {
87
+ if (!target_change_entry)
88
+ return { rowShaped: false };
89
+ if (target_change_entry.startsWith("datagrid_column:") ||
90
+ /\bcolumn\b/i.test(target_change_entry)) {
91
+ return { rowShaped: true };
92
+ }
93
+ return { rowShaped: false };
94
+ }
95
+ /**
96
+ * Heuristic check. Returns is_risky=true when the detector believes the
97
+ * agent is about to interact with an empty region. Always cheap — no
98
+ * subprocesses fired.
99
+ */
100
+ export function detectEmptyStateRisk(input) {
101
+ const { cwd, target_change_entry, action, args } = input;
102
+ // Combine signals from the action and its args.
103
+ const actionLower = action.toLowerCase();
104
+ const haystackParts = [];
105
+ for (const k of ["text", "selector", "description", "intent", "target", "purpose", "step", "label", "name"]) {
106
+ const v = args[k];
107
+ if (typeof v === "string")
108
+ haystackParts.push(v);
109
+ }
110
+ const haystack = haystackParts.join(" ");
111
+ const looksLikeRowAction = ROW_ACTION_HINTS.test(haystack) ||
112
+ actionLower === "type" ||
113
+ actionLower === "type_and_submit" ||
114
+ actionLower === "type_and_tab" ||
115
+ actionLower === "double_click" ||
116
+ actionLower === "fill_form";
117
+ const { rowShaped } = entryIsRowShaped(target_change_entry);
118
+ if (!looksLikeRowAction && !rowShaped) {
119
+ return { is_risky: false, reason: "Action does not look like a row/cell interaction." };
120
+ }
121
+ // Manifest cross-check — only fire risk when the change entry
122
+ // pinned by the agent IS a grid-shaped target. Buttons / menu items /
123
+ // properties may live on screens with no row dependency.
124
+ if (target_change_entry) {
125
+ const { manifest } = loadMostRecentChangeManifest(cwd);
126
+ if (manifest) {
127
+ const entry = manifest.entries.find((e) => (e.kind === "ui_element_added" && `${e.element}: "${e.name}"` === target_change_entry) ||
128
+ (e.kind === "property_added" && `${e.class}.${e.name}` === target_change_entry) ||
129
+ (e.kind === "migration_column_added" && `${e.table}.${e.column}` === target_change_entry));
130
+ if (entry) {
131
+ const isRowEntry = (entry.kind === "ui_element_added" && entry.element === "datagrid_column") ||
132
+ entry.kind === "migration_column_added" ||
133
+ (entry.kind === "property_added" && rowShaped);
134
+ if (!isRowEntry) {
135
+ return { is_risky: false, reason: "Manifest entry is not row-shaped." };
136
+ }
137
+ }
138
+ }
139
+ }
140
+ // Look at recent interaction log: did any successful commit happen in
141
+ // the last 25 entries? If yes, the dataset is no longer empty (the
142
+ // create-arc went through). Likewise, did a seed/shell action run?
143
+ const log = recentLog(cwd).slice(-25);
144
+ const hasCommit = log.some((e) => {
145
+ if (e.success === false)
146
+ return false;
147
+ const a = (e.action ?? "").toLowerCase();
148
+ if (a === "type_and_submit")
149
+ return true;
150
+ if (a === "fill_form")
151
+ return true;
152
+ const args = (e.input_args ?? {});
153
+ const text = [args.text, args.selector, args.description, args.intent, args.target, args.label]
154
+ .filter((v) => typeof v === "string")
155
+ .join(" ");
156
+ return COMMIT_HINTS.test(text);
157
+ });
158
+ const hasSeed = log.some((e) => {
159
+ if (e.success === false)
160
+ return false;
161
+ const a = (e.action ?? "").toLowerCase();
162
+ const args = (e.input_args ?? {});
163
+ if (a === "shell") {
164
+ const cmd = typeof args.command === "string" ? args.command : "";
165
+ return SEED_HINTS.test(cmd) || /\.bat\b|\.sh\b|\.ps1\b/.test(cmd);
166
+ }
167
+ const text = [args.description, args.intent, args.purpose, args.step, args.command]
168
+ .filter((v) => typeof v === "string")
169
+ .join(" ");
170
+ return SEED_HINTS.test(text);
171
+ });
172
+ if (hasCommit || hasSeed) {
173
+ return { is_risky: false, reason: "Prior commit or seed action observed in recent log." };
174
+ }
175
+ return {
176
+ is_risky: true,
177
+ reason: "Heuristic detected a row/cell interaction with no prior commit/seed action in the recent log. " +
178
+ "Typing into / clicking a non-existent row produces no UIA event and the C3 gate will not credit the change entry.",
179
+ };
180
+ }
181
+ /**
182
+ * The HARD postscript appended to a codeloop_interact response when
183
+ * detectEmptyStateRisk reports is_risky. Mirrors the H11 modal
184
+ * postscript style — concrete next steps, no ambiguity.
185
+ */
186
+ export function buildEmptyStateDirective(verdict, target_change_entry) {
187
+ if (!verdict.is_risky)
188
+ return "";
189
+ return [
190
+ "",
191
+ "",
192
+ "[CodeLoop C4] HARD DIRECTIVE — empty-state risk detected.",
193
+ `Reason: ${verdict.reason}`,
194
+ target_change_entry
195
+ ? `Target change entry: ${target_change_entry}`
196
+ : "Target change entry: (unspecified)",
197
+ "",
198
+ "Before continuing the journey for this entry you MUST seed at least one record so the row/cell becomes interactable. Pick whichever applies:",
199
+ " 1. Run codeloop_plan_user_journey and follow its Create arc to add a record via the UI. This both seeds AND credits the user_journey_evidence gate at the same time.",
200
+ " 2. Run a setup script via codeloop_interact action='shell' (e.g. SeedDb.bat, `dotnet ef database update`, `npm run seed`, `python manage.py loaddata fixtures.json`). The detector recognises shell commands containing `seed`/`fixture`/`insert`/`sql`/`backup`/`restore`.",
201
+ " 3. Restore a pre-populated artifact from artifacts/test_files/ via codeloop_interact action='shell' command='cp …' (or platform equivalent).",
202
+ "",
203
+ "After seeding, capture a fresh screenshot to confirm the empty-state UI is gone, THEN re-attempt this interaction. Skipping seeding will leave the C3 change_coverage_evidence gate at continue_fixing because the row interaction never produced a UIA event.",
204
+ ].join("\n");
205
+ }
206
+ // ──────────────────────────────────────────────────────────────────────
207
+ // Cross-platform live UI probe (optional). Used when a caller wants to
208
+ // verify "is this region actually empty right now?" instead of relying
209
+ // on the heuristic. The probe scrapes window text via the platform's
210
+ // accessibility API and matches against the empty-state phrase list.
211
+ // ──────────────────────────────────────────────────────────────────────
212
+ export async function detectEmptyStateLive(opts) {
213
+ const platform = process.platform;
214
+ const tt = opts.target_type ?? autoDetectTargetType();
215
+ if (tt === "desktop_windows" && platform === "win32") {
216
+ return await probeWindowsUIA(opts.app_name);
217
+ }
218
+ if (tt === "desktop_macos" && platform === "darwin") {
219
+ return await probeMacosAX(opts.app_name);
220
+ }
221
+ if (tt === "desktop_linux" && platform === "linux") {
222
+ return await probeLinuxXdotool(opts.app_name);
223
+ }
224
+ // Web target — caller is expected to inspect via Playwright. We
225
+ // return likely_empty=false so the caller can decide.
226
+ return { likely_empty: false, matched_phrase: null };
227
+ }
228
+ function autoDetectTargetType() {
229
+ if (process.platform === "win32")
230
+ return "desktop_windows";
231
+ if (process.platform === "darwin")
232
+ return "desktop_macos";
233
+ return "desktop_linux";
234
+ }
235
+ function matchEmptyText(text) {
236
+ for (const re of EMPTY_STATE_TEXT_HINTS) {
237
+ const m = re.exec(text);
238
+ if (m)
239
+ return { likely_empty: true, matched_phrase: m[0] };
240
+ }
241
+ return { likely_empty: false, matched_phrase: null };
242
+ }
243
+ async function probeWindowsUIA(app_name) {
244
+ // Best-effort: dump the foreground (or named) window's element tree
245
+ // names via PowerShell + UIAutomationClient and scan for empty hints.
246
+ const target = app_name ? `-Name '${app_name.replace(/'/g, "''")}'` : "";
247
+ const ps = `Add-Type -AssemblyName UIAutomationClient,UIAutomationTypes;
248
+ $root = [System.Windows.Automation.AutomationElement]::RootElement;
249
+ $proc = if ('${target ? "1" : ""}' -eq '1') { Get-Process ${target} -ErrorAction SilentlyContinue | Select-Object -First 1 } else { Get-Process | Where-Object { $_.MainWindowHandle -ne 0 } | Sort-Object -Property StartTime -Descending | Select-Object -First 1 };
250
+ if (-not $proc) { Write-Output ''; exit 0 }
251
+ $cond = New-Object System.Windows.Automation.PropertyCondition([System.Windows.Automation.AutomationElement]::ProcessIdProperty, $proc.Id);
252
+ $win = $root.FindFirst([System.Windows.Automation.TreeScope]::Children, $cond);
253
+ if (-not $win) { Write-Output ''; exit 0 }
254
+ $descendants = $win.FindAll([System.Windows.Automation.TreeScope]::Descendants, [System.Windows.Automation.Condition]::TrueCondition);
255
+ $names = @();
256
+ foreach ($d in $descendants) { try { $names += $d.Current.Name } catch {} }
257
+ Write-Output ($names -join "\`n")`;
258
+ try {
259
+ const { stdout } = await execAsync(`powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps.replace(/"/g, '\\"').replace(/\n/g, " ")}"`, { timeout: 8000 });
260
+ return { ...matchEmptyText(stdout), raw: stdout.slice(0, 5000) };
261
+ }
262
+ catch {
263
+ return { likely_empty: false, matched_phrase: null };
264
+ }
265
+ }
266
+ async function probeMacosAX(app_name) {
267
+ const target = app_name ?? "frontmost application's name";
268
+ const script = `tell application "System Events"
269
+ set targetApp to ${app_name ? `"${app_name}"` : "name of first application process whose frontmost is true"}
270
+ tell process targetApp
271
+ set output to ""
272
+ set elements to entire contents of front window
273
+ repeat with elem in elements
274
+ try
275
+ set output to output & " | " & (description of elem) & " :: " & (value of elem as string)
276
+ end try
277
+ end repeat
278
+ return output
279
+ end tell
280
+ end tell`;
281
+ void target;
282
+ try {
283
+ const { stdout } = await execAsync(`osascript -e '${script.replace(/'/g, "'\\''")}'`, { timeout: 6000 });
284
+ return { ...matchEmptyText(stdout), raw: stdout.slice(0, 5000) };
285
+ }
286
+ catch {
287
+ return { likely_empty: false, matched_phrase: null };
288
+ }
289
+ }
290
+ async function probeLinuxXdotool(app_name) {
291
+ // Linux desktop accessibility is fragmented. We do the best-effort
292
+ // path: list all windows and grab their classNames; we don't have a
293
+ // portable text scraper without at-spi. We default to "no signal".
294
+ void app_name;
295
+ try {
296
+ const dirEntries = readdirSync("/proc").filter((n) => /^\d+$/.test(n));
297
+ void dirEntries;
298
+ return { likely_empty: false, matched_phrase: null };
299
+ }
300
+ catch {
301
+ return { likely_empty: false, matched_phrase: null };
302
+ }
303
+ }
304
+ //# sourceMappingURL=empty_state_detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty_state_detector.js","sourceRoot":"","sources":["../../src/runners/empty_state_detector.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { RunnerResult } from "./base.js";
1
2
  export interface MaestroResult {
2
3
  passed: boolean;
3
4
  totalFlows: number;
@@ -9,4 +10,16 @@ export interface MaestroResult {
9
10
  export declare function isMaestroInstalled(): Promise<boolean>;
10
11
  export declare function findMaestroFlows(cwd: string): string[];
11
12
  export declare function runMaestroTests(cwd: string, logDir: string): Promise<MaestroResult>;
13
+ /**
14
+ * 0.1.51 H9 — Adapt `runMaestroTests` to the `RunnerResult` shape used
15
+ * by every other verify runner so it can be pushed into the `results`
16
+ * array in `runVerify` without special-casing. Returns a skipped
17
+ * result (`available: false`) when:
18
+ * - no `.maestro/` / `tests/maestro/` / `maestro/` flows are present;
19
+ * - the `maestro` CLI is not on PATH.
20
+ *
21
+ * `passed` flows count toward `passed`, `failed` flows toward `failed`,
22
+ * and `skipped` is always 0 (Maestro doesn't surface a skipped count).
23
+ */
24
+ export declare function runMaestroFlows(cwd: string, logPath: string): Promise<RunnerResult>;
12
25
  //# sourceMappingURL=maestro.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/runners/maestro.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtD;AAuGD,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiCzF"}
1
+ {"version":3,"file":"maestro.d.ts","sourceRoot":"","sources":["../../src/runners/maestro.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtD;AAuGD,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiCzF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAgCvB"}
@@ -1,4 +1,4 @@
1
- import { runCommand } from "./base.js";
1
+ import { runCommand, makeSkippedResult } from "./base.js";
2
2
  import { existsSync, mkdirSync, readdirSync } from "fs";
3
3
  import { join } from "path";
4
4
  const MAESTRO_FLOW_REL_DIRS = ["tests/maestro", ".maestro", "maestro"];
@@ -130,4 +130,40 @@ export async function runMaestroTests(cwd, logDir) {
130
130
  logPath,
131
131
  };
132
132
  }
133
+ /**
134
+ * 0.1.51 H9 — Adapt `runMaestroTests` to the `RunnerResult` shape used
135
+ * by every other verify runner so it can be pushed into the `results`
136
+ * array in `runVerify` without special-casing. Returns a skipped
137
+ * result (`available: false`) when:
138
+ * - no `.maestro/` / `tests/maestro/` / `maestro/` flows are present;
139
+ * - the `maestro` CLI is not on PATH.
140
+ *
141
+ * `passed` flows count toward `passed`, `failed` flows toward `failed`,
142
+ * and `skipped` is always 0 (Maestro doesn't surface a skipped count).
143
+ */
144
+ export async function runMaestroFlows(cwd, logPath) {
145
+ const flows = findMaestroFlows(cwd);
146
+ if (flows.length === 0) {
147
+ return makeSkippedResult("maestro_flows", "No Maestro flows found (looked under .maestro/, tests/maestro/, maestro/)");
148
+ }
149
+ if (!(await isMaestroInstalled())) {
150
+ return makeSkippedResult("maestro_flows", "maestro CLI not found on PATH. Install via `curl -Ls 'https://get.maestro.mobile.dev' | bash` (POSIX/macOS) and retry.");
151
+ }
152
+ const start = Date.now();
153
+ const logDir = join(logPath, "..");
154
+ const result = await runMaestroTests(cwd, logDir);
155
+ const duration_ms = Date.now() - start;
156
+ return {
157
+ runner_name: "maestro_flows",
158
+ available: true,
159
+ exit_code: result.passed ? 0 : 1,
160
+ passed: result.passedFlows,
161
+ failed: result.failedFlows,
162
+ skipped: 0,
163
+ log_path: result.logPath,
164
+ duration_ms,
165
+ stdout: "",
166
+ stderr: "",
167
+ };
168
+ }
133
169
  //# sourceMappingURL=maestro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"maestro.js","sourceRoot":"","sources":["../../src/runners/maestro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,MAAM,qBAAqB,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,GAAa;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAO,GAAG,EAAE;IACtC,OAAO;QACL,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,EAAE;QACnB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,yDAAyD;IACzD,+EAA+E;IAC/E,OAAO,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAc,EACd,SAAiB,EACjB,QAAgB;IAEhB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACjE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO;YACL,UAAU;YACV,WAAW;YACX,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3D,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,CAAC,CAAC,CAAC;YACV,CAAC;iBAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc;IAC/D,IAAI,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAErD,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,MAAM;QACN,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,eAAe;QACf,OAAO;KACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"maestro.js","sourceRoot":"","sources":["../../src/runners/maestro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { CodeLoopConfig } from "@codelooptech/shared";
2
+ /**
3
+ * 0.1.51 H11 — Cross-platform modal detector.
4
+ *
5
+ * Detects whether the running app currently has a foreground modal
6
+ * dialog (alert / confirm / sheet / overlay) that the agent must
7
+ * interact with before proceeding. The plan exposes 4 enforcement
8
+ * layers; this module is layer 1 (the detector) plus the building
9
+ * block for layer 4 (`codeloop_handle_modal`).
10
+ *
11
+ * Detection strategy:
12
+ * - Browser: query Playwright's page for alert/confirm dialogs
13
+ * and visible overlay elements (role=dialog, aria-modal=true,
14
+ * CSS classes that match common modal libraries).
15
+ * - Windows desktop: PowerShell + UIAutomation — walk the desktop
16
+ * tree for ControlType.Window with WindowVisualState=Normal AND
17
+ * IsModal=true (or, when IsModal isn't reliable, look for the
18
+ * OWNED-window pattern + small-screen-fraction heuristic).
19
+ * - macOS desktop: AppleScript — `every window of process whose
20
+ * subrole is "AXDialog" or "AXSystemDialog"`.
21
+ * - Linux desktop: xdotool / xprop walk for windows whose WM_NAME
22
+ * contains "Dialog" / "Confirm" / "Alert" or which set
23
+ * _NET_WM_WINDOW_TYPE_DIALOG.
24
+ * - Android / iOS: best-effort via dumpsys / xcrun — these
25
+ * surfaces are noisy enough that we treat the detector as
26
+ * optional and let codeloop_handle_modal fall through to a
27
+ * manual prompt (see the H11 docs entry in the plan).
28
+ *
29
+ * The detector NEVER fails the call; on any error it returns
30
+ * `is_modal_present: false` plus a `detection_error` string so the
31
+ * agent can decide whether to retry. Agents must NOT treat a false
32
+ * negative as proof there's no modal — the post-interact directive
33
+ * (layer 3) covers that case by always nudging the agent to look.
34
+ */
35
+ export interface ModalDetectionResult {
36
+ is_modal_present: boolean;
37
+ /** Human-readable description of the detected modal, when present. */
38
+ modal_description?: string;
39
+ /** Suggested action for the agent: "confirm" | "cancel" | "dismiss" | "inspect". */
40
+ suggested_action?: string;
41
+ /** Heuristic confidence 0-1; > 0.7 should be acted on. */
42
+ confidence?: number;
43
+ /** When the detector failed (e.g. UIA not installed), set so the agent doesn't double-fire. */
44
+ detection_error?: string;
45
+ /** target_type the detector ran against. */
46
+ target_type: "browser" | "desktop" | "android_emulator" | "ios_simulator" | "unknown";
47
+ }
48
+ export declare function detectModal(opts: {
49
+ target_type?: "browser" | "desktop" | "android_emulator" | "ios_simulator";
50
+ app_name?: string;
51
+ cwd: string;
52
+ config?: CodeLoopConfig;
53
+ }): Promise<ModalDetectionResult>;
54
+ /**
55
+ * Heuristic for whether a given action is "modal-related" — used by
56
+ * layer 2 (pre-interact block) to decide whether an unrelated action
57
+ * should be refused while a modal is open.
58
+ */
59
+ export declare function isModalRelatedAction(action: string): boolean;
60
+ //# sourceMappingURL=modal_detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal_detector.d.ts","sourceRoot":"","sources":["../../src/runners/modal_detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,WAAW,EAAE,SAAS,GAAG,SAAS,GAAG,kBAAkB,GAAG,eAAe,GAAG,SAAS,CAAC;CACvF;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,WAAW,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,kBAAkB,GAAG,eAAe,CAAC;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiBhC;AA6ID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAiB5D"}