| import { |
| deriveOmegaInterruptedGoalRecovery, |
| OMEGA_AUTONOMOUS_RECOVERY_MAX_FAILURE_STREAK, |
| } from "../recovery.js"; |
| import type { OmegaSelfTimeKernelState } from "../self-time-kernel.js"; |
| import { |
| deriveFocusedActiveTargets, |
| deriveShadowedGoalTasks, |
| deriveSupersededGoalTasks, |
| } from "../session-context.js"; |
|
|
| export type OmegaWakeAction = |
| | { |
| kind: "heartbeat_ok"; |
| reason: string; |
| } |
| | { |
| kind: "review_active_goal"; |
| reason: string; |
| goalTask: string; |
| } |
| | { |
| kind: "resume_interrupted_goal"; |
| reason: string; |
| goalTask: string; |
| goalTargets: string[]; |
| failureStreak: number; |
| suggestedRoute: "omega_delegate" | "sessions_spawn"; |
| errorKind?: string; |
| } |
| | { |
| kind: "abort_interrupted_goal"; |
| reason: string; |
| goalTask: string; |
| goalTargets: string[]; |
| failureStreak: number; |
| suggestedRoute: "omega_delegate" | "sessions_spawn"; |
| errorKind?: string; |
| } |
| | { |
| kind: "prune_stale_goals"; |
| reason: string; |
| goalTasks: string[]; |
| } |
| | { |
| kind: "prune_superseded_goals"; |
| reason: string; |
| goalTasks: string[]; |
| } |
| | { |
| kind: "focus_active_goal_targets"; |
| reason: string; |
| goalTask: string; |
| goalTargets: string[]; |
| } |
| | { |
| kind: "prune_shadowed_goals"; |
| reason: string; |
| goalTasks: string[]; |
| }; |
|
|
| export function decideOmegaWakeAction(params: { |
| kernel?: OmegaSelfTimeKernelState; |
| }): OmegaWakeAction { |
| const kernel = params.kernel; |
| if (!kernel) { |
| return { |
| kind: "heartbeat_ok", |
| reason: "no_kernel_state", |
| }; |
| } |
|
|
| const supersededGoalTasks = deriveSupersededGoalTasks(kernel); |
| if (supersededGoalTasks.length > 0) { |
| return { |
| kind: "prune_superseded_goals", |
| reason: "superseded_goal_gc_due", |
| goalTasks: supersededGoalTasks, |
| }; |
| } |
|
|
| const shadowedGoalTasks = deriveShadowedGoalTasks(kernel); |
| if (shadowedGoalTasks.length > 0) { |
| return { |
| kind: "prune_shadowed_goals", |
| reason: "shadowed_goal_gc_due", |
| goalTasks: shadowedGoalTasks, |
| }; |
| } |
|
|
| const focusedTargets = deriveFocusedActiveTargets(kernel); |
| if (focusedTargets.length > 0 && kernel.activeGoalId) { |
| const activeGoal = kernel.goals.find((goal) => goal.id === kernel.activeGoalId); |
| if (activeGoal) { |
| return { |
| kind: "focus_active_goal_targets", |
| reason: "verified_partial_progress_detected", |
| goalTask: activeGoal.task, |
| goalTargets: focusedTargets, |
| }; |
| } |
| } |
|
|
| const recovery = deriveOmegaInterruptedGoalRecovery({ kernel }); |
| if (recovery) { |
| if (recovery.failureStreak > OMEGA_AUTONOMOUS_RECOVERY_MAX_FAILURE_STREAK) { |
| return { |
| kind: "abort_interrupted_goal", |
| reason: "failure_streak_too_high", |
| goalTask: recovery.goalTask, |
| goalTargets: recovery.remainingTargets, |
| failureStreak: recovery.failureStreak, |
| suggestedRoute: recovery.suggestedRoute, |
| errorKind: recovery.lastErrorKind, |
| }; |
| } |
| return { |
| kind: "resume_interrupted_goal", |
| reason: recovery.reason, |
| goalTask: recovery.goalTask, |
| goalTargets: recovery.remainingTargets, |
| failureStreak: recovery.failureStreak, |
| suggestedRoute: recovery.suggestedRoute, |
| errorKind: recovery.lastErrorKind, |
| }; |
| } |
|
|
| if (kernel.tension.pendingCorrection && kernel.activeGoalId) { |
| const activeGoal = kernel.goals.find((goal) => goal.id === kernel.activeGoalId); |
| if (activeGoal) { |
| return { |
| kind: "review_active_goal", |
| reason: "verified_failure_requires_followup", |
| goalTask: activeGoal.task, |
| }; |
| } |
| } |
|
|
| const staleGoals = kernel.goals.filter((goal) => goal.status === "stale"); |
| if (staleGoals.length > 0) { |
| return { |
| kind: "prune_stale_goals", |
| reason: "stale_goal_gc_due", |
| goalTasks: staleGoals.map((goal) => goal.task), |
| }; |
| } |
|
|
| return { |
| kind: "heartbeat_ok", |
| reason: "no_verified_tension", |
| }; |
| } |
|
|