summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-27 08:53:48 -0600
committeradamelmore <[email protected]>2026-01-28 07:28:02 -0600
commit2f35c40bb59e3b6628247801f9678f5023fd659c (patch)
treee3c93afdb78575d6d22e1774c415321360028d8e /packages/app/src
parent6650aa6f35885ce564eb003da0f3420b49e81cb3 (diff)
downloadopencode-2f35c40bb59e3b6628247801f9678f5023fd659c.tar.gz
opencode-2f35c40bb59e3b6628247801f9678f5023fd659c.zip
chore(app): global config changes
Diffstat (limited to 'packages/app/src')
-rw-r--r--packages/app/src/context/global-sync.tsx108
1 files changed, 84 insertions, 24 deletions
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx
index fb67193ab..ad3d124b2 100644
--- a/packages/app/src/context/global-sync.tsx
+++ b/packages/app/src/context/global-sync.tsx
@@ -188,7 +188,74 @@ function createGlobalSync() {
config: {},
reload: undefined,
})
- let bootstrapQueue: string[] = []
+
+ const queued = new Set<string>()
+ let root = false
+ let running = false
+ let timer: ReturnType<typeof setTimeout> | undefined
+
+ const paused = () => untrack(() => globalStore.reload) !== undefined
+
+ const tick = () => new Promise<void>((resolve) => setTimeout(resolve, 0))
+
+ const take = (count: number) => {
+ if (queued.size === 0) return [] as string[]
+ const items: string[] = []
+ for (const item of queued) {
+ queued.delete(item)
+ items.push(item)
+ if (items.length >= count) break
+ }
+ return items
+ }
+
+ const schedule = () => {
+ if (timer) return
+ timer = setTimeout(() => {
+ timer = undefined
+ void drain()
+ }, 0)
+ }
+
+ const push = (directory: string) => {
+ if (!directory) return
+ queued.add(directory)
+ if (paused()) return
+ schedule()
+ }
+
+ const refresh = () => {
+ root = true
+ if (paused()) return
+ schedule()
+ }
+
+ async function drain() {
+ if (running) return
+ running = true
+ try {
+ while (true) {
+ if (paused()) return
+
+ if (root) {
+ root = false
+ await bootstrap()
+ await tick()
+ continue
+ }
+
+ const dirs = take(2)
+ if (dirs.length === 0) return
+
+ await Promise.all(dirs.map((dir) => bootstrapInstance(dir)))
+ await tick()
+ }
+ } finally {
+ running = false
+ if (paused()) return
+ if (root || queued.size) schedule()
+ }
+ }
createEffect(() => {
if (!projectCacheReady()) return
@@ -210,14 +277,8 @@ function createGlobalSync() {
createEffect(() => {
if (globalStore.reload !== "complete") return
- if (bootstrapQueue.length) {
- for (const directory of bootstrapQueue) {
- bootstrapInstance(directory)
- }
- bootstrap()
- }
- bootstrapQueue = []
setGlobalStore("reload", undefined)
+ refresh()
})
const children: Record<string, [Store<State>, SetStoreFunction<State>]> = {}
@@ -584,9 +645,8 @@ function createGlobalSync() {
if (directory === "global") {
switch (event?.type) {
case "global.disposed": {
- if (globalStore.reload) return
- bootstrap()
- break
+ refresh()
+ return
}
case "project.updated": {
const result = Binary.search(globalStore.project, event.properties.id, (s) => s.id)
@@ -647,12 +707,8 @@ function createGlobalSync() {
switch (event.type) {
case "server.instance.disposed": {
- if (globalStore.reload) {
- bootstrapQueue.push(directory)
- return
- }
- bootstrapInstance(directory)
- break
+ push(directory)
+ return
}
case "session.created": {
const info = event.properties.info
@@ -893,6 +949,10 @@ function createGlobalSync() {
}
})
onCleanup(unsub)
+ onCleanup(() => {
+ if (!timer) return
+ clearTimeout(timer)
+ })
async function bootstrap() {
const health = await globalSDK.client.global
@@ -916,7 +976,7 @@ function createGlobalSync() {
}),
),
retry(() =>
- globalSDK.client.config.get().then((x) => {
+ globalSDK.client.global.config.get().then((x) => {
setGlobalStore("config", x.data!)
}),
),
@@ -999,13 +1059,13 @@ function createGlobalSync() {
},
child,
bootstrap,
- updateConfig: async (config: Config) => {
+ updateConfig: (config: Config) => {
setGlobalStore("reload", "pending")
- const response = await globalSDK.client.config.update({ config })
- setTimeout(() => {
- setGlobalStore("reload", "complete")
- }, 1000)
- return response
+ return globalSDK.client.global.config.update({ config }).finally(() => {
+ setTimeout(() => {
+ setGlobalStore("reload", "complete")
+ }, 1000)
+ })
},
project: {
loadSessions,