blob: 85b0d10355537067afb7fc7b8f3f66505ae8e7af [file]
import { GOAL_CONDITION_TEXT_LIMIT, GOAL_REASON_TEXT_LIMIT, type GoalState } from '@maka/runtime';
import { decodeGoalProjection, type GoalProjection } from '../protocol/index.js';
export function projectGoalState(goal: GoalState): GoalProjection {
return decodeGoalProjection({
goalId: goal.id,
revision: goal.revision,
sessionId: goal.sessionId,
condition: goal.condition,
status: goal.status,
setAt: goal.setAt,
iterations: goal.iterations,
maxIterations: goal.maxIterations,
consecutiveNoProgress: goal.consecutiveNoProgress,
blockCap: goal.blockCap,
tokenBudget: goal.tokenBudget ?? null,
tokensSpent: Math.max(0, goal.tokensNow - goal.tokensAtStart),
lastReason: goal.lastReason ?? null,
achievedAt: goal.achievedAt ?? null,
pausedAt: goal.pausedAt ?? null,
});
}
/** Reserves Session snapshot capacity for a Goal before one is created. */
export function worstCaseGoalProjection(sessionId: string): GoalProjection {
return {
goalId: 'g'.repeat(128),
revision: Number.MAX_SAFE_INTEGER,
sessionId,
condition: '界'.repeat(GOAL_CONDITION_TEXT_LIMIT.codeUnits),
status: 'paused',
setAt: Number.MAX_SAFE_INTEGER,
iterations: Number.MAX_SAFE_INTEGER,
maxIterations: Number.MAX_SAFE_INTEGER,
consecutiveNoProgress: Number.MAX_SAFE_INTEGER,
blockCap: Number.MAX_SAFE_INTEGER,
tokenBudget: Number.MAX_SAFE_INTEGER,
tokensSpent: Number.MAX_SAFE_INTEGER,
lastReason: '界'.repeat(GOAL_REASON_TEXT_LIMIT.codeUnits),
achievedAt: Number.MAX_SAFE_INTEGER,
pausedAt: Number.MAX_SAFE_INTEGER,
};
}