@validate.qa/runner 1.0.59 → 1.0.60

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 (3) hide show
  1. package/dist/cli.js +109 -3
  2. package/dist/cli.mjs +109 -3
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -73342,6 +73342,58 @@ var require_verification_inbox = __commonJS({
73342
73342
  }
73343
73343
  });
73344
73344
 
73345
+ // ../runner-core/dist/services/brokered-inbox-reader.js
73346
+ var require_brokered_inbox_reader = __commonJS({
73347
+ "../runner-core/dist/services/brokered-inbox-reader.js"(exports2) {
73348
+ "use strict";
73349
+ Object.defineProperty(exports2, "__esModule", { value: true });
73350
+ exports2.BrokeredInboxReader = void 0;
73351
+ var BROKERED_WAIT_CHUNK_MS = 55e3;
73352
+ var BrokeredInboxReader = class {
73353
+ transport;
73354
+ constructor(transport) {
73355
+ this.transport = transport;
73356
+ }
73357
+ async getUidWatermark() {
73358
+ const value = await this.transport("getUidWatermark", {});
73359
+ const record = value ?? {};
73360
+ return {
73361
+ uid: typeof record.uid === "number" ? record.uid : 0,
73362
+ uidValidity: typeof record.uidValidity === "number" ? record.uidValidity : 0
73363
+ };
73364
+ }
73365
+ async search(opts) {
73366
+ const value = await this.transport("search", { opts });
73367
+ return Array.isArray(value) ? value : [];
73368
+ }
73369
+ async getLatest(opts) {
73370
+ const value = await this.transport("getLatest", { opts });
73371
+ return value ?? null;
73372
+ }
73373
+ async getById(uid, address, altAddress, freshness) {
73374
+ const value = await this.transport("getById", { uid, address, altAddress, freshness });
73375
+ return value ?? null;
73376
+ }
73377
+ async waitForMessage(opts) {
73378
+ const totalBudgetMs = Math.max(opts.maxWaitMs ?? 9e4, 1e3);
73379
+ const deadline = Date.now() + totalBudgetMs;
73380
+ for (; ; ) {
73381
+ const remaining = deadline - Date.now();
73382
+ if (remaining <= 0)
73383
+ return null;
73384
+ const chunkMs = Math.min(remaining, BROKERED_WAIT_CHUNK_MS);
73385
+ const value = await this.transport("waitForMessage", {
73386
+ opts: { ...opts, maxWaitMs: chunkMs }
73387
+ });
73388
+ if (value)
73389
+ return value;
73390
+ }
73391
+ }
73392
+ };
73393
+ exports2.BrokeredInboxReader = BrokeredInboxReader;
73394
+ }
73395
+ });
73396
+
73345
73397
  // ../runner-core/dist/services/inbox-tools.js
