Skip to content

Commit 29f3f95

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into dev
2 parents 86a7b8f + f3d5a71 commit 29f3f95

25 files changed

Lines changed: 372 additions & 239 deletions

File tree

bun.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"@types/node": "catalog:"
128128
},
129129
"patchedDependencies": {
130+
"@npmcli/[email protected]": "patches/@npmcli%[email protected]",
130131
"@standard-community/[email protected]": "patches/@standard-community%[email protected]",
131132
132133
}

packages/app/src/app.tsx

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,11 @@ export function AppBaseProviders(props: ParentProps<{ locale?: Locale }>) {
141141
<LanguageProvider locale={props.locale}>
142142
<UiI18nBridge>
143143
<ErrorBoundary fallback={(error) => <ErrorPage error={error} />}>
144-
<QueryProvider>
145-
<DialogProvider>
146-
<MarkedProvider>
147-
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
148-
</MarkedProvider>
149-
</DialogProvider>
150-
</QueryProvider>
144+
<DialogProvider>
145+
<MarkedProvider>
146+
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
147+
</MarkedProvider>
148+
</DialogProvider>
151149
</ErrorBoundary>
152150
</UiI18nBridge>
153151
</LanguageProvider>
@@ -293,20 +291,22 @@ export function AppInterface(props: {
293291
>
294292
<ConnectionGate disableHealthCheck={props.disableHealthCheck}>
295293
<ServerKey>
296-
<GlobalSDKProvider>
297-
<GlobalSyncProvider>
298-
<Dynamic
299-
component={props.router ?? Router}
300-
root={(routerProps) => <RouterRoot appChildren={props.children}>{routerProps.children}</RouterRoot>}
301-
>
302-
<Route path="/" component={HomeRoute} />
303-
<Route path="/:dir" component={DirectoryLayout}>
304-
<Route path="/" component={SessionIndexRoute} />
305-
<Route path="/session/:id?" component={SessionRoute} />
306-
</Route>
307-
</Dynamic>
308-
</GlobalSyncProvider>
309-
</GlobalSDKProvider>
294+
<QueryProvider>
295+
<GlobalSDKProvider>
296+
<GlobalSyncProvider>
297+
<Dynamic
298+
component={props.router ?? Router}
299+
root={(routerProps) => <RouterRoot appChildren={props.children}>{routerProps.children}</RouterRoot>}
300+
>
301+
<Route path="/" component={HomeRoute} />
302+
<Route path="/:dir" component={DirectoryLayout}>
303+
<Route path="/" component={SessionIndexRoute} />
304+
<Route path="/session/:id?" component={SessionRoute} />
305+
</Route>
306+
</Dynamic>
307+
</GlobalSyncProvider>
308+
</GlobalSDKProvider>
309+
</QueryProvider>
310310
</ServerKey>
311311
</ConnectionGate>
312312
</ServerProvider>

packages/app/src/components/prompt-input.tsx

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useFilteredList } from "@opencode-ai/ui/hooks"
22
import { useSpring } from "@opencode-ai/ui/motion-spring"
3-
import { createEffect, on, Component, Show, onCleanup, createMemo, createSignal } from "solid-js"
3+
import { createEffect, on, Component, Show, onCleanup, createMemo, createSignal, createResource } from "solid-js"
44
import { createStore } from "solid-js/store"
55
import { useLocal } from "@/context/local"
66
import { selectionFromLines, type SelectedLineRange, useFile } from "@/context/file"
@@ -54,7 +54,7 @@ import { PromptImageAttachments } from "./prompt-input/image-attachments"
5454
import { PromptDragOverlay } from "./prompt-input/drag-overlay"
5555
import { promptPlaceholder } from "./prompt-input/placeholder"
5656
import { ImagePreview } from "@opencode-ai/ui/image-preview"
57-
import { useQuery } from "@tanstack/solid-query"
57+
import { useQueries, useQuery } from "@tanstack/solid-query"
5858
import { loadAgentsQuery, loadProvidersQuery } from "@/context/global-sync/bootstrap"
5959

6060
interface PromptInputProps {
@@ -1252,16 +1252,21 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
12521252
}
12531253
}
12541254

1255-
const agentsQuery = useQuery(() => loadAgentsQuery(sdk.directory))
1256-
const agentsLoading = () => agentsQuery.isLoading
1257-
1258-
const globalProvidersQuery = useQuery(() => loadProvidersQuery(null))
1259-
const providersQuery = useQuery(() => loadProvidersQuery(sdk.directory))
1255+
const [agentsQuery, globalProvidersQuery, providersQuery] = useQueries(() => ({
1256+
queries: [loadAgentsQuery(sdk.directory), loadProvidersQuery(null), loadProvidersQuery(sdk.directory)],
1257+
}))
12601258

1259+
const agentsLoading = () => agentsQuery.isLoading
12611260
const providersLoading = () => agentsLoading() || providersQuery.isLoading || globalProvidersQuery.isLoading
12621261

1262+
const [promptReady] = createResource(
1263+
() => prompt.ready().promise,
1264+
(p) => p,
1265+
)
1266+
12631267
return (
12641268
<div class="relative size-full _max-h-[320px] flex flex-col gap-0">
1269+
{(promptReady(), null)}
12651270
<PromptPopover
12661271
popover={store.popover}
12671272
setSlashPopoverRef={(el) => (slashPopoverRef = el)}
@@ -1358,15 +1363,13 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
13581363
}}
13591364
style={{ "padding-bottom": space }}
13601365
/>
1361-
<Show when={!prompt.dirty()}>
1362-
<div
1363-
class="absolute top-0 inset-x-0 pl-3 pr-2 pt-2 text-14-regular text-text-weak pointer-events-none whitespace-nowrap truncate"
1364-
classList={{ "font-mono!": store.mode === "shell" }}
1365-
style={{ "padding-bottom": space }}
1366-
>
1367-
{placeholder()}
1368-
</div>
1369-
</Show>
1366+
<div
1367+
class="absolute top-0 inset-x-0 pl-3 pr-2 pt-2 text-14-regular text-text-weak pointer-events-none whitespace-nowrap truncate"
1368+
classList={{ "font-mono!": store.mode === "shell" }}
1369+
style={{ "padding-bottom": space, display: prompt.dirty() ? "none" : undefined }}
1370+
>
1371+
{placeholder()}
1372+
</div>
13701373
</div>
13711374

