create-principles-disciple 1.145.3 → 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/core/dist/runtime-v2/index.d.ts +3 -3
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +1 -1
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +8 -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 +32 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.js +51 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/core/dist/runtime-v2/recovery-actions-log.d.ts +15 -0
- package/core/dist/runtime-v2/recovery-actions-log.d.ts.map +1 -1
- package/core/dist/runtime-v2/recovery-actions-log.js +7 -1
- 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 +10 -0
- package/core/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.js +1 -0
- 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 +4 -0
- 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 +10 -0
- 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 +4 -0
- 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 +21 -0
- 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 +14 -6
- package/core/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/core/package.json +1 -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.map +1 -1
- package/dist/installers/workbuddy-host-installer.js +5 -1
- 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/workspace-behavior-evidence.d.ts +3 -0
- package/host-runtime/dist/workspace-behavior-evidence.js +74 -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-evidence.d.ts +2 -3
- package/pd-cli/dist/commands/runtime-internalization-evidence.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-evidence.js +7 -26
- package/pd-cli/dist/commands/runtime-internalization-evidence.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 +5 -0
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/package.json +1 -1
- package/plugin/dist/bundle.js +501 -497
- 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 +19 -19
- 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.map +1 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js +5 -1
- 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
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { createRuntimeStateHandle, appendRecoveryAction, inspectFailedTaskRecovery, recoverSingleFailedTask, listRecoveryActions, hydratePITaskRecord, } from '@principles/core/runtime-v2';
|
|
4
|
+
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
5
|
+
import { buildExecutionNextAction } from './runtime-recovery-failed-tasks.js';
|
|
6
|
+
/** ERR-001-safe record narrowing for untrusted parsed JSON (rc-1/rc-2). */
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function emit(payload, json) {
|
|
11
|
+
if (json) {
|
|
12
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
16
|
+
if (value === undefined)
|
|
17
|
+
continue;
|
|
18
|
+
console.log(` ${key}: ${typeof value === 'object' ? JSON.stringify(value) : String(value)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function refusal(payload, json) {
|
|
23
|
+
emit({ ok: false, ...payload }, json);
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* PRI-991 (P1-01): both modes refuse a workspace whose state.db does not
|
|
28
|
+
* exist BEFORE opening any connection — dry-run must not create it and
|
|
29
|
+
* confirm must not bootstrap a wrong-typed path. The open itself re-validates
|
|
30
|
+
* (no TOCTOU reliance): the check only picks the refusal path.
|
|
31
|
+
*/
|
|
32
|
+
function stateDbPath(workspaceDir) {
|
|
33
|
+
return path.join(workspaceDir, '.pd', 'state.db');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* PRI-991 (P1-01): classify storage-level open/query failures (missing file,
|
|
37
|
+
* not-a-database, missing tables) as structured `storage_unavailable`
|
|
38
|
+
* instead of the generic recovery_error — dry-run's read-only connection
|
|
39
|
+
* cannot migrate or bootstrap, so these are terminal for the invocation.
|
|
40
|
+
*/
|
|
41
|
+
function isSqliteUnavailable(err) {
|
|
42
|
+
if (!isRecord(err))
|
|
43
|
+
return false;
|
|
44
|
+
return typeof err.code === 'string' && err.code.startsWith('SQLITE_');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PRI-991 (P2-B): channel-aware recovery nextAction. A recovered
|
|
48
|
+
* code_tool_hook Artificer task is NOT executable via run-once (it refuses
|
|
49
|
+
* Code Rule tasks) — the next auto-consumer cycle runs the IAER evidence
|
|
50
|
+
* preflight and, without Owner evidence, parks the task in
|
|
51
|
+
* needs_human_review at zero model cost. Every OTHER kind reuses the shared
|
|
52
|
+
* per-kind guidance authority (buildExecutionNextAction) so both recovery
|
|
53
|
+
* surfaces stay identical.
|
|
54
|
+
*/
|
|
55
|
+
function buildRecoveryNextAction(task) {
|
|
56
|
+
const { diagnosticJson } = task;
|
|
57
|
+
if (diagnosticJson !== null && diagnosticJson.trim() !== '') {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(diagnosticJson);
|
|
60
|
+
if (isRecord(parsed) && Object.hasOwn(parsed, 'pi_metadata')) {
|
|
61
|
+
const meta = parsed.pi_metadata;
|
|
62
|
+
if (isRecord(meta) && Object.hasOwn(meta, 'channel') && typeof meta.channel === 'string' && meta.channel === 'code_tool_hook') {
|
|
63
|
+
return 'Task recovered to pending. The next auto-consumer cycle runs the evidence preflight on it: without Owner evidence it is parked in needs_human_review (zero model cost), then attach/resume via: pd runtime internalization evidence attach --confirm → pd runtime internalization evidence resume --confirm';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Unparseable payload — fall through to the per-kind guidance below.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return buildExecutionNextAction(task);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* PRI-991 (r2 P2): the JSONL projection is a read-check-append sequence —
|
|
75
|
+
* concurrent confirm/repair processes can each observe an actionId missing
|
|
76
|
+
* and append it twice. This lock (O_EXCL create, git-12 precedent: an
|
|
77
|
+
* existing lock is never overwritten or auto-deleted) serializes ALL
|
|
78
|
+
* projections for one workspace so the check+append pair is atomic. A stale
|
|
79
|
+
* lock from a crashed holder blocks projections until a human removes it —
|
|
80
|
+
* the durable row facts are unaffected.
|
|
81
|
+
*/
|
|
82
|
+
function projectionLockPath(workspaceDir) {
|
|
83
|
+
return path.join(workspaceDir, '.state', 'recovery_actions.jsonl.lock');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Project the durable recovery facts that are missing from the JSONL,
|
|
87
|
+
* serialized by the projection lock. Sync I/O inside the lock keeps the
|
|
88
|
+
* check+append pair atomic within the process and the lock file arbitrates
|
|
89
|
+
* across processes. Returns which records were projected / already present,
|
|
90
|
+
* or a structured refusal (lock held / sink failure) with ZERO appends.
|
|
91
|
+
*/
|
|
92
|
+
function projectRecoveryRecordsOnce(workspaceDir, taskId, records) {
|
|
93
|
+
fs.mkdirSync(path.join(workspaceDir, '.state'), { recursive: true });
|
|
94
|
+
const lockPath = projectionLockPath(workspaceDir);
|
|
95
|
+
let lockFd;
|
|
96
|
+
try {
|
|
97
|
+
lockFd = fs.openSync(lockPath, 'wx');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
projected: 0,
|
|
103
|
+
skipped: 0,
|
|
104
|
+
reasonCode: 'audit_projection_locked',
|
|
105
|
+
reason: `Another projection holds ${lockPath}`,
|
|
106
|
+
nextAction: 'Wait for the concurrent projection to finish, or (if its holder process is gone) remove the stale lock file manually, then re-run',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
// Write holder info THROUGH the already-held wx descriptor — reopening
|
|
111
|
+
// the path by name would be a file-system race (CodeQL js/file-system-
|
|
112
|
+
// race): the fd pins the inode this process created.
|
|
113
|
+
try {
|
|
114
|
+
fs.writeFileSync(lockFd, `${JSON.stringify({ pid: process.pid, at: new Date().toISOString() })}\n`);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Holder info is best-effort debugging aid — never blocks projection.
|
|
118
|
+
}
|
|
119
|
+
const projectedIds = new Set(listRecoveryActions(workspaceDir, { taskId }).map((a) => a.actionId));
|
|
120
|
+
const missing = records.filter((r) => !projectedIds.has(r.actionId));
|
|
121
|
+
for (const record of missing) {
|
|
122
|
+
appendRecoveryAction(workspaceDir, {
|
|
123
|
+
actionId: record.actionId,
|
|
124
|
+
taskId,
|
|
125
|
+
previousStatus: record.previousStatus,
|
|
126
|
+
result: 'recovered',
|
|
127
|
+
operator: record.operator ?? undefined,
|
|
128
|
+
forceApplied: record.budgetResetApplied,
|
|
129
|
+
previousAttemptCount: record.previousAttemptCount,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return { ok: true, projected: missing.length, skipped: records.length - missing.length };
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
projected: 0,
|
|
138
|
+
skipped: 0,
|
|
139
|
+
reasonCode: 'audit_projection_failed',
|
|
140
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
141
|
+
nextAction: 'Fix the audit sink (workspace/.state/recovery_actions.jsonl); the durable row facts are untouched — re-run --repair-audit afterwards',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
fs.closeSync(lockFd);
|
|
146
|
+
fs.rmSync(lockPath, { force: true });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function repairAuditProjection(opts, workspaceDir) {
|
|
150
|
+
// performs is the idempotent JSONL projection append, serialized by the
|
|
151
|
+
// projection lock (r2 P2: check-then-append alone is not concurrency-safe).
|
|
152
|
+
let handle = null;
|
|
153
|
+
try {
|
|
154
|
+
handle = await createRuntimeStateHandle({ workspaceDir, readonly: true, bootstrapIfMissing: false });
|
|
155
|
+
const rawTask = await handle.stateManager.getTask(String(opts.taskId));
|
|
156
|
+
if (!rawTask) {
|
|
157
|
+
refusal({ reason: 'Task not found in this workspace', reasonCode: 'task_not_found', taskId: opts.taskId, nextAction: 'Verify the exact taskId (pd runtime internalization queue --json)' }, opts.json);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const piTask = hydratePITaskRecord(rawTask);
|
|
161
|
+
const records = piTask?.failedTaskRecoveries ?? [];
|
|
162
|
+
if (records.length === 0) {
|
|
163
|
+
refusal({
|
|
164
|
+
reason: 'No durable recovery fact in the task metadata — nothing to project',
|
|
165
|
+
reasonCode: 'no_durable_recovery_record',
|
|
166
|
+
taskId: opts.taskId,
|
|
167
|
+
nextAction: 'recovery_actions.jsonl has no row-fact fallback for this task (legacy absent-metadata recovery); the recovery itself stands as reported by its confirm output',
|
|
168
|
+
}, opts.json);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const outcome = projectRecoveryRecordsOnce(workspaceDir, String(opts.taskId), records);
|
|
172
|
+
if (!outcome.ok) {
|
|
173
|
+
refusal({
|
|
174
|
+
reason: outcome.reason,
|
|
175
|
+
reasonCode: outcome.reasonCode,
|
|
176
|
+
taskId: opts.taskId,
|
|
177
|
+
nextAction: outcome.nextAction,
|
|
178
|
+
}, opts.json);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
emit({
|
|
182
|
+
ok: true,
|
|
183
|
+
mode: 'repair_audit',
|
|
184
|
+
taskId: opts.taskId,
|
|
185
|
+
auditStatus: outcome.projected > 0 ? 'repaired' : 'already_projected',
|
|
186
|
+
projected: outcome.projected,
|
|
187
|
+
alreadyProjected: outcome.skipped,
|
|
188
|
+
totalDurableFacts: records.length,
|
|
189
|
+
nextAction: outcome.projected > 0
|
|
190
|
+
? 'Audit projection restored. Verify: pd runtime internalization queue --json (task state untouched by this mode)'
|
|
191
|
+
: 'Nothing to do — the JSONL projection already carries every durable actionId',
|
|
192
|
+
}, opts.json);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
if (isSqliteUnavailable(err)) {
|
|
196
|
+
refusal({ reason: err instanceof Error ? err.message : String(err), reasonCode: 'storage_unavailable', nextAction: 'Check the workspace path — repair-audit opens the database read-only and never creates it' }, opts.json);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
refusal({ reason: err instanceof Error ? err.message : String(err), reasonCode: 'repair_failed', nextAction: 'Fix the audit sink (workspace/.state/recovery_actions.jsonl) and re-run; the durable row fact is untouched' }, opts.json);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
if (handle)
|
|
203
|
+
await handle.close();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export async function handleRuntimeRecoveryFailedTask(opts) {
|
|
207
|
+
if (opts.dryRun && opts.confirm) {
|
|
208
|
+
refusal({
|
|
209
|
+
reason: 'Error: --dry-run and --confirm are mutually exclusive',
|
|
210
|
+
reasonCode: 'flag_conflict',
|
|
211
|
+
nextAction: 'Specify only one of --dry-run or --confirm (dry-run is the default)',
|
|
212
|
+
}, opts.json);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// Explicit --dry-run promises zero writes, including to recovery_actions.jsonl.
|
|
216
|
+
// --repair-audit is an intentional JSONL write operation, so neither execution
|
|
217
|
+
// mode flag may be combined with it (default no-flag dry-run remains distinct).
|
|
218
|
+
if (opts.repairAudit && (opts.confirm || opts.dryRun)) {
|
|
219
|
+
refusal({
|
|
220
|
+
reason: 'Error: --repair-audit cannot be combined with --confirm or --dry-run',
|
|
221
|
+
reasonCode: 'flag_conflict',
|
|
222
|
+
nextAction: 'Run --repair-audit alone to project the JSONL, or --dry-run alone for strictly zero-write inspection',
|
|
223
|
+
}, opts.json);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const rawTaskId = opts.taskId ?? '';
|
|
227
|
+
const taskId = rawTaskId.trim();
|
|
228
|
+
if (taskId === '' || taskId !== rawTaskId) {
|
|
229
|
+
refusal({
|
|
230
|
+
reason: 'Error: --task-id requires the exact task id (no surrounding whitespace)',
|
|
231
|
+
reasonCode: 'invalid_task_id',
|
|
232
|
+
nextAction: 'Copy the full taskId from: pd runtime internalization queue --json (or the audit-artificer-evidence output)',
|
|
233
|
+
}, opts.json);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// PRI-991 (r2 P1-03): the UNIFIED workspace authority resolves every
|
|
237
|
+
// target — explicit flag included — so assertSafeDirectoryRoot (empty /
|
|
238
|
+
// parent traversal / filesystem root) and the config-difference warnings
|
|
239
|
+
// apply to this state-mutating command like every other CLI command.
|
|
240
|
+
let workspaceDir;
|
|
241
|
+
try {
|
|
242
|
+
workspaceDir = resolveWorkspaceDir(opts.workspace);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
refusal({
|
|
246
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
247
|
+
reasonCode: 'workspace_invalid',
|
|
248
|
+
nextAction: 'Provide a safe explicit workspace directory with --workspace <path> (no traversal segments, not a filesystem root)',
|
|
249
|
+
}, opts.json);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
// PRI-991 (P1-01): refuse before opening ANY connection when the database
|
|
253
|
+
// does not exist — dry-run must not create it, confirm must not bootstrap.
|
|
254
|
+
if (!fs.existsSync(stateDbPath(workspaceDir))) {
|
|
255
|
+
refusal({
|
|
256
|
+
reason: `No state database at ${stateDbPath(workspaceDir)}`,
|
|
257
|
+
reasonCode: 'storage_unavailable',
|
|
258
|
+
nextAction: 'This workspace has no .pd/state.db — verify the --workspace path; recovery never creates databases',
|
|
259
|
+
}, opts.json);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (opts.repairAudit) {
|
|
263
|
+
await repairAuditProjection(opts, workspaceDir);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const isConfirm = opts.confirm ?? false;
|
|
267
|
+
// PRI-991 (P1-01): dry-run opens a STRICTLY read-only connection with
|
|
268
|
+
// bootstrap disabled — no mkdir, no WAL journal, no schema init/migration
|
|
269
|
+
// can happen from the file open onward. Confirm uses the controlled write
|
|
270
|
+
// connection (bootstrap likewise disabled: the DB is known to exist).
|
|
271
|
+
let closeHandle = null;
|
|
272
|
+
try {
|
|
273
|
+
const handle = await createRuntimeStateHandle({
|
|
274
|
+
workspaceDir,
|
|
275
|
+
readonly: !isConfirm,
|
|
276
|
+
bootstrapIfMissing: false,
|
|
277
|
+
});
|
|
278
|
+
closeHandle = handle.close;
|
|
279
|
+
const { stateManager } = handle;
|
|
280
|
+
if (!isConfirm) {
|
|
281
|
+
// Dry-run (default): pure read — no task mutation, no audit append.
|
|
282
|
+
const inspection = await inspectFailedTaskRecovery(stateManager, taskId);
|
|
283
|
+
const plannedChange = inspection.eligible && inspection.isExhausted === true
|
|
284
|
+
? {
|
|
285
|
+
status: 'failed → pending',
|
|
286
|
+
attemptBudget: `${inspection.attemptCount}/${inspection.maxAttempts} → 0/${(inspection.maxAttempts ?? 0) + 3} (with --reset-budget)`,
|
|
287
|
+
audit: 'a durable recovery fact is written into the task metadata in the same transaction, then projected to .state/recovery_actions.jsonl',
|
|
288
|
+
}
|
|
289
|
+
: inspection.eligible
|
|
290
|
+
? {
|
|
291
|
+
status: 'failed → pending',
|
|
292
|
+
attemptBudget: `${inspection.attemptCount}/${inspection.maxAttempts} → 0/${inspection.maxAttempts}`,
|
|
293
|
+
audit: 'a durable recovery fact is written into the task metadata in the same transaction, then projected to .state/recovery_actions.jsonl',
|
|
294
|
+
}
|
|
295
|
+
: undefined;
|
|
296
|
+
const payload = {
|
|
297
|
+
ok: inspection.eligible,
|
|
298
|
+
mode: 'dry_run',
|
|
299
|
+
...inspection,
|
|
300
|
+
plannedChange,
|
|
301
|
+
wouldWriteAudit: false,
|
|
302
|
+
workspace: workspaceDir,
|
|
303
|
+
...(inspection.eligible
|
|
304
|
+
? { nextAction: inspection.isExhausted === true
|
|
305
|
+
? 'Recover with: pd runtime recovery failed-task --task-id <exact-task-id> --confirm --reset-budget'
|
|
306
|
+
: 'Recover with: pd runtime recovery failed-task --task-id <exact-task-id> --confirm' }
|
|
307
|
+
: {}),
|
|
308
|
+
};
|
|
309
|
+
if (!inspection.eligible) {
|
|
310
|
+
payload.reasonCode = inspection.reasonCode;
|
|
311
|
+
}
|
|
312
|
+
emit(payload, opts.json);
|
|
313
|
+
if (!inspection.eligible) {
|
|
314
|
+
process.exitCode = 1;
|
|
315
|
+
}
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
// Confirm: precheck for precise structured refusals (and zero writes on
|
|
319
|
+
// refusal), then the strict single-task mutation (full-snapshot CAS).
|
|
320
|
+
const inspection = await inspectFailedTaskRecovery(stateManager, taskId);
|
|
321
|
+
if (!inspection.eligible) {
|
|
322
|
+
refusal({
|
|
323
|
+
reason: 'Task is not recoverable in its current state',
|
|
324
|
+
reasonCode: inspection.reasonCode,
|
|
325
|
+
taskId,
|
|
326
|
+
taskKind: inspection.taskKind,
|
|
327
|
+
status: inspection.status,
|
|
328
|
+
attemptCount: inspection.attemptCount,
|
|
329
|
+
maxAttempts: inspection.maxAttempts,
|
|
330
|
+
nextAction: inspection.nextAction,
|
|
331
|
+
}, opts.json);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
// PRI-991 (r2 P1-02): BEFORE the CAS, project any durable facts from
|
|
335
|
+
// PRIOR recoveries that never made it to the JSONL — otherwise this
|
|
336
|
+
// recovery's array append (bounded retention) could be the last holder
|
|
337
|
+
// of an unprojected actionId. Projection failure aborts the confirm
|
|
338
|
+
// BEFORE any state change (cli-5): the Owner fixes the sink and retries.
|
|
339
|
+
const preTask = await stateManager.getTask(taskId);
|
|
340
|
+
const prePi = preTask ? hydratePITaskRecord(preTask) : null;
|
|
341
|
+
const preRecords = prePi?.failedTaskRecoveries ?? [];
|
|
342
|
+
if (preRecords.length > 0) {
|
|
343
|
+
const pre = projectRecoveryRecordsOnce(workspaceDir, taskId, preRecords);
|
|
344
|
+
if (!pre.ok) {
|
|
345
|
+
refusal({
|
|
346
|
+
reason: pre.reason ?? 'Audit projection failed before recovery',
|
|
347
|
+
reasonCode: pre.reasonCode ?? 'audit_projection_failed',
|
|
348
|
+
taskId,
|
|
349
|
+
nextAction: `${pre.nextAction} The recovery was NOT executed (zero state change) — retry after the audit sink is writable`,
|
|
350
|
+
}, opts.json);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const outcome = await recoverSingleFailedTask(stateManager, taskId, {
|
|
355
|
+
resetBudget: opts.resetBudget ?? false,
|
|
356
|
+
// r2 P1-01: the label rides the durable fact in the SAME CAS.
|
|
357
|
+
operator: opts.decidedBy,
|
|
358
|
+
});
|
|
359
|
+
if (outcome.status !== 'recovered') {
|
|
360
|
+
// Lost a race against a concurrent writer, or a guard fired at mutation
|
|
361
|
+
// time — structured refusal, zero writes.
|
|
362
|
+
refusal({
|
|
363
|
+
reason: 'Task recovery refused (guard fired or state changed between precheck and mutation)',
|
|
364
|
+
reasonCode: outcome.status === 'not_found' ? 'task_not_found' : outcome.status,
|
|
365
|
+
taskId,
|
|
366
|
+
...(outcome.status === 'not_failed' ? { currentStatus: outcome.previousStatus } : {}),
|
|
367
|
+
...(outcome.status === 'budget_exhausted'
|
|
368
|
+
? { nextAction: outcome.nextAction }
|
|
369
|
+
: { nextAction: 'Re-run the dry-run to inspect the current state' }),
|
|
370
|
+
}, opts.json);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
// PRI-991 (P1-03): the durable audit fact is ALREADY committed inside the
|
|
374
|
+
// recovery CAS (task metadata failedTaskRecoveries, actionId shared).
|
|
375
|
+
// The JSONL line is a projection under the projection lock; a projection
|
|
376
|
+
// failure must never misreport the recovery as failed — and never asks
|
|
377
|
+
// the Owner to re-confirm.
|
|
378
|
+
const current = await stateManager.getTask(taskId);
|
|
379
|
+
const projected = projectRecoveryRecordsOnce(workspaceDir, taskId, [
|
|
380
|
+
{
|
|
381
|
+
actionId: outcome.actionId,
|
|
382
|
+
recoveredAt: new Date().toISOString(),
|
|
383
|
+
operator: opts.decidedBy?.trim() ? opts.decidedBy.trim() : null,
|
|
384
|
+
previousStatus: 'failed',
|
|
385
|
+
previousAttemptCount: outcome.previousAttemptCount,
|
|
386
|
+
previousMaxAttempts: outcome.previousMaxAttempts,
|
|
387
|
+
newMaxAttempts: outcome.newMaxAttempts,
|
|
388
|
+
budgetResetApplied: outcome.budgetResetApplied,
|
|
389
|
+
},
|
|
390
|
+
]);
|
|
391
|
+
const auditStatus = projected.ok ? 'projected' : 'recovered_but_audit_failed';
|
|
392
|
+
const auditFailureReason = projected.ok ? undefined : projected.reason;
|
|
393
|
+
const nextAction = buildRecoveryNextAction({
|
|
394
|
+
taskId,
|
|
395
|
+
taskKind: outcome.taskKind,
|
|
396
|
+
inputRef: current?.inputRef ?? null,
|
|
397
|
+
diagnosticJson: typeof current?.diagnosticJson === 'string' ? current.diagnosticJson : null,
|
|
398
|
+
});
|
|
399
|
+
emit({
|
|
400
|
+
ok: true,
|
|
401
|
+
mode: 'confirm',
|
|
402
|
+
taskId,
|
|
403
|
+
taskKind: outcome.taskKind,
|
|
404
|
+
previousStatus: outcome.previousStatus,
|
|
405
|
+
newStatus: current?.status ?? 'pending',
|
|
406
|
+
attemptCount: current?.attemptCount ?? 0,
|
|
407
|
+
maxAttempts: current?.maxAttempts ?? outcome.newMaxAttempts,
|
|
408
|
+
previousAttemptCount: outcome.previousAttemptCount,
|
|
409
|
+
previousMaxAttempts: outcome.previousMaxAttempts,
|
|
410
|
+
newMaxAttempts: outcome.newMaxAttempts,
|
|
411
|
+
budgetResetApplied: outcome.budgetResetApplied,
|
|
412
|
+
auditStatus,
|
|
413
|
+
...(auditStatus === 'recovered_but_audit_failed'
|
|
414
|
+
? {
|
|
415
|
+
auditFailureReason,
|
|
416
|
+
auditActionId: outcome.actionId,
|
|
417
|
+
decidedByLabel: opts.decidedBy ?? null,
|
|
418
|
+
nextAction: `Recovery IS committed (durable fact in the task metadata, actionId ${outcome.actionId}); the JSONL projection failed (${auditFailureReason ?? 'unknown'}). Do NOT re-run --confirm. Repair with: pd runtime recovery failed-task --task-id <exact-task-id> --repair-audit`,
|
|
419
|
+
}
|
|
420
|
+
: {
|
|
421
|
+
auditActionId: outcome.actionId,
|
|
422
|
+
nextAction,
|
|
423
|
+
}),
|
|
424
|
+
workspace: workspaceDir,
|
|
425
|
+
}, opts.json);
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
if (isSqliteUnavailable(err)) {
|
|
429
|
+
refusal({
|
|
430
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
431
|
+
reasonCode: 'storage_unavailable',
|
|
432
|
+
nextAction: 'The database could not be opened in its requested mode (readonly for --dry-run); recovery never migrates or bootstraps schemas',
|
|
433
|
+
}, opts.json);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
refusal({
|
|
437
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
438
|
+
reasonCode: 'recovery_error',
|
|
439
|
+
nextAction: 'Check the workspace path and DB connectivity, then re-run the dry-run',
|
|
440
|
+
}, opts.json);
|
|
441
|
+
}
|
|
442
|
+
finally {
|
|
443
|
+
if (closeHandle) {
|
|
444
|
+
await closeHandle();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Register `failed-task` (singular) under `pd runtime recovery` (PRI-991).
|
|
450
|
+
* The exact single-task counterpart of the batch `failed-tasks` command:
|
|
451
|
+
* the two coexist and the batch command is unchanged.
|
|
452
|
+
*/
|
|
453
|
+
export function registerRuntimeRecoveryFailedTaskCommand(recoveryCmd, handlers = {}) {
|
|
454
|
+
const handler = handlers.failedTask ?? handleRuntimeRecoveryFailedTask;
|
|
455
|
+
recoveryCmd
|
|
456
|
+
.command('failed-task')
|
|
457
|
+
.description('Recover ONE failed task by exact taskId (dry-run default; exhausted tasks additionally require --reset-budget)')
|
|
458
|
+
.requiredOption('--task-id <taskId>', 'Exact task id — no prefix, no wildcard, no fallback to batch recovery')
|
|
459
|
+
.option('-w, --workspace <path>', 'Workspace directory')
|
|
460
|
+
.option('--dry-run', 'Strictly read-only precheck: opens the DB read-only (never creates/migrates), shows the exact planned change (default)')
|
|
461
|
+
.option('--confirm', 'Actually recover this one task (full-snapshot CAS; durable audit fact + JSONL projection)')
|
|
462
|
+
.option('--reset-budget', 'Explicitly reset an exhausted attempt budget (required when attempts are exhausted; records previousAttemptCount in the audit)')
|
|
463
|
+
.option('--repair-audit', 'Idempotently re-project the JSONL audit line from the durable recovery fact in the task metadata (never mutates task state)')
|
|
464
|
+
.option('--decidedBy <label>', 'Operator-provided label recorded in the audit log (a label, NOT an authenticated identity)')
|
|
465
|
+
.option('--json', 'Output raw JSON')
|
|
466
|
+
.action(async (opts) => {
|
|
467
|
+
await handler(opts);
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=runtime-recovery-failed-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-recovery-failed-task.js","sourceRoot":"","sources":["../../src/commands/runtime-recovery-failed-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,30 @@ interface RecoveryFailedTasksOptions {
|
|
|
5
5
|
force?: boolean;
|
|
6
6
|
json?: boolean;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* PRI-674 review P2: per-kind execution guidance must point at commands that
|
|
10
|
+
* actually support the recovered task kind (cli-6-output-next-action).
|
|
11
|
+
*
|
|
12
|
+
* Verified against real command surfaces:
|
|
13
|
+
* - `pd runtime internalization run-once` supports ONLY the 6 peer runner
|
|
14
|
+
* kinds (SUPPORTED_RUNNERS in runtime-internalization-run-once.ts).
|
|
15
|
+
* - `pd diagnose run --task-id <id>` is the only diagnostician execution
|
|
16
|
+
* entry (SplitDiagnosticianRunner runs the full A→B→C pipeline from the
|
|
17
|
+
* PARENT task; running a diag_* stage as parent would create bogus nested
|
|
18
|
+
* stage tasks).
|
|
19
|
+
* - diag_* stage linkage: persisted inputRef = parent task ID
|
|
20
|
+
* (SplitDiagnosticianRunner.ensureSubTask), with the
|
|
21
|
+
* diag_<stage>-<parentTaskId> ID convention as fallback. When the parent
|
|
22
|
+
* cannot be resolved we say so instead of printing a guessed command.
|
|
23
|
+
* PRI-991 (P2-B): exported and reused by the single-task recovery command so
|
|
24
|
+
* both recovery surfaces emit IDENTICAL per-kind execution guidance — no
|
|
25
|
+
* second guidance authority.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildExecutionNextAction(t: {
|
|
28
|
+
taskId: string;
|
|
29
|
+
taskKind: string;
|
|
30
|
+
inputRef: string | null;
|
|
31
|
+
}): string;
|
|
8
32
|
export declare function handleRuntimeRecoveryFailedTasks(opts: RecoveryFailedTasksOptions): Promise<void>;
|
|
9
33
|
export {};
|
|
10
34
|
//# sourceMappingURL=runtime-recovery-failed-tasks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-recovery-failed-tasks.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-recovery-failed-tasks.ts"],"names":[],"mappings":"AASA,UAAU,0BAA0B;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"runtime-recovery-failed-tasks.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-recovery-failed-tasks.ts"],"names":[],"mappings":"AASA,UAAU,0BAA0B;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAgBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAuBjH;AAED,wBAAsB,gCAAgC,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyLtG"}
|
|
@@ -18,8 +18,11 @@ const DIAG_STAGE_ID_PREFIXES = ['diag_rootcause-', 'diag_distiller-', 'diag_rout
|
|
|
18
18
|
* (SplitDiagnosticianRunner.ensureSubTask), with the
|
|
19
19
|
* diag_<stage>-<parentTaskId> ID convention as fallback. When the parent
|
|
20
20
|
* cannot be resolved we say so instead of printing a guessed command.
|
|
21
|
+
* PRI-991 (P2-B): exported and reused by the single-task recovery command so
|
|
22
|
+
* both recovery surfaces emit IDENTICAL per-kind execution guidance — no
|
|
23
|
+
* second guidance authority.
|
|
21
24
|
*/
|
|
22
|
-
function buildExecutionNextAction(t) {
|
|
25
|
+
export function buildExecutionNextAction(t) {
|
|
23
26
|
// Branch on the authoritative taskKind, never on taskId shape.
|
|
24
27
|
if (isDiagnosticianStageKind(t.taskKind)) {
|
|
25
28
|
// Parent from persisted inputRef; fallback: diag_<stage>-<parentTaskId>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-recovery-failed-tasks.js","sourceRoot":"","sources":["../../src/commands/runtime-recovery-failed-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAqB9D,6EAA6E;AAC7E,MAAM,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,CAAU,CAAC;AAE/F
|
|
1
|
+
{"version":3,"file":"runtime-recovery-failed-tasks.js","sourceRoot":"","sources":["../../src/commands/runtime-recovery-failed-tasks.ts"],"names":[],"mappings":"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"}
|
package/pd-cli/dist/index.js
CHANGED
|
@@ -51,6 +51,7 @@ import { handleRuntimeDiagnosticsExport } from './commands/runtime-diagnostics-e
|
|
|
51
51
|
import { registerRuntimeCompatibilityScanCommand } from './commands/runtime-compatibility-scan.js';
|
|
52
52
|
import { handleRuntimeRecoverySweep } from './commands/runtime-recovery.js';
|
|
53
53
|
import { handleRuntimeRecoveryFailedTasks } from './commands/runtime-recovery-failed-tasks.js';
|
|
54
|
+
import { registerRuntimeRecoveryFailedTaskCommand } from './commands/runtime-recovery-failed-task.js';
|
|
54
55
|
import { handleRuntimeArtifactRepair } from './commands/runtime-artifact-repair.js';
|
|
55
56
|
import { handleRuntimeActivationDeactivate, handleRuntimeActivationList, handleRuntimeActivationEdit, registerRuntimeActivationPromoteCommand, registerRuntimeActivationDeactivateCommand, registerRuntimeActivationListCommand, registerRuntimeActivationDispatchCommand, registerRuntimeActivationApproveCommand, } from './commands/runtime-activation.js';
|
|
56
57
|
import { handleProvenChannelBaseline } from './commands/proven-channel-baseline.js';
|
|
@@ -849,6 +850,10 @@ recoveryCmd
|
|
|
849
850
|
json: opts.json,
|
|
850
851
|
});
|
|
851
852
|
});
|
|
853
|
+
// PRI-991: exact single-task counterpart of `failed-tasks`. A batch --force
|
|
854
|
+
// resets the budget of EVERY exhausted failed task; this command recovers
|
|
855
|
+
// exactly one Owner-selected task (CAS-guarded, audited, dry-run default).
|
|
856
|
+
registerRuntimeRecoveryFailedTaskCommand(recoveryCmd);
|
|
852
857
|
diagnosticsCmd
|
|
853
858
|
.command('export')
|
|
854
859
|
.description('Export diagnostic bundle for AI assistant analysis')
|