73346
73398
  var require_inbox_tools = __commonJS({
73347
73399
  "../runner-core/dist/services/inbox-tools.js"(exports2) {
@@ -74051,6 +74103,7 @@ var require_mobile_explorer = __commonJS({
74051
74103
  var mobile_auth_coverage_js_1 = require_mobile_auth_coverage();
74052
74104
  var mobile_driver_errors_js_1 = require_mobile_driver_errors();
74053
74105
  var verification_inbox_js_1 = require_verification_inbox();
74106
+ var brokered_inbox_reader_js_1 = require_brokered_inbox_reader();
74054
74107
  var inbox_tools_js_1 = require_inbox_tools();
74055
74108
  var mobile_discovery_auth_js_1 = require_mobile_discovery_auth();
74056
74109
  var MAX_MOBILE_ITERATIONS_SURVEY = 40;
@@ -75372,6 +75425,23 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
75372
75425
  log: (line) => log2(line)
75373
75426
  });
75374
75427
  log2("Verification inbox ENABLED for registration \u2014 monitored identity provisioned.");
75428
+ } else if (registerRequested && ctx.inboxBroker?.address && ctx.inboxBrokerRead) {
75429
+ inboxState = (0, inbox_tools_js_1.createInboxRunState)({ address: ctx.inboxBroker.address }, {
75430
+ tagSeed: targetAppId ?? ctx.projectId,
75431
+ projectScope: ctx.projectId
75432
+ });
75433
+ inboxReader = new brokered_inbox_reader_js_1.BrokeredInboxReader(ctx.inboxBrokerRead);
75434
+ await (0, inbox_tools_js_1.applyAndPersistInboxIdentity)({
75435
+ variableContext: ctx.variableContext,
75436
+ registration: {
75437
+ email: inboxState.email,
75438
+ legacyEmail: inboxState.legacyEmail,
75439
+ passwordKey: inboxState.passwordKey ?? "TEST_USER_PASSWORD"
75440
+ },
75441
+ persist: ctx.onCredentialUpdate,
75442
+ log: (line) => log2(line)
75443
+ });
75444
+ log2("Verification inbox ENABLED via server broker \u2014 monitored identity provisioned (IMAP credentials stay server-side).");
75375
75445
  } else if (registerRequested) {
75376
75446
  log2("Registration requested without a verification inbox \u2014 preserving the seeded credential identity and reporting any verification wall as unauthenticated.");
75377
75447
  }
@@ -84286,12 +84356,14 @@ ${args.directive}`);
84286
84356
  { role: "user", content: userContent }
84287
84357
  ];
84288
84358
  let content;
84359
+ let finishReason;
84289
84360
  try {
84290
84361
  const response = await (0, ai_retry_js_1.resilientAICall)((signal, arm) => (0, ai_queue_js_1.queuedAICall)(() => {
84291
84362
  arm();
84292
84363
  return aiClient.chat.completions.create({ model, messages, max_tokens: 8e3, temperature: 0.1 }, { signal });
84293
84364
  }), { label: `mobile-heal-attempt-${attempt}`, deferTimeoutUntilArmed: true });
84294
84365
  content = response?.choices?.[0]?.message?.content ?? "";
84366
+ finishReason = response?.choices?.[0]?.finish_reason ?? void 0;
84295
84367
  } catch {
84296
84368
  options.onProgress?.(`Phase 1 attempt ${attempt}: model call failed in transport \u2014 granting a recovery turn`);
84297
84369
  markRecoverableTurn();
@@ -84301,7 +84373,7 @@ ${args.directive}`);
84301
84373
  aiResponseCount += 1;
84302
84374
  const parsed = parseHealVerdict(content);
84303
84375
  if (!parsed) {
84304
- options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
84376
+ options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict (${content.length} chars, finish=${finishReason ?? "unknown"}) \u2014 granting a recovery turn`);
84305
84377
  markRecoverableTurn();
84306
84378
  pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
84307
84379
  continue;
@@ -349952,7 +350024,7 @@ var require_dist2 = __commonJS({
349952
350024
  Object.defineProperty(exports2, "__esModule", { value: true });
349953
350025
  exports2.resolveRefFromSnapshot = exports2.replayAuthRecipeIntoBrowser = exports2.runRegisterCaptureRun = exports2.runLoginCaptureRun = exports2.filterLoginCaptureCredentials = exports2.buildLoginCaptureCredentials = exports2.isReservedRunnerEnvVar = exports2.RESERVED_RUNNER_ENV_VARS = exports2.AUTH_MARKER_VERSION = exports2.buildHealAuthStamp = exports2.extractAuthRegion = exports2.upsertAuthBlock = exports2.buildAuthRecipe = exports2.commandToReplayStep = exports2.buildReplayPlan = exports2.absoluteRoute = exports2.renderReplaySettleArrow = exports2.renderReplayClickArrow = exports2.renderAuthFn = exports2.filterFeatureGroupsToPathScope = exports2.isAuthFlowRoute = exports2.deriveSurveyPathScope = exports2.canonicalizeRoute = exports2.codeUsesInboxHelper = exports2.codeUsesTestInboxIdentity = exports2.codeSelfProvisionsRegistration = exports2.executeGrokPerBatchHeal = exports2.executeGrokPerTestHeal = exports2.headerVal = exports2.classifyAuthType = exports2.isTextExcerptable = exports2.isStaticAssetByExt = exports2.isApiCall = exports2.buildApiCallSummary = exports2.computeMobileHealOutcome = exports2.detectMobileStepSecretLeak = exports2.redactMobileSecretsFromText = exports2.MOBILE_LIVE_HEAL_SYSTEM_PROMPT = exports2.MOBILE_SCRIPT_HEAL_SYSTEM_PROMPT = exports2.executeMobileLiveHeal = exports2.executeMobileTestWithHealing = exports2.executeMobileScriptDrivenHeal = exports2.prepareMobileScenarioAppState = exports2.runMobileGeneratePhase = exports2.runMobileAIPlanner = exports2.buildMobileSiteMap = exports2.formatMobileEvidenceForPlanner = exports2.MOBILE_SCENARIO_SYSTEM_PROMPT = exports2.MOBILE_SURVEY_SYSTEM_PROMPT = exports2.runMobileExplorePhase = void 0;
349954
350026
  exports2.MAX_MANIFEST_FILES = exports2.toDiffSummary = exports2.isLikelyTestFile = exports2.sanitizeRepoRelPath = exports2.sha256Hex = exports2.hashFiles = exports2.enumerateTestFiles = exports2.buildNextManifest = exports2.detectRepoSwitch = exports2.classifyImportDiff = exports2.parseImportManifest = exports2.validateAuthoredMobileTest = exports2.buildMobileRepoAuthorSystemRules = exports2.buildMobileRepoAuthorKickoff = exports2.buildMobileRepoAuthorContractMd = exports2.REPO_ANALYSIS_SCHEMA_VERSION = exports2.validateSourceEndpoints = exports2.validateAuthoredTest = exports2.validateRepoMapFile = exports2.validateRepoMemoryFile = exports2.buildTestingStandardsSection = exports2.buildRepoAuthorSystemRules = exports2.buildRepoAuthorKickoff = exports2.buildRepoAuthorContractMd = exports2.buildRepoMapSystemRules = exports2.buildRepoMapKickoff = exports2.buildRepoMapContractMd = exports2.buildRepoMemorySystemRules = exports2.buildRepoMemoryKickoff = exports2.buildRepoMemoryContractMd = exports2.runRepoAnalysisOnRunner = exports2.MOBILE_IMPORT_SCHEMA_VERSION = exports2.validateImportedMobileTest = exports2.buildMobileImportSystemRules = exports2.buildMobileImportKickoff = exports2.buildMobileImportContractMd = exports2.IMPORT_SCHEMA_VERSION = exports2.validateImportResultFile = exports2.validateImportedTest = exports2.buildImportSystemRules = exports2.buildImportKickoff = exports2.buildImportContractMd = exports2.MAX_ARCHIVE_BYTES = exports2.isUnsafeEntryName = exports2.extractZipSafely = exports2.downloadArchiveCapped = exports2.detectArchiveKind = exports2.acquireRepoForImport = exports2.runFrameworkImportOnRunner = exports2.getAgenticEngine = void 0;
349955
- exports2.UNSUPPORTED_RENDERER_PREFIX = exports2.UnsupportedRendererError = exports2.buildCanvasModeAuthoringAddendum = exports2.buildUnsupportedRendererMessage = exports2.modelSupportsVision = exports2.decideCanvasStrategy = exports2.decideAppRenderType = exports2.detectCanvasApp = exports2.detectRateLimitBlock = exports2.isSafeCanonicalRedirect = exports2.resolveBaseUrlPreflight = exports2.checkBaseUrlRedirect = exports2.stripJsonFences = exports2.scrubCredentials = exports2.withAIRetry = exports2.snapshotMatchingChildren = exports2.findNewChromiumChildPid = exports2.killProcessTree = exports2.gracefulCloseWithTreeKill = exports2.liveBrowserRegistry = exports2.REPO_SWITCH_REMOVED_FRACTION = void 0;
350027
+ exports2.BrokeredInboxReader = exports2.applyPlusTag = exports2.deriveProjectInboxTag = exports2.deriveInboxTag = exports2.loadVerificationInboxConfig = exports2.VerificationInboxReader = exports2.UNSUPPORTED_RENDERER_PREFIX = exports2.UnsupportedRendererError = exports2.buildCanvasModeAuthoringAddendum = exports2.buildUnsupportedRendererMessage = exports2.modelSupportsVision = exports2.decideCanvasStrategy = exports2.decideAppRenderType = exports2.detectCanvasApp = exports2.detectRateLimitBlock = exports2.isSafeCanonicalRedirect = exports2.resolveBaseUrlPreflight = exports2.checkBaseUrlRedirect = exports2.stripJsonFences = exports2.scrubCredentials = exports2.withAIRetry = exports2.snapshotMatchingChildren = exports2.findNewChromiumChildPid = exports2.killProcessTree = exports2.gracefulCloseWithTreeKill = exports2.liveBrowserRegistry = exports2.REPO_SWITCH_REMOVED_FRACTION = void 0;
349956
350028
  __exportStar(require_ai_provider(), exports2);
349957
350029
  __exportStar(require_mobile_types(), exports2);
349958
350030
  __exportStar(require_mobile_source_parser(), exports2);
@@ -350374,6 +350446,26 @@ var require_dist2 = __commonJS({
350374
350446
  Object.defineProperty(exports2, "UNSUPPORTED_RENDERER_PREFIX", { enumerable: true, get: function() {
350375
350447
  return canvas_detector_js_1.UNSUPPORTED_RENDERER_PREFIX;
350376
350448
  } });
350449
+ var verification_inbox_js_1 = require_verification_inbox();
350450
+ Object.defineProperty(exports2, "VerificationInboxReader", { enumerable: true, get: function() {
350451
+ return verification_inbox_js_1.VerificationInboxReader;
350452
+ } });
350453
+ Object.defineProperty(exports2, "loadVerificationInboxConfig", { enumerable: true, get: function() {
350454
+ return verification_inbox_js_1.loadVerificationInboxConfig;
350455
+ } });
350456
+ Object.defineProperty(exports2, "deriveInboxTag", { enumerable: true, get: function() {
350457
+ return verification_inbox_js_1.deriveInboxTag;
350458
+ } });
350459
+ Object.defineProperty(exports2, "deriveProjectInboxTag", { enumerable: true, get: function() {
350460
+ return verification_inbox_js_1.deriveProjectInboxTag;
350461
+ } });
350462
+ Object.defineProperty(exports2, "applyPlusTag", { enumerable: true, get: function() {
350463
+ return verification_inbox_js_1.applyPlusTag;
350464
+ } });
350465
+ var brokered_inbox_reader_js_1 = require_brokered_inbox_reader();
350466
+ Object.defineProperty(exports2, "BrokeredInboxReader", { enumerable: true, get: function() {
350467
+ return brokered_inbox_reader_js_1.BrokeredInboxReader;
350468
+ } });
350377
350469
  }
350378
350470
  });
350379
350471
 
@@ -350382,7 +350474,7 @@ var require_package4 = __commonJS({
350382
350474
  "package.json"(exports2, module2) {
350383
350475
  module2.exports = {
350384
350476
  name: "@validate.qa/runner",
350385
- version: "1.0.59",
350477
+ version: "1.0.60",
350386
350478
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
350387
350479
  bin: {
350388
350480
  "validate-runner": "dist/cli.js"
@@ -358915,6 +359007,20 @@ ${finalVerifyResult.logs ?? ""}`;
358915
359007
  { ...input, actor: "ai-explorer" },
358916
359008
  run2.claimEpoch
358917
359009
  );
359010
+ if (ctx.inboxBroker?.address) {
359011
+ ctx.inboxBrokerRead = async (op, payload) => {
359012
+ const res = await fetch(`${opts.serverUrl}/api/runner/inbox/read`, {
359013
+ method: "POST",
359014
+ headers: { ...headers, "Content-Type": "application/json" },
359015
+ body: JSON.stringify({ runId: run2.runId, op, payload })
359016
+ });
359017
+ if (!res.ok) {
359018
+ const detail = await res.text().catch(() => "");
359019
+ throw new Error(`inbox broker ${op} failed: HTTP ${res.status}${detail ? ` \u2014 ${detail.slice(0, 200)}` : ""}`);
359020
+ }
359021
+ return (await res.json()).value ?? null;
359022
+ };
359023
+ }
358918
359024
  log.info(`Discovery (${ctx.mode}) on ${ctx.baseUrl}`);
358919
359025
  const { push: pushAudit, drain: drainAudit } = createAuditFlusher(
358920
359026
  `${opts.serverUrl}/api/runner/runs/${run2.runId}/ai-audit-batch`,
package/dist/cli.mjs CHANGED
@@ -73347,6 +73347,58 @@ var require_verification_inbox = __commonJS({
73347
73347
  }
73348
73348
  });
73349
73349
 
73350
+ // ../runner-core/dist/services/brokered-inbox-reader.js
73351
+ var require_brokered_inbox_reader = __commonJS({
73352
+ "../runner-core/dist/services/brokered-inbox-reader.js"(exports) {
73353
+ "use strict";
73354
+ Object.defineProperty(exports, "__esModule", { value: true });
73355
+ exports.BrokeredInboxReader = void 0;
73356
+ var BROKERED_WAIT_CHUNK_MS = 55e3;
73357
+ var BrokeredInboxReader = class {
73358
+ transport;
73359
+ constructor(transport) {
73360
+ this.transport = transport;
73361
+ }
73362
+ async getUidWatermark() {
73363
+ const value = await this.transport("getUidWatermark", {});
73364
+ const record = value ?? {};
73365
+ return {
73366
+ uid: typeof record.uid === "number" ? record.uid : 0,
73367
+ uidValidity: typeof record.uidValidity === "number" ? record.uidValidity : 0
73368
+ };
73369
+ }
73370
+ async search(opts) {
73371
+ const value = await this.transport("search", { opts });
73372
+ return Array.isArray(value) ? value : [];
73373
+ }
73374
+ async getLatest(opts) {
73375
+ const value = await this.transport("getLatest", { opts });
73376
+ return value ?? null;
73377
+ }
73378
+ async getById(uid, address, altAddress, freshness) {
73379
+ const value = await this.transport("getById", { uid, address, altAddress, freshness });
73380
+ return value ?? null;
73381
+ }
73382
+ async waitForMessage(opts) {
73383
+ const totalBudgetMs = Math.max(opts.maxWaitMs ?? 9e4, 1e3);
73384
+ const deadline = Date.now() + totalBudgetMs;
73385
+ for (; ; ) {
73386
+ const remaining = deadline - Date.now();
73387
+ if (remaining <= 0)
73388
+ return null;
73389
+ const chunkMs = Math.min(remaining, BROKERED_WAIT_CHUNK_MS);
73390
+ const value = await this.transport("waitForMessage", {
73391
+ opts: { ...opts, maxWaitMs: chunkMs }
73392
+ });
73393
+ if (value)
73394
+ return value;
73395
+ }
73396
+ }
73397
+ };
73398
+ exports.BrokeredInboxReader = BrokeredInboxReader;
73399
+ }
73400
+ });
73401
+
73350
73402
  // ../runner-core/dist/services/inbox-tools.js
73351
73403
  var require_inbox_tools = __commonJS({
73352
73404
  "../runner-core/dist/services/inbox-tools.js"(exports) {
@@ -74056,6 +74108,7 @@ var require_mobile_explorer = __commonJS({
74056
74108
  var mobile_auth_coverage_js_1 = require_mobile_auth_coverage();
74057
74109
  var mobile_driver_errors_js_1 = require_mobile_driver_errors();
74058
74110
  var verification_inbox_js_1 = require_verification_inbox();
74111
+ var brokered_inbox_reader_js_1 = require_brokered_inbox_reader();
74059
74112
  var inbox_tools_js_1 = require_inbox_tools();
74060
74113
  var mobile_discovery_auth_js_1 = require_mobile_discovery_auth();
74061
74114
  var MAX_MOBILE_ITERATIONS_SURVEY = 40;
@@ -75377,6 +75430,23 @@ ${existingScreens.slice(0, 100).map((s) => `- ${s.screenId}${s.name ? ` "${s.nam
75377
75430
  log: (line) => log2(line)
75378
75431
  });
75379
75432
  log2("Verification inbox ENABLED for registration \u2014 monitored identity provisioned.");
75433
+ } else if (registerRequested && ctx.inboxBroker?.address && ctx.inboxBrokerRead) {
75434
+ inboxState = (0, inbox_tools_js_1.createInboxRunState)({ address: ctx.inboxBroker.address }, {
75435
+ tagSeed: targetAppId ?? ctx.projectId,
75436
+ projectScope: ctx.projectId
75437
+ });
75438
+ inboxReader = new brokered_inbox_reader_js_1.BrokeredInboxReader(ctx.inboxBrokerRead);
75439
+ await (0, inbox_tools_js_1.applyAndPersistInboxIdentity)({
75440
+ variableContext: ctx.variableContext,
75441
+ registration: {
75442
+ email: inboxState.email,
75443
+ legacyEmail: inboxState.legacyEmail,
75444
+ passwordKey: inboxState.passwordKey ?? "TEST_USER_PASSWORD"
75445
+ },
75446
+ persist: ctx.onCredentialUpdate,
75447
+ log: (line) => log2(line)
75448
+ });
75449
+ log2("Verification inbox ENABLED via server broker \u2014 monitored identity provisioned (IMAP credentials stay server-side).");
75380
75450
  } else if (registerRequested) {
75381
75451
  log2("Registration requested without a verification inbox \u2014 preserving the seeded credential identity and reporting any verification wall as unauthenticated.");
75382
75452
  }
@@ -84291,12 +84361,14 @@ ${args.directive}`);
84291
84361
  { role: "user", content: userContent }
84292
84362
  ];
84293
84363
  let content;
84364
+ let finishReason;
84294
84365
  try {
84295
84366
  const response = await (0, ai_retry_js_1.resilientAICall)((signal, arm) => (0, ai_queue_js_1.queuedAICall)(() => {
84296
84367
  arm();
84297
84368
  return aiClient.chat.completions.create({ model, messages, max_tokens: 8e3, temperature: 0.1 }, { signal });
84298
84369
  }), { label: `mobile-heal-attempt-${attempt}`, deferTimeoutUntilArmed: true });
84299
84370
  content = response?.choices?.[0]?.message?.content ?? "";
84371
+ finishReason = response?.choices?.[0]?.finish_reason ?? void 0;
84300
84372
  } catch {
84301
84373
  options.onProgress?.(`Phase 1 attempt ${attempt}: model call failed in transport \u2014 granting a recovery turn`);
84302
84374
  markRecoverableTurn();
@@ -84306,7 +84378,7 @@ ${args.directive}`);
84306
84378
  aiResponseCount += 1;
84307
84379
  const parsed = parseHealVerdict(content);
84308
84380
  if (!parsed) {
84309
- options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict \u2014 granting a recovery turn`);
84381
+ options.onProgress?.(`Phase 1 attempt ${attempt}: response was not a valid verdict (${content.length} chars, finish=${finishReason ?? "unknown"}) \u2014 granting a recovery turn`);
84310
84382
  markRecoverableTurn();
84311
84383
  pendingDirective = "Your last response was not valid JSON matching the verdict schema. Return exactly one JSON verdict object.";
84312
84384
  continue;
@@ -349957,7 +350029,7 @@ var require_dist2 = __commonJS({
349957
350029
  Object.defineProperty(exports, "__esModule", { value: true });
349958
350030
  exports.resolveRefFromSnapshot = exports.replayAuthRecipeIntoBrowser = exports.runRegisterCaptureRun = exports.runLoginCaptureRun = exports.filterLoginCaptureCredentials = exports.buildLoginCaptureCredentials = exports.isReservedRunnerEnvVar = exports.RESERVED_RUNNER_ENV_VARS = exports.AUTH_MARKER_VERSION = exports.buildHealAuthStamp = exports.extractAuthRegion = exports.upsertAuthBlock = exports.buildAuthRecipe = exports.commandToReplayStep = exports.buildReplayPlan = exports.absoluteRoute = exports.renderReplaySettleArrow = exports.renderReplayClickArrow = exports.renderAuthFn = exports.filterFeatureGroupsToPathScope = exports.isAuthFlowRoute = exports.deriveSurveyPathScope = exports.canonicalizeRoute = exports.codeUsesInboxHelper = exports.codeUsesTestInboxIdentity = exports.codeSelfProvisionsRegistration = exports.executeGrokPerBatchHeal = exports.executeGrokPerTestHeal = exports.headerVal = exports.classifyAuthType = exports.isTextExcerptable = exports.isStaticAssetByExt = exports.isApiCall = exports.buildApiCallSummary = exports.computeMobileHealOutcome = exports.detectMobileStepSecretLeak = exports.redactMobileSecretsFromText = exports.MOBILE_LIVE_HEAL_SYSTEM_PROMPT = exports.MOBILE_SCRIPT_HEAL_SYSTEM_PROMPT = exports.executeMobileLiveHeal = exports.executeMobileTestWithHealing = exports.executeMobileScriptDrivenHeal = exports.prepareMobileScenarioAppState = exports.runMobileGeneratePhase = exports.runMobileAIPlanner = exports.buildMobileSiteMap = exports.formatMobileEvidenceForPlanner = exports.MOBILE_SCENARIO_SYSTEM_PROMPT = exports.MOBILE_SURVEY_SYSTEM_PROMPT = exports.runMobileExplorePhase = void 0;
349959
350031
  exports.MAX_MANIFEST_FILES = exports.toDiffSummary = exports.isLikelyTestFile = exports.sanitizeRepoRelPath = exports.sha256Hex = exports.hashFiles = exports.enumerateTestFiles = exports.buildNextManifest = exports.detectRepoSwitch = exports.classifyImportDiff = exports.parseImportManifest = exports.validateAuthoredMobileTest = exports.buildMobileRepoAuthorSystemRules = exports.buildMobileRepoAuthorKickoff = exports.buildMobileRepoAuthorContractMd = exports.REPO_ANALYSIS_SCHEMA_VERSION = exports.validateSourceEndpoints = exports.validateAuthoredTest = exports.validateRepoMapFile = exports.validateRepoMemoryFile = exports.buildTestingStandardsSection = exports.buildRepoAuthorSystemRules = exports.buildRepoAuthorKickoff = exports.buildRepoAuthorContractMd = exports.buildRepoMapSystemRules = exports.buildRepoMapKickoff = exports.buildRepoMapContractMd = exports.buildRepoMemorySystemRules = exports.buildRepoMemoryKickoff = exports.buildRepoMemoryContractMd = exports.runRepoAnalysisOnRunner = exports.MOBILE_IMPORT_SCHEMA_VERSION = exports.validateImportedMobileTest = exports.buildMobileImportSystemRules = exports.buildMobileImportKickoff = exports.buildMobileImportContractMd = exports.IMPORT_SCHEMA_VERSION = exports.validateImportResultFile = exports.validateImportedTest = exports.buildImportSystemRules = exports.buildImportKickoff = exports.buildImportContractMd = exports.MAX_ARCHIVE_BYTES = exports.isUnsafeEntryName = exports.extractZipSafely = exports.downloadArchiveCapped = exports.detectArchiveKind = exports.acquireRepoForImport = exports.runFrameworkImportOnRunner = exports.getAgenticEngine = void 0;
349960
- exports.UNSUPPORTED_RENDERER_PREFIX = exports.UnsupportedRendererError = exports.buildCanvasModeAuthoringAddendum = exports.buildUnsupportedRendererMessage = exports.modelSupportsVision = exports.decideCanvasStrategy = exports.decideAppRenderType = exports.detectCanvasApp = exports.detectRateLimitBlock = exports.isSafeCanonicalRedirect = exports.resolveBaseUrlPreflight = exports.checkBaseUrlRedirect = exports.stripJsonFences = exports.scrubCredentials = exports.withAIRetry = exports.snapshotMatchingChildren = exports.findNewChromiumChildPid = exports.killProcessTree = exports.gracefulCloseWithTreeKill = exports.liveBrowserRegistry = exports.REPO_SWITCH_REMOVED_FRACTION = void 0;
350032
+ exports.BrokeredInboxReader = exports.applyPlusTag = exports.deriveProjectInboxTag = exports.deriveInboxTag = exports.loadVerificationInboxConfig = exports.VerificationInboxReader = exports.UNSUPPORTED_RENDERER_PREFIX = exports.UnsupportedRendererError = exports.buildCanvasModeAuthoringAddendum = exports.buildUnsupportedRendererMessage = exports.modelSupportsVision = exports.decideCanvasStrategy = exports.decideAppRenderType = exports.detectCanvasApp = exports.detectRateLimitBlock = exports.isSafeCanonicalRedirect = exports.resolveBaseUrlPreflight = exports.checkBaseUrlRedirect = exports.stripJsonFences = exports.scrubCredentials = exports.withAIRetry = exports.snapshotMatchingChildren = exports.findNewChromiumChildPid = exports.killProcessTree = exports.gracefulCloseWithTreeKill = exports.liveBrowserRegistry = exports.REPO_SWITCH_REMOVED_FRACTION = void 0;
349961
350033
  __exportStar(require_ai_provider(), exports);
349962
350034
  __exportStar(require_mobile_types(), exports);
349963
350035
  __exportStar(require_mobile_source_parser(), exports);
@@ -350379,6 +350451,26 @@ var require_dist2 = __commonJS({
350379
350451
  Object.defineProperty(exports, "UNSUPPORTED_RENDERER_PREFIX", { enumerable: true, get: function() {
350380
350452
  return canvas_detector_js_1.UNSUPPORTED_RENDERER_PREFIX;
350381
350453
  } });
350454
+ var verification_inbox_js_1 = require_verification_inbox();
350455
+ Object.defineProperty(exports, "VerificationInboxReader", { enumerable: true, get: function() {
350456
+ return verification_inbox_js_1.VerificationInboxReader;
350457
+ } });
350458
+ Object.defineProperty(exports, "loadVerificationInboxConfig", { enumerable: true, get: function() {
350459
+ return verification_inbox_js_1.loadVerificationInboxConfig;
350460
+ } });
350461
+ Object.defineProperty(exports, "deriveInboxTag", { enumerable: true, get: function() {
350462
+ return verification_inbox_js_1.deriveInboxTag;
350463
+ } });
350464
+ Object.defineProperty(exports, "deriveProjectInboxTag", { enumerable: true, get: function() {
350465
+ return verification_inbox_js_1.deriveProjectInboxTag;
350466
+ } });
350467
+ Object.defineProperty(exports, "applyPlusTag", { enumerable: true, get: function() {
350468
+ return verification_inbox_js_1.applyPlusTag;
350469
+ } });
350470
+ var brokered_inbox_reader_js_1 = require_brokered_inbox_reader();
350471
+ Object.defineProperty(exports, "BrokeredInboxReader", { enumerable: true, get: function() {
350472
+ return brokered_inbox_reader_js_1.BrokeredInboxReader;
350473
+ } });
350382
350474
  }
350383
350475
  });
350384
350476
 
@@ -350387,7 +350479,7 @@ var require_package4 = __commonJS({
350387
350479
  "package.json"(exports, module) {
350388
350480
  module.exports = {
350389
350481
  name: "@validate.qa/runner",
350390
- version: "1.0.59",
350482
+ version: "1.0.60",
350391
350483
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
350392
350484
  bin: {
350393
350485
  "validate-runner": "dist/cli.js"
@@ -358923,6 +359015,20 @@ ${finalVerifyResult.logs ?? ""}`;
358923
359015
  { ...input, actor: "ai-explorer" },
358924
359016
  run2.claimEpoch
358925
359017
  );
359018
+ if (ctx.inboxBroker?.address) {
359019
+ ctx.inboxBrokerRead = async (op, payload) => {
359020
+ const res = await fetch(`${opts.serverUrl}/api/runner/inbox/read`, {
359021
+ method: "POST",
359022
+ headers: { ...headers, "Content-Type": "application/json" },
359023
+ body: JSON.stringify({ runId: run2.runId, op, payload })
359024
+ });
359025
+ if (!res.ok) {
359026
+ const detail = await res.text().catch(() => "");
359027
+ throw new Error(`inbox broker ${op} failed: HTTP ${res.status}${detail ? ` \u2014 ${detail.slice(0, 200)}` : ""}`);
359028
+ }
359029
+ return (await res.json()).value ?? null;
359030
+ };
359031
+ }
358926
359032
  log.info(`Discovery (${ctx.mode}) on ${ctx.baseUrl}`);
358927
359033
  const { push: pushAudit, drain: drainAudit } = createAuditFlusher(
358928
359034
  `${opts.serverUrl}/api/runner/runs/${run2.runId}/ai-audit-batch`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@validate.qa/runner",
3
- "version": "1.0.59",
3
+ "version": "1.0.60",
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"