@principles/core 1.123.0 → 1.125.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/dist/runtime-v2/__tests__/architecture-regression.test.js +42 -74
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js +115 -21
- package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/golden-path-diagnostician-e2e.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js +7 -6
- package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-short-circuit.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js.map +1 -1
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -0
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
- package/dist/runtime-v2/cli/diagnose.d.ts +2 -2
- package/dist/runtime-v2/cli/diagnose.d.ts.map +1 -1
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +3 -3
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-defaults.js +3 -3
- package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-types.d.ts +2 -0
- package/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-types.js.map +1 -1
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js +45 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +57 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js +39 -0
- package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +34 -0
- package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js +57 -0
- package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js.map +1 -0
- package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts +80 -0
- package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/diag-distiller-output.js +103 -0
- package/dist/runtime-v2/diagnostician/diag-distiller-output.js.map +1 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +115 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js +166 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -0
- package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts +134 -0
- package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js +156 -0
- package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js.map +1 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +96 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +216 -0
- package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -0
- package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts +127 -0
- package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts.map +1 -0
- package/dist/runtime-v2/diagnostician/router-prompt-builder.js +131 -0
- package/dist/runtime-v2/diagnostician/router-prompt-builder.js.map +1 -0
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +1 -64
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.js +0 -186
- package/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +13 -7
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +3 -3
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +14 -10
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +9 -6
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts +25 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js +123 -0
- package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +734 -0
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js +437 -0
- package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js +336 -0
- package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js +437 -0
- package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js +3 -3
- package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js.map +1 -1
- package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts +83 -0
- package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/diag-distiller-runner.js +274 -0
- package/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +73 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js +229 -0
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -0
- package/dist/runtime-v2/internalization/diag-router-runner.d.ts +85 -0
- package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/diag-router-runner.js +353 -0
- package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -0
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts +66 -0
- package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/split-diagnostician-runner.js +241 -0
- package/dist/runtime-v2/internalization/split-diagnostician-runner.js.map +1 -0
- package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js +28 -21
- package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.d.ts +22 -3
- package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.js +16 -7
- package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +13 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js +64 -34
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +2 -2
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/diagnose.test.js.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts +3 -3
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +6 -6
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/dist/runtime-v2/runner/peer-runner-types.d.ts +3 -3
- package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
- package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js +2 -2
- package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js.map +1 -1
- package/dist/runtime-v2/types/principle-enums.d.ts +2 -2
- package/dist/runtime-v2/types/principle-enums.d.ts.map +1 -1
- package/dist/runtime-v2/types/principle-enums.js +1 -0
- package/dist/runtime-v2/types/principle-enums.js.map +1 -1
- package/dist/runtime-v2/types/principle-schema.d.ts +1 -1
- package/dist/runtime-v2/types/principle-tree-store.d.ts +1 -1
- package/dist/telemetry-event.d.ts +2 -2
- package/dist/telemetry-event.d.ts.map +1 -1
- package/dist/telemetry-event.js +1 -0
- package/dist/telemetry-event.js.map +1 -1
- package/package.json +1 -1
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts +0 -2
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts.map +0 -1
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js +0 -122
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts +0 -2
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js +0 -169
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts +0 -2
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js +0 -462
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts +0 -13
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js +0 -97
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js +0 -378
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js +0 -682
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js +0 -286
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js +0 -320
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js +0 -261
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js +0 -405
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js +0 -347
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js +0 -186
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js +0 -355
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js +0 -486
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js +0 -171
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js +0 -175
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js +0 -276
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js +0 -272
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.js +0 -67
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.js.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts +0 -57
- package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner-options.js +0 -21
- package/dist/runtime-v2/runner/diagnostician-runner-options.js.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner.d.ts +0 -89
- package/dist/runtime-v2/runner/diagnostician-runner.d.ts.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner.js +0 -470
- package/dist/runtime-v2/runner/diagnostician-runner.js.map +0 -1
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* max_attempts_exceeded integration tests.
|
|
3
|
-
*
|
|
4
|
-
* Verifies DiagnosticianRunner correctly handles max attempts enforcement:
|
|
5
|
-
* 1. Task fails with max_attempts_exceeded when RetryPolicy.shouldRetry returns false
|
|
6
|
-
* 2. attemptCount correctly reflects total attempts at the boundary
|
|
7
|
-
* 3. Subsequent acquireLease calls are rejected after max_attempts_exceeded
|
|
8
|
-
*/
|
|
9
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
10
|
-
import * as fs from 'fs';
|
|
11
|
-
import * as path from 'path';
|
|
12
|
-
import * as os from 'os';
|
|
13
|
-
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
14
|
-
import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
|
|
15
|
-
import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
|
|
16
|
-
import { StoreEventEmitter } from '../../store/event-emitter.js';
|
|
17
|
-
import { DiagnosticianRunner } from '../diagnostician-runner.js';
|
|
18
|
-
import { PassThroughValidator } from '../diagnostician-validator.js';
|
|
19
|
-
import { PDRuntimeError } from '../../error-categories.js';
|
|
20
|
-
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
21
|
-
// -- Test fixtures --
|
|
22
|
-
function makeDiagnosticianOutput(taskId) {
|
|
23
|
-
return {
|
|
24
|
-
valid: true,
|
|
25
|
-
diagnosisId: `diag-${Date.now()}`,
|
|
26
|
-
taskId,
|
|
27
|
-
summary: 'Integration test diagnosis summary',
|
|
28
|
-
rootCause: 'Test root cause analysis',
|
|
29
|
-
violatedPrinciples: [],
|
|
30
|
-
evidence: [],
|
|
31
|
-
recommendations: [],
|
|
32
|
-
confidence: 0.85,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function makeDiagnosticianTaskInput(options) {
|
|
36
|
-
const { taskId, workspaceDir, diagnostic, overrides } = options;
|
|
37
|
-
const diagnosticJson = JSON.stringify({
|
|
38
|
-
workspaceDir,
|
|
39
|
-
reasonSummary: diagnostic?.reasonSummary ?? 'Integration test task',
|
|
40
|
-
sourcePainId: diagnostic?.sourcePainId,
|
|
41
|
-
severity: diagnostic?.severity,
|
|
42
|
-
source: diagnostic?.source,
|
|
43
|
-
});
|
|
44
|
-
return {
|
|
45
|
-
taskId,
|
|
46
|
-
taskKind: 'diagnostician',
|
|
47
|
-
status: 'pending',
|
|
48
|
-
attemptCount: 0,
|
|
49
|
-
maxAttempts: 3,
|
|
50
|
-
...overrides,
|
|
51
|
-
diagnosticJson,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
// -- FailingValidator --
|
|
55
|
-
class FailingValidator {
|
|
56
|
-
errorCategory;
|
|
57
|
-
errorMessages;
|
|
58
|
-
constructor(errorCategory = 'output_invalid', errorMessages = ['Integration test validation failure']) {
|
|
59
|
-
this.errorCategory = errorCategory;
|
|
60
|
-
this.errorMessages = errorMessages;
|
|
61
|
-
}
|
|
62
|
-
async validate(_output, _taskId) {
|
|
63
|
-
return {
|
|
64
|
-
valid: false,
|
|
65
|
-
errors: this.errorMessages,
|
|
66
|
-
errorCategory: this.errorCategory,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// -- StubRuntimeAdapter --
|
|
71
|
-
/* eslint-disable @typescript-eslint/class-methods-use-this */
|
|
72
|
-
class StubRuntimeAdapter {
|
|
73
|
-
kindValue;
|
|
74
|
-
nextOutput = null;
|
|
75
|
-
nextStatus = 'succeeded';
|
|
76
|
-
constructor(kindValue = 'test-double') {
|
|
77
|
-
this.kindValue = kindValue;
|
|
78
|
-
}
|
|
79
|
-
setOutput(output) {
|
|
80
|
-
this.nextOutput = output;
|
|
81
|
-
}
|
|
82
|
-
setRunStatus(status) {
|
|
83
|
-
this.nextStatus = status;
|
|
84
|
-
}
|
|
85
|
-
kind() {
|
|
86
|
-
return this.kindValue;
|
|
87
|
-
}
|
|
88
|
-
async getCapabilities() {
|
|
89
|
-
return {
|
|
90
|
-
supportsStructuredJsonOutput: true,
|
|
91
|
-
supportsToolUse: false,
|
|
92
|
-
supportsWorkingDirectory: false,
|
|
93
|
-
supportsModelSelection: false,
|
|
94
|
-
supportsLongRunningSessions: false,
|
|
95
|
-
supportsCancellation: true,
|
|
96
|
-
supportsArtifactWriteBack: false,
|
|
97
|
-
supportsConcurrentRuns: false,
|
|
98
|
-
supportsStreaming: false,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
async healthCheck() {
|
|
102
|
-
return {
|
|
103
|
-
healthy: true,
|
|
104
|
-
degraded: false,
|
|
105
|
-
warnings: [],
|
|
106
|
-
lastCheckedAt: new Date().toISOString(),
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
async startRun(_input) {
|
|
110
|
-
const runId = `stub-run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
111
|
-
return {
|
|
112
|
-
runId,
|
|
113
|
-
runtimeKind: this.kindValue,
|
|
114
|
-
startedAt: new Date().toISOString(),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
async pollRun(runId) {
|
|
118
|
-
return {
|
|
119
|
-
runId,
|
|
120
|
-
status: this.nextStatus,
|
|
121
|
-
startedAt: new Date().toISOString(),
|
|
122
|
-
endedAt: new Date().toISOString(),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
async cancelRun(_runId) { }
|
|
126
|
-
async fetchOutput(runId) {
|
|
127
|
-
if (this.nextOutput === null)
|
|
128
|
-
return null;
|
|
129
|
-
return { runId, payload: this.nextOutput };
|
|
130
|
-
}
|
|
131
|
-
async fetchArtifacts(_runId) {
|
|
132
|
-
return [];
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/* eslint-enable @typescript-eslint/class-methods-use-this */
|
|
136
|
-
// -- Integration test setup --
|
|
137
|
-
const TMP_ROOT = path.join(os.tmpdir(), `pd-m4-04-max-attempts-${process.pid}`);
|
|
138
|
-
describe('max_attempts_exceeded integration', () => {
|
|
139
|
-
let testDir = '';
|
|
140
|
-
let stateManager = null;
|
|
141
|
-
let contextAssembler = null;
|
|
142
|
-
let historyQuery = null;
|
|
143
|
-
let eventEmitter = null;
|
|
144
|
-
let runtimeAdapter = null;
|
|
145
|
-
beforeEach(async () => {
|
|
146
|
-
testDir = path.join(TMP_ROOT, `test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
147
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
148
|
-
stateManager = new RuntimeStateManager({ workspaceDir: testDir });
|
|
149
|
-
await stateManager.initialize();
|
|
150
|
-
const sqliteConn = stateManager.connection;
|
|
151
|
-
historyQuery = new SqliteHistoryQuery(sqliteConn);
|
|
152
|
-
const { taskStore } = stateManager;
|
|
153
|
-
const { runStore } = stateManager;
|
|
154
|
-
contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
|
|
155
|
-
eventEmitter = new StoreEventEmitter();
|
|
156
|
-
runtimeAdapter = new StubRuntimeAdapter();
|
|
157
|
-
});
|
|
158
|
-
afterEach(() => {
|
|
159
|
-
stateManager.close();
|
|
160
|
-
try {
|
|
161
|
-
fs.rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
// ignore cleanup errors on Windows
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
function createRunner(validator = new PassThroughValidator(), committer = { commit: async () => ({ commitId: "mock-commit-id", artifactId: "mock-artifact-id", candidateCount: 0 }) }) {
|
|
168
|
-
return new DiagnosticianRunner({
|
|
169
|
-
stateManager,
|
|
170
|
-
contextAssembler,
|
|
171
|
-
runtimeAdapter,
|
|
172
|
-
eventEmitter,
|
|
173
|
-
validator,
|
|
174
|
-
committer,
|
|
175
|
-
}, {
|
|
176
|
-
owner: 'integration-test-runner',
|
|
177
|
-
runtimeKind: 'test-double',
|
|
178
|
-
pollIntervalMs: 50,
|
|
179
|
-
timeoutMs: 2000,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
it('transitions to max_attempts_exceeded when attemptCount reaches maxAttempts', async () => {
|
|
183
|
-
const taskId = 'max-attempts-task-001';
|
|
184
|
-
// Create task with maxAttempts=2
|
|
185
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
186
|
-
taskId,
|
|
187
|
-
workspaceDir: testDir,
|
|
188
|
-
diagnostic: { reasonSummary: 'max attempts exceeded test' },
|
|
189
|
-
overrides: { maxAttempts: 2 },
|
|
190
|
-
}));
|
|
191
|
-
// First attempt: acquire lease, then fail validation → retry_wait
|
|
192
|
-
const output = makeDiagnosticianOutput(taskId);
|
|
193
|
-
runtimeAdapter.setOutput(output);
|
|
194
|
-
const failingValidator = new FailingValidator('output_invalid', ['Validation failure on attempt 1']);
|
|
195
|
-
const runner = createRunner(failingValidator);
|
|
196
|
-
const result1 = await runner.run(taskId);
|
|
197
|
-
expect(result1.status).toBe('retried');
|
|
198
|
-
expect(result1.attemptCount).toBe(1);
|
|
199
|
-
let task = await stateManager.getTask(taskId);
|
|
200
|
-
expect(task.status).toBe('retry_wait');
|
|
201
|
-
expect(task.attemptCount).toBe(1);
|
|
202
|
-
// Second attempt: runner re-acquires lease (attemptCount becomes 2), fails validation again
|
|
203
|
-
// shouldRetry returns false because attemptCount (2) >= maxAttempts (2)
|
|
204
|
-
const runner2 = createRunner(failingValidator);
|
|
205
|
-
const result2 = await runner2.run(taskId);
|
|
206
|
-
expect(result2.status).toBe('failed');
|
|
207
|
-
expect(result2.errorCategory).toBe('max_attempts_exceeded');
|
|
208
|
-
task = await stateManager.getTask(taskId);
|
|
209
|
-
expect(task.status).toBe('failed');
|
|
210
|
-
expect(task.lastError).toBe('max_attempts_exceeded');
|
|
211
|
-
});
|
|
212
|
-
it('rejects subsequent acquireLease after max_attempts_exceeded', async () => {
|
|
213
|
-
const taskId = 'max-attempts-task-002';
|
|
214
|
-
// Create task with maxAttempts=1 — single attempt then done
|
|
215
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
216
|
-
taskId,
|
|
217
|
-
workspaceDir: testDir,
|
|
218
|
-
diagnostic: { reasonSummary: 'single attempt max test' },
|
|
219
|
-
overrides: { maxAttempts: 1 },
|
|
220
|
-
}));
|
|
221
|
-
// First attempt: acquire + fail validation
|
|
222
|
-
runtimeAdapter.setOutput(makeDiagnosticianOutput(taskId));
|
|
223
|
-
const runner = createRunner(new FailingValidator('output_invalid', ['Always fails']));
|
|
224
|
-
const result = await runner.run(taskId);
|
|
225
|
-
// With maxAttempts=1, shouldRetry returns false immediately → max_attempts_exceeded
|
|
226
|
-
expect(result.status).toBe('failed');
|
|
227
|
-
expect(result.errorCategory).toBe('max_attempts_exceeded');
|
|
228
|
-
const task = await stateManager.getTask(taskId);
|
|
229
|
-
expect(task.status).toBe('failed');
|
|
230
|
-
// Subsequent acquireLease should throw lease_conflict (task is 'failed', not 'pending'/'retry_wait')
|
|
231
|
-
await expect(stateManager.acquireLease({ taskId, owner: 'late-runner', runtimeKind: 'test-double' })).rejects.toThrow();
|
|
232
|
-
try {
|
|
233
|
-
await stateManager.acquireLease({ taskId, owner: 'late-runner', runtimeKind: 'test-double' });
|
|
234
|
-
}
|
|
235
|
-
catch (err) {
|
|
236
|
-
expect(err).toBeInstanceOf(PDRuntimeError);
|
|
237
|
-
expect(err.category).toBe('lease_conflict');
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
it('tracks correct attemptCount at boundary with manual state transitions', async () => {
|
|
241
|
-
const taskId = 'max-attempts-task-003';
|
|
242
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
243
|
-
taskId,
|
|
244
|
-
workspaceDir: testDir,
|
|
245
|
-
diagnostic: { reasonSummary: 'boundary attemptCount test' },
|
|
246
|
-
overrides: { maxAttempts: 2 },
|
|
247
|
-
}));
|
|
248
|
-
// Manual cycle 1: acquire → retry_wait
|
|
249
|
-
await stateManager.acquireLease({ taskId, owner: 'runner-1', runtimeKind: 'test-double' });
|
|
250
|
-
let task = await stateManager.getTask(taskId);
|
|
251
|
-
expect(task.attemptCount).toBe(1);
|
|
252
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
253
|
-
task = await stateManager.getTask(taskId);
|
|
254
|
-
expect(task.status).toBe('retry_wait');
|
|
255
|
-
expect(task.attemptCount).toBe(1);
|
|
256
|
-
// Manual cycle 2: acquire → attemptCount becomes 2
|
|
257
|
-
await stateManager.acquireLease({ taskId, owner: 'runner-2', runtimeKind: 'test-double' });
|
|
258
|
-
task = await stateManager.getTask(taskId);
|
|
259
|
-
expect(task.attemptCount).toBe(2);
|
|
260
|
-
// Mark retry_wait — shouldRetry returns false (2 >= 2)
|
|
261
|
-
// The runner's retryOrFail would call markTaskFailed, but we test at stateManager level
|
|
262
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
263
|
-
task = await stateManager.getTask(taskId);
|
|
264
|
-
expect(task.status).toBe('retry_wait');
|
|
265
|
-
expect(task.attemptCount).toBe(2);
|
|
266
|
-
// Verify RetryPolicy correctly reports shouldRetry = false
|
|
267
|
-
const shouldRetry = stateManager.getRetryPolicy().shouldRetry(task);
|
|
268
|
-
expect(shouldRetry).toBe(false);
|
|
269
|
-
// Verify 2 run records exist
|
|
270
|
-
const runs = await stateManager.getRunsByTask(taskId);
|
|
271
|
-
expect(runs).toHaveLength(2);
|
|
272
|
-
expect(runs[0].attemptNumber).toBe(1);
|
|
273
|
-
expect(runs[1].attemptNumber).toBe(2);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
//# sourceMappingURL=max-attempts-exceeded.integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"max-attempts-exceeded.integration.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry-wait-recovery.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* retry_wait recovery integration tests.
|
|
3
|
-
*
|
|
4
|
-
* Verifies DiagnosticianRunner correctly handles retry_wait → leased recovery:
|
|
5
|
-
* 1. Task in retry_wait can be re-acquired via acquireLease
|
|
6
|
-
* 2. attemptCount increments correctly on each lease acquisition
|
|
7
|
-
* 3. Multiple RunRecords are created (one per lease cycle)
|
|
8
|
-
* 4. Runner can complete the task after recovery
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
import * as fs from 'fs';
|
|
12
|
-
import * as path from 'path';
|
|
13
|
-
import * as os from 'os';
|
|
14
|
-
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
15
|
-
import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
|
|
16
|
-
import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
|
|
17
|
-
import { StoreEventEmitter } from '../../store/event-emitter.js';
|
|
18
|
-
import { DiagnosticianRunner } from '../diagnostician-runner.js';
|
|
19
|
-
import { PassThroughValidator } from '../diagnostician-validator.js';
|
|
20
|
-
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
21
|
-
// -- Test fixtures --
|
|
22
|
-
function makeDiagnosticianOutput(taskId) {
|
|
23
|
-
return {
|
|
24
|
-
valid: true,
|
|
25
|
-
diagnosisId: `diag-${Date.now()}`,
|
|
26
|
-
taskId,
|
|
27
|
-
summary: 'Integration test diagnosis summary',
|
|
28
|
-
rootCause: 'Test root cause analysis',
|
|
29
|
-
violatedPrinciples: [],
|
|
30
|
-
evidence: [],
|
|
31
|
-
recommendations: [],
|
|
32
|
-
confidence: 0.85,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function makeDiagnosticianTaskInput(options) {
|
|
36
|
-
const { taskId, workspaceDir, diagnostic, overrides } = options;
|
|
37
|
-
const diagnosticJson = JSON.stringify({
|
|
38
|
-
workspaceDir,
|
|
39
|
-
reasonSummary: diagnostic?.reasonSummary ?? 'Integration test task',
|
|
40
|
-
sourcePainId: diagnostic?.sourcePainId,
|
|
41
|
-
severity: diagnostic?.severity,
|
|
42
|
-
source: diagnostic?.source,
|
|
43
|
-
});
|
|
44
|
-
return {
|
|
45
|
-
taskId,
|
|
46
|
-
taskKind: 'diagnostician',
|
|
47
|
-
status: 'pending',
|
|
48
|
-
attemptCount: 0,
|
|
49
|
-
maxAttempts: 3,
|
|
50
|
-
...overrides,
|
|
51
|
-
diagnosticJson,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
// -- StubRuntimeAdapter --
|
|
55
|
-
/* eslint-disable @typescript-eslint/class-methods-use-this */
|
|
56
|
-
class StubRuntimeAdapter {
|
|
57
|
-
kindValue;
|
|
58
|
-
nextOutput = null;
|
|
59
|
-
nextStatus = 'succeeded';
|
|
60
|
-
constructor(kindValue = 'test-double') {
|
|
61
|
-
this.kindValue = kindValue;
|
|
62
|
-
}
|
|
63
|
-
setOutput(output) {
|
|
64
|
-
this.nextOutput = output;
|
|
65
|
-
}
|
|
66
|
-
setRunStatus(status) {
|
|
67
|
-
this.nextStatus = status;
|
|
68
|
-
}
|
|
69
|
-
kind() {
|
|
70
|
-
return this.kindValue;
|
|
71
|
-
}
|
|
72
|
-
async getCapabilities() {
|
|
73
|
-
return {
|
|
74
|
-
supportsStructuredJsonOutput: true,
|
|
75
|
-
supportsToolUse: false,
|
|
76
|
-
supportsWorkingDirectory: false,
|
|
77
|
-
supportsModelSelection: false,
|
|
78
|
-
supportsLongRunningSessions: false,
|
|
79
|
-
supportsCancellation: true,
|
|
80
|
-
supportsArtifactWriteBack: false,
|
|
81
|
-
supportsConcurrentRuns: false,
|
|
82
|
-
supportsStreaming: false,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
async healthCheck() {
|
|
86
|
-
return {
|
|
87
|
-
healthy: true,
|
|
88
|
-
degraded: false,
|
|
89
|
-
warnings: [],
|
|
90
|
-
lastCheckedAt: new Date().toISOString(),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
async startRun(_input) {
|
|
94
|
-
const runId = `stub-run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
95
|
-
return {
|
|
96
|
-
runId,
|
|
97
|
-
runtimeKind: this.kindValue,
|
|
98
|
-
startedAt: new Date().toISOString(),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
async pollRun(runId) {
|
|
102
|
-
return {
|
|
103
|
-
runId,
|
|
104
|
-
status: this.nextStatus,
|
|
105
|
-
startedAt: new Date().toISOString(),
|
|
106
|
-
endedAt: new Date().toISOString(),
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
async cancelRun(_runId) { }
|
|
110
|
-
async fetchOutput(runId) {
|
|
111
|
-
if (this.nextOutput === null)
|
|
112
|
-
return null;
|
|
113
|
-
return { runId, payload: this.nextOutput };
|
|
114
|
-
}
|
|
115
|
-
async fetchArtifacts(_runId) {
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/* eslint-enable @typescript-eslint/class-methods-use-this */
|
|
120
|
-
// -- Integration test setup --
|
|
121
|
-
const TMP_ROOT = path.join(os.tmpdir(), `pd-m4-04-retry-wait-${process.pid}`);
|
|
122
|
-
describe('retry_wait recovery integration', () => {
|
|
123
|
-
let testDir = '';
|
|
124
|
-
let stateManager = null;
|
|
125
|
-
let contextAssembler = null;
|
|
126
|
-
let historyQuery = null;
|
|
127
|
-
let eventEmitter = null;
|
|
128
|
-
let runtimeAdapter = null;
|
|
129
|
-
beforeEach(async () => {
|
|
130
|
-
testDir = path.join(TMP_ROOT, `test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
131
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
132
|
-
stateManager = new RuntimeStateManager({ workspaceDir: testDir });
|
|
133
|
-
await stateManager.initialize();
|
|
134
|
-
const sqliteConn = stateManager.connection;
|
|
135
|
-
historyQuery = new SqliteHistoryQuery(sqliteConn);
|
|
136
|
-
const { taskStore } = stateManager;
|
|
137
|
-
const { runStore } = stateManager;
|
|
138
|
-
contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
|
|
139
|
-
eventEmitter = new StoreEventEmitter();
|
|
140
|
-
runtimeAdapter = new StubRuntimeAdapter();
|
|
141
|
-
});
|
|
142
|
-
afterEach(() => {
|
|
143
|
-
stateManager.close();
|
|
144
|
-
try {
|
|
145
|
-
fs.rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
// ignore cleanup errors on Windows
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
function createRunner(validator = new PassThroughValidator(), committer = { commit: async () => ({ commitId: "mock-commit-id", artifactId: "mock-artifact-id", candidateCount: 0 }) }) {
|
|
152
|
-
return new DiagnosticianRunner({
|
|
153
|
-
stateManager,
|
|
154
|
-
contextAssembler,
|
|
155
|
-
runtimeAdapter,
|
|
156
|
-
eventEmitter,
|
|
157
|
-
validator,
|
|
158
|
-
committer,
|
|
159
|
-
}, {
|
|
160
|
-
owner: 'integration-test-runner',
|
|
161
|
-
runtimeKind: 'test-double',
|
|
162
|
-
pollIntervalMs: 50,
|
|
163
|
-
timeoutMs: 2000,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
it('re-acquires task in retry_wait state and increments attemptCount', async () => {
|
|
167
|
-
const taskId = 'retry-wait-task-001';
|
|
168
|
-
// Create diagnostician task with maxAttempts=3
|
|
169
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
170
|
-
taskId,
|
|
171
|
-
workspaceDir: testDir,
|
|
172
|
-
diagnostic: { reasonSummary: 'retry_wait recovery test' },
|
|
173
|
-
overrides: { maxAttempts: 3 },
|
|
174
|
-
}));
|
|
175
|
-
// First acquireLease — attemptCount becomes 1 (first run created)
|
|
176
|
-
await stateManager.acquireLease({
|
|
177
|
-
taskId,
|
|
178
|
-
owner: 'first-runner',
|
|
179
|
-
runtimeKind: 'test-double',
|
|
180
|
-
});
|
|
181
|
-
let task = await stateManager.getTask(taskId);
|
|
182
|
-
expect(task).not.toBeNull();
|
|
183
|
-
expect(task.status).toBe('leased');
|
|
184
|
-
expect(task.attemptCount).toBe(1);
|
|
185
|
-
// Mark task as retry_wait (simulates first attempt failure)
|
|
186
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
187
|
-
task = await stateManager.getTask(taskId);
|
|
188
|
-
expect(task).not.toBeNull();
|
|
189
|
-
expect(task.status).toBe('retry_wait');
|
|
190
|
-
expect(task.attemptCount).toBe(1);
|
|
191
|
-
// Second acquireLease — task in retry_wait should be re-acquirable
|
|
192
|
-
await stateManager.acquireLease({
|
|
193
|
-
taskId,
|
|
194
|
-
owner: 'second-runner',
|
|
195
|
-
runtimeKind: 'test-double',
|
|
196
|
-
});
|
|
197
|
-
task = await stateManager.getTask(taskId);
|
|
198
|
-
expect(task).not.toBeNull();
|
|
199
|
-
expect(task.status).toBe('leased');
|
|
200
|
-
expect(task.attemptCount).toBe(2);
|
|
201
|
-
// Verify 2 RunRecords exist (one per lease acquisition)
|
|
202
|
-
const runs = await stateManager.getRunsByTask(taskId);
|
|
203
|
-
expect(runs).toHaveLength(2);
|
|
204
|
-
expect(runs[0].attemptNumber).toBe(1);
|
|
205
|
-
expect(runs[1].attemptNumber).toBe(2);
|
|
206
|
-
});
|
|
207
|
-
it('runner completes task after retry_wait recovery', async () => {
|
|
208
|
-
const taskId = 'retry-wait-task-002';
|
|
209
|
-
// Create task
|
|
210
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
211
|
-
taskId,
|
|
212
|
-
workspaceDir: testDir,
|
|
213
|
-
diagnostic: { reasonSummary: 'runner recovery test' },
|
|
214
|
-
overrides: { maxAttempts: 3 },
|
|
215
|
-
}));
|
|
216
|
-
// First attempt: acquire → fail → retry_wait
|
|
217
|
-
await stateManager.acquireLease({
|
|
218
|
-
taskId,
|
|
219
|
-
owner: 'first-runner',
|
|
220
|
-
runtimeKind: 'test-double',
|
|
221
|
-
});
|
|
222
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
223
|
-
// Set up adapter for successful run on second attempt
|
|
224
|
-
const output = makeDiagnosticianOutput(taskId);
|
|
225
|
-
runtimeAdapter.setOutput(output);
|
|
226
|
-
// Runner should re-acquire (retry_wait → leased) and complete successfully
|
|
227
|
-
const runner = createRunner();
|
|
228
|
-
const result = await runner.run(taskId);
|
|
229
|
-
expect(result.status).toBe('succeeded');
|
|
230
|
-
expect(result.taskId).toBe(taskId);
|
|
231
|
-
// Verify final task state
|
|
232
|
-
const task = await stateManager.getTask(taskId);
|
|
233
|
-
expect(task).not.toBeNull();
|
|
234
|
-
expect(task.status).toBe('succeeded');
|
|
235
|
-
// Verify total runs: 1 (first failed attempt) + 1 (second attempt created by runner) = 2
|
|
236
|
-
const runs = await stateManager.getRunsByTask(taskId);
|
|
237
|
-
expect(runs).toHaveLength(2);
|
|
238
|
-
});
|
|
239
|
-
it('supports multiple retry_wait cycles with correct attemptCount tracking', async () => {
|
|
240
|
-
const taskId = 'retry-wait-task-003';
|
|
241
|
-
await stateManager.createTask(makeDiagnosticianTaskInput({
|
|
242
|
-
taskId,
|
|
243
|
-
workspaceDir: testDir,
|
|
244
|
-
diagnostic: { reasonSummary: 'multi-cycle recovery test' },
|
|
245
|
-
overrides: { maxAttempts: 5 },
|
|
246
|
-
}));
|
|
247
|
-
// Cycle 1: acquire → retry_wait
|
|
248
|
-
await stateManager.acquireLease({ taskId, owner: 'runner-1', runtimeKind: 'test-double' });
|
|
249
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
250
|
-
let task = await stateManager.getTask(taskId);
|
|
251
|
-
expect(task.attemptCount).toBe(1);
|
|
252
|
-
expect(task.status).toBe('retry_wait');
|
|
253
|
-
// Cycle 2: re-acquire → retry_wait
|
|
254
|
-
await stateManager.acquireLease({ taskId, owner: 'runner-2', runtimeKind: 'test-double' });
|
|
255
|
-
await stateManager.markTaskRetryWait(taskId, 'execution_failed');
|
|
256
|
-
task = await stateManager.getTask(taskId);
|
|
257
|
-
expect(task.attemptCount).toBe(2);
|
|
258
|
-
expect(task.status).toBe('retry_wait');
|
|
259
|
-
// Cycle 3: re-acquire → succeed
|
|
260
|
-
const output = makeDiagnosticianOutput(taskId);
|
|
261
|
-
runtimeAdapter.setOutput(output);
|
|
262
|
-
const runner = createRunner();
|
|
263
|
-
const result = await runner.run(taskId);
|
|
264
|
-
expect(result.status).toBe('succeeded');
|
|
265
|
-
task = await stateManager.getTask(taskId);
|
|
266
|
-
expect(task.status).toBe('succeeded');
|
|
267
|
-
// Total runs: 2 (cycles 1+2) + 1 (runner in cycle 3) = 3
|
|
268
|
-
const runs = await stateManager.getRunsByTask(taskId);
|
|
269
|
-
expect(runs).toHaveLength(3);
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
//# sourceMappingURL=retry-wait-recovery.integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry-wait-recovery.integration.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start-run-input.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/start-run-input.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* StartRunInput construction validation tests.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that the StartRunInput built by DiagnosticianRunner.invokeRuntime()
|
|
5
|
-
* conforms to StartRunInputSchema and contains the expected fields.
|
|
6
|
-
*
|
|
7
|
-
* Approach: Mirror the construction logic from invokeRuntime() in a helper function,
|
|
8
|
-
* then validate the output against the TypeBox schema. This avoids wiring up the
|
|
9
|
-
* full DiagnosticianRunner with mock stores.
|
|
10
|
-
*/
|
|
11
|
-
import { describe, it, expect } from 'vitest';
|
|
12
|
-
import { Value } from '@sinclair/typebox/value';
|
|
13
|
-
import { DiagnosticianPromptBuilder } from '../../diagnostician-prompt-builder.js';
|
|
14
|
-
import { StartRunInputSchema } from '../../runtime-protocol.js';
|
|
15
|
-
/** Mirrors DiagnosticianRunner.invokeRuntime() construction logic exactly. */
|
|
16
|
-
function buildStartRunInput(context, taskId, timeoutMs) {
|
|
17
|
-
const builder = new DiagnosticianPromptBuilder();
|
|
18
|
-
const { message } = builder.buildPrompt(context);
|
|
19
|
-
return {
|
|
20
|
-
agentSpec: { agentId: 'main', schemaVersion: 'v1' },
|
|
21
|
-
taskRef: { taskId },
|
|
22
|
-
inputPayload: message,
|
|
23
|
-
contextItems: [],
|
|
24
|
-
outputSchemaRef: 'diagnostician-output-v1',
|
|
25
|
-
timeoutMs,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
/** Minimal DiagnosticianContextPayload for testing. */
|
|
29
|
-
function makeTestContext() {
|
|
30
|
-
return {
|
|
31
|
-
contextId: 'ctx-test-001',
|
|
32
|
-
contextHash: 'abc123',
|
|
33
|
-
taskId: 'test-task-001',
|
|
34
|
-
workspaceDir: '/tmp/test',
|
|
35
|
-
sourceRefs: [],
|
|
36
|
-
diagnosisTarget: { reasonSummary: 'Test diagnosis target', severity: 'medium' },
|
|
37
|
-
conversationWindow: [],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
describe('StartRunInput construction from invokeRuntime()', () => {
|
|
41
|
-
const context = makeTestContext();
|
|
42
|
-
const taskId = 'test-task-001';
|
|
43
|
-
const timeoutMs = 30000;
|
|
44
|
-
const input = buildStartRunInput(context, taskId, timeoutMs);
|
|
45
|
-
it('passes Value.Check against StartRunInputSchema', () => {
|
|
46
|
-
expect(Value.Check(StartRunInputSchema, input)).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
it('agentSpec field is { agentId: "main", schemaVersion: "v1" }', () => {
|
|
49
|
-
expect(input.agentSpec).toEqual({ agentId: 'main', schemaVersion: 'v1' });
|
|
50
|
-
});
|
|
51
|
-
it('taskRef field is { taskId: "<taskId>" }', () => {
|
|
52
|
-
expect(input.taskRef).toEqual({ taskId: 'test-task-001' });
|
|
53
|
-
});
|
|
54
|
-
it('outputSchemaRef is "diagnostician-output-v1"', () => {
|
|
55
|
-
expect(input.outputSchemaRef).toBe('diagnostician-output-v1');
|
|
56
|
-
});
|
|
57
|
-
it('inputPayload is a JSON string containing taskId and diagnosticInstruction', () => {
|
|
58
|
-
const payload = JSON.parse(input.inputPayload);
|
|
59
|
-
expect(payload.taskId).toBe(taskId);
|
|
60
|
-
expect(payload.diagnosticInstruction).toBeDefined();
|
|
61
|
-
expect(payload.diagnosticInstruction.length).toBeGreaterThan(100);
|
|
62
|
-
});
|
|
63
|
-
it('contextItems is empty (instruction is embedded in inputPayload)', () => {
|
|
64
|
-
expect(input.contextItems).toHaveLength(0);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
//# sourceMappingURL=start-run-input.test.js.map
|