feat: route force-recall continuity via plugin adapter

This commit is contained in:
Eve
2026-04-24 17:26:50 +08:00
parent b336958fc0
commit acf83824b7
8 changed files with 486 additions and 10 deletions

View File

@@ -1,7 +1,63 @@
export function createForceRecallContinuityAdapter() {
throw new Error('Not implemented: force-recall continuity adapter contract placeholder');
import { evaluateContinuity, buildContinuityGateBlock } from '../continuity/evaluator.mjs';
function isNonEmptyString(value) {
return typeof value === 'string' && value.trim().length > 0;
}
export function runForceRecallContinuityAdapter() {
throw new Error('Not implemented: force-recall continuity adapter contract placeholder');
export function buildApprovedPlanContinuityInput(wrapperResult, autoChainPlanResult = null) {
if (!wrapperResult || wrapperResult.classification !== 'long_task') return null;
const wrapperNextAction = wrapperResult?.nextDerivedAction ?? wrapperResult?.derivedAction ?? null;
const plannerDerivedAction = autoChainPlanResult?.derivedAction && autoChainPlanResult.derivedAction !== 'none'
? {
type: autoChainPlanResult.dispatchMode ?? 'no_dispatch',
action: autoChainPlanResult.derivedAction,
}
: null;
const nextDerivedAction = wrapperNextAction ?? plannerDerivedAction;
if (nextDerivedAction == null) return null;
const replyClosureState = isNonEmptyString(wrapperResult?.replyClosureState)
? wrapperResult.replyClosureState
: (wrapperResult?.handoff?.mode === 'button_path' ? 'waiting_user' : 'completed');
const dispatchReceipt = wrapperResult?.dispatchReceipt ?? null;
const nextTaskKnown = wrapperResult?.nextTaskKnown === true
|| (plannerDerivedAction != null && isNonEmptyString(autoChainPlanResult?.derivedAction) && autoChainPlanResult.derivedAction !== 'none');
const sameApprovedPlan = wrapperResult?.sameApprovedPlan === true || plannerDerivedAction != null;
const taskBoundaryStop = wrapperResult?.taskBoundaryStop === true || replyClosureState === 'completed';
const highRiskStop = wrapperResult?.highRiskStop === true;
return {
planId: wrapperResult?.planId ?? 'hook-preflight-approved-plan',
currentTask: wrapperResult?.currentTask ?? wrapperResult?.requiredNextAction ?? 'hook-preflight-task',
taskState: wrapperResult?.taskState ?? (plannerDerivedAction ? 'complete' : null),
nextDerivedAction,
replyClosureState,
dispatchReceipt,
nextTaskKnown,
sameApprovedPlan,
taskBoundaryStop,
highRiskStop,
};
}
export function createForceRecallContinuityAdapter(config = {}) {
const legalTerminalStates = config?.legalTerminalStates;
const label = config?.adapter?.forceRecall?.injectBlockLabel ?? 'APPROVED_PLAN_CONTINUITY_GATE';
return {
evaluate({ wrapperResult, autoChainPlanResult = null }) {
const input = buildApprovedPlanContinuityInput(wrapperResult, autoChainPlanResult);
if (!input) return { input: null, result: null, block: '' };
const result = evaluateContinuity(input, { legalTerminalStates });
const block = buildContinuityGateBlock(result, { legalTerminalStates, label });
return { input, result, block };
},
};
}
export function runForceRecallContinuityAdapter({ wrapperResult, autoChainPlanResult = null, config = {} } = {}) {
return createForceRecallContinuityAdapter(config).evaluate({ wrapperResult, autoChainPlanResult });
}