create-principles-disciple 1.145.1 → 1.145.4
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/_release/product-identity.json +2 -2
- package/codex-adapter/dist/worker/workspace-worker.js +2 -1
- package/codex-adapter/package.json +1 -1
- package/console/dist/server/config/pd-config-store.js +3 -0
- package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +4 -4
- package/console/dist/ui/i18n/en.json +17 -16
- package/console/dist/ui/i18n/zh-CN.json +17 -16
- package/console/dist/ui/pages/focus/FocusPage.js +9 -5
- package/console/dist/ui/pages/focus/OwnerDecisionCard.js +1 -1
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +10 -4
- package/console/dist/ui/pages/principles/PrinciplesPage.js +1 -1
- package/console/dist/ui/utils/reading-layout.d.ts +19 -0
- package/console/dist/ui/utils/reading-layout.js +46 -0
- package/console/dist/web/assets/app.js +30 -28
- package/core/dist/runtime-v2/index.d.ts +13 -3
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +6 -1
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +25 -6
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +21 -7
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-run-correlation.d.ts +82 -0
- package/core/dist/runtime-v2/internalization/artificer-run-correlation.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/artificer-run-correlation.js +79 -0
- package/core/dist/runtime-v2/internalization/artificer-run-correlation.js.map +1 -0
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts +16 -2
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-runner.js +89 -9
- package/core/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/consumer-evidence-preflight.d.ts +141 -0
- package/core/dist/runtime-v2/internalization/consumer-evidence-preflight.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/consumer-evidence-preflight.js +284 -0
- package/core/dist/runtime-v2/internalization/consumer-evidence-preflight.js.map +1 -0
- package/core/dist/runtime-v2/internalization/evidence-readiness.d.ts +170 -0
- package/core/dist/runtime-v2/internalization/evidence-readiness.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/evidence-readiness.js +335 -0
- package/core/dist/runtime-v2/internalization/evidence-readiness.js.map +1 -0
- package/core/dist/runtime-v2/internalization/owner-evidence-recovery.d.ts +190 -0
- package/core/dist/runtime-v2/internalization/owner-evidence-recovery.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/owner-evidence-recovery.js +488 -0
- package/core/dist/runtime-v2/internalization/owner-evidence-recovery.js.map +1 -0
- package/core/dist/runtime-v2/internalization/owner-retry.d.ts +23 -1
- package/core/dist/runtime-v2/internalization/owner-retry.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/owner-retry.js +19 -3
- package/core/dist/runtime-v2/internalization/owner-retry.js.map +1 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +16 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts +44 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.js +75 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/core/dist/runtime-v2/recovery-actions-log.d.ts +55 -0
- package/core/dist/runtime-v2/recovery-actions-log.d.ts.map +1 -1
- package/core/dist/runtime-v2/recovery-actions-log.js +84 -3
- package/core/dist/runtime-v2/recovery-actions-log.js.map +1 -1
- package/core/dist/runtime-v2/recovery-sweep-service.d.ts +116 -1
- package/core/dist/runtime-v2/recovery-sweep-service.d.ts.map +1 -1
- package/core/dist/runtime-v2/recovery-sweep-service.js +252 -13
- package/core/dist/runtime-v2/recovery-sweep-service.js.map +1 -1
- package/core/dist/runtime-v2/runtime-state-handle.d.ts +8 -0
- package/core/dist/runtime-v2/runtime-state-handle.d.ts.map +1 -1
- package/core/dist/runtime-v2/runtime-state-handle.js +1 -0
- package/core/dist/runtime-v2/runtime-state-handle.js.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.d.ts +16 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.js +7 -2
- package/core/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.d.ts +7 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.js +16 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts +7 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js +31 -2
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/task-store.d.ts +19 -5
- package/core/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/core/dist/telemetry-event.d.ts +2 -2
- package/core/dist/telemetry-event.d.ts.map +1 -1
- package/core/dist/telemetry-event.js +13 -0
- package/core/dist/telemetry-event.js.map +1 -1
- package/core/package.json +5 -1
- package/dist/installer.d.ts +1 -1
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +5 -1
- package/dist/installer.js.map +1 -1
- package/dist/installers/workbuddy-host-installer.d.ts +16 -3
- package/dist/installers/workbuddy-host-installer.d.ts.map +1 -1
- package/dist/installers/workbuddy-host-installer.js +62 -11
- package/dist/installers/workbuddy-host-installer.js.map +1 -1
- package/dist/manifest-host-union.d.ts +23 -0
- package/dist/manifest-host-union.d.ts.map +1 -0
- package/dist/manifest-host-union.js +22 -0
- package/dist/manifest-host-union.js.map +1 -0
- package/dist/uninstaller.d.ts +2 -1
- package/dist/uninstaller.d.ts.map +1 -1
- package/dist/uninstaller.js +7 -1
- package/dist/uninstaller.js.map +1 -1
- package/host-runtime/dist/behavior-example-pack-assembler.d.ts +41 -0
- package/host-runtime/dist/behavior-example-pack-assembler.js +243 -0
- package/host-runtime/dist/behavior-history.d.ts +6 -0
- package/host-runtime/dist/behavior-history.js +76 -0
- package/host-runtime/dist/index.d.ts +3 -0
- package/host-runtime/dist/index.js +3 -0
- package/host-runtime/dist/internalization-consumer-cycle.d.ts +12 -1
- package/host-runtime/dist/internalization-consumer-cycle.js +141 -16
- package/host-runtime/dist/workspace-behavior-evidence.d.ts +3 -0
- package/host-runtime/dist/workspace-behavior-evidence.js +74 -0
- package/host-runtime/dist/workspace-telemetry-emitter.js +13 -0
- package/host-runtime/package.json +10 -2
- package/install-layout/dist/index.d.ts +40 -1
- package/install-layout/dist/index.js +88 -6
- package/install-layout/package.json +1 -1
- package/package.json +3 -3
- package/pd-cli/dist/commands/runtime-internalization-audit-artificer-evidence.d.ts +44 -0
- package/pd-cli/dist/commands/runtime-internalization-audit-artificer-evidence.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-audit-artificer-evidence.js +138 -0
- package/pd-cli/dist/commands/runtime-internalization-audit-artificer-evidence.js.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-evidence.d.ts +71 -0
- package/pd-cli/dist/commands/runtime-internalization-evidence.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-evidence.js +405 -0
- package/pd-cli/dist/commands/runtime-internalization-evidence.js.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-once.js +22 -1
- package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +45 -4
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
- package/pd-cli/dist/commands/runtime-recovery-failed-task.d.ts +22 -0
- package/pd-cli/dist/commands/runtime-recovery-failed-task.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-recovery-failed-task.js +470 -0
- package/pd-cli/dist/commands/runtime-recovery-failed-task.js.map +1 -0
- package/pd-cli/dist/commands/runtime-recovery-failed-tasks.d.ts +24 -0
- package/pd-cli/dist/commands/runtime-recovery-failed-tasks.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-recovery-failed-tasks.js +4 -1
- package/pd-cli/dist/commands/runtime-recovery-failed-tasks.js.map +1 -1
- package/pd-cli/dist/index.js +13 -0
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/artificer-evidence-audit.d.ts +156 -0
- package/pd-cli/dist/services/artificer-evidence-audit.d.ts.map +1 -0
- package/pd-cli/dist/services/artificer-evidence-audit.js +321 -0
- package/pd-cli/dist/services/artificer-evidence-audit.js.map +1 -0
- package/pd-cli/dist/services/rulehost-pipeline-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.js +17 -3
- package/pd-cli/dist/services/rulehost-pipeline-runner.js.map +1 -1
- package/pd-cli/package.json +1 -1
- package/plugin/dist/bundle.js +545 -541
- package/plugin/dist/core/behavior-example-pack-assembler.d.ts +4 -32
- package/plugin/dist/core/rule-context-assembler.d.ts +0 -9
- package/plugin/dist/openclaw.plugin.json +1 -1
- package/plugin/dist/rulehost-evidence.js +27 -27
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/release-manager/dist/installer.d.ts +1 -1
- package/release-manager/dist/installer.d.ts.map +1 -1
- package/release-manager/dist/installer.js +5 -1
- package/release-manager/dist/installer.js.map +1 -1
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts +16 -3
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +1 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js +62 -11
- package/release-manager/dist/installers/workbuddy-host-installer.js.map +1 -1
- package/release-manager/dist/manifest-host-union.d.ts +23 -0
- package/release-manager/dist/manifest-host-union.d.ts.map +1 -0
- package/release-manager/dist/manifest-host-union.js +22 -0
- package/release-manager/dist/manifest-host-union.js.map +1 -0
- package/release-manager/dist/uninstaller.d.ts +2 -1
- package/release-manager/dist/uninstaller.d.ts.map +1 -1
- package/release-manager/dist/uninstaller.js +7 -1
- package/release-manager/dist/uninstaller.js.map +1 -1
- package/release-manager/package.json +2 -2
- package/workbuddy-adapter/package.json +1 -1
|
@@ -25,12 +25,101 @@ export interface FailedTaskRecoveryResult {
|
|
|
25
25
|
attemptCount: number;
|
|
26
26
|
maxAttempts: number;
|
|
27
27
|
forceApplied: boolean;
|
|
28
|
+
/** Attempt budget before the recovery reset (PRI-991; additive, optional). */
|
|
29
|
+
previousAttemptCount?: number;
|
|
30
|
+
previousMaxAttempts?: number;
|
|
28
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* PRI-991 — read-only precheck for recovering ONE failed task. Pure read:
|
|
34
|
+
* no mutation, no audit, no telemetry. Consumed by the CLI dry-run AND as
|
|
35
|
+
* the confirm path's pre-mutation guard.
|
|
36
|
+
*/
|
|
37
|
+
export interface FailedTaskRecoveryInspection {
|
|
38
|
+
taskId: string;
|
|
39
|
+
found: boolean;
|
|
40
|
+
taskKind?: string;
|
|
41
|
+
status?: string;
|
|
42
|
+
attemptCount?: number;
|
|
43
|
+
maxAttempts?: number;
|
|
44
|
+
isExhausted?: boolean;
|
|
45
|
+
/** `isExhausted` — recovering requires the explicit `resetBudget` opt-in. */
|
|
46
|
+
budgetResetRequired?: boolean;
|
|
47
|
+
/** Active (unexpired) lease on the task row. */
|
|
48
|
+
leaseConflict?: boolean;
|
|
49
|
+
leaseOwner?: string | null;
|
|
50
|
+
leaseExpiresAt?: string | null;
|
|
51
|
+
/** Parsed pi_metadata carries a completionIntent with status 'pending'. */
|
|
52
|
+
completionIntentPending?: boolean;
|
|
53
|
+
/** Kind is in the recoverable set (runner kinds + diagnostician). */
|
|
54
|
+
kindRecoverable?: boolean;
|
|
55
|
+
/** All guards pass — a confirm with the right budget flag would recover. */
|
|
56
|
+
eligible: boolean;
|
|
57
|
+
/** Stable refusal/eligibility code (FR-06). */
|
|
58
|
+
reasonCode: string;
|
|
59
|
+
nextAction?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* PRI-991 — structured outcome of the strict single-task recovery. Every
|
|
63
|
+
* non-recovered variant leaves the task row untouched (single CAS write).
|
|
64
|
+
*/
|
|
65
|
+
export type SingleTaskRecoveryOutcome = {
|
|
66
|
+
status: 'not_found';
|
|
67
|
+
} | {
|
|
68
|
+
status: 'kind_not_recoverable';
|
|
69
|
+
taskKind: string;
|
|
70
|
+
} | {
|
|
71
|
+
status: 'not_failed';
|
|
72
|
+
taskKind: string;
|
|
73
|
+
previousStatus: string;
|
|
74
|
+
} | {
|
|
75
|
+
status: 'invalid_task_metadata';
|
|
76
|
+
taskKind: string;
|
|
77
|
+
} | {
|
|
78
|
+
status: 'lease_conflict';
|
|
79
|
+
taskKind: string;
|
|
80
|
+
leaseOwner: string;
|
|
81
|
+
leaseExpiresAt: string;
|
|
82
|
+
} | {
|
|
83
|
+
status: 'completion_intent_pending';
|
|
84
|
+
taskKind: string;
|
|
85
|
+
} | {
|
|
86
|
+
status: 'budget_exhausted';
|
|
87
|
+
taskKind: string;
|
|
88
|
+
attemptCount: number;
|
|
89
|
+
maxAttempts: number;
|
|
90
|
+
nextAction: string;
|
|
91
|
+
} | {
|
|
92
|
+
status: 'conflict';
|
|
93
|
+
taskKind: string;
|
|
94
|
+
previousStatus: string;
|
|
95
|
+
} | {
|
|
96
|
+
status: 'recovered';
|
|
97
|
+
taskKind: string;
|
|
98
|
+
previousStatus: string;
|
|
99
|
+
previousAttemptCount: number;
|
|
100
|
+
previousMaxAttempts: number;
|
|
101
|
+
newMaxAttempts: number;
|
|
102
|
+
budgetResetApplied: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* PRI-991 (P1-03): id of the durable audit fact embedded in the task's
|
|
105
|
+
* own metadata by the SAME conditional UPDATE that moved the task to
|
|
106
|
+
* pending. The recovery_actions.jsonl line must carry the same id; the
|
|
107
|
+
* CLI's --repair-audit mode re-projects from this fact.
|
|
108
|
+
*/
|
|
109
|
+
actionId: string;
|
|
110
|
+
};
|
|
29
111
|
export interface RecoverySweepService {
|
|
30
112
|
detectExpiredLeases(): Promise<string[]>;
|
|
31
113
|
recoverTask(taskId: string): Promise<RecoveryResult | null>;
|
|
32
114
|
detectFailedTasks(): Promise<FailedTaskRecoveryInfo[]>;
|
|
33
115
|
recoverFailedTask(taskId: string, force?: boolean): Promise<FailedTaskRecoveryResult | null>;
|
|
116
|
+
/** PRI-991: read-only single-task recovery precheck. */
|
|
117
|
+
inspectFailedTaskRecovery(taskId: string): Promise<FailedTaskRecoveryInspection>;
|
|
118
|
+
/** PRI-991: strict single-task recovery (guards + CAS + opt-in budget reset). */
|
|
119
|
+
recoverSingleFailedTask(taskId: string, opts?: {
|
|
120
|
+
resetBudget?: boolean;
|
|
121
|
+
operator?: string;
|
|
122
|
+
}): Promise<SingleTaskRecoveryOutcome>;
|
|
34
123
|
/**
|
|
35
124
|
* Governance Recovery Actions v1: Owner authority reset for a
|
|
36
125
|
* needs_human_review task (→ pending, clears runnerDecision +
|
|
@@ -54,8 +143,34 @@ export interface RecoverySweepServiceHandle {
|
|
|
54
143
|
* Returns null (no mutation) when the task is absent or not in `failed`
|
|
55
144
|
* status; throws `input_invalid` when the budget is exhausted and force is
|
|
56
145
|
* not supplied.
|
|
146
|
+
*
|
|
147
|
+
* PRI-991: the mutation is now a CAS
|
|
148
|
+
* (`updateTaskIfDiagnosticJsonUnchanged` with `expectedStatus: 'failed'`)
|
|
149
|
+
* over the caller's read snapshot — a concurrent writer that moved the task
|
|
150
|
+
* out of `failed` (or mutated its metadata) between this read and write
|
|
151
|
+
* loses the race and yields null instead of a double recovery. Observable
|
|
152
|
+
* batch behavior is unchanged (null already meant "skipped").
|
|
153
|
+
*/
|
|
154
|
+
export declare function recoverFailedTask(stateManager: Pick<RuntimeStateHandle['stateManager'], 'getTask' | 'updateTaskIfDiagnosticJsonUnchanged'>, taskId: string, force?: boolean): Promise<FailedTaskRecoveryResult | null>;
|
|
155
|
+
/**
|
|
156
|
+
* PRI-991 — read-only inspection of ONE task for single-task recovery.
|
|
157
|
+
* Guards, in refusal-priority order: existence → kind legality → status
|
|
158
|
+
* (`failed` only) → active lease → pending completion intent → budget.
|
|
159
|
+
* Malformed metadata never blocks the inspection (it only makes the intent
|
|
160
|
+
* guard unprovable — the CAS still protects the mutation).
|
|
161
|
+
*/
|
|
162
|
+
export declare function inspectFailedTaskRecovery(stateManager: Pick<RuntimeStateHandle['stateManager'], 'getTask' | 'updateTaskIfDiagnosticJsonUnchanged'>, taskId: string): Promise<FailedTaskRecoveryInspection>;
|
|
163
|
+
/**
|
|
164
|
+
* PRI-991 — strict single-task recovery. Same mutation authority as
|
|
165
|
+
* `recoverFailedTask` (shared patch builder + CAS), plus the guards the
|
|
166
|
+
* batch path deliberately does not enforce: exact-task kind legality, active
|
|
167
|
+
* lease refusal, pending completion intent refusal, and the budget reset as
|
|
168
|
+
* an explicit `resetBudget` opt-in (structured refusal instead of a throw).
|
|
57
169
|
*/
|
|
58
|
-
export declare function
|
|
170
|
+
export declare function recoverSingleFailedTask(stateManager: Pick<RuntimeStateHandle['stateManager'], 'getTask' | 'updateTaskIfDiagnosticJsonUnchanged'>, taskId: string, opts?: {
|
|
171
|
+
resetBudget?: boolean;
|
|
172
|
+
operator?: string;
|
|
173
|
+
}): Promise<SingleTaskRecoveryOutcome>;
|
|
59
174
|
export declare function createRecoverySweepService(opts: {
|
|
60
175
|
workspaceDir: string;
|
|
61
176
|
}): Promise<RecoverySweepServiceHandle>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-sweep-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery-sweep-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,85 @@
|
|
|
1
1
|
import { createRuntimeStateHandle } from './runtime-state-handle.js';
|
|
2
2
|
import { PDRuntimeError } from './error-categories.js';
|
|
3
3
|
import { isRunnerKind } from './internalization/peer-runner-contracts.js';
|
|
4
|
+
import { hydratePITaskRecord, mergePITaskMetadata, createPITaskDiagnosticJson, FAILED_TASK_RECOVERY_RETENTION } from './internalization/pitask-metadata.js';
|
|
4
5
|
import { ownerRetryNeedsHumanReviewTask } from './internalization/owner-retry.js';
|
|
6
|
+
import * as crypto from 'crypto';
|
|
7
|
+
/** TaskRecord.diagnosticJson is optional — normalize to the store's null contract. */
|
|
8
|
+
function readRawDiagnosticJson(task) {
|
|
9
|
+
return typeof task.diagnosticJson === 'string' ? task.diagnosticJson : null;
|
|
10
|
+
}
|
|
11
|
+
function assessRecoveryMetadataGuard(task) {
|
|
12
|
+
const raw = readRawDiagnosticJson(task);
|
|
13
|
+
if (raw === null || raw.trim() === '')
|
|
14
|
+
return { state: 'absent' };
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { state: 'invalid' };
|
|
21
|
+
}
|
|
22
|
+
const hasPiMetadata = typeof parsed === 'object'
|
|
23
|
+
&& parsed !== null
|
|
24
|
+
&& !Array.isArray(parsed)
|
|
25
|
+
&& Object.hasOwn(parsed, 'pi_metadata');
|
|
26
|
+
if (!hasPiMetadata)
|
|
27
|
+
return { state: 'absent' };
|
|
28
|
+
const piTask = hydratePITaskRecord(task);
|
|
29
|
+
if (piTask === null)
|
|
30
|
+
return { state: 'invalid' };
|
|
31
|
+
return { state: 'valid', piTask };
|
|
32
|
+
}
|
|
33
|
+
/** PRI-991 (P1-04): the FULL decision snapshot joins the conditional UPDATE. */
|
|
34
|
+
function failedRecoveryPreconditions(task, expectedStatus) {
|
|
35
|
+
return {
|
|
36
|
+
expectedStatus,
|
|
37
|
+
expectedAttemptCount: task.attemptCount,
|
|
38
|
+
expectedMaxAttempts: task.maxAttempts,
|
|
39
|
+
expectedLeaseOwner: task.leaseOwner ?? null,
|
|
40
|
+
expectedLeaseExpiresAt: task.leaseExpiresAt ?? null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** PRI-991 (P1-03): active (unexpired) lease check shared by inspect + recover. */
|
|
44
|
+
function hasActiveLease(task) {
|
|
45
|
+
const owner = task.leaseOwner ?? null;
|
|
46
|
+
const expiresAt = task.leaseExpiresAt ?? null;
|
|
47
|
+
if (owner === null || expiresAt === null)
|
|
48
|
+
return { active: false };
|
|
49
|
+
const expiryMs = new Date(expiresAt).getTime();
|
|
50
|
+
if (Number.isNaN(expiryMs) || expiryMs <= Date.now())
|
|
51
|
+
return { active: false };
|
|
52
|
+
return { active: true, owner, expiresAt };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* ONE patch builder for the failed→pending reset — the legacy batch path and
|
|
56
|
+
* the strict single-task path share this so the mutation content has exactly
|
|
57
|
+
* one authority (P4). Budget semantics: exhausted + reset → maxAttempts =
|
|
58
|
+
* max(maxAttempts, attemptCount) + 3, attemptCount 0; otherwise maxAttempts
|
|
59
|
+
* unchanged, attemptCount 0. lastError / lease / resultRef cleared; runs,
|
|
60
|
+
* artifacts are NEVER touched. The strict path additionally injects the
|
|
61
|
+
* durable audit fact via `diagnosticJson` (P1-03) — the batch path keeps the
|
|
62
|
+
* metadata payload untouched.
|
|
63
|
+
*/
|
|
64
|
+
function buildFailedRecoveryPatch(task, resetBudget) {
|
|
65
|
+
const isExhausted = task.attemptCount >= task.maxAttempts;
|
|
66
|
+
const newMaxAttempts = isExhausted && resetBudget
|
|
67
|
+
? Math.max(task.maxAttempts, task.attemptCount) + 3
|
|
68
|
+
: task.maxAttempts;
|
|
69
|
+
return {
|
|
70
|
+
isExhausted,
|
|
71
|
+
newMaxAttempts,
|
|
72
|
+
patch: {
|
|
73
|
+
status: 'pending',
|
|
74
|
+
attemptCount: 0,
|
|
75
|
+
maxAttempts: newMaxAttempts,
|
|
76
|
+
lastError: null,
|
|
77
|
+
leaseOwner: null,
|
|
78
|
+
leaseExpiresAt: null,
|
|
79
|
+
resultRef: null,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
5
83
|
/**
|
|
6
84
|
* Recover a failed task to `pending` — the single recovery authority for the
|
|
7
85
|
* failed→pending reset semantics (PRI-674), shared by the recovery sweep
|
|
@@ -12,6 +90,13 @@ import { ownerRetryNeedsHumanReviewTask } from './internalization/owner-retry.js
|
|
|
12
90
|
* Returns null (no mutation) when the task is absent or not in `failed`
|
|
13
91
|
* status; throws `input_invalid` when the budget is exhausted and force is
|
|
14
92
|
* not supplied.
|
|
93
|
+
*
|
|
94
|
+
* PRI-991: the mutation is now a CAS
|
|
95
|
+
* (`updateTaskIfDiagnosticJsonUnchanged` with `expectedStatus: 'failed'`)
|
|
96
|
+
* over the caller's read snapshot — a concurrent writer that moved the task
|
|
97
|
+
* out of `failed` (or mutated its metadata) between this read and write
|
|
98
|
+
* loses the race and yields null instead of a double recovery. Observable
|
|
99
|
+
* batch behavior is unchanged (null already meant "skipped").
|
|
15
100
|
*/
|
|
16
101
|
export async function recoverFailedTask(stateManager, taskId, force = false) {
|
|
17
102
|
const task = await stateManager.getTask(taskId);
|
|
@@ -19,22 +104,16 @@ export async function recoverFailedTask(stateManager, taskId, force = false) {
|
|
|
19
104
|
return null;
|
|
20
105
|
if (task.status !== 'failed')
|
|
21
106
|
return null;
|
|
22
|
-
const isExhausted = task
|
|
107
|
+
const { isExhausted, patch } = buildFailedRecoveryPatch(task, force);
|
|
23
108
|
if (isExhausted && !force) {
|
|
24
109
|
throw new PDRuntimeError('input_invalid', `Task ${taskId} has exhausted max attempts (${task.attemptCount}/${task.maxAttempts}). Use force to recover.`);
|
|
25
110
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const updated = await stateManager.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
maxAttempts: newMaxAttempts,
|
|
33
|
-
lastError: null,
|
|
34
|
-
leaseOwner: null,
|
|
35
|
-
leaseExpiresAt: null,
|
|
36
|
-
resultRef: null,
|
|
37
|
-
});
|
|
111
|
+
// PRI-991 (P1-04): the batch path joins the same full decision snapshot —
|
|
112
|
+
// a concurrent budget/lease writer defeats the recovery instead of being
|
|
113
|
+
// silently overwritten. Observable behavior unchanged (null → "skipped").
|
|
114
|
+
const updated = await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, readRawDiagnosticJson(task), patch, failedRecoveryPreconditions(task, 'failed'));
|
|
115
|
+
if (!updated)
|
|
116
|
+
return null;
|
|
38
117
|
return {
|
|
39
118
|
taskId: updated.taskId,
|
|
40
119
|
previousStatus: 'failed',
|
|
@@ -42,6 +121,160 @@ export async function recoverFailedTask(stateManager, taskId, force = false) {
|
|
|
42
121
|
attemptCount: updated.attemptCount,
|
|
43
122
|
maxAttempts: updated.maxAttempts,
|
|
44
123
|
forceApplied: isExhausted && force,
|
|
124
|
+
previousAttemptCount: task.attemptCount,
|
|
125
|
+
previousMaxAttempts: task.maxAttempts,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* PRI-991 — read-only inspection of ONE task for single-task recovery.
|
|
130
|
+
* Guards, in refusal-priority order: existence → kind legality → status
|
|
131
|
+
* (`failed` only) → active lease → pending completion intent → budget.
|
|
132
|
+
* Malformed metadata never blocks the inspection (it only makes the intent
|
|
133
|
+
* guard unprovable — the CAS still protects the mutation).
|
|
134
|
+
*/
|
|
135
|
+
export async function inspectFailedTaskRecovery(stateManager, taskId) {
|
|
136
|
+
const task = await stateManager.getTask(taskId);
|
|
137
|
+
if (!task) {
|
|
138
|
+
return {
|
|
139
|
+
taskId,
|
|
140
|
+
found: false,
|
|
141
|
+
eligible: false,
|
|
142
|
+
reasonCode: 'task_not_found',
|
|
143
|
+
nextAction: 'Verify the exact taskId in this workspace (pd runtime internalization queue --json); prefixes and wildcards are never matched',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const kindRecoverable = isRunnerKind(task.taskKind) || task.taskKind === 'diagnostician';
|
|
147
|
+
const leaseCheck = hasActiveLease(task);
|
|
148
|
+
const leaseConflict = leaseCheck.active;
|
|
149
|
+
const isExhausted = task.attemptCount >= task.maxAttempts;
|
|
150
|
+
const isFailed = task.status === 'failed';
|
|
151
|
+
const metadataGuard = assessRecoveryMetadataGuard(task);
|
|
152
|
+
const completionIntentPending = metadataGuard.state === 'valid' && metadataGuard.piTask.completionIntent?.status === 'pending';
|
|
153
|
+
const base = {
|
|
154
|
+
taskId,
|
|
155
|
+
found: true,
|
|
156
|
+
taskKind: task.taskKind,
|
|
157
|
+
status: task.status,
|
|
158
|
+
attemptCount: task.attemptCount,
|
|
159
|
+
maxAttempts: task.maxAttempts,
|
|
160
|
+
isExhausted,
|
|
161
|
+
budgetResetRequired: isExhausted,
|
|
162
|
+
leaseConflict,
|
|
163
|
+
leaseOwner: task.leaseOwner ?? null,
|
|
164
|
+
leaseExpiresAt: task.leaseExpiresAt ?? null,
|
|
165
|
+
completionIntentPending,
|
|
166
|
+
kindRecoverable,
|
|
167
|
+
};
|
|
168
|
+
if (!kindRecoverable) {
|
|
169
|
+
return { ...base, eligible: false, reasonCode: 'kind_not_recoverable', nextAction: `Task kind '${task.taskKind}' has no failed-task recovery entry` };
|
|
170
|
+
}
|
|
171
|
+
if (!isFailed) {
|
|
172
|
+
return { ...base, eligible: false, reasonCode: 'not_failed', nextAction: `Task is '${task.status}', not 'failed' — nothing to recover` };
|
|
173
|
+
}
|
|
174
|
+
// PRI-991 (P1-02): corrupted governance payload fails closed BEFORE any
|
|
175
|
+
// other guard can be interpreted — a corrupt record must never read as
|
|
176
|
+
// "no pending intent" (the guard itself must not be bypassable). The
|
|
177
|
+
// metadataGuard was computed above (single assessment, shared with the
|
|
178
|
+
// completionIntentPending projection).
|
|
179
|
+
if (metadataGuard.state === 'invalid') {
|
|
180
|
+
return { ...base, eligible: false, reasonCode: 'invalid_task_metadata', nextAction: 'The task pi_metadata is present but fails validation (parsePITaskMetadata/hydratePITaskRecord) — inspect and repair the diagnostic payload before recovering' };
|
|
181
|
+
}
|
|
182
|
+
if (leaseConflict) {
|
|
183
|
+
return { ...base, eligible: false, reasonCode: 'lease_conflict', nextAction: 'Wait for the lease to expire (the per-cycle recovery sweep will reclaim it), then retry' };
|
|
184
|
+
}
|
|
185
|
+
if (metadataGuard.state === 'valid' && metadataGuard.piTask.completionIntent?.status === 'pending') {
|
|
186
|
+
return { ...base, eligible: false, reasonCode: 'completion_intent_pending', nextAction: 'A runner verdict completion intent is still pending — let the runner resume it, or resolve it via the governance focus before recovering' };
|
|
187
|
+
}
|
|
188
|
+
if (isExhausted) {
|
|
189
|
+
return { ...base, eligible: true, reasonCode: 'eligible_budget_reset_required', nextAction: 'Recoverable with an explicit budget reset: rerun with --confirm --reset-budget' };
|
|
190
|
+
}
|
|
191
|
+
return { ...base, eligible: true, reasonCode: 'eligible', nextAction: 'Recoverable: rerun with --confirm' };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* PRI-991 — strict single-task recovery. Same mutation authority as
|
|
195
|
+
* `recoverFailedTask` (shared patch builder + CAS), plus the guards the
|
|
196
|
+
* batch path deliberately does not enforce: exact-task kind legality, active
|
|
197
|
+
* lease refusal, pending completion intent refusal, and the budget reset as
|
|
198
|
+
* an explicit `resetBudget` opt-in (structured refusal instead of a throw).
|
|
199
|
+
*/
|
|
200
|
+
export async function recoverSingleFailedTask(stateManager, taskId, opts = {}) {
|
|
201
|
+
const task = await stateManager.getTask(taskId);
|
|
202
|
+
if (!task)
|
|
203
|
+
return { status: 'not_found' };
|
|
204
|
+
if (!isRunnerKind(task.taskKind) && task.taskKind !== 'diagnostician') {
|
|
205
|
+
return { status: 'kind_not_recoverable', taskKind: task.taskKind };
|
|
206
|
+
}
|
|
207
|
+
if (task.status !== 'failed') {
|
|
208
|
+
return { status: 'not_failed', taskKind: task.taskKind, previousStatus: task.status };
|
|
209
|
+
}
|
|
210
|
+
// PRI-991 (P1-02): corrupted governance payload fails closed — identical
|
|
211
|
+
// judgment to inspectFailedTaskRecovery (T02-G), evaluated at mutation time.
|
|
212
|
+
const metadataGuard = assessRecoveryMetadataGuard(task);
|
|
213
|
+
if (metadataGuard.state === 'invalid') {
|
|
214
|
+
return { status: 'invalid_task_metadata', taskKind: task.taskKind };
|
|
215
|
+
}
|
|
216
|
+
const leaseCheck = hasActiveLease(task);
|
|
217
|
+
if (leaseCheck.active) {
|
|
218
|
+
return { status: 'lease_conflict', taskKind: task.taskKind, leaseOwner: leaseCheck.owner, leaseExpiresAt: leaseCheck.expiresAt };
|
|
219
|
+
}
|
|
220
|
+
if (metadataGuard.state === 'valid' && metadataGuard.piTask.completionIntent?.status === 'pending') {
|
|
221
|
+
return { status: 'completion_intent_pending', taskKind: task.taskKind };
|
|
222
|
+
}
|
|
223
|
+
const { isExhausted, newMaxAttempts, patch } = buildFailedRecoveryPatch(task, opts.resetBudget === true);
|
|
224
|
+
if (isExhausted && opts.resetBudget !== true) {
|
|
225
|
+
return {
|
|
226
|
+
status: 'budget_exhausted',
|
|
227
|
+
taskKind: task.taskKind,
|
|
228
|
+
attemptCount: task.attemptCount,
|
|
229
|
+
maxAttempts: task.maxAttempts,
|
|
230
|
+
nextAction: 'Rerun with --reset-budget to explicitly reset the attempt budget (run history and failure reasons are preserved)',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// PRI-991 (P1-03): the audit fact rides the SAME conditional UPDATE as the
|
|
234
|
+
// status change (crash-durable). The JSONL is a projection of this fact,
|
|
235
|
+
// never its source of truth. Only hydratable payloads carry the record —
|
|
236
|
+
// legacy absent-metadata payloads stay byte-identical (documented
|
|
237
|
+
// reliability boundary: their JSONL projection has no row-fact fallback).
|
|
238
|
+
// r2 P1-01: the operator-provided label is part of the durable fact (an
|
|
239
|
+
// unprojected recovery must be repairable WITH its operator attribution);
|
|
240
|
+
// it remains a label, never an authenticated identity.
|
|
241
|
+
// r2 P1-02: the fact is APPENDED to the per-task array (bounded retention)
|
|
242
|
+
// — a second recovery must never destroy an unprojected prior fact.
|
|
243
|
+
const actionId = crypto.randomUUID();
|
|
244
|
+
if (metadataGuard.state === 'valid') {
|
|
245
|
+
const priorRecords = metadataGuard.piTask.failedTaskRecoveries ?? [];
|
|
246
|
+
const merged = mergePITaskMetadata(metadataGuard.piTask, {
|
|
247
|
+
failedTaskRecoveries: [
|
|
248
|
+
...priorRecords,
|
|
249
|
+
{
|
|
250
|
+
actionId,
|
|
251
|
+
recoveredAt: new Date().toISOString(),
|
|
252
|
+
operator: opts.operator?.trim() ? opts.operator.trim() : null,
|
|
253
|
+
previousStatus: 'failed',
|
|
254
|
+
previousAttemptCount: task.attemptCount,
|
|
255
|
+
previousMaxAttempts: task.maxAttempts,
|
|
256
|
+
newMaxAttempts,
|
|
257
|
+
budgetResetApplied: isExhausted && opts.resetBudget === true,
|
|
258
|
+
},
|
|
259
|
+
].slice(-FAILED_TASK_RECOVERY_RETENTION),
|
|
260
|
+
});
|
|
261
|
+
patch.diagnosticJson = createPITaskDiagnosticJson(merged);
|
|
262
|
+
}
|
|
263
|
+
// PRI-991 (P1-04): every field the decision depended on joins the WHERE
|
|
264
|
+
// clause — a concurrent budget/lease/metadata writer defeats the recovery.
|
|
265
|
+
const updated = await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, readRawDiagnosticJson(task), patch, failedRecoveryPreconditions(task, 'failed'));
|
|
266
|
+
if (!updated) {
|
|
267
|
+
return { status: 'conflict', taskKind: task.taskKind, previousStatus: task.status };
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
status: 'recovered',
|
|
271
|
+
taskKind: task.taskKind,
|
|
272
|
+
previousStatus: 'failed',
|
|
273
|
+
previousAttemptCount: task.attemptCount,
|
|
274
|
+
previousMaxAttempts: task.maxAttempts,
|
|
275
|
+
newMaxAttempts: updated.maxAttempts,
|
|
276
|
+
budgetResetApplied: isExhausted && opts.resetBudget === true,
|
|
277
|
+
actionId,
|
|
45
278
|
};
|
|
46
279
|
}
|
|
47
280
|
class RecoverySweepServiceImpl {
|
|
@@ -76,6 +309,12 @@ class RecoverySweepServiceImpl {
|
|
|
76
309
|
async recoverFailedTask(taskId, force = false) {
|
|
77
310
|
return recoverFailedTask(this.stateManager, taskId, force);
|
|
78
311
|
}
|
|
312
|
+
async inspectFailedTaskRecovery(taskId) {
|
|
313
|
+
return inspectFailedTaskRecovery(this.stateManager, taskId);
|
|
314
|
+
}
|
|
315
|
+
async recoverSingleFailedTask(taskId, opts = {}) {
|
|
316
|
+
return recoverSingleFailedTask(this.stateManager, taskId, opts);
|
|
317
|
+
}
|
|
79
318
|
async recoverNeedsHumanReviewTask(taskId) {
|
|
80
319
|
return ownerRetryNeedsHumanReviewTask(this.stateManager, taskId);
|
|
81
320
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-sweep-service.js","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recovery-sweep-service.js","sourceRoot":"","sources":["../../src/runtime-v2/recovery-sweep-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,13 @@ export interface RuntimeStateHandle {
|
|
|
6
6
|
export declare function createRuntimeStateHandle(opts: {
|
|
7
7
|
workspaceDir: string;
|
|
8
8
|
readonly?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* PRI-991 (P1-01): when false, a missing state.db is never created — the
|
|
11
|
+
* open fails loudly instead. Strictly-readonly inspection paths (dry-run)
|
|
12
|
+
* combine `readonly: true` with `bootstrapIfMissing: false` so the handle
|
|
13
|
+
* cannot create files, directories, WAL journals or schema as a side
|
|
14
|
+
* effect. Default true (backward compatible).
|
|
15
|
+
*/
|
|
16
|
+
bootstrapIfMissing?: boolean;
|
|
9
17
|
}): Promise<RuntimeStateHandle>;
|
|
10
18
|
//# sourceMappingURL=runtime-state-handle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state-handle.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/runtime-state-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,mBAAmB,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-state-handle.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/runtime-state-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,mBAAmB,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4B9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state-handle.js","sourceRoot":"","sources":["../../src/runtime-v2/runtime-state-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAOvE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime-state-handle.js","sourceRoot":"","sources":["../../src/runtime-v2/runtime-state-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAOvE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAW9C;IACC,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC;QAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO;QACL,YAAY;QACZ,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -47,6 +47,12 @@ export interface RuntimeStateManagerOptions {
|
|
|
47
47
|
retryPolicyConfig?: RetryPolicyConfig;
|
|
48
48
|
/** Open DB in readonly mode — skips schema init/migration, no writes allowed */
|
|
49
49
|
readonly?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* PRI-991 (P1-01): when false, a missing state.db is NEVER bootstrapped —
|
|
52
|
+
* readonly callers fail loudly instead of silently creating databases.
|
|
53
|
+
* Default true (backward compatible). Forwarded to SqliteConnection.
|
|
54
|
+
*/
|
|
55
|
+
bootstrapIfMissing?: boolean;
|
|
50
56
|
}
|
|
51
57
|
export declare class RuntimeStateManager {
|
|
52
58
|
private readonly options;
|
|
@@ -133,8 +139,17 @@ export declare class RuntimeStateManager {
|
|
|
133
139
|
* Narrow CAS (PRI-629): apply patch only when the task's diagnostic_json is
|
|
134
140
|
* still byte-equal to expectedDiagnosticJson. Returns null on precondition
|
|
135
141
|
* failure — caller re-reads and re-evaluates (idempotent-or-conflict).
|
|
142
|
+
* PRI-983: `options.expectedStatus` additionally requires the task to still
|
|
143
|
+
* sit in that status (SPEC-PD-IAER-001 §6.3) — arbitrates content-neutral
|
|
144
|
+
* authority resets under concurrent writers.
|
|
136
145
|
*/
|
|
137
|
-
updateTaskIfDiagnosticJsonUnchanged(taskId: string, expectedDiagnosticJson: string | null, patch: TaskStoreUpdatePatch
|
|
146
|
+
updateTaskIfDiagnosticJsonUnchanged(taskId: string, expectedDiagnosticJson: string | null, patch: TaskStoreUpdatePatch, options?: {
|
|
147
|
+
readonly expectedStatus?: string;
|
|
148
|
+
readonly expectedAttemptCount?: number;
|
|
149
|
+
readonly expectedMaxAttempts?: number;
|
|
150
|
+
readonly expectedLeaseOwner?: string | null;
|
|
151
|
+
readonly expectedLeaseExpiresAt?: string | null;
|
|
152
|
+
}): Promise<TaskRecord | null>;
|
|
138
153
|
/**
|
|
139
154
|
* Atomically records an Owner decision only while both the task metadata and
|
|
140
155
|
* every artifact row used by its evidence snapshot remain unchanged.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state-manager.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/store/runtime-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAgB,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAezF,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAE1I,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAsB,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACjI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAK3F,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAI7G,MAAM,WAAW,0BAA0B;IACzC,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-state-manager.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/store/runtime-state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,7 @@ export class RuntimeStateManager {
|
|
|
42
42
|
this._connection = new SqliteConnectionClass({
|
|
43
43
|
workspaceDir: this.options.workspaceDir,
|
|
44
44
|
readonly: this.options.readonly,
|
|
45
|
+
bootstrapIfMissing: this.options.bootstrapIfMissing,
|
|
45
46
|
});
|
|
46
47
|
this._taskStore = new SqliteTaskStore(this._connection);
|
|
47
48
|
this._runStore = new SqliteRunStore(this._connection);
|
|
@@ -329,10 +330,14 @@ export class RuntimeStateManager {
|
|
|
329
330
|
* Narrow CAS (PRI-629): apply patch only when the task's diagnostic_json is
|
|
330
331
|
* still byte-equal to expectedDiagnosticJson. Returns null on precondition
|
|
331
332
|
* failure — caller re-reads and re-evaluates (idempotent-or-conflict).
|
|
333
|
+
* PRI-983: `options.expectedStatus` additionally requires the task to still
|
|
334
|
+
* sit in that status (SPEC-PD-IAER-001 §6.3) — arbitrates content-neutral
|
|
335
|
+
* authority resets under concurrent writers.
|
|
332
336
|
*/
|
|
333
|
-
|
|
337
|
+
// eslint-disable-next-line @typescript-eslint/max-params -- the 4th parameter is a CAS PRECONDITION (SPEC-PD-IAER-001 §6.3), not write payload: folding it into the patch type would let it leak into TaskRecord on unconditional updateTask paths.
|
|
338
|
+
async updateTaskIfDiagnosticJsonUnchanged(taskId, expectedDiagnosticJson, patch, options) {
|
|
334
339
|
this.assertInitialized();
|
|
335
|
-
return this._taskStore.updateTaskIfDiagnosticJsonUnchanged(taskId, expectedDiagnosticJson, patch);
|
|
340
|
+
return this._taskStore.updateTaskIfDiagnosticJsonUnchanged(taskId, expectedDiagnosticJson, patch, options);
|
|
336
341
|
}
|
|
337
342
|
/**
|
|
338
343
|
* Atomically records an Owner decision only while both the task metadata and
|