fix(tui): restore legacy sync consumers (#31908)

This commit is contained in:
Dax 2026-06-11 11:01:20 -04:00 committed by GitHub
commit 567d6ed1a3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 97 additions and 97 deletions

View file

@ -1,17 +1,17 @@
import { createMemo, createSignal } from "solid-js"
import { useLocal } from "../context/local"
import { map, pipe, filter, sortBy, take } from "remeda"
import { map, pipe, flatMap, entries, filter, sortBy, take } from "remeda"
import { DialogSelect } from "../ui/dialog-select"
import { useDialog } from "../ui/dialog"
import { createDialogProviderOptions, DialogProvider } from "./dialog-provider"
import { DialogVariant } from "./dialog-variant"
import * as fuzzysort from "fuzzysort"
import { useConnected } from "./use-connected"
import { useData } from "../context/data"
import { useSync } from "../context/sync"
export function DialogModel(props: { providerID?: string }) {
const local = useLocal()
const data = useData()
const sync = useSync()
const dialog = useDialog()
const [query, setQuery] = createSignal("")
@ -29,21 +29,19 @@ export function DialogModel(props: { providerID?: string }) {
function toOptions(items: typeof favorites, category: string) {
if (!showSections) return []
return items.flatMap((item) => {
const provider = data.location.provider.list()?.find((provider) => provider.id === item.providerID)
const provider = sync.data.provider.find((provider) => provider.id === item.providerID)
if (!provider) return []
const model = data.location.model
.list()
?.find((model) => model.providerID === item.providerID && model.id === item.modelID)
const model = provider.models[item.modelID]
if (!model) return []
return [
{
key: item,
value: { providerID: provider.id, modelID: model.id },
title: model.name,
title: model.name ?? item.modelID,
description: provider.name,
category,
disabled: provider.id === "opencode" && model.id.includes("-nano"),
footer: model.cost[0]?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect: () => {
onSelect(provider.id, model.id)
},
@ -61,43 +59,50 @@ export function DialogModel(props: { providerID?: string }) {
)
const providerOptions = pipe(
data.location.model.list() ?? [],
filter((model) => model.status !== "deprecated"),
filter((model) => (props.providerID ? model.providerID === props.providerID : true)),
sync.data.provider,
sortBy(
(model) => model.providerID !== "opencode",
(model) => data.location.provider.list()?.find((provider) => provider.id === model.providerID)?.name ?? "",
[(model) => model.time.released, "desc"],
(provider) => provider.id !== "opencode",
(provider) => provider.name,
),
flatMap((provider) =>
pipe(
provider.models,
entries(),
filter(([_, info]) => info.status !== "deprecated"),
filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)),
map(([model, info]) => ({
value: { providerID: provider.id, modelID: model },
title: info.name ?? model,
releaseDate: info.release_date,
description: favorites.some((item) => item.providerID === provider.id && item.modelID === model)
? "(Favorite)"
: undefined,
category: connected() ? provider.name : undefined,
disabled: provider.id === "opencode" && model.includes("-nano"),
footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect() {
onSelect(provider.id, model)
},
})),
filter((option) => {
if (!showSections) return true
if (
favorites.some(
(item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID,
)
)
return false
if (
recents.some(
(item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID,
)
)
return false
return true
}),
(options) => sortModelOptions(options, props.providerID !== undefined),
),
),
map((model) => ({
value: { providerID: model.providerID, modelID: model.id },
title: model.name,
releaseDate: model.time.released,
description: favorites.some((item) => item.providerID === model.providerID && item.modelID === model.id)
? "(Favorite)"
: undefined,
category: connected()
? data.location.provider.list()?.find((provider) => provider.id === model.providerID)?.name
: undefined,
disabled: !model.enabled || (model.providerID === "opencode" && model.id.includes("-nano")),
footer: model.cost[0]?.input === 0 && model.providerID === "opencode" ? "Free" : undefined,
onSelect() {
onSelect(model.providerID, model.id)
},
})),
filter((option) => {
if (!showSections) return true
if (
favorites.some((item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID)
)
return false
if (
recents.some((item) => item.providerID === option.value.providerID && item.modelID === option.value.modelID)
)
return false
return true
}),
(options) => sortModelOptions(options, props.providerID !== undefined),
)
const popularProviders = !connected()
@ -122,7 +127,7 @@ export function DialogModel(props: { providerID?: string }) {
})
const provider = createMemo(() =>
props.providerID ? data.location.provider.list()?.find((item) => item.id === props.providerID) : null,
props.providerID ? sync.data.provider.find((item) => item.id === props.providerID) : null,
)
const title = createMemo(() => {

View file

@ -132,7 +132,7 @@ export async function warpWorkspaceSession(input: {
input.project.workspace.set(input.workspaceID)
await input.sync.bootstrap()
await input.sync.bootstrap({ fatal: false }).catch(() => undefined)
const dir = input.project.instance.directory() || input.sync.path.directory
if (dir) {

View file

@ -82,7 +82,7 @@ export function DialogWorkspaceList() {
route.navigate({ type: "home" })
}
await project.workspace.sync()
await sync.bootstrap()
await sync.bootstrap({ fatal: false }).catch(() => undefined)
setRemoving(undefined)
}

View file

@ -317,9 +317,10 @@ export function Autocomplete(props: {
const { lineRange, baseQuery } = extractLineRange(query ?? "")
// Get files from SDK
const result = await sdk.client.find.files({
const result = await sdk.client.v2.fs.find({
query: baseQuery,
workspace: project.workspace.current(),
limit: "20",
location: { workspace: project.workspace.current() },
})
const options: AutocompleteOption[] = []
@ -329,15 +330,13 @@ export function Autocomplete(props: {
if (!result.error && result.data) {
const width = props.anchor().width - 4
options.push(
...result.data.map((item): AutocompleteOption => {
const { filename, url, part } = createFilePart(item, lineRange)
const isDir = item.endsWith("/")
...result.data.data.map((item): AutocompleteOption => {
const { filename, url, part } = createFilePart(item.path, lineRange)
return {
display: Locale.truncateMiddle(filename, width),
value: filename,
isDirectory: isDir,
path: item,
isDirectory: item.type === "directory",
path: item.path,
onSelect: () => {
insertPart(filename, part)
},
@ -390,15 +389,15 @@ export function Autocomplete(props: {
})
const agents = createMemo(() => {
return (data.location.agent.list() ?? [])
return sync.data.agent
.filter((agent) => !agent.hidden && agent.mode !== "primary")
.map(
(agent): AutocompleteOption => ({
display: "@" + agent.id,
display: "@" + agent.name,
onSelect: () => {
insertPart(agent.id, {
insertPart(agent.name, {
type: "agent",
name: agent.id,
name: agent.name,
source: {
start: 0,
end: 0,

View file

@ -1,7 +1,11 @@
import { createMemo } from "solid-js"
import { useData } from "../context/data"
import { useSync } from "../context/sync"
export function useConnected() {
const data = useData()
return createMemo(() => (data.location.provider.list() ?? []).some((provider) => provider.enabled !== false))
const sync = useSync()
return createMemo(() =>
sync.data.provider.some((provider) =>
provider.id !== "opencode" || Object.values(provider.models).some((model) => model.cost?.input !== 0),
),
)
}