codeloop-mcp-server 0.1.62 → 0.1.64

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 (55) 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/auth/key_resolver.d.ts +55 -0
  5. package/dist/auth/key_resolver.d.ts.map +1 -0
  6. package/dist/auth/key_resolver.js +41 -0
  7. package/dist/auth/key_resolver.js.map +1 -0
  8. package/dist/auth/key_source.d.ts +60 -4
  9. package/dist/auth/key_source.d.ts.map +1 -1
  10. package/dist/auth/key_source.js +281 -48
  11. package/dist/auth/key_source.js.map +1 -1
  12. package/dist/evidence/observability.d.ts +67 -0
  13. package/dist/evidence/observability.d.ts.map +1 -0
  14. package/dist/evidence/observability.js +57 -0
  15. package/dist/evidence/observability.js.map +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +91 -5
  18. package/dist/index.js.map +1 -1
  19. package/dist/runners/app_logger.d.ts.map +1 -1
  20. package/dist/runners/app_logger.js +31 -3
  21. package/dist/runners/app_logger.js.map +1 -1
  22. package/dist/runners/logging_readiness.d.ts +72 -0
  23. package/dist/runners/logging_readiness.d.ts.map +1 -0
  24. package/dist/runners/logging_readiness.js +419 -0
  25. package/dist/runners/logging_readiness.js.map +1 -0
  26. package/dist/runners/modal_close_strategies.d.ts +23 -0
  27. package/dist/runners/modal_close_strategies.d.ts.map +1 -1
  28. package/dist/runners/modal_close_strategies.js +59 -0
  29. package/dist/runners/modal_close_strategies.js.map +1 -1
  30. package/dist/runners/modal_detector.d.ts +36 -0
  31. package/dist/runners/modal_detector.d.ts.map +1 -1
  32. package/dist/runners/modal_detector.js +160 -78
  33. package/dist/runners/modal_detector.js.map +1 -1
  34. package/dist/runners/remote_logs.d.ts +105 -0
  35. package/dist/runners/remote_logs.d.ts.map +1 -0
  36. package/dist/runners/remote_logs.js +336 -0
  37. package/dist/runners/remote_logs.js.map +1 -0
  38. package/dist/runners/win_accessibility.d.ts.map +1 -1
  39. package/dist/runners/win_accessibility.js +3 -6
  40. package/dist/runners/win_accessibility.js.map +1 -1
  41. package/dist/runners/window_manager.d.ts +24 -0
  42. package/dist/runners/window_manager.d.ts.map +1 -1
  43. package/dist/runners/window_manager.js +70 -0
  44. package/dist/runners/window_manager.js.map +1 -1
  45. package/dist/tools/gate_check.d.ts.map +1 -1
  46. package/dist/tools/gate_check.js +25 -0
  47. package/dist/tools/gate_check.js.map +1 -1
  48. package/dist/tools/interaction_replay.d.ts +18 -0
  49. package/dist/tools/interaction_replay.d.ts.map +1 -1
  50. package/dist/tools/interaction_replay.js +102 -1
  51. package/dist/tools/interaction_replay.js.map +1 -1
  52. package/dist/tools/verify.d.ts.map +1 -1
  53. package/dist/tools/verify.js +61 -5
  54. package/dist/tools/verify.js.map +1 -1
  55. package/package.json +2 -2
