summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-06 08:18:17 -0600
committerAdam <[email protected]>2026-01-06 08:19:17 -0600
commitb88bcd49fdea0955f2efc8f09a3614c188d22107 (patch)
tree8ab04d7a9d2b892cd884eab5ab3bb5da9187191a /packages/app/src/context
parent3f463bc9168abd907be9ae582e161ff89c3a27c9 (diff)
downloadopencode-b88bcd49fdea0955f2efc8f09a3614c188d22107.tar.gz
opencode-b88bcd49fdea0955f2efc8f09a3614c188d22107.zip
fix(app): code splitting for web load perf gains
Diffstat (limited to 'packages/app/src/context')
-rw-r--r--packages/app/src/context/command.tsx13
-rw-r--r--packages/app/src/context/server.tsx62
2 files changed, 54 insertions, 21 deletions
diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx
index efd83bec8..7f88b74c8 100644
--- a/packages/app/src/context/command.tsx
+++ b/packages/app/src/context/command.tsx
@@ -177,8 +177,19 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex
const dialog = useDialog()
const options = createMemo(() => {
- const all = registrations().flatMap((x) => x())
+ const seen = new Set<string>()
+ const all: CommandOption[] = []
+
+ for (const reg of registrations()) {
+ for (const opt of reg()) {
+ if (seen.has(opt.id)) continue
+ seen.add(opt.id)
+ all.push(opt)
+ }
+ }
+
const suggested = all.filter((x) => x.suggested && !x.disabled)
+
return [
...suggested.map((x) => ({
...x,
diff --git a/packages/app/src/context/server.tsx b/packages/app/src/context/server.tsx
index beb00be87..48e7e99cc 100644
--- a/packages/app/src/context/server.tsx
+++ b/packages/app/src/context/server.tsx
@@ -1,6 +1,6 @@
import { createOpencodeClient } from "@opencode-ai/sdk/v2/client"
import { createSimpleContext } from "@opencode-ai/ui/context"
-import { batch, createEffect, createMemo, createResource, createSignal, onCleanup } from "solid-js"
+import { batch, createEffect, createMemo, createSignal, onCleanup } from "solid-js"
import { createStore } from "solid-js/store"
import { usePlatform } from "@/context/platform"
import { persisted } from "@/utils/persist"
@@ -91,27 +91,49 @@ export const { use: useServer, provider: ServerProvider } = createSimpleContext(
const isReady = createMemo(() => ready() && !!active())
- const [healthy, { refetch }] = createResource(
- () => active() || undefined,
- async (url) => {
- if (!url) return
-
- const sdk = createOpencodeClient({
- baseUrl: url,
- fetch: platform.fetch,
- signal: AbortSignal.timeout(3000),
- })
- return sdk.global
- .health()
- .then((x) => x.data?.healthy === true)
- .catch(() => false)
- },
- )
+ const [healthy, setHealthy] = createSignal<boolean | undefined>(undefined)
+
+ const check = (url: string) => {
+ const sdk = createOpencodeClient({
+ baseUrl: url,
+ fetch: platform.fetch,
+ signal: AbortSignal.timeout(3000),
+ })
+ return sdk.global
+ .health()
+ .then((x) => x.data?.healthy === true)
+ .catch(() => false)
+ }
createEffect(() => {
- if (!active()) return
- const interval = setInterval(() => refetch(), 10_000)
- onCleanup(() => clearInterval(interval))
+ const url = active()
+ if (!url) return
+
+ setHealthy(undefined)
+
+ let alive = true
+ let busy = false
+
+ const run = () => {
+ if (busy) return
+ busy = true
+ void check(url)
+ .then((next) => {
+ if (!alive) return
+ setHealthy(next)
+ })
+ .finally(() => {
+ busy = false
+ })
+ }
+
+ run()
+ const interval = setInterval(run, 10_000)
+
+ onCleanup(() => {
+ alive = false
+ clearInterval(interval)
+ })
})
const origin = createMemo(() => projectsKey(active()))