From a43783a6d47a069ca2fd187c378b8e9899093b37 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 18 Mar 2026 14:46:53 +0800 Subject: [PATCH] app: initialize command catalog more efficiently cuts down load times by like 30-50% --- packages/app/src/context/command.tsx | 34 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx index 2c6799d12..65805f40c 100644 --- a/packages/app/src/context/command.tsx +++ b/packages/app/src/context/command.tsx @@ -1,10 +1,10 @@ -import { createEffect, createMemo, onCleanup, onMount, type Accessor } from "solid-js" -import { createStore } from "solid-js/store" import { createSimpleContext } from "@opencode-ai/ui/context" import { useDialog } from "@opencode-ai/ui/context/dialog" -import { dict as en } from "@/i18n/en" +import { type Accessor, createEffect, createMemo, onCleanup, onMount } from "solid-js" +import { createStore } from "solid-js/store" import { useLanguage } from "@/context/language" import { useSettings } from "@/context/settings" +import { dict as en } from "@/i18n/en" import { Persist, persisted } from "@/utils/persist" const IS_MAC = typeof navigator === "object" && /(Mac|iPod|iPhone|iPad)/.test(navigator.platform) @@ -238,9 +238,10 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex }) const warnedDuplicates = new Set() + type CommandCatalog = Record const [catalog, setCatalog, _, catalogReady] = persisted( Persist.global("command.catalog.v1"), - createStore>({}), + createStore({}), ) const bind = (id: string, def: KeybindConfig | undefined) => { @@ -259,7 +260,7 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex if (seen.has(opt.id)) { if (import.meta.env.DEV && !warnedDuplicates.has(opt.id)) { warnedDuplicates.add(opt.id) - console.warn(`[command] duplicate command id \"${opt.id}\" registered; keeping first entry`) + console.warn(`[command] duplicate command id "${opt.id}" registered; keeping first entry`) } continue } @@ -274,16 +275,19 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex createEffect(() => { if (!catalogReady()) return - for (const opt of registered()) { - const id = actionId(opt.id) - setCatalog(id, { - title: opt.title, - description: opt.description, - category: opt.category, - keybind: opt.keybind, - slash: opt.slash, - }) - } + setCatalog( + registered().reduce((acc, opt) => { + const id = actionId(opt.id) + acc[id] = { + title: opt.title, + description: opt.description, + category: opt.category, + keybind: opt.keybind, + slash: opt.slash, + } + return acc + }, {} as CommandCatalog), + ) }) const catalogOptions = createMemo(() => Object.entries(catalog).map(([id, meta]) => ({ id, ...meta })))