diff options
| author | Filip <[email protected]> | 2025-09-24 18:05:15 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-24 11:05:15 -0500 |
| commit | d3b6545e7c6069c9db031634b7890e6b8eb4de2a (patch) | |
| tree | 5457b28378cf453e2c138337fc1abee3b3423ed2 /packages/app/src/context/local.tsx | |
| parent | 3f911b22b011af74426699dac079b33badf862b1 (diff) | |
| download | opencode-d3b6545e7c6069c9db031634b7890e6b8eb4de2a.tar.gz opencode-d3b6545e7c6069c9db031634b7890e6b8eb4de2a.zip | |
feat(app): added command palette (#2630)
Co-authored-by: Adam <[email protected]>
Diffstat (limited to 'packages/app/src/context/local.tsx')
| -rw-r--r-- | packages/app/src/context/local.tsx | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index 825023616..c52fe0db4 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -1,7 +1,7 @@ import { createStore, produce, reconcile } from "solid-js/store" import { batch, createContext, createEffect, createMemo, useContext, type ParentProps } from "solid-js" import { uniqueBy } from "remeda" -import type { FileContent, FileNode } from "@opencode-ai/sdk" +import type { FileContent, FileNode, Model, Provider } from "@opencode-ai/sdk" import { useSDK, useEvent, useSync } from "@/context" export type LocalFile = FileNode & @@ -19,12 +19,17 @@ export type LocalFile = FileNode & export type TextSelection = LocalFile["selection"] export type View = LocalFile["view"] +export type LocalModel = Omit<Model, "provider"> & { + provider: Provider +} +export type ModelKey = { providerID: string; modelID: string } + function init() { const sdk = useSDK() const sync = useSync() - const list = createMemo(() => sync.data.agent.filter((x) => x.mode !== "subagent")) const agent = (() => { + const list = createMemo(() => sync.data.agent.filter((x) => x.mode !== "subagent")) const [store, setStore] = createStore<{ current: string }>({ @@ -54,18 +59,14 @@ function init() { })() const model = (() => { + const list = createMemo(() => + sync.data.provider.flatMap((p) => Object.values(p.models).map((m) => ({ ...m, provider: p }) as LocalModel)), + ) + const find = (key: ModelKey) => list().find((m) => m.id === key?.modelID && m.provider.id === key.providerID) + const [store, setStore] = createStore<{ - model: Record< - string, - { - providerID: string - modelID: string - } - > - recent: { - providerID: string - modelID: string - }[] + model: Record<string, ModelKey> + recent: ModelKey[] }>({ model: {}, recent: [], @@ -81,37 +82,21 @@ function init() { if (store.recent.length) return store.recent[0] const provider = sync.data.provider[0] const model = Object.values(provider.models)[0] - return { - providerID: provider.id, - modelID: model.id, - } + return { modelID: model.id, providerID: provider.id } }) const current = createMemo(() => { const a = agent.current() - return store.model[agent.current().name] ?? (a.model ? a.model : fallback()) + return find(store.model[agent.current().name]) ?? find(a.model ?? fallback()) }) - const list = createMemo(() => - sync.data.provider.flatMap((x) => Object.values(x.models).map((m) => ({ providerID: x.id, modelID: m.id }))), - ) + const recent = createMemo(() => store.recent.map(find).filter(Boolean)) return { list, current, - recent() { - return store.recent - }, - parsed: createMemo(() => { - const value = current() - const provider = sync.data.provider.find((x) => x.id === value.providerID)! - const model = provider.models[value.modelID] - return { - provider: provider.name ?? value.providerID, - model: model.name ?? value.modelID, - } - }), - set(model: { providerID: string; modelID: string } | undefined, options?: { recent?: boolean }) { + recent, + set(model: ModelKey | undefined, options?: { recent?: boolean }) { batch(() => { setStore("model", agent.current().name, model ?? fallback()) if (options?.recent && model) { @@ -234,6 +219,7 @@ function init() { break case "file.watcher.updated": load(event.properties.file) + sync.load.changes() break } }) |
