summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authorFilip <[email protected]>2025-09-24 18:05:15 +0200
committerGitHub <[email protected]>2025-09-24 11:05:15 -0500
commitd3b6545e7c6069c9db031634b7890e6b8eb4de2a (patch)
tree5457b28378cf453e2c138337fc1abee3b3423ed2 /packages/app/src/context
parent3f911b22b011af74426699dac079b33badf862b1 (diff)
downloadopencode-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.tsx54
-rw-r--r--packages/app/src/context/sync.tsx31
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,
}
}