fix(dashboard): hand off cleanly from setup wizard to model onboarding
On a fresh install useAuthOnboarding's effect ran at mount before the setup wizard's 500ms auto-open timer fired. The one-shot ref locked, and the resolved fetch could either stack model onboarding on top of the wizard or never re-trigger after the wizard closed. - Gate the trigger on projectId being set so the wizard owns the bootstrap phase; the auth check only fires once a project exists. - Re-check setupWizardOpen via a ref when the auth fetch resolves to avoid stacking onboarding on top of a wizard opened mid-fetch. - Release the one-shot in that suppressed branch so the effect retries when the wizard closes. Adds two regression tests: fresh-install handoff and mid-fetch wizard suppression. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
export { COLUMNS, COLUMN_LABELS, COLUMN_DESCRIPTIONS, VALID_TRANSITIONS, DEFAULT_SETTINGS, DEFAULT_GLOBAL_SETTINGS, DEFAULT_PROJECT_SETTINGS, GLOBAL_SETTINGS_KEYS, PROJECT_SETTINGS_KEYS, isGlobalSettingsKey, isProjectSettingsKey, THINKING_LEVELS, THEME_MODES, COLOR_THEMES, WORKFLOW_STEP_TEMPLATES, AGENT_PERMISSIONS, agentToConfigSnapshot, diffConfigSnapshots, isEphemeralAgent, hasAgentIdentity, CheckoutConflictError, EXECUTION_MODES, DEFAULT_EXECUTION_MODE, TASK_PRIORITIES, DEFAULT_TASK_PRIORITY, validateMessageMetadata } from "./types.js";
|
||||
export type { Column, IssueInfo, IssueState, TaskSourceIssue, PrInfo, PrStatus, Task, TaskTokenUsage, TaskAttachment, TaskComment, TaskCommentInput, TaskDocument, TaskDocumentRevision, TaskDocumentCreateInput, TaskDocumentWithTask, TaskCreateInput, TaskDetail, InboxTask, TodoList, TodoItem, TodoListCreateInput, TodoListUpdateInput, TodoItemCreateInput, TodoItemUpdateInput, TodoListWithItems, AgentLogEntry, AgentLogType, AgentRole, BoardConfig, MergeDetails, MergeResult, Settings, GlobalSettings, ProjectSettings, SettingsScope, DaemonTokenSettings, TaskStep, StepStatus, TaskLogEntry, RunMutationContext, ActivityLogEntry, ActivityEventType, ThinkingLevel, ThemeMode, ColorTheme, ExecutionMode, TaskPriority, UnavailableNodePolicy, PlanningQuestion, PlanningSummary, PlanningResponse, PlanningQuestionType, ArchivedTaskEntry, BatchStatusRequest, BatchStatusResponse, BatchStatusEntry, BatchStatusResult, ModelPreset, WorkflowStep, WorkflowStepMode, WorkflowStepPhase, WorkflowStepInput, WorkflowStepResult, WorkflowStepTemplate, Agent, OrgTreeNode, AgentState, AgentDetail, AgentCreateInput, AgentUpdateInput, AgentApiKey, AgentApiKeyCreateResult, AgentCapability, AgentPromptTemplate, AgentPromptsConfig, AgentPermission, TaskAssignSource, AgentAccessState, AgentHeartbeatConfig, AgentBudgetConfig, AgentBudgetStatus, InstructionsBundleConfig, MessageResponseMode, AgentHeartbeatEvent, AgentHeartbeatRun, BlockedStateSnapshot, HeartbeatInvocationSource, AgentTaskSession, AgentRating, AgentRatingSummary, AgentRatingInput, AgentConfigSnapshot, RevisionFieldDiff, AgentConfigRevision, AgentStats, ReflectionTrigger, ReflectionMetrics, AgentReflection, AgentPerformanceSummary, NtfyNotificationEvent, NotificationEvent, NotificationPayload, NotificationProviderConfig, SteeringComment, ParticipantType, MessageType, Message, MessageCreateInput, MessageFilter, MessageMetadata, MessageReplyReference, Mailbox, CheckoutLease, RunAuditDomain, RunAuditEvent, RunAuditEventInput, RunAuditEventFilter } from "./types.js";
|
||||
export type { MergeStrategy, MergeConflictStrategy, Column, IssueInfo, IssueState, TaskSourceIssue, PrInfo, PrStatus, Task, TaskTokenUsage, TaskAttachment, TaskComment, TaskCommentInput, TaskDocument, TaskDocumentRevision, TaskDocumentCreateInput, TaskDocumentWithTask, TaskCreateInput, TaskDetail, InboxTask, TodoList, TodoItem, TodoListCreateInput, TodoListUpdateInput, TodoItemCreateInput, TodoItemUpdateInput, TodoListWithItems, AgentLogEntry, AgentLogType, AgentRole, BoardConfig, MergeDetails, MergeResult, Settings, GlobalSettings, ProjectSettings, SettingsScope, DaemonTokenSettings, TaskStep, StepStatus, TaskLogEntry, RunMutationContext, ActivityLogEntry, ActivityEventType, ThinkingLevel, ThemeMode, ColorTheme, ExecutionMode, TaskPriority, UnavailableNodePolicy, PlanningQuestion, PlanningSummary, PlanningResponse, PlanningQuestionType, ArchivedTaskEntry, BatchStatusRequest, BatchStatusResponse, BatchStatusEntry, BatchStatusResult, ModelPreset, WorkflowStep, WorkflowStepMode, WorkflowStepPhase, WorkflowStepInput, WorkflowStepResult, WorkflowStepTemplate, Agent, OrgTreeNode, AgentState, AgentDetail, AgentCreateInput, AgentUpdateInput, AgentApiKey, AgentApiKeyCreateResult, AgentCapability, AgentPromptTemplate, AgentPromptsConfig, AgentPermission, TaskAssignSource, AgentAccessState, AgentHeartbeatConfig, AgentBudgetConfig, AgentBudgetStatus, InstructionsBundleConfig, MessageResponseMode, AgentHeartbeatEvent, AgentHeartbeatRun, BlockedStateSnapshot, HeartbeatInvocationSource, AgentTaskSession, AgentRating, AgentRatingSummary, AgentRatingInput, AgentConfigSnapshot, RevisionFieldDiff, AgentConfigRevision, AgentStats, ReflectionTrigger, ReflectionMetrics, AgentReflection, AgentPerformanceSummary, NtfyNotificationEvent, NotificationEvent, NotificationPayload, NotificationProviderConfig, SteeringComment, ParticipantType, MessageType, Message, MessageCreateInput, MessageFilter, MessageMetadata, MessageReplyReference, Mailbox, CheckoutLease, RunAuditDomain, RunAuditEvent, RunAuditEventInput, RunAuditEventFilter } from "./types.js";
|
||||
export { AGENT_VALID_TRANSITIONS } from "./types.js";
|
||||
export {
|
||||
BUILTIN_AGENT_PROMPTS,
|
||||
|
||||
@@ -114,6 +114,8 @@ export const DEFAULT_PROJECT_SETTINGS = {
|
||||
smartConflictResolution: true,
|
||||
worktreeRebaseBeforeMerge: true,
|
||||
worktreeRebaseRemote: "",
|
||||
worktreeRebaseLocalBase: true,
|
||||
mergeConflictStrategy: "smart",
|
||||
workflowStepTimeoutMs: 360_000,
|
||||
strictScopeEnforcement: false,
|
||||
buildRetryCount: 0,
|
||||
|
||||
@@ -92,6 +92,16 @@ export type ColorTheme = (typeof COLOR_THEMES)[number];
|
||||
|
||||
export type PrStatus = "open" | "closed" | "merged";
|
||||
export type MergeStrategy = "direct" | "pull-request";
|
||||
/** How merge conflicts are resolved when the AI agent can't (or shouldn't) decide.
|
||||
* - "smart" (default): try AI, then auto-resolve lock/generated/trivial files,
|
||||
* then fall back to `-X theirs` (task branch wins). Backwards-compatible.
|
||||
* - "ai-only": run AI on every attempt; never silently prefer one side.
|
||||
* - "prefer-main": after AI/auto-resolve, fall back to `-X ours` so main's
|
||||
* state wins. Best when concurrent tasks frequently regress just-merged
|
||||
* sibling work.
|
||||
* - "abort": run AI once; if conflict remains, fail the merge so a human
|
||||
* can resolve it. */
|
||||
export type MergeConflictStrategy = "smart" | "ai-only" | "prefer-main" | "abort";
|
||||
/** Policy for handling task execution when the selected node is unavailable/unhealthy. */
|
||||
export type UnavailableNodePolicy = "block" | "fallback-local";
|
||||
|
||||
@@ -685,8 +695,8 @@ export interface MergeDetails {
|
||||
mergedAt?: string;
|
||||
mergeConfirmed?: boolean;
|
||||
prNumber?: number;
|
||||
resolutionStrategy?: "ai" | "auto-resolve" | "theirs";
|
||||
resolutionMethod?: "ai" | "auto" | "mixed" | "theirs";
|
||||
resolutionStrategy?: "ai" | "auto-resolve" | "theirs" | "ours" | "abort";
|
||||
resolutionMethod?: "ai" | "auto" | "mixed" | "theirs" | "ours" | "abort";
|
||||
attemptsMade?: 1 | 2 | 3;
|
||||
autoResolvedCount?: number;
|
||||
}
|
||||
@@ -1500,6 +1510,17 @@ export interface ProjectSettings {
|
||||
* (typically `origin`). Exposed as a dropdown in the dashboard's
|
||||
* Worktrees settings. */
|
||||
worktreeRebaseRemote?: string;
|
||||
/** When true, the worktree is also rebased onto the local default-branch
|
||||
* HEAD (in addition to the remote rebase). Catches sibling tasks that
|
||||
* merged into local main *after* this task's worktree was created but
|
||||
* *before* its merge — including merges that haven't been pushed yet.
|
||||
* Without this, concurrent task branches based on stale main can silently
|
||||
* re-introduce code that an earlier sibling task already deleted.
|
||||
* Default: true. */
|
||||
worktreeRebaseLocalBase?: boolean;
|
||||
/** Strategy used when a merge conflict can't be resolved by AI. See
|
||||
* {@link MergeConflictStrategy}. Default: "smart". */
|
||||
mergeConflictStrategy?: MergeConflictStrategy;
|
||||
/** Wall-clock timeout (ms) for a single pre-merge workflow step's AI call.
|
||||
* When a step exceeds this, the session is aborted and the executor is
|
||||
* given one shot to retry with the configured fallback model before the
|
||||
|
||||
Reference in New Issue
Block a user