summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-30 11:03:34 -0600
committerAdam <[email protected]>2025-12-30 11:03:34 -0600
commit8d2feed30ebdec92ee859eee9c2adff201b10167 (patch)
tree5eaece0392d90a5b266653873e6bf43a2cd4f838
parent2d8d4e5dee12b5d68bb479adf71d3ff548b8c152 (diff)
downloadopencode-8d2feed30ebdec92ee859eee9c2adff201b10167.tar.gz
opencode-8d2feed30ebdec92ee859eee9c2adff201b10167.zip
fix(desktop): more defensive agent access
-rw-r--r--packages/app/src/components/prompt-input.tsx14
-rw-r--r--packages/app/src/context/local.tsx40
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)