@akagilnc/pi-workflow-roles 0.1.2152 → 0.1.2169
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/public-cli/main.js +556 -368
- package/package.json +1 -1
- package/src/public-cli/auto-resume.ts +80 -0
- package/src/public-cli/coder-run.ts +35 -30
- package/src/public-cli/collector-run.ts +1 -1
- package/src/public-cli/doctor-run.ts +1 -1
- package/src/public-cli/fixer-run.ts +32 -31
- package/src/public-cli/judge-run.ts +33 -29
- package/src/public-cli/merger-run.ts +32 -30
- package/src/public-cli/reviewer-run.ts +32 -31
- package/src/public-cli/run-lifecycle.ts +89 -25
- package/src/public-cli/settlement.ts +170 -15
- package/src/public-cli/terminal.ts +8 -0
package/package.json
CHANGED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single generic auto-resume loop for #416 (owner scope = single LLM call).
|
|
3
|
+
* Call-local retries, at most AUTO_RESUME_LIMIT times, in-place (same runId/session).
|
|
4
|
+
* Unifies presentation: intermediate attempts use dummyIo, only final Terminal is presented.
|
|
5
|
+
*/
|
|
6
|
+
import { AUTO_RESUME_LIMIT, isSessionPrincipalAvailable, acquireRunWriterLease, RunWriterLeaseHeldError, type RunWriterLease } from "./run-lifecycle.ts";
|
|
7
|
+
import { isLawfulTypedTerminalOutcome, formatTerminalResult, type TerminalResult } from "./terminal.ts";
|
|
8
|
+
import { presentFailureTerminal, presentStructuralRejection } from "./settlement.ts";
|
|
9
|
+
import type { CliIo } from "./cli-io.ts";
|
|
10
|
+
|
|
11
|
+
const dummyIo: CliIo = { stdout: () => {}, stderr: () => {} };
|
|
12
|
+
|
|
13
|
+
function presentTerminal(terminal: TerminalResult, io: CliIo): void {
|
|
14
|
+
if (terminal.roleOutcome.kind === "failure" || terminal.roleOutcome.kind === "no_receipt") {
|
|
15
|
+
presentFailureTerminal(terminal, io);
|
|
16
|
+
} else {
|
|
17
|
+
io.stdout(formatTerminalResult(terminal));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type AutoResumeDispatchResult = {
|
|
22
|
+
exitCode: number;
|
|
23
|
+
terminal?: TerminalResult;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export async function runWithAutoResumeLoop<T extends AutoResumeDispatchResult>(options: {
|
|
27
|
+
admitted: { sessionFile: string; runDirectory: string };
|
|
28
|
+
io: CliIo;
|
|
29
|
+
buildInitialArgs: () => string[];
|
|
30
|
+
buildResumeArgs: () => string[];
|
|
31
|
+
dispatch: (extraArgs: string[], lease: RunWriterLease, isFirst: boolean, attemptIo: CliIo) => Promise<T>;
|
|
32
|
+
}): Promise<T> {
|
|
33
|
+
let autoResumeAttempts = 0;
|
|
34
|
+
let isFirst = true;
|
|
35
|
+
let currentExtraArgs = options.buildInitialArgs();
|
|
36
|
+
|
|
37
|
+
while (true) {
|
|
38
|
+
let lease: RunWriterLease;
|
|
39
|
+
try {
|
|
40
|
+
lease = await acquireRunWriterLease(options.admitted.runDirectory, (diagnostic) =>
|
|
41
|
+
options.io.stderr(diagnostic),
|
|
42
|
+
);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
if (error instanceof RunWriterLeaseHeldError) {
|
|
45
|
+
presentStructuralRejection(error, options.io);
|
|
46
|
+
return { exitCode: 2 } as T;
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const result = await options.dispatch(currentExtraArgs, lease, isFirst, dummyIo);
|
|
52
|
+
|
|
53
|
+
const terminal = (result as { terminal?: TerminalResult }).terminal;
|
|
54
|
+
if (terminal !== undefined) {
|
|
55
|
+
(terminal as { autoResumeCount?: number }).autoResumeCount = autoResumeAttempts;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const lawful = terminal !== undefined && isLawfulTypedTerminalOutcome(terminal.roleOutcome);
|
|
59
|
+
if (lawful) {
|
|
60
|
+
if (terminal !== undefined) {
|
|
61
|
+
// Present lawful terminal once to real io (dummy was used inside dispatch)
|
|
62
|
+
options.io.stdout(formatTerminalResult(terminal));
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (autoResumeAttempts >= AUTO_RESUME_LIMIT) {
|
|
68
|
+
if (terminal !== undefined) presentTerminal(terminal, options.io);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
if (!(await isSessionPrincipalAvailable(options.admitted.sessionFile))) {
|
|
72
|
+
if (terminal !== undefined) presentTerminal(terminal, options.io);
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
autoResumeAttempts++;
|
|
77
|
+
currentExtraArgs = options.buildResumeArgs();
|
|
78
|
+
isFirst = false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
type RunWriterLease,
|
|
51
51
|
type TypedProviderHttpObservation,
|
|
52
52
|
} from "./run-lifecycle.ts";
|
|
53
|
+
import { runWithAutoResumeLoop } from "./auto-resume.ts";
|
|
53
54
|
import {
|
|
54
55
|
classifyPostAdmissionFailure,
|
|
55
56
|
exitCodeForTerminalOutcome,
|
|
@@ -446,17 +447,7 @@ export async function runPublicCoder(
|
|
|
446
447
|
}
|
|
447
448
|
|
|
448
449
|
await markRunAdmitted(admitted);
|
|
449
|
-
|
|
450
|
-
let lease: RunWriterLease;
|
|
451
|
-
try {
|
|
452
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
453
|
-
} catch (error) {
|
|
454
|
-
if (error instanceof RunWriterLeaseHeldError) {
|
|
455
|
-
presentStructuralRejection(error, io);
|
|
456
|
-
return { exitCode: 2 };
|
|
457
|
-
}
|
|
458
|
-
throw error;
|
|
459
|
-
}
|
|
450
|
+
// #416 scope = single LLM call: call-local retry counter, no persistence.
|
|
460
451
|
|
|
461
452
|
let methodProvenance: PackagedMethodSkillProvenance | undefined;
|
|
462
453
|
if (admitted.phase === "apply") {
|
|
@@ -467,7 +458,6 @@ export async function runPublicCoder(
|
|
|
467
458
|
);
|
|
468
459
|
methodProvenance = material.provenance;
|
|
469
460
|
} catch (error) {
|
|
470
|
-
await lease.release();
|
|
471
461
|
return await presentControlledFailure(
|
|
472
462
|
admitted,
|
|
473
463
|
{
|
|
@@ -482,24 +472,35 @@ export async function runPublicCoder(
|
|
|
482
472
|
}
|
|
483
473
|
}
|
|
484
474
|
|
|
485
|
-
|
|
486
|
-
packageRoot: env.packageRoot,
|
|
487
|
-
...(env.model === undefined ? {} : { model: env.model }),
|
|
488
|
-
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
489
|
-
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
return await dispatchAdmittedCoder({
|
|
475
|
+
return runWithAutoResumeLoop({
|
|
493
476
|
admitted,
|
|
494
|
-
env: {
|
|
495
|
-
...env,
|
|
496
|
-
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
497
|
-
},
|
|
498
477
|
io,
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
478
|
+
buildInitialArgs: () =>
|
|
479
|
+
buildCoderActivationExtraArgs(admitted, {
|
|
480
|
+
packageRoot: env.packageRoot,
|
|
481
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
482
|
+
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
483
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
484
|
+
}),
|
|
485
|
+
buildResumeArgs: () =>
|
|
486
|
+
buildCoderResumeActivationExtraArgs(admitted, {
|
|
487
|
+
packageRoot: env.packageRoot,
|
|
488
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
489
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
490
|
+
}),
|
|
491
|
+
dispatch: (extraArgs, lease, isFirst, attemptIo) =>
|
|
492
|
+
dispatchAdmittedCoder({
|
|
493
|
+
admitted,
|
|
494
|
+
env: {
|
|
495
|
+
...env,
|
|
496
|
+
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
497
|
+
},
|
|
498
|
+
io: attemptIo,
|
|
499
|
+
extraArgs,
|
|
500
|
+
lease,
|
|
501
|
+
...(methodProvenance === undefined ? {} : { methodProvenance }),
|
|
502
|
+
...(isFirst && env.engine !== undefined ? { effectiveEngine: env.engine } : {}),
|
|
503
|
+
}),
|
|
503
504
|
});
|
|
504
505
|
}
|
|
505
506
|
|
|
@@ -547,7 +548,7 @@ export async function runPublicCoderResume(
|
|
|
547
548
|
|
|
548
549
|
let lease: RunWriterLease;
|
|
549
550
|
try {
|
|
550
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
551
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
551
552
|
} catch (error) {
|
|
552
553
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
553
554
|
// Concurrent resume: reject without second writer or dispatch.
|
|
@@ -587,7 +588,7 @@ export async function runPublicCoderResume(
|
|
|
587
588
|
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
588
589
|
});
|
|
589
590
|
|
|
590
|
-
|
|
591
|
+
const result = await dispatchAdmittedCoder({
|
|
591
592
|
admitted,
|
|
592
593
|
env: {
|
|
593
594
|
...env,
|
|
@@ -598,6 +599,10 @@ export async function runPublicCoderResume(
|
|
|
598
599
|
lease,
|
|
599
600
|
...(methodProvenance === undefined ? {} : { methodProvenance }),
|
|
600
601
|
});
|
|
602
|
+
if (result.terminal !== undefined) {
|
|
603
|
+
(result.terminal as { autoResumeCount?: number }).autoResumeCount = 0;
|
|
604
|
+
}
|
|
605
|
+
return result;
|
|
601
606
|
}
|
|
602
607
|
|
|
603
608
|
// Re-export for tests that assert typed credential failure channel shape.
|
|
@@ -355,7 +355,7 @@ export async function runPublicCollector(
|
|
|
355
355
|
|
|
356
356
|
let lease: RunWriterLease;
|
|
357
357
|
try {
|
|
358
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
358
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
359
359
|
} catch (error) {
|
|
360
360
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
361
361
|
presentStructuralRejection(error, io);
|
|
@@ -334,7 +334,7 @@ export async function runPublicDoctor(
|
|
|
334
334
|
|
|
335
335
|
let lease: RunWriterLease;
|
|
336
336
|
try {
|
|
337
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
337
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
338
338
|
} catch (error) {
|
|
339
339
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
340
340
|
presentStructuralRejection(error, io);
|
|
@@ -52,6 +52,7 @@ import {
|
|
|
52
52
|
type RunWriterLease,
|
|
53
53
|
type TypedProviderHttpObservation,
|
|
54
54
|
} from "./run-lifecycle.ts";
|
|
55
|
+
import { runWithAutoResumeLoop } from "./auto-resume.ts";
|
|
55
56
|
import {
|
|
56
57
|
classifyPostAdmissionFailure,
|
|
57
58
|
exitCodeForTerminalOutcome,
|
|
@@ -474,22 +475,10 @@ export async function runPublicFixer(
|
|
|
474
475
|
|
|
475
476
|
await markRunAdmitted(admitted);
|
|
476
477
|
|
|
477
|
-
let lease: RunWriterLease;
|
|
478
|
-
try {
|
|
479
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
480
|
-
} catch (error) {
|
|
481
|
-
if (error instanceof RunWriterLeaseHeldError) {
|
|
482
|
-
presentStructuralRejection(error, io);
|
|
483
|
-
return { exitCode: 2 };
|
|
484
|
-
}
|
|
485
|
-
throw error;
|
|
486
|
-
}
|
|
487
|
-
|
|
488
478
|
let methodMaterial: PackagedMethodSkillMaterial;
|
|
489
479
|
try {
|
|
490
480
|
methodMaterial = await loadFixerMethodMaterial(env.packageRoot);
|
|
491
481
|
} catch (error) {
|
|
492
|
-
await lease.release();
|
|
493
482
|
return await presentControlledFailure(
|
|
494
483
|
admitted,
|
|
495
484
|
{
|
|
@@ -502,25 +491,35 @@ export async function runPublicFixer(
|
|
|
502
491
|
);
|
|
503
492
|
}
|
|
504
493
|
|
|
505
|
-
|
|
506
|
-
packageRoot: env.packageRoot,
|
|
507
|
-
...(env.model === undefined ? {} : { model: env.model }),
|
|
508
|
-
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
509
|
-
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
510
|
-
});
|
|
511
|
-
|
|
512
|
-
return await dispatchAdmittedFixer({
|
|
494
|
+
return runWithAutoResumeLoop({
|
|
513
495
|
admitted,
|
|
514
|
-
env: {
|
|
515
|
-
...env,
|
|
516
|
-
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
517
|
-
},
|
|
518
496
|
io,
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
497
|
+
buildInitialArgs: () =>
|
|
498
|
+
buildFixerActivationExtraArgs(admitted, {
|
|
499
|
+
packageRoot: env.packageRoot,
|
|
500
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
501
|
+
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
502
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
503
|
+
}),
|
|
504
|
+
buildResumeArgs: () =>
|
|
505
|
+
buildFixerResumeActivationExtraArgs(admitted, {
|
|
506
|
+
packageRoot: env.packageRoot,
|
|
507
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
508
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
509
|
+
}),
|
|
510
|
+
dispatch: (extraArgs, lease, isFirst, attemptIo) =>
|
|
511
|
+
dispatchAdmittedFixer({
|
|
512
|
+
admitted,
|
|
513
|
+
env: {
|
|
514
|
+
...env,
|
|
515
|
+
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
516
|
+
},
|
|
517
|
+
io: attemptIo,
|
|
518
|
+
extraArgs,
|
|
519
|
+
lease,
|
|
520
|
+
methodMaterial,
|
|
521
|
+
...(isFirst && env.engine !== undefined ? { effectiveEngine: env.engine } : {}),
|
|
522
|
+
}),
|
|
524
523
|
});
|
|
525
524
|
}
|
|
526
525
|
|
|
@@ -568,7 +567,7 @@ export async function runPublicFixerResume(
|
|
|
568
567
|
|
|
569
568
|
let lease: RunWriterLease;
|
|
570
569
|
try {
|
|
571
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
570
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
572
571
|
} catch (error) {
|
|
573
572
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
574
573
|
io.stderr(formatCliDiagnostic(error.message));
|
|
@@ -600,7 +599,7 @@ export async function runPublicFixerResume(
|
|
|
600
599
|
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
601
600
|
});
|
|
602
601
|
|
|
603
|
-
|
|
602
|
+
const result = await dispatchAdmittedFixer({
|
|
604
603
|
admitted,
|
|
605
604
|
env: {
|
|
606
605
|
...env,
|
|
@@ -611,6 +610,8 @@ export async function runPublicFixerResume(
|
|
|
611
610
|
lease,
|
|
612
611
|
methodMaterial,
|
|
613
612
|
});
|
|
613
|
+
if (result.terminal !== undefined) (result.terminal as { autoResumeCount?: number }).autoResumeCount = 0;
|
|
614
|
+
return result;
|
|
614
615
|
}
|
|
615
616
|
|
|
616
617
|
// Re-export for tests that assert typed credential failure channel shape.
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
RunWriterLeaseHeldError,
|
|
46
46
|
type RunWriterLease,
|
|
47
47
|
} from "./run-lifecycle.ts";
|
|
48
|
+
import { runWithAutoResumeLoop } from "./auto-resume.ts";
|
|
48
49
|
import {
|
|
49
50
|
classifyPostAdmissionFailure,
|
|
50
51
|
exitCodeForTerminalOutcome,
|
|
@@ -459,35 +460,33 @@ export async function runPublicJudge(
|
|
|
459
460
|
|
|
460
461
|
await markRunAdmitted(admitted);
|
|
461
462
|
|
|
462
|
-
|
|
463
|
-
try {
|
|
464
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
465
|
-
} catch (error) {
|
|
466
|
-
if (error instanceof RunWriterLeaseHeldError) {
|
|
467
|
-
presentStructuralRejection(error, io);
|
|
468
|
-
return { exitCode: 2 };
|
|
469
|
-
}
|
|
470
|
-
throw error;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
const extraArgs = buildJudgeActivationExtraArgs(admitted, {
|
|
474
|
-
packageRoot: env.packageRoot,
|
|
475
|
-
...(env.model === undefined ? {} : { model: env.model }),
|
|
476
|
-
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
477
|
-
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
return await dispatchAdmittedJudge({
|
|
463
|
+
return runWithAutoResumeLoop({
|
|
481
464
|
admitted,
|
|
482
|
-
env: {
|
|
483
|
-
...env,
|
|
484
|
-
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
485
|
-
},
|
|
486
465
|
io,
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
466
|
+
buildInitialArgs: () =>
|
|
467
|
+
buildJudgeActivationExtraArgs(admitted, {
|
|
468
|
+
packageRoot: env.packageRoot,
|
|
469
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
470
|
+
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
471
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
472
|
+
}),
|
|
473
|
+
buildResumeArgs: () =>
|
|
474
|
+
buildJudgeResumeActivationExtraArgs(admitted, {
|
|
475
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
476
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
477
|
+
}),
|
|
478
|
+
dispatch: (extraArgs, lease, isFirst, attemptIo) =>
|
|
479
|
+
dispatchAdmittedJudge({
|
|
480
|
+
admitted,
|
|
481
|
+
env: {
|
|
482
|
+
...env,
|
|
483
|
+
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
484
|
+
},
|
|
485
|
+
io: attemptIo,
|
|
486
|
+
extraArgs,
|
|
487
|
+
lease,
|
|
488
|
+
...(isFirst && env.engine !== undefined ? { effectiveEngine: env.engine } : {}),
|
|
489
|
+
}),
|
|
491
490
|
});
|
|
492
491
|
}
|
|
493
492
|
|
|
@@ -537,7 +536,7 @@ export async function runPublicResume(
|
|
|
537
536
|
|
|
538
537
|
let lease: RunWriterLease;
|
|
539
538
|
try {
|
|
540
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
539
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
541
540
|
} catch (error) {
|
|
542
541
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
543
542
|
// Concurrent resume: reject without second writer or dispatch.
|
|
@@ -552,7 +551,7 @@ export async function runPublicResume(
|
|
|
552
551
|
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
553
552
|
});
|
|
554
553
|
|
|
555
|
-
|
|
554
|
+
const result = await dispatchAdmittedJudge({
|
|
556
555
|
admitted,
|
|
557
556
|
env: {
|
|
558
557
|
...env,
|
|
@@ -562,4 +561,9 @@ export async function runPublicResume(
|
|
|
562
561
|
extraArgs,
|
|
563
562
|
lease,
|
|
564
563
|
});
|
|
564
|
+
// Manual resume: distinct scope from per-call auto retry; just expose observation.
|
|
565
|
+
if (result.terminal !== undefined) {
|
|
566
|
+
(result.terminal as { autoResumeCount?: number }).autoResumeCount = 0;
|
|
567
|
+
}
|
|
568
|
+
return result;
|
|
565
569
|
}
|
|
@@ -55,6 +55,7 @@ import {
|
|
|
55
55
|
type RunWriterLease,
|
|
56
56
|
type TypedProviderHttpObservation,
|
|
57
57
|
} from "./run-lifecycle.ts";
|
|
58
|
+
import { runWithAutoResumeLoop } from "./auto-resume.ts";
|
|
58
59
|
import {
|
|
59
60
|
classifyPostAdmissionFailure,
|
|
60
61
|
exitCodeForTerminalOutcome,
|
|
@@ -554,22 +555,10 @@ export async function runPublicMerger(
|
|
|
554
555
|
|
|
555
556
|
await markRunAdmitted(admitted);
|
|
556
557
|
|
|
557
|
-
let lease: RunWriterLease;
|
|
558
|
-
try {
|
|
559
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
560
|
-
} catch (error) {
|
|
561
|
-
if (error instanceof RunWriterLeaseHeldError) {
|
|
562
|
-
presentStructuralRejection(error, io);
|
|
563
|
-
return { exitCode: 2 };
|
|
564
|
-
}
|
|
565
|
-
throw error;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
558
|
let methodMaterial: PackagedMethodSkillMaterial;
|
|
569
559
|
try {
|
|
570
560
|
methodMaterial = await loadMergerMethodMaterial(env.packageRoot);
|
|
571
561
|
} catch (error) {
|
|
572
|
-
await lease.release();
|
|
573
562
|
return await presentControlledFailure(
|
|
574
563
|
admitted,
|
|
575
564
|
{
|
|
@@ -583,24 +572,35 @@ export async function runPublicMerger(
|
|
|
583
572
|
);
|
|
584
573
|
}
|
|
585
574
|
|
|
586
|
-
|
|
587
|
-
packageRoot: env.packageRoot,
|
|
588
|
-
...(env.model === undefined ? {} : { model: env.model }),
|
|
589
|
-
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
590
|
-
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
591
|
-
});
|
|
592
|
-
|
|
593
|
-
return await dispatchAdmittedMerger({
|
|
575
|
+
return runWithAutoResumeLoop({
|
|
594
576
|
admitted,
|
|
595
|
-
env: {
|
|
596
|
-
...env,
|
|
597
|
-
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
598
|
-
},
|
|
599
577
|
io,
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
578
|
+
buildInitialArgs: () =>
|
|
579
|
+
buildMergerActivationExtraArgs(admitted, {
|
|
580
|
+
packageRoot: env.packageRoot,
|
|
581
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
582
|
+
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
583
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
584
|
+
}),
|
|
585
|
+
buildResumeArgs: () =>
|
|
586
|
+
buildMergerResumeActivationExtraArgs(admitted, {
|
|
587
|
+
packageRoot: env.packageRoot,
|
|
588
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
589
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
590
|
+
}),
|
|
591
|
+
dispatch: (extraArgs, lease, isFirst, attemptIo) =>
|
|
592
|
+
dispatchAdmittedMerger({
|
|
593
|
+
admitted,
|
|
594
|
+
env: {
|
|
595
|
+
...env,
|
|
596
|
+
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
597
|
+
},
|
|
598
|
+
io: attemptIo,
|
|
599
|
+
extraArgs,
|
|
600
|
+
lease,
|
|
601
|
+
methodMaterial,
|
|
602
|
+
...(isFirst && env.engine !== undefined ? { effectiveEngine: env.engine } : {}),
|
|
603
|
+
}),
|
|
604
604
|
});
|
|
605
605
|
}
|
|
606
606
|
|
|
@@ -648,7 +648,7 @@ export async function runPublicMergerResume(
|
|
|
648
648
|
|
|
649
649
|
let lease: RunWriterLease;
|
|
650
650
|
try {
|
|
651
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
651
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
652
652
|
} catch (error) {
|
|
653
653
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
654
654
|
io.stderr(formatCliDiagnostic(error.message));
|
|
@@ -681,7 +681,7 @@ export async function runPublicMergerResume(
|
|
|
681
681
|
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
682
682
|
});
|
|
683
683
|
|
|
684
|
-
|
|
684
|
+
const result = await dispatchAdmittedMerger({
|
|
685
685
|
admitted,
|
|
686
686
|
env: {
|
|
687
687
|
...env,
|
|
@@ -692,6 +692,8 @@ export async function runPublicMergerResume(
|
|
|
692
692
|
lease,
|
|
693
693
|
methodMaterial,
|
|
694
694
|
});
|
|
695
|
+
if (result.terminal !== undefined) (result.terminal as { autoResumeCount?: number }).autoResumeCount = 0;
|
|
696
|
+
return result;
|
|
695
697
|
}
|
|
696
698
|
|
|
697
699
|
export type { ExplicitInternalKnownFailure, PackagedMethodSkillProvenance };
|
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
type RunWriterLease,
|
|
54
54
|
type TypedProviderHttpObservation,
|
|
55
55
|
} from "./run-lifecycle.ts";
|
|
56
|
+
import { runWithAutoResumeLoop } from "./auto-resume.ts";
|
|
56
57
|
import {
|
|
57
58
|
classifyPostAdmissionFailure,
|
|
58
59
|
exitCodeForTerminalOutcome,
|
|
@@ -494,22 +495,10 @@ export async function runPublicReviewer(
|
|
|
494
495
|
|
|
495
496
|
await markRunAdmitted(admitted);
|
|
496
497
|
|
|
497
|
-
let lease: RunWriterLease;
|
|
498
|
-
try {
|
|
499
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
500
|
-
} catch (error) {
|
|
501
|
-
if (error instanceof RunWriterLeaseHeldError) {
|
|
502
|
-
presentStructuralRejection(error, io);
|
|
503
|
-
return { exitCode: 2 };
|
|
504
|
-
}
|
|
505
|
-
throw error;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
498
|
let methodMaterial: PackagedMethodSkillMaterial;
|
|
509
499
|
try {
|
|
510
500
|
methodMaterial = await loadReviewerMethodMaterial(env.packageRoot);
|
|
511
501
|
} catch (error) {
|
|
512
|
-
await lease.release();
|
|
513
502
|
return await presentControlledFailure(
|
|
514
503
|
admitted,
|
|
515
504
|
{
|
|
@@ -522,25 +511,35 @@ export async function runPublicReviewer(
|
|
|
522
511
|
);
|
|
523
512
|
}
|
|
524
513
|
|
|
525
|
-
|
|
526
|
-
packageRoot: env.packageRoot,
|
|
527
|
-
...(env.model === undefined ? {} : { model: env.model }),
|
|
528
|
-
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
529
|
-
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
return await dispatchAdmittedReviewer({
|
|
514
|
+
return runWithAutoResumeLoop({
|
|
533
515
|
admitted,
|
|
534
|
-
env: {
|
|
535
|
-
...env,
|
|
536
|
-
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
537
|
-
},
|
|
538
516
|
io,
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
517
|
+
buildInitialArgs: () =>
|
|
518
|
+
buildReviewerActivationExtraArgs(admitted, {
|
|
519
|
+
packageRoot: env.packageRoot,
|
|
520
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
521
|
+
...(env.engine === undefined ? {} : { engine: env.engine }),
|
|
522
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
523
|
+
}),
|
|
524
|
+
buildResumeArgs: () =>
|
|
525
|
+
buildReviewerResumeActivationExtraArgs(admitted, {
|
|
526
|
+
packageRoot: env.packageRoot,
|
|
527
|
+
...(env.model === undefined ? {} : { model: env.model }),
|
|
528
|
+
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
529
|
+
}),
|
|
530
|
+
dispatch: (extraArgs, lease, isFirst, attemptIo) =>
|
|
531
|
+
dispatchAdmittedReviewer({
|
|
532
|
+
admitted,
|
|
533
|
+
env: {
|
|
534
|
+
...env,
|
|
535
|
+
...(admitted.correlationId === undefined ? {} : { correlationId: admitted.correlationId }),
|
|
536
|
+
},
|
|
537
|
+
io: attemptIo,
|
|
538
|
+
extraArgs,
|
|
539
|
+
lease,
|
|
540
|
+
methodMaterial,
|
|
541
|
+
...(isFirst && env.engine !== undefined ? { effectiveEngine: env.engine } : {}),
|
|
542
|
+
}),
|
|
544
543
|
});
|
|
545
544
|
}
|
|
546
545
|
|
|
@@ -588,7 +587,7 @@ export async function runPublicReviewerResume(
|
|
|
588
587
|
|
|
589
588
|
let lease: RunWriterLease;
|
|
590
589
|
try {
|
|
591
|
-
lease = await acquireRunWriterLease(admitted.runDirectory);
|
|
590
|
+
lease = await acquireRunWriterLease(admitted.runDirectory, (diagnostic) => io.stderr(diagnostic));
|
|
592
591
|
} catch (error) {
|
|
593
592
|
if (error instanceof RunWriterLeaseHeldError) {
|
|
594
593
|
io.stderr(formatCliDiagnostic(error.message));
|
|
@@ -620,7 +619,7 @@ export async function runPublicReviewerResume(
|
|
|
620
619
|
...(env.extraPiArgs === undefined ? {} : { extraPiArgs: env.extraPiArgs }),
|
|
621
620
|
});
|
|
622
621
|
|
|
623
|
-
|
|
622
|
+
const result = await dispatchAdmittedReviewer({
|
|
624
623
|
admitted,
|
|
625
624
|
env: {
|
|
626
625
|
...env,
|
|
@@ -631,6 +630,8 @@ export async function runPublicReviewerResume(
|
|
|
631
630
|
lease,
|
|
632
631
|
methodMaterial,
|
|
633
632
|
});
|
|
633
|
+
if (result.terminal !== undefined) (result.terminal as { autoResumeCount?: number }).autoResumeCount = 0;
|
|
634
|
+
return result;
|
|
634
635
|
}
|
|
635
636
|
|
|
636
637
|
export type { ExplicitInternalKnownFailure, PackagedMethodSkillProvenance };
|