@validate.qa/runner 1.0.57 → 1.0.58

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/dist/cli.js CHANGED
@@ -5276,6 +5276,12 @@ var init_auth_state_freshness = __esm({
5276
5276
  function detectSkippedApiCoverage(steps) {
5277
5277
  const allSkipped = steps.length > 0 && steps.every((s) => s.status === "skipped");
5278
5278
  if (allSkipped) {
5279
+ if (steps.every((s) => s.skipKind === "fixme")) {
5280
+ return {
5281
+ detected: false,
5282
+ logLine: "All @api tests skipped, but EVERY skip is a deliberate fixme (intentional N/A \u2014 e.g. a UI-only redirect login) \u2014 NOT relabelling CONFIG_ISSUE"
5283
+ };
5284
+ }
5279
5285
  return {
5280
5286
  detected: true,
5281
5287
  error: (
@@ -75514,12 +75520,11 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
75514
75520
  keyboardRecoveryScreenId = currentScreenId ?? null;
75515
75521
  keyboardRecoverySameScreenTurns = 0;
75516
75522
  }
75517
- const keyboardLikelyOpen = (0, mobile_keyboard_js_1.hasFocusedEditableElement)(getLatest()?.screen.elements ?? []);
75518
- if (keyboardRecoverySameScreenTurns >= 4 && keyboardLikelyOpen && iteration - lastKeyboardRecoveryIteration > 4) {
75523
+ if (keyboardRecoverySameScreenTurns >= 4 && iteration - lastKeyboardRecoveryIteration > 4) {
75519
75524
  lastKeyboardRecoveryIteration = iteration;
75520
75525
  try {
75521
75526
  await (0, mobile_keyboard_js_1.dismissKeyboardForRetry)(driver);
75522
- log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen with a focused input).");
75527
+ log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen).");
75523
75528
  transientDirectives.push("HARNESS NOTE: the on-screen keyboard was just auto-dismissed because multiple turns stalled on this screen \u2014 controls it occluded (e.g. the form submit button) may now be visible. Call mobile_snapshot, then TAP the commit/submit control instead of re-filling fields.");
75524
75529
  } catch (error2) {
75525
75530
  (0, mobile_driver_errors_js_1.rethrowIfTerminalMobileDriverError)(error2);
@@ -84295,6 +84300,7 @@ ${args.directive}`);
84295
84300
  aiResponseCount += 1;
84296
84301
  const parsed = parseHealVerdict(content);
84297
84302
  if (!parsed) {
84303
+ options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
84298
84304
  markRecoverableTurn();
84299
84305
  pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
84300
84306
  continue;
@@ -350298,7 +350304,7 @@ var require_package4 = __commonJS({
350298
350304
  "package.json"(exports2, module2) {
350299
350305
  module2.exports = {
350300
350306
  name: "@validate.qa/runner",
350301
- version: "1.0.57",
350307
+ version: "1.0.58",
350302
350308
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
350303
350309
  bin: {
350304
350310
  "validate-runner": "dist/cli.js"
@@ -351977,6 +351983,12 @@ function isKeyboardAlreadyHiddenError(err) {
351977
351983
  return /keyboard.*(not|already).*(shown|visible|present|open)|no.*keyboard/i.test(message);
351978
351984
  }
351979
351985
  async function dismissKeyboard(sessionPath, platform3) {
351986
+ try {
351987
+ const shown = await appiumRequest(`${sessionPath}/appium/device/is_keyboard_shown`, { method: "GET" });
351988
+ if (readValue(shown) === false) return;
351989
+ } catch (err) {
351990
+ if (isAppiumDriverDeadError(err)) throw err;
351991
+ }
351980
351992
  if (platform3 === "ANDROID") {
351981
351993
  await pressBack(sessionPath);
351982
351994
  return;
@@ -356560,11 +356572,17 @@ var MobileBridgeDriver = class {
356560
356572
  }
356561
356573
  /** Type `value`; pass `bounds` to tap-to-focus first when nothing is focused. */
356562
356574
  async type(value, bounds) {
356563
- return this.runAction(() => typeText(this.sessionPath, value, bounds));
356575
+ return this.runAction(async () => {
356576
+ await typeText(this.sessionPath, value, bounds);
356577
+ await hideKeyboardIfShown(this.sessionPath);
356578
+ });
356564
356579
  }
356565
356580
  /** Invoke the focused field's Enter/Done action without clearing its value. */
356566
356581
  async submitKeyboard(bounds) {
356567
- return this.runAction(() => submitKeyboard(this.sessionPath, bounds));
356582
+ return this.runAction(async () => {
356583
+ await submitKeyboard(this.sessionPath, bounds);
356584
+ await hideKeyboardIfShown(this.sessionPath);
356585
+ });
356568
356586
  }
356569
356587
  /** Clear the focused element; pass `bounds` to tap-to-focus first. */
356570
356588
  async clear(bounds) {
package/dist/cli.mjs CHANGED
@@ -5281,6 +5281,12 @@ var init_auth_state_freshness = __esm({
5281
5281
  function detectSkippedApiCoverage(steps) {
5282
5282
  const allSkipped = steps.length > 0 && steps.every((s) => s.status === "skipped");
5283
5283
  if (allSkipped) {
5284
+ if (steps.every((s) => s.skipKind === "fixme")) {
5285
+ return {
5286
+ detected: false,
5287
+ logLine: "All @api tests skipped, but EVERY skip is a deliberate fixme (intentional N/A \u2014 e.g. a UI-only redirect login) \u2014 NOT relabelling CONFIG_ISSUE"
5288
+ };
5289
+ }
5284
5290
  return {
5285
5291
  detected: true,
5286
5292
  error: (
@@ -75519,12 +75525,11 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
75519
75525
  keyboardRecoveryScreenId = currentScreenId ?? null;
75520
75526
  keyboardRecoverySameScreenTurns = 0;
75521
75527
  }
75522
- const keyboardLikelyOpen = (0, mobile_keyboard_js_1.hasFocusedEditableElement)(getLatest()?.screen.elements ?? []);
75523
- if (keyboardRecoverySameScreenTurns >= 4 && keyboardLikelyOpen && iteration - lastKeyboardRecoveryIteration > 4) {
75528
+ if (keyboardRecoverySameScreenTurns >= 4 && iteration - lastKeyboardRecoveryIteration > 4) {
75524
75529
  lastKeyboardRecoveryIteration = iteration;
75525
75530
  try {
75526
75531
  await (0, mobile_keyboard_js_1.dismissKeyboardForRetry)(driver);
75527
- log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen with a focused input).");
75532
+ log2(" Auto-dismissed the on-screen keyboard (several turns stalled on this screen).");
75528
75533
  transientDirectives.push("HARNESS NOTE: the on-screen keyboard was just auto-dismissed because multiple turns stalled on this screen \u2014 controls it occluded (e.g. the form submit button) may now be visible. Call mobile_snapshot, then TAP the commit/submit control instead of re-filling fields.");
75529
75534
  } catch (error2) {
75530
75535
  (0, mobile_driver_errors_js_1.rethrowIfTerminalMobileDriverError)(error2);
@@ -84300,6 +84305,7 @@ ${args.directive}`);
84300
84305
  aiResponseCount += 1;
84301
84306
  const parsed = parseHealVerdict(content);
84302
84307
  if (!parsed) {
84308
+ options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
84303
84309
  markRecoverableTurn();
84304
84310
  pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
84305
84311
  continue;
@@ -350303,7 +350309,7 @@ var require_package4 = __commonJS({
350303
350309
  "package.json"(exports, module) {
350304
350310
  module.exports = {
350305
350311
  name: "@validate.qa/runner",
350306
- version: "1.0.57",
350312
+ version: "1.0.58",
350307
350313
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
350308
350314
  bin: {
350309
350315
  "validate-runner": "dist/cli.js"
@@ -351982,6 +351988,12 @@ function isKeyboardAlreadyHiddenError(err) {
351982
351988
  return /keyboard.*(not|already).*(shown|visible|present|open)|no.*keyboard/i.test(message);
351983
351989
  }
351984
351990
  async function dismissKeyboard(sessionPath, platform3) {
351991
+ try {
351992
+ const shown = await appiumRequest(`${sessionPath}/appium/device/is_keyboard_shown`, { method: "GET" });
351993
+ if (readValue(shown) === false) return;
351994
+ } catch (err) {
351995
+ if (isAppiumDriverDeadError(err)) throw err;
351996
+ }
351985
351997
  if (platform3 === "ANDROID") {
351986
351998
  await pressBack(sessionPath);
351987
351999
  return;
@@ -356568,11 +356580,17 @@ var MobileBridgeDriver = class {
356568
356580
  }
356569
356581
  /** Type `value`; pass `bounds` to tap-to-focus first when nothing is focused. */
356570
356582
  async type(value, bounds) {
356571
- return this.runAction(() => typeText(this.sessionPath, value, bounds));
356583
+ return this.runAction(async () => {
356584
+ await typeText(this.sessionPath, value, bounds);
356585
+ await hideKeyboardIfShown(this.sessionPath);
356586
+ });
356572
356587
  }
356573
356588
  /** Invoke the focused field's Enter/Done action without clearing its value. */
356574
356589
  async submitKeyboard(bounds) {
356575
- return this.runAction(() => submitKeyboard(this.sessionPath, bounds));
356590
+ return this.runAction(async () => {
356591
+ await submitKeyboard(this.sessionPath, bounds);
356592
+ await hideKeyboardIfShown(this.sessionPath);
356593
+ });
356576
356594
  }
356577
356595
  /** Clear the focused element; pass `bounds` to tap-to-focus first. */
356578
356596
  async clear(bounds) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@validate.qa/runner",
3
- "version": "1.0.57",
3
+ "version": "1.0.58",
4
4
  "description": "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
5
5
  "bin": {
6
6
  "validate-runner": "dist/cli.js"