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:
@@ -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), {
|
||||
|
||||
Reference in New Issue
Block a user