FN-7902: persist thinkingLevel across mission/planning interview sessions

Threads an optional per-session reasoning-effort (thinkingLevel) through mission planning and planning-mode agent sessions so the selected level survives draft reopen, session start, and agent rebuild.

- Add ThinkingLevel to DraftInputPayload/session state in planning.ts; persist and restore it in inputPayload alongside model overrides, threading it into createDraftSession, startExistingSession, createSessionWithAgent, initializeAgent, createPlanningAgent, and ensureSessionAgent as defaultThinkingLevel.
- Preserve thinkingLevel across draft syncs in ai-session-store.ts's updateDraft so it isn't erased when the model pair is unchanged.
- Extend mission-interview.ts session state/persistence and createMissionInterviewAgent/createMissionInterviewSession to accept and persist a validated thinkingLevel, defaulting the agent's reasoning effort from it.
- Validate thinkingLevel against THINKING_LEVELS in mission-routes.ts's POST /api/missions/interview/start and thread it through to the interview session.
- Update PlanningModeModal.tsx and MissionInterviewModal.tsx to surface and submit the selected thinking level; update legacy.ts API client to pass it through.
- Extend register-planning-subtask-routes.ts to accept/validate/forward thinkingLevel for subtask planning routes.
- Add regression coverage in mission-interview.test.ts, routes-planning.test.ts, and session-persistence-roundtrip.test.ts.
- Add changeset for @runfusion/fusion (minor): persisted thinking-level controls for Mission Interview and Planning mode.

Files changed:
 .changeset/quiet-dragons-think.md                  |   7 ++
 packages/dashboard/app/api/legacy.ts               |  14 ++-
 .../app/components/MissionInterviewModal.tsx       |  21 +++-
 .../dashboard/app/components/PlanningModeModal.tsx |  34 ++++--
 .../src/__tests__/mission-interview.test.ts        |  34 ++++++
 .../src/__tests__/routes-planning.test.ts          |  17 ++-
 .../session-persistence-roundtrip.test.ts          |  16 +++
 packages/dashboard/src/ai-session-store.ts         |  13 +-
 packages/dashboard/src/mission-interview.ts        |  30 ++++-
 packages/dashboard/src/mission-routes.ts           |  14 ++-
 packages/dashboard/src/planning.ts                 |  70 ++++++++---
 packages/dashboard/src/routes.ts                   |  11 +-
 .../src/routes/register-planning-subtask-routes.ts | 135 +++++++++++++++------
 13 files changed, 330 insertions(+), 86 deletions(-)

Fusion-Task-Id: FN-7902

Fusion-Task-Lineage: 751fb238-fd67-4870-975d-3b10dadde1a0

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-07-12 20:05:08 -07:00
parent 23cb061af2
commit c110b72df1
13 changed files with 330 additions and 86 deletions

View File

@@ -3950,6 +3950,7 @@ export interface AgentOnboardingSummary {
}
export type OnboardingMode = "create" | "edit";
export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
export interface ExistingAgentOnboardingConfig {
name?: string;
@@ -3961,7 +3962,7 @@ export interface ExistingAgentOnboardingConfig {
reportsTo?: string;
skills?: string[];
model?: string;
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
thinkingLevel?: ThinkingLevel;
maxTurns?: number;
runtimeHint?: string;
heartbeatIntervalMs?: number;
@@ -3996,7 +3997,7 @@ export function startPlanning(
export function createPlanningDraft(
initialPlan: string,
projectId?: string,
modelOverride?: { planningModelProvider?: string; planningModelId?: string },
modelOverride?: { planningModelProvider?: string; planningModelId?: string; thinkingLevel?: ThinkingLevel },
): Promise<{ sessionId: string; title: string }> {
return api<{ sessionId: string; title: string }>(withProjectId("/planning/create-draft", projectId), {
method: "POST",
@@ -4004,6 +4005,7 @@ export function createPlanningDraft(
initialPlan,
planningModelProvider: modelOverride?.planningModelProvider,
planningModelId: modelOverride?.planningModelId,
thinkingLevel: modelOverride?.thinkingLevel,
}),
});
}
@@ -4012,7 +4014,7 @@ export function createPlanningDraft(
export function startPlanningStreaming(
initialPlan: string,
projectId?: string,
modelOverride?: { planningModelProvider?: string; planningModelId?: string },
modelOverride?: { planningModelProvider?: string; planningModelId?: string; thinkingLevel?: ThinkingLevel },
planningOptions?: { planningDepth?: "small" | "medium" | "large"; customQuestionCount?: number },
existingSessionId?: string,
): Promise<{ sessionId: string }> {
@@ -4022,6 +4024,7 @@ export function startPlanningStreaming(
initialPlan,
planningModelProvider: modelOverride?.planningModelProvider,
planningModelId: modelOverride?.planningModelId,
thinkingLevel: modelOverride?.thinkingLevel,
planningDepth: planningOptions?.planningDepth,
customQuestionCount: planningOptions?.customQuestionCount,
...(existingSessionId ? { existingSessionId } : {}),
@@ -8728,7 +8731,7 @@ export type MissionInterviewResponse =
export function startMissionInterview(
missionTitle: string,
projectId?: string,
modelOverride?: { modelProvider?: string; modelId?: string },
modelOverride?: { modelProvider?: string; modelId?: string; thinkingLevel?: ThinkingLevel },
): Promise<{ sessionId: string }> {
return api<{ sessionId: string }>(withProjectId("/missions/interview/start", projectId), {
method: "POST",
@@ -8736,6 +8739,7 @@ export function startMissionInterview(
missionTitle,
modelProvider: modelOverride?.modelProvider,
modelId: modelOverride?.modelId,
thinkingLevel: modelOverride?.thinkingLevel,
}),
});
}
@@ -9538,7 +9542,7 @@ export function pingSession(sessionId: string, projectId?: string): Promise<{ ok
export function updatePlanningSessionDraft(
sessionId: string,
draft: { initialPlan: string; modelProvider?: string; modelId?: string },
draft: { initialPlan: string; modelProvider?: string; modelId?: string; thinkingLevel?: ThinkingLevel },
projectId?: string,
): Promise<{ ok: boolean }> {
return api<{ ok: boolean }>(withProjectId(`/ai-sessions/${encodeURIComponent(sessionId)}/draft`, projectId), {