@@ -0,0 +1,336 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { checkToolAvailable, runCommand } from "./base.js";
4
+ const FILE = "remote_logs.json";
5
+ function fileExists(cwd, ...names) {
6
+ return names.some((n) => existsSync(join(cwd, n)));
7
+ }
8
+ function pkgIncludes(cwd, re) {
9
+ try {
10
+ const p = join(cwd, "package.json");
11
+ return existsSync(p) && re.test(readFileSync(p, "utf-8"));
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ function hasEnvRef(cwd, re) {
18
+ for (const f of [".env", ".env.local", ".env.production"]) {
19
+ try {
20
+ const p = join(cwd, f);
21
+ if (existsSync(p) && re.test(readFileSync(p, "utf-8")))
22
+ return true;
23
+ }
24
+ catch {
25
+ /* ignore */
26
+ }
27
+ }
28
+ return false;
29
+ }
30
+ /**
31
+ * Built-in provider registry. Covers the common deploy + SaaS targets; the
32
+ * long tail is handled via config.remote_logs.providers overrides.
33
+ */
34
+ export const PROVIDER_REGISTRY = [
35
+ {
36
+ id: "vercel",
37
+ displayName: "Vercel",
38
+ cli: "vercel",
39
+ detect: (cwd) => fileExists(cwd, "vercel.json", ".vercel") || pkgIncludes(cwd, /"vercel"/),
40
+ logsArgs: () => null, // `vercel logs <deployment-url>` needs a target
41
+ installHint: "npm i -g vercel (then `vercel login`)",
42
+ },
43
+ {
44
+ id: "netlify",
45
+ displayName: "Netlify",
46
+ cli: "netlify",
47
+ detect: (cwd) => fileExists(cwd, "netlify.toml", ".netlify"),
48
+ logsArgs: () => null, // `netlify logs:function <name>` needs a function target
49
+ installHint: "npm i -g netlify-cli (then `netlify login`)",
50
+ },
51
+ {
52
+ id: "heroku",
53
+ displayName: "Heroku",
54
+ cli: "heroku",
55
+ detect: (cwd) => fileExists(cwd, "Procfile", "app.json") || hasGitRemoteMatch(cwd, /heroku/),
56
+ logsArgs: (tail) => ["logs", "-n", String(tail)],
57
+ installHint: "https://devcenter.heroku.com/articles/heroku-cli (then `heroku login`)",
58
+ },
59
+ {
60
+ id: "fly",
61
+ displayName: "Fly.io",
62
+ cli: "fly",
63
+ detect: (cwd) => fileExists(cwd, "fly.toml"),
64
+ logsArgs: () => ["logs"], // streams; killed by timeout, partial output captured
65
+ installHint: "https://fly.io/docs/flyctl/install/ (then `fly auth login`)",
66
+ },
67
+ {
68
+ id: "railway",
69
+ displayName: "Railway",
70
+ cli: "railway",
71
+ detect: (cwd) => fileExists(cwd, "railway.json", "railway.toml"),
72
+ logsArgs: () => ["logs"],
73
+ installHint: "npm i -g @railway/cli (then `railway login`)",
74
+ },
75
+ {
76
+ id: "render",
77
+ displayName: "Render",
78
+ cli: "render",
79
+ detect: (cwd) => fileExists(cwd, "render.yaml"),
80
+ logsArgs: () => null, // needs a service id
81
+ installHint: "https://render.com/docs/cli (then `render login`)",
82
+ },
83
+ {
84
+ id: "cloudflare",
85
+ displayName: "Cloudflare Workers",
86
+ cli: "wrangler",
87
+ detect: (cwd) => fileExists(cwd, "wrangler.toml", "wrangler.jsonc", "wrangler.json"),
88
+ logsArgs: () => ["tail", "--format", "json"], // streams; killed by timeout
89
+ installHint: "npm i -g wrangler (then `wrangler login`)",
90
+ },
91
+ {
92
+ id: "firebase",
93
+ displayName: "Firebase",
94
+ cli: "firebase",
95
+ detect: (cwd) => fileExists(cwd, "firebase.json", ".firebaserc"),
96
+ logsArgs: (tail) => ["functions:log", "-n", String(tail)],
97
+ installHint: "npm i -g firebase-tools (then `firebase login`)",
98
+ },
99
+ {
100
+ id: "gcloud",
101
+ displayName: "Google Cloud",
102
+ cli: "gcloud",
103
+ detect: (cwd) => fileExists(cwd, "app.yaml", ".gcloudignore", "cloudbuild.yaml"),
104
+ logsArgs: (tail) => ["logging", "read", "severity>=ERROR", "--limit", String(tail), "--freshness=1d"],
105
+ installHint: "https://cloud.google.com/sdk/docs/install (then `gcloud auth login`)",
106
+ },
107
+ {
108
+ id: "aws",
109
+ displayName: "AWS CloudWatch",
110
+ cli: "aws",
111
+ detect: (cwd) => fileExists(cwd, "serverless.yml", "serverless.yaml", "samconfig.toml", "template.yaml", "cdk.json"),
112
+ logsArgs: () => null, // `aws logs tail <log-group>` needs the group name
113
+ installHint: "https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html (then `aws configure`)",
114
+ },
115
+ {
116
+ id: "supabase",
117
+ displayName: "Supabase",
118
+ cli: "supabase",
119
+ detect: (cwd) => fileExists(cwd, "supabase") || pkgIncludes(cwd, /"@supabase\/supabase-js"/),
120
+ logsArgs: () => null,
121
+ installHint: "npm i -g supabase (then `supabase login`)",
122
+ },
123
+ {
124
+ id: "stripe",
125
+ displayName: "Stripe",
126
+ cli: "stripe",
127
+ detect: (cwd) => pkgIncludes(cwd, /"stripe"/) || hasEnvRef(cwd, /STRIPE_(SECRET|API)_KEY/),
128
+ logsArgs: () => ["logs", "tail"], // streams; killed by timeout
129
+ installHint: "https://stripe.com/docs/stripe-cli (then `stripe login`)",
130
+ },
131
+ {
132
+ id: "convex",
133
+ displayName: "Convex",
134
+ cli: "convex",
135
+ detect: (cwd) => fileExists(cwd, "convex") || pkgIncludes(cwd, /"convex"/),
136
+ logsArgs: () => ["logs"],
137
+ installHint: "npm i -g convex (then `npx convex login`)",
138
+ },
139
+ ];
140
+ function hasGitRemoteMatch(cwd, re) {
141
+ try {
142
+ const cfg = join(cwd, ".git", "config");
143
+ return existsSync(cfg) && re.test(readFileSync(cfg, "utf-8"));
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ /**
150
+ * Pure: pick the candidate providers given the project, config, and registry.
151
+ * - mode "off" / enabled:false -> []
152
+ * - mode "configured" -> only providers explicitly listed in config (enabled).
153
+ * - mode "auto" (default) -> registry providers whose detect() matches, PLUS
154
+ * any explicitly-configured providers; config can disable a provider.
155
+ */
156
+ export function selectRemoteLogCandidates(cwd, config, registry = PROVIDER_REGISTRY) {
157
+ if (config.enabled === false || config.mode === "off")
158
+ return [];
159
+ const mode = config.mode ?? "auto";
160
+ const overrides = new Map((config.providers ?? []).map((p) => [p.id, p]));
161
+ const byId = new Map(registry.map((p) => [p.id, p]));
162
+ const out = [];
163
+ const seen = new Set();
164
+ const pushCandidate = (provider) => {
165
+ if (seen.has(provider.id))
166
+ return;
167
+ const ov = overrides.get(provider.id);
168
+ if (ov?.enabled === false)
169
+ return;
170
+ seen.add(provider.id);
171
+ out.push({
172
+ provider,
173
+ cli: ov?.cli ?? provider.cli,
174
+ commandOverride: ov?.logs_command,
175
+ installHint: ov?.install_hint ?? provider.installHint,
176
+ });
177
+ };
178
+ if (mode === "auto") {
179
+ for (const provider of registry) {
180
+ try {
181
+ if (provider.detect(cwd))
182
+ pushCandidate(provider);
183
+ }
184
+ catch {
185
+ /* detect is best-effort */
186
+ }
187
+ }
188
+ }
189
+ // Explicitly-configured providers are always candidates (both modes).
190
+ for (const ov of config.providers ?? []) {
191
+ if (ov.enabled === false)
192
+ continue;
193
+ const known = byId.get(ov.id);
194
+ if (known) {
195
+ pushCandidate(known);
196
+ }
197
+ else if (ov.cli || ov.logs_command) {
198
+ // Custom provider not in the registry — long-tail CLI support.
199
+ seen.add(ov.id);
200
+ out.push({
201
+ provider: {
202
+ id: ov.id,
203
+ displayName: ov.id,
204
+ cli: ov.cli ?? ov.id,
205
+ detect: () => true,
206
+ logsArgs: () => null,
207
+ installHint: ov.install_hint ?? `install the ${ov.id} CLI`,
208
+ },
209
+ cli: ov.cli ?? ov.id,
210
+ commandOverride: ov.logs_command,
211
+ installHint: ov.install_hint ?? `install the ${ov.id} CLI`,
212
+ });
213
+ }
214
+ }
215
+ return out;
216
+ }
217
+ const AUTH_ERROR_RE = /(not (logged in|authenticated)|unauthorized|please (log|sign) ?in|run `?\w+ login|no active account|credentials? (not|missing)|401 )/i;
218
+ /**
219
+ * Collect remote logs. Best-effort: never throws. Writes remote_logs.json
220
+ * into runDir and the per-provider logs into logDir.
221
+ */
222
+ export async function collectRemoteLogs(cwd, config, logDir) {
223
+ const mode = config.mode ?? "auto";
224
+ const ev = {
225
+ generated_at: new Date().toISOString(),
226
+ enabled: config.enabled !== false && mode !== "off",
227
+ mode,
228
+ detected: [],
229
+ captured: [],
230
+ missing_clis: [],
231
+ auth_needed: [],
232
+ needs_config: [],
233
+ };
234
+ if (!ev.enabled) {
235
+ ev.reason = "remote log collection disabled in config";
236
+ return ev;
237
+ }
238
+ const tail = config.tail_lines ?? 200;
239
+ const timeoutMs = (config.timeout_seconds ?? 25) * 1000;
240
+ let candidates;
241
+ try {
242
+ candidates = selectRemoteLogCandidates(cwd, config);
243
+ }
244
+ catch {
245
+ candidates = [];
246
+ }
247
+ ev.detected = candidates.map((c) => c.provider.id);
248
+ for (const cand of candidates) {
249
+ try {
250
+ const installed = await checkToolAvailable(cand.cli);
251
+ if (!installed) {
252
+ ev.missing_clis.push({
253
+ id: cand.provider.id,
254
+ displayName: cand.provider.displayName,
255
+ cli: cand.cli,
256
+ install_hint: cand.installHint,
257
+ });
258
+ continue;
259
+ }
260
+ let cmd;
261
+ let args;
262
+ if (cand.commandOverride) {
263
+ const parts = cand.commandOverride.split(/\s+/).filter(Boolean);
264
+ cmd = parts[0];
265
+ args = parts.slice(1);
266
+ }
267
+ else {
268
+ const a = cand.provider.logsArgs(tail);
269
+ if (!a) {
270
+ ev.needs_config.push(cand.provider.id);
271
+ continue;
272
+ }
273
+ cmd = cand.cli;
274
+ args = a;
275
+ }
276
+ mkdirSync(logDir, { recursive: true });
277
+ const outPath = join(logDir, `remote_${cand.provider.id}.log`);
278
+ const res = await runCommand(cmd, args, cwd, undefined, undefined, timeoutMs);
279
+ const body = `$ ${cmd} ${args.join(" ")}\nexit_code: ${res.exit_code}\n\n${res.stdout}\n${res.stderr}\n`;
280
+ try {
281
+ writeFileSync(outPath, body, "utf-8");
282
+ }
283
+ catch {
284
+ /* best-effort */
285
+ }
286
+ if (AUTH_ERROR_RE.test(res.stderr) || AUTH_ERROR_RE.test(res.stdout)) {
287
+ ev.auth_needed.push(cand.provider.id);
288
+ continue;
289
+ }
290
+ ev.captured.push({
291
+ id: cand.provider.id,
292
+ displayName: cand.provider.displayName,
293
+ path: outPath,
294
+ command: `${cmd} ${args.join(" ")}`,
295
+ });
296
+ }
297
+ catch {
298
+ /* one provider failing must never break the others or verify */
299
+ }
300
+ }
301
+ return ev;
302
+ }
303
+ export function writeRemoteLogsEvidence(runDir, ev) {
304
+ try {
305
+ mkdirSync(runDir, { recursive: true });
306
+ writeFileSync(join(runDir, FILE), JSON.stringify(ev, null, 2), "utf-8");
307
+ }
308
+ catch {
309
+ /* best-effort */
310
+ }
311
+ }
312
+ export function loadRemoteLogsEvidence(runDir) {
313
+ const p = join(runDir, FILE);
314
+ if (!existsSync(p))
315
+ return null;
316
+ try {
317
+ return JSON.parse(readFileSync(p, "utf-8"));
318
+ }
319
+ catch {
320
+ return null;
321
+ }
322
+ }
323
+ /** Captured remote log files in a run's logs dir, for runtime_log_scan. */
324
+ export function listCapturedRemoteLogs(logDir) {
325
+ if (!existsSync(logDir))
326
+ return [];
327
+ try {
328
+ return readdirSync(logDir)
329
+ .filter((f) => f.startsWith("remote_") && f.endsWith(".log"))
330
+ .map((f) => ({ source: f.replace(/\.log$/, ""), path: join(logDir, f) }));
331
+ }
332
+ catch {
333
+ return [];
334
+ }
335
+ }
336
+ //# sourceMappingURL=remote_logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote_logs.js","sourceRoot":"","sources":["../../src/runners/remote_logs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"win_accessibility.d.ts","sourceRoot":"","sources":["../../src/runners/win_accessibility.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD7F;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,eAAe,CAAC;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAC9D,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAC9D,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA0MzB"}
1
+ {"version":3,"file":"win_accessibility.d.ts","sourceRoot":"","sources":["../../src/runners/win_accessibility.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoD7F;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,eAAe,CAAC;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAC9D,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAC9D,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAwMzB"}
@@ -1,5 +1,6 @@
1
1
  import { platform } from "os";
2
2
  import { runCommand, checkToolAvailable } from "./base.js";
3
+ import { buildUiaAppElementLookup } from "./window_manager.js";
3
4
  export async function inspectUITree(appName) {
4
5
  if (platform() !== "win32") {
5
6
  return { error: "UI Automation is only available on Windows" };
@@ -31,9 +32,7 @@ function Get-UITree($element, $depth) {
31
32
  return $children
32
33
  }
33
34
 
34
- $root = [System.Windows.Automation.AutomationElement]::RootElement
35
- $condition = New-Object System.Windows.Automation.PropertyCondition([System.Windows.Automation.AutomationElement]::NameProperty, "${appName}")
36
- $appElement = $root.FindFirst([System.Windows.Automation.TreeScope]::Children, $condition)
35
+ ${buildUiaAppElementLookup(appName)}
37
36
 
38
37
  if ($appElement) {
39
38
  $tree = Get-UITree $appElement 0
@@ -88,9 +87,7 @@ $ErrorActionPreference = 'Stop'
88
87
  Add-Type -AssemblyName UIAutomationClient
89
88
  Add-Type -AssemblyName UIAutomationTypes
90
89
 
91
- $root = [System.Windows.Automation.AutomationElement]::RootElement
92
- $appCondition = New-Object System.Windows.Automation.PropertyCondition([System.Windows.Automation.AutomationElement]::NameProperty, "${appName}")
93
- $appElement = $root.FindFirst([System.Windows.Automation.TreeScope]::Children, $appCondition)
90
+ ${buildUiaAppElementLookup(appName)}
94
91
  if (-not $appElement) {
95
92
  Write-Output (ConvertTo-Json @{ success = $false; reason = 'app-not-found' } -Compress)
96
93
  exit 1
@@ -1 +1 @@
1
- {"version":3,"file":"win_accessibility.js","sourceRoot":"","sources":["../../src/runners/win_accessibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"win_accessibility.js","sourceRoot":"","sources":["../../src/runners/win_accessibility.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,30 @@ export declare function findWindowIdDetailed(appName: string): Promise<WindowLoo
54
54
  * filter has its own `Select-Object -First 1`.
55
55
  */
56
56
  export declare function buildWindowsProcessLookup(appName: string): string;
57
+ /**
58
+ * 0.1.63 H12 — robust UIA app-window resolver.
59
+ *
60
+ * win_ui_inspect / win_ui_automate previously located the app window
61
+ * with an EXACT NameProperty match:
62
+ * PropertyCondition(NameProperty, appName)
63
+ * so a caller passing app_name="Photometry DB" never matched the live
64
+ * window title "PhotometryDB - Professional Photometric Data Management"
65
+ * (no space, extra suffix) and every inspect returned the unhelpful
66
+ * "App window not found". The Photometry-DB delete-confirm E2E showed
67
+ * the agent fall back to coordinate guessing because of this.
68
+ *
69
+ * This emits a PowerShell block that sets `$appElement` to the running
70
+ * app's top-level Window via a tolerant ladder:
71
+ * 1. exact Name match
72
+ * 2. whitespace-insensitive, case-insensitive contains (either way)
73
+ * 3. owning-process match (ProcessName / MainWindowTitle fuzzy) so a
74
+ * window whose title doesn't embed the app name at all still resolves
75
+ *
76
+ * Requires `Add-Type -AssemblyName UIAutomationClient` to have run
77
+ * already (both call sites do). Uses `cl`-prefixed variable names so it
78
+ * can't collide with the caller's `$appElement` consumers.
79
+ */
80
+ export declare function buildUiaAppElementLookup(appName: string): string;
57
81
  /**
58
82
  * Bring an app to the front, un-minimizing if needed.
59
83
  * Returns the name/title of the previously frontmost app for later restoration.
@@ -1 +1 @@
1
- {"version":3,"file":"window_manager.d.ts","sourceRoot":"","sources":["../../src/runners/window_manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"window_manager.d.ts","sourceRoot":"","sources":["../../src/runners/window_manager.ts"],"names":[],"mappings":"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"}
@@ -160,12 +160,82 @@ export function buildWindowsProcessLookup(appName) {
160
160
  const regexLiteral = appName
161
161
  .replace(/'/g, "''")
162
162
  .replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
163
+ // 0.1.63 H12 — whitespace-insensitive fallback. The Photometry-DB
164
+ // window title is "PhotometryDB - Professional Photometric Data
165
+ // Management" but evidence.target_app / app_name is "Photometry DB"
166
+ // (with a space). The exact / starts-with / substring ladder all
167
+ // miss because "Photometry DB" is not a substring of "PhotometryDB".
168
+ // Stripping ALL whitespace from both sides lets the two reconcile.
169
+ // -like is case-insensitive in PowerShell; we escape the wildcard
170
+ // metacharacters so a literal '[' in an app name can't break it.
171
+ const normLiteral = appName
172
+ .replace(/\s+/g, "")
173
+ .replace(/'/g, "''")
174
+ .replace(/([[\]*?])/g, "`$1");
163
175
  return `
164
176
  $candidates = Get-Process | Where-Object { $_.MainWindowHandle -ne 0 }
165
177
  $proc = $candidates | Where-Object { $_.ProcessName -eq '${psLiteral}' } | Select-Object -First 1
166
178
  if (-not $proc) { $proc = $candidates | Where-Object { $_.MainWindowTitle -eq '${psLiteral}' } | Select-Object -First 1 }
167
179
  if (-not $proc) { $proc = $candidates | Where-Object { $_.MainWindowTitle -like '${psLiteral}*' } | Select-Object -First 1 }
168
180
  if (-not $proc) { $proc = $candidates | Where-Object { $_.MainWindowTitle -match '${regexLiteral}' } | Select-Object -First 1 }
181
+ if (-not $proc) { $proc = $candidates | Where-Object { ($_.ProcessName -replace '\\s','') -like '${normLiteral}' } | Select-Object -First 1 }
182
+ if (-not $proc) { $proc = $candidates | Where-Object { $_.MainWindowTitle -and (($_.MainWindowTitle -replace '\\s','') -like '*${normLiteral}*') } | Select-Object -First 1 }
183
+ `;
184
+ }
185
+ /**
186
+ * 0.1.63 H12 — robust UIA app-window resolver.
187
+ *
188
+ * win_ui_inspect / win_ui_automate previously located the app window
189
+ * with an EXACT NameProperty match:
190
+ * PropertyCondition(NameProperty, appName)
191
+ * so a caller passing app_name="Photometry DB" never matched the live
192
+ * window title "PhotometryDB - Professional Photometric Data Management"
193
+ * (no space, extra suffix) and every inspect returned the unhelpful
194
+ * "App window not found". The Photometry-DB delete-confirm E2E showed
195
+ * the agent fall back to coordinate guessing because of this.
196
+ *
197
+ * This emits a PowerShell block that sets `$appElement` to the running
198
+ * app's top-level Window via a tolerant ladder:
199
+ * 1. exact Name match
200
+ * 2. whitespace-insensitive, case-insensitive contains (either way)
201
+ * 3. owning-process match (ProcessName / MainWindowTitle fuzzy) so a
202
+ * window whose title doesn't embed the app name at all still resolves
203
+ *
204
+ * Requires `Add-Type -AssemblyName UIAutomationClient` to have run
205
+ * already (both call sites do). Uses `cl`-prefixed variable names so it
206
+ * can't collide with the caller's `$appElement` consumers.
207
+ */
208
+ export function buildUiaAppElementLookup(appName) {
209
+ const psLiteral = appName.replace(/'/g, "''");
210
+ return `
211
+ $clTarget = '${psLiteral}'
212
+ $clNorm = ($clTarget -replace '\\s','').ToLowerInvariant()
213
+ $clRoot = [System.Windows.Automation.AutomationElement]::RootElement
214
+ $clWinCond = New-Object System.Windows.Automation.PropertyCondition([System.Windows.Automation.AutomationElement]::ControlTypeProperty, [System.Windows.Automation.ControlType]::Window)
215
+ $clWins = $clRoot.FindAll([System.Windows.Automation.TreeScope]::Children, $clWinCond)
216
+ $appElement = $null
217
+ foreach ($clW in $clWins) { try { if ($clW.Current.Name -eq $clTarget) { $appElement = $clW; break } } catch {} }
218
+ if (-not $appElement) {
219
+ foreach ($clW in $clWins) {
220
+ try {
221
+ $clN = $clW.Current.Name
222
+ if ([string]::IsNullOrWhiteSpace($clN)) { continue }
223
+ $clNn = ($clN -replace '\\s','').ToLowerInvariant()
224
+ if ($clNn -eq $clNorm -or $clNn.Contains($clNorm) -or $clNorm.Contains($clNn)) { $appElement = $clW; break }
225
+ } catch {}
226
+ }
227
+ }
228
+ if (-not $appElement -and $clNorm.Length -gt 0) {
229
+ try {
230
+ $clPids = @(Get-Process | Where-Object {
231
+ ($_.ProcessName -replace '\\s','').ToLowerInvariant() -eq $clNorm -or
232
+ ($_.MainWindowTitle -and ((($_.MainWindowTitle -replace '\\s','').ToLowerInvariant()).Contains($clNorm)))
233
+ } | Select-Object -ExpandProperty Id)
234
+ if ($clPids.Count -gt 0) {
235
+ foreach ($clW in $clWins) { try { if ($clPids -contains $clW.Current.ProcessId) { $appElement = $clW; break } } catch {} }
236
+ }
237
+ } catch {}
238
+ }
169
239
  `;
170
240
  }
171
241
  async function findWindowsWindowId(appName) {