diff options
| author | Adam <[email protected]> | 2025-12-30 11:03:34 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-30 11:03:34 -0600 |
| commit | 8d2feed30ebdec92ee859eee9c2adff201b10167 (patch) | |
| tree | 5eaece0392d90a5b266653873e6bf43a2cd4f838 | |
| parent | 2d8d4e5dee12b5d68bb479adf71d3ff548b8c152 (diff) | |
| download | opencode-8d2feed30ebdec92ee859eee9c2adff201b10167.tar.gz opencode-8d2feed30ebdec92ee859eee9c2adff201b10167.zip | |
fix(desktop): more defensive agent access
| -rw-r--r-- | packages/app/src/components/prompt-input.tsx | 14 | ||||
| -rw-r--r-- | packages/app/src/context/local.tsx | 40 |
2 files changed, 40 insertions, 14 deletions
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 5f0b4bdc5..df8a2f3b2 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1115,11 +1115,17 @@ export const PromptInput: Component<PromptInputProps> = (props) => { setStore("imageAttachments", []) setStore("mode", "normal") + const currentModel = local.model.current() + const currentAgent = local.agent.current() + if (!currentModel || !currentAgent) { + console.warn("No agent or model available for prompt submission") + return + } const model = { - modelID: local.model.current()!.id, - providerID: local.model.current()!.provider.id, + modelID: currentModel.id, + providerID: currentModel.provider.id, } - const agent = local.agent.current()!.name + const agent = currentAgent.name if (isShellMode) { sdk.client.session @@ -1360,7 +1366,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => { > <Select options={local.agent.list().map((agent) => agent.name)} - current={local.agent.current().name} + current={local.agent.current()?.name ?? ""} onSelect={local.agent.set} class="capitalize" variant="ghost" diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index 49217b82b..23d706bb0 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -65,23 +65,40 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const agent = (() => { const list = createMemo(() => sync.data.agent.filter((x) => x.mode !== "subagent" && !x.hidden)) const [store, setStore] = createStore<{ - current: string + current?: string }>({ - current: list()[0].name, + current: list()[0]?.name, }) return { list, current() { - return list().find((x) => x.name === store.current)! + const available = list() + if (available.length === 0) return undefined + return available.find((x) => x.name === store.current) ?? available[0] }, set(name: string | undefined) { - setStore("current", name ?? list()[0].name) + const available = list() + if (available.length === 0) { + setStore("current", undefined) + return + } + if (name && available.some((x) => x.name === name)) { + setStore("current", name) + return + } + setStore("current", available[0].name) }, move(direction: 1 | -1) { - let next = list().findIndex((x) => x.name === store.current) + direction - if (next < 0) next = list().length - 1 - if (next >= list().length) next = 0 - const value = list()[next] + const available = list() + if (available.length === 0) { + setStore("current", undefined) + return + } + let next = available.findIndex((x) => x.name === store.current) + direction + if (next < 0) next = available.length - 1 + if (next >= available.length) next = 0 + const value = available[next] + if (!value) return setStore("current", value.name) if (value.model) model.set({ @@ -182,11 +199,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const current = createMemo(() => { const a = agent.current() + if (!a) return undefined const key = getFirstValidModel( () => ephemeral.model[a.name], () => a.model, fallbackModel, - )! + ) + if (!key) return undefined return find(key) }) @@ -232,7 +251,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ cycle, set(model: ModelKey | undefined, options?: { recent?: boolean }) { batch(() => { - setEphemeral("model", agent.current().name, model ?? fallbackModel()) + const currentAgent = agent.current() + if (currentAgent) setEphemeral("model", currentAgent.name, model ?? fallbackModel()) if (model) updateVisibility(model, "show") if (options?.recent && model) { const uniq = uniqueBy([model, ...store.recent], (x) => x.providerID + x.modelID) |
