fix: sync draft chat config to draft target directory (#777)
When opening a new conversation draft for a different workspace, OpenChamber kept using the config snapshot from the previously active directory. The draft agent picker showed wrong agents and the first send inherited a stale agent selection. Use useConfigStore.activateDirectory() whenever the draft target is established or changed: - openNewSessionDraft: activate config on draft open - overrideNewSessionDraftTarget: activate config on external override - setNewSessionDraftTarget: activate config on user target change - sendMessage (draft path): await activation before reading agent/model Removes the inline agent resolution block in openNewSessionDraft that duplicated logic already handled by activateDirectory. Co-authored-by: hkay-dev <14947763+hkay-dev@users.noreply.github.com> Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
committed by
GitHub
co-authored by
hkay-dev
Bohdan Triapitsyn
parent
b59040ff18
commit
0e70422835
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { create } from "zustand"
|
import { create } from "zustand"
|
||||||
import type { Session, Part, Message, TextPart, Agent } from "@opencode-ai/sdk/v2/client"
|
import type { Session, Part, Message, TextPart } from "@opencode-ai/sdk/v2/client"
|
||||||
import type { AttachedFile, SessionContextUsage } from "@/stores/types/sessionTypes"
|
import type { AttachedFile, SessionContextUsage } from "@/stores/types/sessionTypes"
|
||||||
import type { WorktreeMetadata } from "@/types/worktree"
|
import type { WorktreeMetadata } from "@/types/worktree"
|
||||||
import { opencodeClient } from "@/lib/opencode/client"
|
import { opencodeClient } from "@/lib/opencode/client"
|
||||||
@@ -350,6 +350,10 @@ const resolveSessionDirectory = (
|
|||||||
return resolveDirectoryKey(target)
|
return resolveDirectoryKey(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const activateConfigForDirectory = async (directory: string | null | undefined): Promise<void> => {
|
||||||
|
await useConfigStore.getState().activateDirectory(normalizePath(directory))
|
||||||
|
}
|
||||||
|
|
||||||
const DEFAULT_DRAFT: NewSessionDraftState = {
|
const DEFAULT_DRAFT: NewSessionDraftState = {
|
||||||
open: false,
|
open: false,
|
||||||
directoryOverride: null,
|
directoryOverride: null,
|
||||||
@@ -494,19 +498,7 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
useInputStore.getState().setPendingInputText(options.initialPrompt)
|
useInputStore.getState().setPendingInputText(options.initialPrompt)
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
void activateConfigForDirectory(directory)
|
||||||
const configState = useConfigStore.getState()
|
|
||||||
const visibleAgents = configState.getVisibleAgents()
|
|
||||||
let agentName: string | undefined
|
|
||||||
if (configState.settingsDefaultAgent) {
|
|
||||||
const settingsAgent = visibleAgents.find((a: Agent) => a.name === configState.settingsDefaultAgent)
|
|
||||||
if (settingsAgent) agentName = settingsAgent.name
|
|
||||||
}
|
|
||||||
if (!agentName) {
|
|
||||||
agentName = visibleAgents.find((a: Agent) => a.name === "build")?.name || visibleAgents[0]?.name
|
|
||||||
}
|
|
||||||
if (agentName) configState.setAgent(agentName)
|
|
||||||
} catch { /* ignored */ }
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -530,14 +522,20 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
setNewSessionDraftTarget: (target) =>
|
setNewSessionDraftTarget: (target) => {
|
||||||
set((s) => ({
|
let nextDirectory: string | null = null
|
||||||
newSessionDraft: {
|
set((s) => {
|
||||||
...s.newSessionDraft,
|
nextDirectory = normalizePath(target.directoryOverride ?? s.newSessionDraft.directoryOverride)
|
||||||
selectedProjectId: target.projectId ?? target.selectedProjectId ?? s.newSessionDraft.selectedProjectId,
|
return {
|
||||||
directoryOverride: target.directoryOverride ?? s.newSessionDraft.directoryOverride,
|
newSessionDraft: {
|
||||||
},
|
...s.newSessionDraft,
|
||||||
})),
|
selectedProjectId: target.projectId ?? target.selectedProjectId ?? s.newSessionDraft.selectedProjectId,
|
||||||
|
directoryOverride: target.directoryOverride ?? s.newSessionDraft.directoryOverride,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
void activateConfigForDirectory(nextDirectory)
|
||||||
|
},
|
||||||
|
|
||||||
setDraftPreserveDirectoryOverride: (value) =>
|
setDraftPreserveDirectoryOverride: (value) =>
|
||||||
set((s) => {
|
set((s) => {
|
||||||
@@ -629,10 +627,17 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
return { worktreeMetadata: map }
|
return { worktreeMetadata: map }
|
||||||
}),
|
}),
|
||||||
|
|
||||||
overrideNewSessionDraftTarget: (options) =>
|
overrideNewSessionDraftTarget: (options) => {
|
||||||
set((s) => ({
|
let nextDirectory: string | null = null
|
||||||
newSessionDraft: { ...s.newSessionDraft, ...options },
|
set((s) => {
|
||||||
})),
|
const nextDraft = { ...s.newSessionDraft, ...options }
|
||||||
|
nextDirectory = normalizePath(
|
||||||
|
typeof nextDraft.directoryOverride === "string" ? nextDraft.directoryOverride : null,
|
||||||
|
)
|
||||||
|
return { newSessionDraft: nextDraft }
|
||||||
|
})
|
||||||
|
void activateConfigForDirectory(nextDirectory)
|
||||||
|
},
|
||||||
|
|
||||||
resolvePendingDraftWorktreeTarget: (requestId, directory, options) =>
|
resolvePendingDraftWorktreeTarget: (requestId, directory, options) =>
|
||||||
set((s) => {
|
set((s) => {
|
||||||
@@ -699,6 +704,9 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
directory: normalizePath(draftDirectoryOverride ?? created.directory ?? null),
|
directory: normalizePath(draftDirectoryOverride ?? created.directory ?? null),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const draftSyntheticParts = draft.syntheticParts
|
||||||
|
await activateConfigForDirectory(draftDirectoryOverride ?? created.directory ?? null)
|
||||||
|
|
||||||
const configState = useConfigStore.getState()
|
const configState = useConfigStore.getState()
|
||||||
const draftAgentName = configState.currentAgentName
|
const draftAgentName = configState.currentAgentName
|
||||||
const effectiveDraftAgent = trimmedAgent ?? draftAgentName
|
const effectiveDraftAgent = trimmedAgent ?? draftAgentName
|
||||||
@@ -717,7 +725,6 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
|
|
||||||
get().initializeNewOpenChamberSession(created.id, configState.agents ?? [])
|
get().initializeNewOpenChamberSession(created.id, configState.agents ?? [])
|
||||||
|
|
||||||
const draftSyntheticParts = draft.syntheticParts
|
|
||||||
const createdDirectory = normalizePath(draftDirectoryOverride ?? created.directory ?? null)
|
const createdDirectory = normalizePath(draftDirectoryOverride ?? created.directory ?? null)
|
||||||
|
|
||||||
get().closeNewSessionDraft()
|
get().closeNewSessionDraft()
|
||||||
|
|||||||
Reference in New Issue
Block a user