66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
interface ContinuationAssignment {
|
|
status: string;
|
|
executionToken?: string;
|
|
}
|
|
|
|
interface ContinuationGate {
|
|
id: string;
|
|
kind: string;
|
|
status: string;
|
|
}
|
|
|
|
interface ContinuationContext {
|
|
gateId: string;
|
|
runRevision: number;
|
|
planRevision: number;
|
|
activeParentSessionId: string;
|
|
strategy?: string;
|
|
status: string;
|
|
method?: string;
|
|
outcome?: string;
|
|
}
|
|
|
|
export interface ContinuationState {
|
|
revision: number;
|
|
status: string;
|
|
planArtifact?: { revision: number };
|
|
implementationContext?: ContinuationContext;
|
|
openGate?: ContinuationGate;
|
|
assignments: ContinuationAssignment[];
|
|
}
|
|
|
|
export function isValidContextContinuation(
|
|
run: ContinuationState,
|
|
sessionId?: string,
|
|
) {
|
|
const context = run.implementationContext;
|
|
const gate = run.openGate;
|
|
if (
|
|
run.status !== "waiting" ||
|
|
!context ||
|
|
gate?.status !== "open" ||
|
|
gate.kind !== "implementation-context" ||
|
|
gate.id !== context.gateId ||
|
|
run.planArtifact?.revision !== context.planRevision ||
|
|
context.runRevision > run.revision ||
|
|
run.revision - context.runRevision > 1 ||
|
|
(sessionId && context.activeParentSessionId !== sessionId) ||
|
|
run.assignments.some(
|
|
(assignment) =>
|
|
assignment.status === "running" ||
|
|
(assignment.status === "queued" && Boolean(assignment.executionToken)),
|
|
)
|
|
) {
|
|
return false;
|
|
}
|
|
return (
|
|
(context.status === "handoff-pending" &&
|
|
context.strategy === "fresh-session" &&
|
|
context.method === "fresh-session") ||
|
|
(context.status === "normal-compact-pending" &&
|
|
context.strategy === "smart-compact" &&
|
|
context.method === "smart_compact" &&
|
|
context.outcome === "unavailable")
|
|
);
|
|
}
|