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 /packages/app/src/context | |
| parent | 2d8d4e5dee12b5d68bb479adf71d3ff548b8c152 (diff) | |
| download | opencode-8d2feed30ebdec92ee859eee9c2adff201b10167.tar.gz opencode-8d2feed30ebdec92ee859eee9c2adff201b10167.zip | |
fix(desktop): more defensive agent access
Diffstat (limited to 'packages/app/src/context')
| -rw-r--r-- | packages/app/src/context/local.tsx | 40 |
1 files changed, 30 insertions, 10 deletions
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) |
