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 | |
| 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')
| -rw-r--r-- | packages/app/src/context/local.tsx | 54 | ||||
| -rw-r--r-- | packages/app/src/context/sync.tsx | 31 |
2 files changed, 38 insertions, 47 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 } }) diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 907071d75..a03b8b58a 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -94,20 +94,24 @@ function init() { }) const sdk = useSDK() - Promise.all([ - sdk.config.providers().then((x) => setStore("provider", x.data!.providers)), - sdk.path.get().then((x) => setStore("path", x.data!)), - sdk.app.agents().then((x) => setStore("agent", x.data ?? [])), - sdk.session.list().then((x) => - setStore( - "session", - (x.data ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)), + + const load = { + provider: () => sdk.config.providers().then((x) => setStore("provider", x.data!.providers)), + path: () => sdk.path.get().then((x) => setStore("path", x.data!)), + agent: () => sdk.app.agents().then((x) => setStore("agent", x.data ?? [])), + session: () => + sdk.session.list().then((x) => + setStore( + "session", + (x.data ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)), + ), ), - ), - sdk.config.get().then((x) => setStore("config", x.data!)), - sdk.file.status().then((x) => setStore("changes", x.data!)), - sdk.file.list({ query: { path: "/" } }).then((x) => setStore("node", x.data!)), - ]).then(() => setStore("ready", true)) + config: () => sdk.config.get().then((x) => setStore("config", x.data!)), + changes: () => sdk.file.status().then((x) => setStore("changes", x.data!)), + node: () => sdk.file.list({ query: { path: "/" } }).then((x) => setStore("node", x.data!)), + } + + Promise.all(Object.values(load).map((p) => p())).then(() => setStore("ready", true)) return { data: store, @@ -138,6 +142,7 @@ function init() { ) }, }, + load, } } |