13721375
<div
@@ -1457,7 +1460,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
14571460
</div>
14581461
<div class="flex items-center gap-1.5 min-w-0 flex-1 h-7">
14591462
<Show when={!agentsLoading()}>
1460-
<div data-component="prompt-agent-control">
1463+
<div data-component="prompt-agent-control" style={{ animation: "fade-in 0.3s" }}>
14611464
<TooltipKeybind
14621465
placement="top"
14631466
gutter={4}
@@ -1483,7 +1486,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
14831486
</Show>
14841487
<Show when={!providersLoading()}>
14851488
<Show when={store.mode !== "shell"}>
1486-
<div data-component="prompt-model-control">
1489+
<div data-component="prompt-model-control" style={{ animation: "fade-in 0.3s" }}>
14871490
<Show
14881491
when={providers.paid().length > 0}
14891492
fallback={
@@ -1554,7 +1557,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
15541557
</TooltipKeybind>
15551558
</Show>
15561559
</div>
1557-
<div data-component="prompt-variant-control">
1560+
<div data-component="prompt-variant-control" style={{ animation: "fade-in 0.3s" }}>
15581561
<TooltipKeybind
15591562
placement="top"
15601563
gutter={4}

packages/app/src/context/global-sync.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type {
99
} from "@opencode-ai/sdk/v2/client"
1010
import { showToast } from "@opencode-ai/ui/toast"
1111
import { getFilename } from "@opencode-ai/shared/util/path"
12-
import { createContext, getOwner, onCleanup, onMount, type ParentProps, untrack, useContext } from "solid-js"
12+
import { batch, createContext, getOwner, onCleanup, onMount, type ParentProps, untrack, useContext } from "solid-js"
1313
import { createStore, produce, reconcile } from "solid-js/store"
1414
import { useLanguage } from "@/context/language"
1515
import { Persist, persisted } from "@/utils/persist"
@@ -223,16 +223,18 @@ function createGlobalSync() {
223223
limit,
224224
permission: store.permission,
225225
})
226-
setStore(
227-
"sessionTotal",
228-
estimateRootSessionTotal({
229-
count: nonArchived.length,
230-
limit: x.limit,
231-
limited: x.limited,
232-
}),
233-
)
234-
setStore("session", reconcile(sessions, { key: "id" }))
235-
cleanupDroppedSessionCaches(store, setStore, sessions, setSessionTodo)
226+
batch(() => {
227+
setStore(
228+
"sessionTotal",
229+
estimateRootSessionTotal({
230+
count: nonArchived.length,
231+
limit: x.limit,
232+
limited: x.limited,
233+
}),
234+
)
235+
setStore("session", reconcile(sessions, { key: "id" }))
236+
cleanupDroppedSessionCaches(store, setStore, sessions, setSessionTodo)
237+
})
236238
sessionMeta.set(directory, { limit })
237239
})
238240
.catch((err) => {

0 commit comments

Comments
 (0)