@exodus/xqa 5.2.0 → 5.4.0
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/README.md +4 -1
- package/dist/xqa.cjs +154 -60
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -180,7 +180,8 @@ Suite files live at `.xqa/suites/<name>.suite.json` and declare the work items p
|
|
|
180
180
|
"beforeEach": {
|
|
181
181
|
"script": "qa/prepare-sim.mjs",
|
|
182
182
|
"env": { "APP_PROFILE": "funded" },
|
|
183
|
-
"timeoutSeconds": 120
|
|
183
|
+
"timeoutSeconds": 120,
|
|
184
|
+
"retries": 3
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
187
|
}
|
|
@@ -206,6 +207,8 @@ Contract:
|
|
|
206
207
|
- Exit 0 → proceed with item.
|
|
207
208
|
- Non-zero exit → item marked failed, `executeItem` skipped, counts toward simulator-unhealthy threshold.
|
|
208
209
|
- Default 120s timeout, overridable via `hooks.beforeEach.timeoutSeconds`.
|
|
210
|
+
- Default 3 retries on failure (`HOOK_EXIT_NONZERO`, `HOOK_TIMEOUT`, `HOOK_SPAWN_FAILED`), overridable via `hooks.beforeEach.retries` (range `0..10`). Set to `0` to disable retries. Aborts (`HOOK_ABORTED`) are never retried.
|
|
211
|
+
- A `HOOK_RETRY` suite event is emitted before each retry attempt with `attempt`, `maxAttempts`, and `previousErrorType`.
|
|
209
212
|
- Honors the suite abort signal.
|
|
210
213
|
|
|
211
214
|
## Configuration
|
package/dist/xqa.cjs
CHANGED
|
@@ -161,7 +161,7 @@ var require_index_cjs = __commonJS({
|
|
|
161
161
|
}, reject);
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
var
|
|
164
|
+
var ResultAsync29 = class _ResultAsync {
|
|
165
165
|
constructor(res) {
|
|
166
166
|
this._promise = res;
|
|
167
167
|
}
|
|
@@ -262,8 +262,8 @@ var require_index_cjs = __commonJS({
|
|
|
262
262
|
return new Ok(res.value);
|
|
263
263
|
})));
|
|
264
264
|
}
|
|
265
|
-
match(
|
|
266
|
-
return this._promise.then((res) => res.match(
|
|
265
|
+
match(ok45, _err) {
|
|
266
|
+
return this._promise.then((res) => res.match(ok45, _err));
|
|
267
267
|
}
|
|
268
268
|
unwrapOr(t) {
|
|
269
269
|
return this._promise.then((res) => res.unwrapOr(t));
|
|
@@ -299,17 +299,17 @@ var require_index_cjs = __commonJS({
|
|
|
299
299
|
});
|
|
300
300
|
}
|
|
301
301
|
};
|
|
302
|
-
function
|
|
303
|
-
return new
|
|
302
|
+
function okAsync13(value) {
|
|
303
|
+
return new ResultAsync29(Promise.resolve(new Ok(value)));
|
|
304
304
|
}
|
|
305
305
|
function errAsync12(err45) {
|
|
306
|
-
return new
|
|
306
|
+
return new ResultAsync29(Promise.resolve(new Err(err45)));
|
|
307
307
|
}
|
|
308
|
-
var fromPromise =
|
|
309
|
-
var fromSafePromise2 =
|
|
310
|
-
var fromAsyncThrowable9 =
|
|
308
|
+
var fromPromise = ResultAsync29.fromPromise;
|
|
309
|
+
var fromSafePromise2 = ResultAsync29.fromSafePromise;
|
|
310
|
+
var fromAsyncThrowable9 = ResultAsync29.fromThrowable;
|
|
311
311
|
var combineResultList = (resultList) => {
|
|
312
|
-
let acc =
|
|
312
|
+
let acc = ok41([]);
|
|
313
313
|
for (const result of resultList) {
|
|
314
314
|
if (result.isErr()) {
|
|
315
315
|
acc = err41(result.error);
|
|
@@ -320,9 +320,9 @@ var require_index_cjs = __commonJS({
|
|
|
320
320
|
}
|
|
321
321
|
return acc;
|
|
322
322
|
};
|
|
323
|
-
var combineResultAsyncList = (asyncResultList) =>
|
|
323
|
+
var combineResultAsyncList = (asyncResultList) => ResultAsync29.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);
|
|
324
324
|
var combineResultListWithAllErrors = (resultList) => {
|
|
325
|
-
let acc =
|
|
325
|
+
let acc = ok41([]);
|
|
326
326
|
for (const result of resultList) {
|
|
327
327
|
if (result.isErr() && acc.isErr()) {
|
|
328
328
|
acc.error.push(result.error);
|
|
@@ -334,14 +334,14 @@ var require_index_cjs = __commonJS({
|
|
|
334
334
|
}
|
|
335
335
|
return acc;
|
|
336
336
|
};
|
|
337
|
-
var combineResultAsyncListWithAllErrors = (asyncResultList) =>
|
|
337
|
+
var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync29.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);
|
|
338
338
|
exports2.Result = void 0;
|
|
339
339
|
(function(Result3) {
|
|
340
340
|
function fromThrowable21(fn, errorFn) {
|
|
341
341
|
return (...args) => {
|
|
342
342
|
try {
|
|
343
343
|
const result = fn(...args);
|
|
344
|
-
return
|
|
344
|
+
return ok41(result);
|
|
345
345
|
} catch (e3) {
|
|
346
346
|
return err41(errorFn ? errorFn(e3) : e3);
|
|
347
347
|
}
|
|
@@ -357,7 +357,7 @@ var require_index_cjs = __commonJS({
|
|
|
357
357
|
}
|
|
358
358
|
Result3.combineWithAllErrors = combineWithAllErrors;
|
|
359
359
|
})(exports2.Result || (exports2.Result = {}));
|
|
360
|
-
function
|
|
360
|
+
function ok41(value) {
|
|
361
361
|
return new Ok(value);
|
|
362
362
|
}
|
|
363
363
|
function err41(err45) {
|
|
@@ -366,7 +366,7 @@ var require_index_cjs = __commonJS({
|
|
|
366
366
|
function safeTry(body) {
|
|
367
367
|
const n3 = body().next();
|
|
368
368
|
if (n3 instanceof Promise) {
|
|
369
|
-
return new
|
|
369
|
+
return new ResultAsync29(n3.then((r3) => r3.value));
|
|
370
370
|
}
|
|
371
371
|
return n3.value;
|
|
372
372
|
}
|
|
@@ -381,11 +381,11 @@ var require_index_cjs = __commonJS({
|
|
|
381
381
|
return !this.isOk();
|
|
382
382
|
}
|
|
383
383
|
map(f6) {
|
|
384
|
-
return
|
|
384
|
+
return ok41(f6(this.value));
|
|
385
385
|
}
|
|
386
386
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
387
387
|
mapErr(_f) {
|
|
388
|
-
return
|
|
388
|
+
return ok41(this.value);
|
|
389
389
|
}
|
|
390
390
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
|
|
391
391
|
andThen(f6) {
|
|
@@ -400,14 +400,14 @@ var require_index_cjs = __commonJS({
|
|
|
400
400
|
f6(this.value);
|
|
401
401
|
} catch (e3) {
|
|
402
402
|
}
|
|
403
|
-
return
|
|
403
|
+
return ok41(this.value);
|
|
404
404
|
}
|
|
405
405
|
orTee(_f) {
|
|
406
|
-
return
|
|
406
|
+
return ok41(this.value);
|
|
407
407
|
}
|
|
408
408
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
|
|
409
409
|
orElse(_f) {
|
|
410
|
-
return
|
|
410
|
+
return ok41(this.value);
|
|
411
411
|
}
|
|
412
412
|
asyncAndThen(f6) {
|
|
413
413
|
return f6(this.value);
|
|
@@ -417,15 +417,15 @@ var require_index_cjs = __commonJS({
|
|
|
417
417
|
return f6(this.value).map(() => this.value);
|
|
418
418
|
}
|
|
419
419
|
asyncMap(f6) {
|
|
420
|
-
return
|
|
420
|
+
return ResultAsync29.fromSafePromise(f6(this.value));
|
|
421
421
|
}
|
|
422
422
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
423
423
|
unwrapOr(_v) {
|
|
424
424
|
return this.value;
|
|
425
425
|
}
|
|
426
426
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
427
|
-
match(
|
|
428
|
-
return
|
|
427
|
+
match(ok45, _err) {
|
|
428
|
+
return ok45(this.value);
|
|
429
429
|
}
|
|
430
430
|
safeUnwrap() {
|
|
431
431
|
const value = this.value;
|
|
@@ -521,15 +521,15 @@ var require_index_cjs = __commonJS({
|
|
|
521
521
|
var fromThrowable20 = exports2.Result.fromThrowable;
|
|
522
522
|
exports2.Err = Err;
|
|
523
523
|
exports2.Ok = Ok;
|
|
524
|
-
exports2.ResultAsync =
|
|
524
|
+
exports2.ResultAsync = ResultAsync29;
|
|
525
525
|
exports2.err = err41;
|
|
526
526
|
exports2.errAsync = errAsync12;
|
|
527
527
|
exports2.fromAsyncThrowable = fromAsyncThrowable9;
|
|
528
528
|
exports2.fromPromise = fromPromise;
|
|
529
529
|
exports2.fromSafePromise = fromSafePromise2;
|
|
530
530
|
exports2.fromThrowable = fromThrowable20;
|
|
531
|
-
exports2.ok =
|
|
532
|
-
exports2.okAsync =
|
|
531
|
+
exports2.ok = ok41;
|
|
532
|
+
exports2.okAsync = okAsync13;
|
|
533
533
|
exports2.safeTry = safeTry;
|
|
534
534
|
}
|
|
535
535
|
});
|
|
@@ -5321,8 +5321,8 @@ var require_resolve_flow_scalar = __commonJS({
|
|
|
5321
5321
|
};
|
|
5322
5322
|
function parseCharCode(source, offset, length, onError) {
|
|
5323
5323
|
const cc = source.substr(offset, length);
|
|
5324
|
-
const
|
|
5325
|
-
const code =
|
|
5324
|
+
const ok41 = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
|
|
5325
|
+
const code = ok41 ? parseInt(cc, 16) : NaN;
|
|
5326
5326
|
if (isNaN(code)) {
|
|
5327
5327
|
const raw = source.substr(offset - 2, length + 2);
|
|
5328
5328
|
onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`);
|
|
@@ -49496,9 +49496,9 @@ var tq = k((oq) => {
|
|
|
49496
49496
|
});
|
|
49497
49497
|
var sq = k((aq) => {
|
|
49498
49498
|
Object.defineProperty(aq, "__esModule", { value: true });
|
|
49499
|
-
var
|
|
49499
|
+
var ok41 = Q$(), tk = { keyword: "not", schemaType: ["object", "boolean"], trackErrors: true, code($) {
|
|
49500
49500
|
let { gen: X, schema: J, it: Q } = $;
|
|
49501
|
-
if ((0,
|
|
49501
|
+
if ((0, ok41.alwaysValidSchema)(Q, J)) {
|
|
49502
49502
|
$.fail();
|
|
49503
49503
|
return;
|
|
49504
49504
|
}
|
|
@@ -65151,6 +65151,15 @@ function normalizeSimulatorUnhealthy(event) {
|
|
|
65151
65151
|
}
|
|
65152
65152
|
];
|
|
65153
65153
|
}
|
|
65154
|
+
function normalizeHookRetry(event) {
|
|
65155
|
+
return [
|
|
65156
|
+
{
|
|
65157
|
+
kind: "text",
|
|
65158
|
+
style: "default",
|
|
65159
|
+
text: `[${event.itemName}] HOOK_RETRY ${String(event.attempt)}/${String(event.maxAttempts)} after ${event.previousErrorType}`
|
|
65160
|
+
}
|
|
65161
|
+
];
|
|
65162
|
+
}
|
|
65154
65163
|
function normalizeSuiteCompleted(event) {
|
|
65155
65164
|
return [
|
|
65156
65165
|
{
|
|
@@ -65168,6 +65177,7 @@ var HANDLERS = {
|
|
|
65168
65177
|
ITEM_TIMEOUT: (event) => normalizeItemTimeout(event),
|
|
65169
65178
|
ITEM_ABORTED: (event) => normalizeItemAborted(event),
|
|
65170
65179
|
SIMULATOR_UNHEALTHY: (event) => normalizeSimulatorUnhealthy(event),
|
|
65180
|
+
HOOK_RETRY: (event) => normalizeHookRetry(event),
|
|
65171
65181
|
SUITE_COMPLETED: (event) => normalizeSuiteCompleted(event)
|
|
65172
65182
|
};
|
|
65173
65183
|
function normalizeSuiteEvent(event) {
|
|
@@ -65571,6 +65581,7 @@ var SUITE_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
|
65571
65581
|
"ITEM_TIMEOUT",
|
|
65572
65582
|
"ITEM_ABORTED",
|
|
65573
65583
|
"SIMULATOR_UNHEALTHY",
|
|
65584
|
+
"HOOK_RETRY",
|
|
65574
65585
|
"SUITE_COMPLETED"
|
|
65575
65586
|
]);
|
|
65576
65587
|
var UI_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
@@ -65681,6 +65692,14 @@ function reduceSimulatorUnhealthy(state, event) {
|
|
|
65681
65692
|
};
|
|
65682
65693
|
return { ...state, log: [...state.log, entry] };
|
|
65683
65694
|
}
|
|
65695
|
+
function reduceHookRetry(state, event) {
|
|
65696
|
+
const entry = {
|
|
65697
|
+
itemId: event.itemId,
|
|
65698
|
+
source: "annotation",
|
|
65699
|
+
lines: normalizeSuiteEvent(event)
|
|
65700
|
+
};
|
|
65701
|
+
return { ...state, log: [...state.log, entry] };
|
|
65702
|
+
}
|
|
65684
65703
|
function reduceSuiteEvent(state, event) {
|
|
65685
65704
|
switch (event.type) {
|
|
65686
65705
|
case "ITEM_QUEUED": {
|
|
@@ -65698,6 +65717,9 @@ function reduceSuiteEvent(state, event) {
|
|
|
65698
65717
|
case "SIMULATOR_UNHEALTHY": {
|
|
65699
65718
|
return reduceSimulatorUnhealthy(state, event);
|
|
65700
65719
|
}
|
|
65720
|
+
case "HOOK_RETRY": {
|
|
65721
|
+
return reduceHookRetry(state, event);
|
|
65722
|
+
}
|
|
65701
65723
|
case "SUITE_COMPLETED": {
|
|
65702
65724
|
return { ...state, suiteEnded: true };
|
|
65703
65725
|
}
|
|
@@ -79360,6 +79382,7 @@ function formatOptionalNumber(value) {
|
|
|
79360
79382
|
// src/shell/debug-agent-events.ts
|
|
79361
79383
|
var TOOL_INPUT_MAX = 120;
|
|
79362
79384
|
var TOOL_ERROR_MAX = 120;
|
|
79385
|
+
var THOUGHT_TEXT_MAX = 240;
|
|
79363
79386
|
var UNSERIALIZABLE = "[unserializable]";
|
|
79364
79387
|
function tryStringify(value) {
|
|
79365
79388
|
const result = JSON.stringify(value);
|
|
@@ -79443,6 +79466,13 @@ function handleVisualStep(context, event) {
|
|
|
79443
79466
|
function handleError(context, event) {
|
|
79444
79467
|
context.logger.log("ERROR", `${event.agent} ${event.message}`);
|
|
79445
79468
|
}
|
|
79469
|
+
function flattenThoughtText(text) {
|
|
79470
|
+
return text.replaceAll(/\s+/g, " ").trim();
|
|
79471
|
+
}
|
|
79472
|
+
function handleThought(context, event) {
|
|
79473
|
+
const text = truncate(flattenThoughtText(event.text), THOUGHT_TEXT_MAX);
|
|
79474
|
+
context.logger.log("THOUGHT", `${event.agent} ${text}`);
|
|
79475
|
+
}
|
|
79446
79476
|
var AGENT_EVENT_HANDLERS = {
|
|
79447
79477
|
STAGE_START: handleStageStart,
|
|
79448
79478
|
STAGE_END: handleStageEnd,
|
|
@@ -79455,7 +79485,8 @@ var AGENT_EVENT_HANDLERS = {
|
|
|
79455
79485
|
INSPECTOR_STEP_START: handleInspectorStepStart,
|
|
79456
79486
|
INSPECTOR_STEP: handleInspectorStep,
|
|
79457
79487
|
VISUAL_STEP: handleVisualStep,
|
|
79458
|
-
ERROR: handleError
|
|
79488
|
+
ERROR: handleError,
|
|
79489
|
+
THOUGHT: handleThought
|
|
79459
79490
|
};
|
|
79460
79491
|
function handleAgentEvent(context, event) {
|
|
79461
79492
|
const handler2 = AGENT_EVENT_HANDLERS[event.type];
|
|
@@ -79502,6 +79533,12 @@ function handleSimulatorUnhealthy(logger, event) {
|
|
|
79502
79533
|
`sim=${event.simulatorUdid} failures=${String(event.consecutiveFailures)}`
|
|
79503
79534
|
);
|
|
79504
79535
|
}
|
|
79536
|
+
function handleHookRetry(logger, event) {
|
|
79537
|
+
logger.log(
|
|
79538
|
+
"HOOK_RETRY",
|
|
79539
|
+
`id=${event.itemId} sim=${event.simulatorUdid} attempt=${String(event.attempt)}/${String(event.maxAttempts)} prev=${event.previousErrorType}`
|
|
79540
|
+
);
|
|
79541
|
+
}
|
|
79505
79542
|
function handleSuiteCompleted(logger, event) {
|
|
79506
79543
|
logger.log(
|
|
79507
79544
|
"SUITE_COMPLETED",
|
|
@@ -79516,6 +79553,7 @@ var SUITE_EVENT_HANDLERS = {
|
|
|
79516
79553
|
ITEM_TIMEOUT: handleItemTimeout,
|
|
79517
79554
|
ITEM_ABORTED: handleItemAborted,
|
|
79518
79555
|
SIMULATOR_UNHEALTHY: handleSimulatorUnhealthy,
|
|
79556
|
+
HOOK_RETRY: handleHookRetry,
|
|
79519
79557
|
SUITE_COMPLETED: handleSuiteCompleted
|
|
79520
79558
|
};
|
|
79521
79559
|
function handleSuiteEvent(logger, event) {
|
|
@@ -85283,10 +85321,12 @@ var freestyleSchema = external_exports.union([external_exports.number().int().po
|
|
|
85283
85321
|
}
|
|
85284
85322
|
return value;
|
|
85285
85323
|
});
|
|
85324
|
+
var MAX_HOOK_RETRIES = 10;
|
|
85286
85325
|
var hookConfigSchema = external_exports.object({
|
|
85287
85326
|
script: external_exports.string().min(1),
|
|
85288
85327
|
env: external_exports.record(external_exports.string(), external_exports.string()).optional(),
|
|
85289
|
-
timeoutSeconds: external_exports.number().int().positive().optional()
|
|
85328
|
+
timeoutSeconds: external_exports.number().int().positive().optional(),
|
|
85329
|
+
retries: external_exports.number().int().nonnegative().max(MAX_HOOK_RETRIES).optional()
|
|
85290
85330
|
}).superRefine((data, context) => {
|
|
85291
85331
|
if (data.env === void 0) {
|
|
85292
85332
|
return;
|
|
@@ -85318,18 +85358,20 @@ var safeJsonParse5 = (0, import_neverthrow75.fromThrowable)(
|
|
|
85318
85358
|
cause
|
|
85319
85359
|
})
|
|
85320
85360
|
);
|
|
85361
|
+
function pickDefined(object2) {
|
|
85362
|
+
return Object.fromEntries(
|
|
85363
|
+
Object.entries(object2).filter(([, value]) => value !== void 0)
|
|
85364
|
+
);
|
|
85365
|
+
}
|
|
85321
85366
|
function buildHookConfig(parsed) {
|
|
85322
|
-
|
|
85323
|
-
|
|
85324
|
-
|
|
85325
|
-
|
|
85326
|
-
|
|
85327
|
-
|
|
85328
|
-
|
|
85329
|
-
|
|
85330
|
-
return { script, timeoutSeconds };
|
|
85331
|
-
}
|
|
85332
|
-
return { script };
|
|
85367
|
+
return {
|
|
85368
|
+
script: parsed.script,
|
|
85369
|
+
...pickDefined({
|
|
85370
|
+
env: parsed.env,
|
|
85371
|
+
timeoutSeconds: parsed.timeoutSeconds,
|
|
85372
|
+
retries: parsed.retries
|
|
85373
|
+
})
|
|
85374
|
+
};
|
|
85333
85375
|
}
|
|
85334
85376
|
function normalizeHooks(hooks) {
|
|
85335
85377
|
if (hooks === void 0) {
|
|
@@ -85845,25 +85887,71 @@ function runHook(options2) {
|
|
|
85845
85887
|
|
|
85846
85888
|
// src/suite/shell/hook-invoker.ts
|
|
85847
85889
|
var DEFAULT_HOOK_TIMEOUT_SECONDS = 120;
|
|
85890
|
+
var DEFAULT_HOOK_RETRIES = 3;
|
|
85848
85891
|
var MS_PER_SECOND5 = 1e3;
|
|
85849
|
-
|
|
85850
|
-
|
|
85851
|
-
|
|
85852
|
-
|
|
85892
|
+
var RETRYABLE_HOOK_ERROR_TYPES = /* @__PURE__ */ new Set([
|
|
85893
|
+
"HOOK_EXIT_NONZERO",
|
|
85894
|
+
"HOOK_TIMEOUT",
|
|
85895
|
+
"HOOK_SPAWN_FAILED"
|
|
85896
|
+
]);
|
|
85897
|
+
async function runHookOnce(context) {
|
|
85853
85898
|
return runHook({
|
|
85854
|
-
script:
|
|
85855
|
-
cwd: hookCwd,
|
|
85856
|
-
env:
|
|
85857
|
-
baseEnv: hookBaseEnv,
|
|
85858
|
-
nodeExecPath: hookNodeExecPath,
|
|
85859
|
-
timeoutMs:
|
|
85860
|
-
signal
|
|
85899
|
+
script: context.input.hook.script,
|
|
85900
|
+
cwd: context.input.hookCwd,
|
|
85901
|
+
env: context.env,
|
|
85902
|
+
baseEnv: context.input.hookBaseEnv,
|
|
85903
|
+
nodeExecPath: context.input.hookNodeExecPath,
|
|
85904
|
+
timeoutMs: context.timeoutMs,
|
|
85905
|
+
signal: context.input.signal
|
|
85861
85906
|
});
|
|
85862
85907
|
}
|
|
85863
|
-
|
|
85908
|
+
function emitRetryEvent(context, event) {
|
|
85909
|
+
context.input.observer?.({
|
|
85910
|
+
type: "HOOK_RETRY",
|
|
85911
|
+
itemId: context.input.item.id,
|
|
85912
|
+
itemName: context.input.item.name,
|
|
85913
|
+
simulatorUdid: context.input.simulatorUdid,
|
|
85914
|
+
attempt: event.attempt,
|
|
85915
|
+
maxAttempts: context.maxAttempts,
|
|
85916
|
+
previousErrorType: event.previous.type
|
|
85917
|
+
});
|
|
85918
|
+
}
|
|
85919
|
+
async function runAllAttempts(context) {
|
|
85920
|
+
let lastResult = await runHookOnce(context);
|
|
85921
|
+
for (let attempt = 2; attempt <= context.maxAttempts; attempt += 1) {
|
|
85922
|
+
if (lastResult.isOk()) {
|
|
85923
|
+
return lastResult;
|
|
85924
|
+
}
|
|
85925
|
+
if (!isRetryableHookError(lastResult.error) || context.input.signal.aborted) {
|
|
85926
|
+
return lastResult;
|
|
85927
|
+
}
|
|
85928
|
+
emitRetryEvent(context, { attempt, previous: lastResult.error });
|
|
85929
|
+
lastResult = await runHookOnce(context);
|
|
85930
|
+
}
|
|
85931
|
+
return lastResult;
|
|
85932
|
+
}
|
|
85933
|
+
function buildAttemptContext(input) {
|
|
85934
|
+
const env3 = buildHookEnv({
|
|
85935
|
+
item: input.item,
|
|
85936
|
+
simulatorUdid: input.simulatorUdid,
|
|
85937
|
+
suiteName: input.suiteName,
|
|
85938
|
+
suiteEnv: input.hook.env
|
|
85939
|
+
});
|
|
85940
|
+
const timeoutMs = (input.hook.timeoutSeconds ?? DEFAULT_HOOK_TIMEOUT_SECONDS) * MS_PER_SECOND5;
|
|
85941
|
+
const maxAttempts = (input.hook.retries ?? DEFAULT_HOOK_RETRIES) + 1;
|
|
85942
|
+
return { input, env: env3, timeoutMs, maxAttempts };
|
|
85943
|
+
}
|
|
85944
|
+
function invokeHook(input) {
|
|
85945
|
+
const context = buildAttemptContext(input);
|
|
85946
|
+
return import_neverthrow79.ResultAsync.fromSafePromise(runAllAttempts(context)).andThen((result) => result);
|
|
85947
|
+
}
|
|
85948
|
+
function isRetryableHookError(error48) {
|
|
85949
|
+
return RETRYABLE_HOOK_ERROR_TYPES.has(error48.type);
|
|
85950
|
+
}
|
|
85951
|
+
function maybeInvokeHook(input) {
|
|
85864
85952
|
const { hook: hook2 } = input;
|
|
85865
85953
|
if (hook2 === void 0) {
|
|
85866
|
-
return (0, import_neverthrow79.
|
|
85954
|
+
return (0, import_neverthrow79.okAsync)();
|
|
85867
85955
|
}
|
|
85868
85956
|
return invokeHook({ ...input, hook: hook2 });
|
|
85869
85957
|
}
|
|
@@ -85889,7 +85977,8 @@ function buildHookInvokeInput(workerContext, item) {
|
|
|
85889
85977
|
hookCwd: config2.hookCwd,
|
|
85890
85978
|
hookBaseEnv: config2.hookBaseEnv,
|
|
85891
85979
|
hookNodeExecPath: config2.hookNodeExecPath,
|
|
85892
|
-
signal: config2.signal
|
|
85980
|
+
signal: config2.signal,
|
|
85981
|
+
observer: config2.observer
|
|
85893
85982
|
};
|
|
85894
85983
|
}
|
|
85895
85984
|
function emitItemStarted(state) {
|
|
@@ -94105,11 +94194,16 @@ var agentsSchema = external_exports.object({
|
|
|
94105
94194
|
consolidator: consolidatorConfigSchema,
|
|
94106
94195
|
triager: triagerConfigSchema
|
|
94107
94196
|
}).strict();
|
|
94197
|
+
var planPrObjectSchema = external_exports.object({
|
|
94198
|
+
enabled: external_exports.boolean().default(true)
|
|
94199
|
+
}).strict();
|
|
94200
|
+
var planPrSchema = external_exports.preprocess((value) => value ?? {}, planPrObjectSchema).default({ enabled: true });
|
|
94108
94201
|
var rootConfigSchema = external_exports.object({
|
|
94109
94202
|
version: external_exports.literal(1),
|
|
94110
94203
|
run: runSchema,
|
|
94111
94204
|
suites: suitesSchema,
|
|
94112
|
-
agents: agentsSchema
|
|
94205
|
+
agents: agentsSchema,
|
|
94206
|
+
planPr: planPrSchema
|
|
94113
94207
|
}).strict();
|
|
94114
94208
|
|
|
94115
94209
|
// src/config.ts
|
|
@@ -94259,7 +94353,7 @@ function buildProgram(options2) {
|
|
|
94259
94353
|
|
|
94260
94354
|
// src/index.ts
|
|
94261
94355
|
process.title = "xqa";
|
|
94262
|
-
var version2 = `${"5.
|
|
94356
|
+
var version2 = `${"5.4.0"}${false ? ` (dev build +${"fb81480"})` : ""}`;
|
|
94263
94357
|
var program2 = buildProgram({ version: version2 });
|
|
94264
94358
|
void program2.parseAsync(process.argv);
|
|
94265
94359
|
/*! Bundled license information:
|