@resolveio/server-lib 22.3.136 → 22.3.138
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/package.json +1 -1
- package/util/ai-runner-manager-policy.d.ts +81 -0
- package/util/ai-runner-manager-policy.js +255 -1
- package/util/ai-runner-manager-policy.js.map +1 -1
- package/util/aicoder-runner-v6.d.ts +4 -1
- package/util/aicoder-runner-v6.js +13 -2
- package/util/aicoder-runner-v6.js.map +1 -1
- package/util/support-runner-v5.d.ts +5 -1
- package/util/support-runner-v5.js +39 -12
- package/util/support-runner-v5.js.map +1 -1
package/package.json
CHANGED
|
@@ -83,6 +83,76 @@ export interface ResolveIOAIManagerRecoveryEvidenceProbe {
|
|
|
83
83
|
loopResetEvidence: string[];
|
|
84
84
|
createdAt: string;
|
|
85
85
|
}
|
|
86
|
+
export type ResolveIOAIManagerRecoveryAutomationMode = 'advance' | 'collect_evidence' | 'read_only_diagnosis' | 'repair_infra' | 'repair_compile' | 'repair_journey_contract' | 'repair_business_assertion' | 'repair_release' | 'targeted_product_repair' | 'manual_review' | 'continue_gate';
|
|
87
|
+
export interface ResolveIOAIManagerRecoveryActionRetryPolicy {
|
|
88
|
+
allowImmediateRetry: boolean;
|
|
89
|
+
requireNewEvidence: boolean;
|
|
90
|
+
resetLoopWhen: string[];
|
|
91
|
+
stopWhen: string[];
|
|
92
|
+
}
|
|
93
|
+
export interface ResolveIOAIManagerRecoveryActionPacket {
|
|
94
|
+
actionId: string;
|
|
95
|
+
checkpointId: string;
|
|
96
|
+
probeId: string;
|
|
97
|
+
recoveryClass: ResolveIOAIManagerRecoveryClass;
|
|
98
|
+
mode: ResolveIOAIManagerRecoveryAutomationMode;
|
|
99
|
+
label: string;
|
|
100
|
+
lane: string;
|
|
101
|
+
stepType: string;
|
|
102
|
+
primaryStepKind: ResolveIOAIManagerRecoveryEvidenceProbeStepKind | 'none';
|
|
103
|
+
objective: string;
|
|
104
|
+
evidenceOnly: boolean;
|
|
105
|
+
autoRunnable: boolean;
|
|
106
|
+
productRepairAllowed: boolean;
|
|
107
|
+
expensiveModelAllowed: boolean;
|
|
108
|
+
canResetLoopAfterEvidence: boolean;
|
|
109
|
+
maxAttemptsBeforePark: number;
|
|
110
|
+
requiredArtifacts: string[];
|
|
111
|
+
nextCommands: string[];
|
|
112
|
+
successCriteria: string[];
|
|
113
|
+
retryPolicy: ResolveIOAIManagerRecoveryActionRetryPolicy;
|
|
114
|
+
blockedReason?: string;
|
|
115
|
+
createdAt: string;
|
|
116
|
+
}
|
|
117
|
+
export type ResolveIOAIManagerRecoveryActionDispatchAction = 'run_evidence_probe' | 'run_read_only_diagnosis' | 'run_infra_repair' | 'run_compile_repair' | 'run_journey_contract_repair' | 'run_business_assertion_repair' | 'run_release_repair' | 'run_targeted_product_repair' | 'advance' | 'continue_gate' | 'park_manual';
|
|
118
|
+
export type ResolveIOAIManagerRecoveryActionDispatchStatus = 'queued' | 'started' | 'completed' | 'failed' | 'parked';
|
|
119
|
+
export interface ResolveIOAIManagerRecoveryActionDispatchRecord {
|
|
120
|
+
dispatchId: string;
|
|
121
|
+
actionId: string;
|
|
122
|
+
checkpointId: string;
|
|
123
|
+
probeId: string;
|
|
124
|
+
mode: ResolveIOAIManagerRecoveryAutomationMode;
|
|
125
|
+
dispatchAction: ResolveIOAIManagerRecoveryActionDispatchAction;
|
|
126
|
+
status: ResolveIOAIManagerRecoveryActionDispatchStatus;
|
|
127
|
+
evidenceHash: string;
|
|
128
|
+
blockerFingerprint: string;
|
|
129
|
+
productRepairAllowed: boolean;
|
|
130
|
+
expensiveModelAllowed: boolean;
|
|
131
|
+
reason: string;
|
|
132
|
+
artifactPaths: string[];
|
|
133
|
+
startedAt?: string;
|
|
134
|
+
completedAt?: string;
|
|
135
|
+
createdAt: string;
|
|
136
|
+
}
|
|
137
|
+
export interface ResolveIOAIManagerRecoveryActionDispatchInput {
|
|
138
|
+
action?: ResolveIOAIManagerRecoveryActionPacket;
|
|
139
|
+
history?: ResolveIOAIManagerRecoveryActionDispatchRecord[];
|
|
140
|
+
current?: ResolveIOAIManagerFailureRecord;
|
|
141
|
+
operatorApproved?: boolean;
|
|
142
|
+
now?: Date | string;
|
|
143
|
+
}
|
|
144
|
+
export interface ResolveIOAIManagerRecoveryActionDispatchDecision {
|
|
145
|
+
dispatchAction: ResolveIOAIManagerRecoveryActionDispatchAction;
|
|
146
|
+
allowed: boolean;
|
|
147
|
+
reason: string;
|
|
148
|
+
status: ResolveIOAIManagerRecoveryActionDispatchStatus;
|
|
149
|
+
canRunProductRepair: boolean;
|
|
150
|
+
canRunExpensiveModel: boolean;
|
|
151
|
+
shouldRecordDispatch: boolean;
|
|
152
|
+
requiresNewEvidence: boolean;
|
|
153
|
+
newEvidence: boolean;
|
|
154
|
+
dispatchRecord?: ResolveIOAIManagerRecoveryActionDispatchRecord;
|
|
155
|
+
}
|
|
86
156
|
export interface ResolveIOAIManagerRecoveryCheckpointInput {
|
|
87
157
|
plan: ResolveIOAIManagerRecoveryPlan;
|
|
88
158
|
current?: ResolveIOAIManagerFailureRecord;
|
|
@@ -115,6 +185,13 @@ export interface ResolveIOAIManagerRecoveryEvidenceProbeInput {
|
|
|
115
185
|
current?: ResolveIOAIManagerFailureRecord;
|
|
116
186
|
now?: Date | string;
|
|
117
187
|
}
|
|
188
|
+
export interface ResolveIOAIManagerRecoveryActionPacketInput {
|
|
189
|
+
plan?: ResolveIOAIManagerRecoveryPlan;
|
|
190
|
+
checkpoint: ResolveIOAIManagerRecoveryCheckpoint;
|
|
191
|
+
probe?: ResolveIOAIManagerRecoveryEvidenceProbe;
|
|
192
|
+
current?: ResolveIOAIManagerFailureRecord;
|
|
193
|
+
now?: Date | string;
|
|
194
|
+
}
|
|
118
195
|
export interface ResolveIOAIManagerRecoveryPlanInput {
|
|
119
196
|
action?: ResolveIOAIManagerAction | string;
|
|
120
197
|
reason?: string;
|
|
@@ -152,12 +229,16 @@ export interface ResolveIOAIManagerPolicyDecision {
|
|
|
152
229
|
recoveryPlan: ResolveIOAIManagerRecoveryPlan;
|
|
153
230
|
recoveryCheckpoint: ResolveIOAIManagerRecoveryCheckpoint;
|
|
154
231
|
recoveryEvidenceProbe: ResolveIOAIManagerRecoveryEvidenceProbe;
|
|
232
|
+
recoveryAction: ResolveIOAIManagerRecoveryActionPacket;
|
|
155
233
|
}
|
|
156
234
|
export declare function normalizeResolveIOAIManagerFailureClass(value: any): string;
|
|
157
235
|
export declare function fingerprintResolveIOAIManagerBlocker(value: any): string;
|
|
158
236
|
export declare function hashResolveIOAIManagerEvidence(record: ResolveIOAIManagerFailureRecord | undefined): string;
|
|
159
237
|
export declare function buildResolveIOAIManagerRecoveryCheckpoint(input: ResolveIOAIManagerRecoveryCheckpointInput): ResolveIOAIManagerRecoveryCheckpoint;
|
|
160
238
|
export declare function buildResolveIOAIManagerRecoveryEvidenceProbe(input: ResolveIOAIManagerRecoveryEvidenceProbeInput): ResolveIOAIManagerRecoveryEvidenceProbe;
|
|
239
|
+
export declare function buildResolveIOAIManagerRecoveryActionPacket(input: ResolveIOAIManagerRecoveryActionPacketInput): ResolveIOAIManagerRecoveryActionPacket;
|
|
240
|
+
export declare function decideResolveIOAIManagerRecoveryActionDispatch(input: ResolveIOAIManagerRecoveryActionDispatchInput): ResolveIOAIManagerRecoveryActionDispatchDecision;
|
|
241
|
+
export declare function appendResolveIOAIManagerRecoveryActionDispatch(history: ResolveIOAIManagerRecoveryActionDispatchRecord[] | undefined, record: ResolveIOAIManagerRecoveryActionDispatchRecord | undefined, limit?: number): ResolveIOAIManagerRecoveryActionDispatchRecord[];
|
|
161
242
|
export declare function decideResolveIOAIManagerRecoveryGate(input: ResolveIOAIManagerRecoveryGateInput): ResolveIOAIManagerRecoveryGateDecision;
|
|
162
243
|
export declare function buildResolveIOAIManagerRecoveryPlan(input?: ResolveIOAIManagerRecoveryPlanInput): ResolveIOAIManagerRecoveryPlan;
|
|
163
244
|
export declare function decideResolveIOAIManagerPolicy(input: ResolveIOAIManagerPolicyInput): ResolveIOAIManagerPolicyDecision;
|
|
@@ -52,6 +52,9 @@ exports.fingerprintResolveIOAIManagerBlocker = fingerprintResolveIOAIManagerBloc
|
|
|
52
52
|
exports.hashResolveIOAIManagerEvidence = hashResolveIOAIManagerEvidence;
|
|
53
53
|
exports.buildResolveIOAIManagerRecoveryCheckpoint = buildResolveIOAIManagerRecoveryCheckpoint;
|
|
54
54
|
exports.buildResolveIOAIManagerRecoveryEvidenceProbe = buildResolveIOAIManagerRecoveryEvidenceProbe;
|
|
55
|
+
exports.buildResolveIOAIManagerRecoveryActionPacket = buildResolveIOAIManagerRecoveryActionPacket;
|
|
56
|
+
exports.decideResolveIOAIManagerRecoveryActionDispatch = decideResolveIOAIManagerRecoveryActionDispatch;
|
|
57
|
+
exports.appendResolveIOAIManagerRecoveryActionDispatch = appendResolveIOAIManagerRecoveryActionDispatch;
|
|
55
58
|
exports.decideResolveIOAIManagerRecoveryGate = decideResolveIOAIManagerRecoveryGate;
|
|
56
59
|
exports.buildResolveIOAIManagerRecoveryPlan = buildResolveIOAIManagerRecoveryPlan;
|
|
57
60
|
exports.decideResolveIOAIManagerPolicy = decideResolveIOAIManagerPolicy;
|
|
@@ -314,6 +317,251 @@ function buildResolveIOAIManagerRecoveryEvidenceProbe(input) {
|
|
|
314
317
|
createdAt: now
|
|
315
318
|
};
|
|
316
319
|
}
|
|
320
|
+
function recoveryAutomationModeFor(checkpoint) {
|
|
321
|
+
if (checkpoint.status === 'manual_handoff' || checkpoint.recoveryClass === 'manual_handoff') {
|
|
322
|
+
return 'manual_review';
|
|
323
|
+
}
|
|
324
|
+
if (checkpoint.status === 'complete' || checkpoint.recoveryClass === 'advance_after_proof') {
|
|
325
|
+
return 'advance';
|
|
326
|
+
}
|
|
327
|
+
if (checkpoint.status === 'parked' || checkpoint.recoveryClass === 'blocked_until_new_evidence') {
|
|
328
|
+
return 'collect_evidence';
|
|
329
|
+
}
|
|
330
|
+
if (checkpoint.recoveryClass === 'diagnosis_only' || checkpoint.recoveryClass === 'diagnosis_revision') {
|
|
331
|
+
return 'read_only_diagnosis';
|
|
332
|
+
}
|
|
333
|
+
if (checkpoint.recoveryClass === 'infra_repair') {
|
|
334
|
+
return 'repair_infra';
|
|
335
|
+
}
|
|
336
|
+
if (checkpoint.recoveryClass === 'compile_repair') {
|
|
337
|
+
return 'repair_compile';
|
|
338
|
+
}
|
|
339
|
+
if (checkpoint.recoveryClass === 'journey_contract_repair') {
|
|
340
|
+
return 'repair_journey_contract';
|
|
341
|
+
}
|
|
342
|
+
if (checkpoint.recoveryClass === 'business_proof_repair') {
|
|
343
|
+
return 'repair_business_assertion';
|
|
344
|
+
}
|
|
345
|
+
if (checkpoint.recoveryClass === 'release_repair') {
|
|
346
|
+
return 'repair_release';
|
|
347
|
+
}
|
|
348
|
+
if (checkpoint.recoveryClass === 'product_code_repair') {
|
|
349
|
+
return 'targeted_product_repair';
|
|
350
|
+
}
|
|
351
|
+
return 'continue_gate';
|
|
352
|
+
}
|
|
353
|
+
function recoveryActionLabelFor(mode, checkpoint) {
|
|
354
|
+
var explicit = cleanText(checkpoint.nextActionLabel, 120);
|
|
355
|
+
if (explicit && mode !== 'collect_evidence') {
|
|
356
|
+
return explicit;
|
|
357
|
+
}
|
|
358
|
+
var labels = {
|
|
359
|
+
advance: 'Advance To Next Gate',
|
|
360
|
+
collect_evidence: 'Collect New Evidence',
|
|
361
|
+
read_only_diagnosis: 'Run Diagnosis Evidence Pass',
|
|
362
|
+
repair_infra: 'Repair Infra Gate',
|
|
363
|
+
repair_compile: 'Repair Compile Gate',
|
|
364
|
+
repair_journey_contract: 'Repair Journey Contract',
|
|
365
|
+
repair_business_assertion: 'Repair Business Proof',
|
|
366
|
+
repair_release: 'Repair Release Gate',
|
|
367
|
+
targeted_product_repair: 'Run Targeted Repair',
|
|
368
|
+
manual_review: 'Manual Review',
|
|
369
|
+
continue_gate: 'Continue Current Gate'
|
|
370
|
+
};
|
|
371
|
+
return labels[mode];
|
|
372
|
+
}
|
|
373
|
+
function recoveryActionAutoRunnable(mode, probe) {
|
|
374
|
+
if (mode === 'manual_review') {
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
if (mode === 'advance' || mode === 'continue_gate') {
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
if (mode === 'targeted_product_repair' || mode === 'read_only_diagnosis' || mode === 'repair_journey_contract' || mode === 'repair_business_assertion') {
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
return probe.steps.some(function (step) { return step.commandHint || step.kind === 'rerun_same_gate' || step.kind === 'release_status' || step.kind === 'diff_scope_check'; });
|
|
384
|
+
}
|
|
385
|
+
function buildResolveIOAIManagerRecoveryActionPacket(input) {
|
|
386
|
+
var checkpoint = input.checkpoint;
|
|
387
|
+
var probe = input.probe || buildResolveIOAIManagerRecoveryEvidenceProbe({
|
|
388
|
+
checkpoint: checkpoint,
|
|
389
|
+
current: input.current,
|
|
390
|
+
now: input.now
|
|
391
|
+
});
|
|
392
|
+
var mode = recoveryAutomationModeFor(checkpoint);
|
|
393
|
+
var primaryStep = probe.steps.find(function (step) { return step.required && step.id !== 'snapshot_current_blocker'; })
|
|
394
|
+
|| probe.steps.find(function (step) { return step.required; })
|
|
395
|
+
|| probe.steps[0];
|
|
396
|
+
var evidenceOnly = probe.evidenceOnly || mode === 'collect_evidence' || mode === 'repair_infra' || mode === 'repair_compile' || mode === 'repair_release';
|
|
397
|
+
var requireNewEvidence = mode === 'collect_evidence'
|
|
398
|
+
|| checkpoint.status === 'parked'
|
|
399
|
+
|| checkpoint.attempts >= checkpoint.maxAttemptsBeforePark;
|
|
400
|
+
var stopWhen = Array.from(new Set(__spreadArray(__spreadArray([], __read(probe.stopConditions), false), __read((requireNewEvidence ? ['same blocker fingerprint and same evidence hash after probe'] : [])), false).map(function (entry) { return cleanText(entry, 500); }).filter(Boolean))).slice(0, 30);
|
|
401
|
+
var resetLoopWhen = Array.from(new Set(__spreadArray(__spreadArray(__spreadArray([], __read(checkpoint.loopResetEvidence), false), __read(probe.loopResetEvidence), false), __read((requireNewEvidence ? ['changed evidence hash', 'new artifact path'] : [])), false).map(function (entry) { return cleanText(entry, 500); }).filter(Boolean))).slice(0, 30);
|
|
402
|
+
var nextCommands = probe.steps
|
|
403
|
+
.map(function (step) { return cleanText(step.commandHint || "".concat(step.kind, ":").concat(step.id), 500); })
|
|
404
|
+
.filter(Boolean)
|
|
405
|
+
.slice(0, 12);
|
|
406
|
+
var now = isoNow(input.now);
|
|
407
|
+
return __assign(__assign({ actionId: stableHash('mgr-action', {
|
|
408
|
+
checkpointId: checkpoint.checkpointId,
|
|
409
|
+
probeId: probe.probeId,
|
|
410
|
+
mode: mode,
|
|
411
|
+
evidenceHash: checkpoint.evidenceHash,
|
|
412
|
+
blockerFingerprint: checkpoint.blockerFingerprint
|
|
413
|
+
}), checkpointId: checkpoint.checkpointId, probeId: probe.probeId, recoveryClass: checkpoint.recoveryClass, mode: mode, label: recoveryActionLabelFor(mode, checkpoint), lane: checkpoint.lane, stepType: checkpoint.stepType, primaryStepKind: (primaryStep === null || primaryStep === void 0 ? void 0 : primaryStep.kind) || 'none', objective: mode === 'collect_evidence'
|
|
414
|
+
? probe.objective
|
|
415
|
+
: cleanText(checkpoint.objective || probe.objective, 1000), evidenceOnly: evidenceOnly, autoRunnable: recoveryActionAutoRunnable(mode, probe), productRepairAllowed: checkpoint.productRepairAllowed && !evidenceOnly && checkpoint.status !== 'parked', expensiveModelAllowed: checkpoint.expensiveModelAllowed && checkpoint.status !== 'parked', canResetLoopAfterEvidence: resetLoopWhen.length > 0, maxAttemptsBeforePark: checkpoint.maxAttemptsBeforePark, requiredArtifacts: probe.requiredArtifacts.slice(0, 20), nextCommands: nextCommands, successCriteria: probe.acceptanceEvidence.slice(0, 20), retryPolicy: {
|
|
416
|
+
allowImmediateRetry: checkpoint.status !== 'parked' && mode !== 'manual_review',
|
|
417
|
+
requireNewEvidence: requireNewEvidence,
|
|
418
|
+
resetLoopWhen: resetLoopWhen,
|
|
419
|
+
stopWhen: stopWhen
|
|
420
|
+
} }, (mode === 'collect_evidence' ? { blockedReason: 'Manager parked this loop until the recovery action records new evidence.' } : {})), { createdAt: now });
|
|
421
|
+
}
|
|
422
|
+
function dispatchActionForMode(mode) {
|
|
423
|
+
var map = {
|
|
424
|
+
advance: 'advance',
|
|
425
|
+
collect_evidence: 'run_evidence_probe',
|
|
426
|
+
read_only_diagnosis: 'run_read_only_diagnosis',
|
|
427
|
+
repair_infra: 'run_infra_repair',
|
|
428
|
+
repair_compile: 'run_compile_repair',
|
|
429
|
+
repair_journey_contract: 'run_journey_contract_repair',
|
|
430
|
+
repair_business_assertion: 'run_business_assertion_repair',
|
|
431
|
+
repair_release: 'run_release_repair',
|
|
432
|
+
targeted_product_repair: 'run_targeted_product_repair',
|
|
433
|
+
manual_review: 'park_manual',
|
|
434
|
+
continue_gate: 'continue_gate'
|
|
435
|
+
};
|
|
436
|
+
return map[mode] || 'park_manual';
|
|
437
|
+
}
|
|
438
|
+
function buildRecoveryDispatchRecord(action, dispatchAction, status, reason, current, now) {
|
|
439
|
+
var evidenceHash = (current === null || current === void 0 ? void 0 : current.evidenceHash) || action.checkpointId || action.actionId;
|
|
440
|
+
var blockerFingerprint = resolveResolveIOAIManagerBlockerFingerprint(current, action.objective);
|
|
441
|
+
var artifactPaths = cleanList(current === null || current === void 0 ? void 0 : current.artifactPaths, 20, 500);
|
|
442
|
+
var createdAt = isoNow(now);
|
|
443
|
+
return __assign(__assign(__assign({ dispatchId: stableHash('mgr-dispatch', {
|
|
444
|
+
actionId: action.actionId,
|
|
445
|
+
dispatchAction: dispatchAction,
|
|
446
|
+
evidenceHash: evidenceHash,
|
|
447
|
+
blockerFingerprint: blockerFingerprint,
|
|
448
|
+
status: status
|
|
449
|
+
}), actionId: action.actionId, checkpointId: action.checkpointId, probeId: action.probeId, mode: action.mode, dispatchAction: dispatchAction, status: status, evidenceHash: evidenceHash, blockerFingerprint: blockerFingerprint, productRepairAllowed: action.productRepairAllowed && dispatchAction === 'run_targeted_product_repair', expensiveModelAllowed: action.expensiveModelAllowed && dispatchAction !== 'run_evidence_probe', reason: reason, artifactPaths: artifactPaths }, (status === 'started' ? { startedAt: createdAt } : {})), (status === 'completed' ? { completedAt: createdAt } : {})), { createdAt: createdAt });
|
|
450
|
+
}
|
|
451
|
+
function decideResolveIOAIManagerRecoveryActionDispatch(input) {
|
|
452
|
+
var action = input.action;
|
|
453
|
+
var history = Array.isArray(input.history) ? input.history.filter(Boolean).slice(-50) : [];
|
|
454
|
+
var current = input.current || {};
|
|
455
|
+
if (!action) {
|
|
456
|
+
return {
|
|
457
|
+
dispatchAction: 'park_manual',
|
|
458
|
+
allowed: false,
|
|
459
|
+
reason: 'recovery_dispatch_missing_action',
|
|
460
|
+
status: 'parked',
|
|
461
|
+
canRunProductRepair: false,
|
|
462
|
+
canRunExpensiveModel: false,
|
|
463
|
+
shouldRecordDispatch: false,
|
|
464
|
+
requiresNewEvidence: true,
|
|
465
|
+
newEvidence: false
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
var dispatchAction = dispatchActionForMode(action.mode);
|
|
469
|
+
var evidenceHash = current.evidenceHash || action.checkpointId || action.actionId;
|
|
470
|
+
var blockerFingerprint = resolveResolveIOAIManagerBlockerFingerprint(current, action.objective);
|
|
471
|
+
var sameActionHistory = history.filter(function (entry) { return entry.actionId === action.actionId; });
|
|
472
|
+
var sameEvidenceHistory = sameActionHistory.filter(function (entry) { return entry.evidenceHash === evidenceHash
|
|
473
|
+
&& entry.blockerFingerprint === blockerFingerprint; });
|
|
474
|
+
var activeDispatch = sameEvidenceHistory.find(function (entry) { return entry.status === 'queued' || entry.status === 'started'; });
|
|
475
|
+
var completedDispatch = sameEvidenceHistory.find(function (entry) { return entry.status === 'completed' || entry.status === 'failed'; });
|
|
476
|
+
var newEvidence = sameActionHistory.length > 0 && sameEvidenceHistory.length === 0;
|
|
477
|
+
var requiresNewEvidence = action.retryPolicy.requireNewEvidence === true;
|
|
478
|
+
var manualOnly = action.mode === 'manual_review' || !action.autoRunnable;
|
|
479
|
+
var productDispatch = dispatchAction === 'run_targeted_product_repair';
|
|
480
|
+
var expensiveDispatch = !['run_evidence_probe', 'advance', 'continue_gate', 'park_manual'].includes(dispatchAction);
|
|
481
|
+
if (manualOnly && input.operatorApproved !== true) {
|
|
482
|
+
var record_1 = buildRecoveryDispatchRecord(action, 'park_manual', 'parked', 'recovery_dispatch_requires_manual_review', current, input.now);
|
|
483
|
+
return {
|
|
484
|
+
dispatchAction: 'park_manual',
|
|
485
|
+
allowed: false,
|
|
486
|
+
reason: record_1.reason,
|
|
487
|
+
status: 'parked',
|
|
488
|
+
canRunProductRepair: false,
|
|
489
|
+
canRunExpensiveModel: false,
|
|
490
|
+
shouldRecordDispatch: true,
|
|
491
|
+
requiresNewEvidence: requiresNewEvidence,
|
|
492
|
+
newEvidence: newEvidence,
|
|
493
|
+
dispatchRecord: record_1
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
if (productDispatch && action.productRepairAllowed !== true) {
|
|
497
|
+
var record_2 = buildRecoveryDispatchRecord(action, 'park_manual', 'parked', 'recovery_dispatch_product_repair_not_allowed', current, input.now);
|
|
498
|
+
return {
|
|
499
|
+
dispatchAction: 'park_manual',
|
|
500
|
+
allowed: false,
|
|
501
|
+
reason: record_2.reason,
|
|
502
|
+
status: 'parked',
|
|
503
|
+
canRunProductRepair: false,
|
|
504
|
+
canRunExpensiveModel: false,
|
|
505
|
+
shouldRecordDispatch: true,
|
|
506
|
+
requiresNewEvidence: true,
|
|
507
|
+
newEvidence: newEvidence,
|
|
508
|
+
dispatchRecord: record_2
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
if (activeDispatch) {
|
|
512
|
+
return {
|
|
513
|
+
dispatchAction: 'park_manual',
|
|
514
|
+
allowed: false,
|
|
515
|
+
reason: 'recovery_dispatch_already_running_for_same_evidence',
|
|
516
|
+
status: 'parked',
|
|
517
|
+
canRunProductRepair: false,
|
|
518
|
+
canRunExpensiveModel: false,
|
|
519
|
+
shouldRecordDispatch: false,
|
|
520
|
+
requiresNewEvidence: true,
|
|
521
|
+
newEvidence: false
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
if (completedDispatch && requiresNewEvidence && !newEvidence) {
|
|
525
|
+
var record_3 = buildRecoveryDispatchRecord(action, 'park_manual', 'parked', 'recovery_dispatch_same_evidence_already_attempted', current, input.now);
|
|
526
|
+
return {
|
|
527
|
+
dispatchAction: 'park_manual',
|
|
528
|
+
allowed: false,
|
|
529
|
+
reason: record_3.reason,
|
|
530
|
+
status: 'parked',
|
|
531
|
+
canRunProductRepair: false,
|
|
532
|
+
canRunExpensiveModel: false,
|
|
533
|
+
shouldRecordDispatch: true,
|
|
534
|
+
requiresNewEvidence: true,
|
|
535
|
+
newEvidence: false,
|
|
536
|
+
dispatchRecord: record_3
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
var status = dispatchAction === 'advance' || dispatchAction === 'continue_gate'
|
|
540
|
+
? 'completed'
|
|
541
|
+
: 'started';
|
|
542
|
+
var record = buildRecoveryDispatchRecord(action, dispatchAction, status, 'recovery_dispatch_allowed', current, input.now);
|
|
543
|
+
return {
|
|
544
|
+
dispatchAction: dispatchAction,
|
|
545
|
+
allowed: true,
|
|
546
|
+
reason: 'recovery_dispatch_allowed',
|
|
547
|
+
status: status,
|
|
548
|
+
canRunProductRepair: productDispatch && action.productRepairAllowed === true,
|
|
549
|
+
canRunExpensiveModel: expensiveDispatch && action.expensiveModelAllowed === true,
|
|
550
|
+
shouldRecordDispatch: true,
|
|
551
|
+
requiresNewEvidence: requiresNewEvidence,
|
|
552
|
+
newEvidence: newEvidence,
|
|
553
|
+
dispatchRecord: record
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
function appendResolveIOAIManagerRecoveryActionDispatch(history, record, limit) {
|
|
557
|
+
if (limit === void 0) { limit = 50; }
|
|
558
|
+
var existing = Array.isArray(history) ? history.filter(Boolean) : [];
|
|
559
|
+
if (!record) {
|
|
560
|
+
return existing.slice(-limit);
|
|
561
|
+
}
|
|
562
|
+
var deduped = existing.filter(function (entry) { return entry.dispatchId !== record.dispatchId; });
|
|
563
|
+
return __spreadArray(__spreadArray([], __read(deduped), false), [record], false).slice(-limit);
|
|
564
|
+
}
|
|
317
565
|
function listHasNewEntry(current, previous) {
|
|
318
566
|
var existing = new Set(previous.map(function (entry) { return cleanText(entry, 500); }).filter(Boolean));
|
|
319
567
|
return current.some(function (entry) {
|
|
@@ -651,8 +899,14 @@ function decideResolveIOAIManagerPolicy(input) {
|
|
|
651
899
|
plan: recoveryPlan,
|
|
652
900
|
current: current
|
|
653
901
|
});
|
|
654
|
-
|
|
902
|
+
var recoveryEvidenceProbe = buildResolveIOAIManagerRecoveryEvidenceProbe({
|
|
903
|
+
checkpoint: recoveryCheckpoint,
|
|
904
|
+
current: current
|
|
905
|
+
});
|
|
906
|
+
return __assign(__assign({}, merged), { action: action, reason: reason, recoveryPlan: recoveryPlan, recoveryCheckpoint: recoveryCheckpoint, recoveryEvidenceProbe: recoveryEvidenceProbe, recoveryAction: buildResolveIOAIManagerRecoveryActionPacket({
|
|
907
|
+
plan: recoveryPlan,
|
|
655
908
|
checkpoint: recoveryCheckpoint,
|
|
909
|
+
probe: recoveryEvidenceProbe,
|
|
656
910
|
current: current
|
|
657
911
|
}) });
|
|
658
912
|
};
|