Merge branch 'dev' into interleaved-fixes

This commit is contained in:
Aiden Cline 2025-12-10 13:20:42 -06:00
commit be178cecda
9 changed files with 44 additions and 37 deletions

View file

@ -241,7 +241,7 @@
"@opencode-ai/script": "workspace:*", "@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
"@opencode-ai/util": "workspace:*", "@opencode-ai/util": "workspace:*",
"@openrouter/ai-sdk-provider": "1.2.8", "@openrouter/ai-sdk-provider": "1.5.2",
"@opentui/core": "0.1.60", "@opentui/core": "0.1.60",
"@opentui/solid": "0.1.60", "@opentui/solid": "0.1.60",
"@parcel/watcher": "2.5.1", "@parcel/watcher": "2.5.1",
@ -1141,7 +1141,7 @@
"@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"],
"@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.2.8", "", { "dependencies": { "@openrouter/sdk": "^0.1.8" }, "peerDependencies": { "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" } }, "sha512-pQT8AzZBKg9f4bkt4doF486ZlhK0XjKkevrLkiqYgfh1Jplovieu28nK4Y+xy3sF18/mxjqh9/2y6jh01qzLrA=="], "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.2", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "@toon-format/toon": "^2.0.0", "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" }, "optionalPeers": ["@toon-format/toon"] }, "sha512-3Th0vmJ9pjnwcPc2H1f59Mb0LFvwaREZAScfOQIpUxAHjZ7ZawVKDP27qgsteZPmMYqccNMy4r4Y3kgUnNcKAg=="],
"@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="], "@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="],

View file

@ -1,3 +1,3 @@
{ {
"nodeModules": "sha256-pwjePZClFKDhDr5xrTNCBlO0xTwxLQYiQYaIEd0FdQQ=" "nodeModules": "sha256-JT8J+Nd2kk0x46BcyotmBbM39tuKOW7VzXfOV3R3sqQ="
} }

View file

@ -588,7 +588,7 @@ export async function handler(
tx tx
.update(KeyTable) .update(KeyTable)
.set({ timeUsed: sql`now()` }) .set({ timeUsed: sql`now()` })
.where(eq(KeyTable.id, authInfo.apiKeyId)), .where(and(eq(KeyTable.workspaceID, authInfo.workspaceID), eq(KeyTable.id, authInfo.apiKeyId))),
) )
} }

View file

@ -70,7 +70,7 @@
"@opencode-ai/script": "workspace:*", "@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*", "@opencode-ai/sdk": "workspace:*",
"@opencode-ai/util": "workspace:*", "@opencode-ai/util": "workspace:*",
"@openrouter/ai-sdk-provider": "1.2.8", "@openrouter/ai-sdk-provider": "1.5.2",
"@opentui/core": "0.1.60", "@opentui/core": "0.1.60",
"@opentui/solid": "0.1.60", "@opentui/solid": "0.1.60",
"@parcel/watcher": "2.5.1", "@parcel/watcher": "2.5.1",

View file

@ -17,7 +17,7 @@
"darkAccent": "#FFF7F1", "darkAccent": "#FFF7F1",
"darkRed": "#e06c75", "darkRed": "#e06c75",
"darkOrange": "#EC5B2B", "darkOrange": "#EC5B2B",
"darkGreen": "#7fd88f", "darkBlue": "#6ba1e6",
"darkCyan": "#56b6c2", "darkCyan": "#56b6c2",
"darkYellow": "#e5c07b", "darkYellow": "#e5c07b",
"lightStep1": "#ffffff", "lightStep1": "#ffffff",
@ -36,7 +36,7 @@
"lightAccent": "#c94d24", "lightAccent": "#c94d24",
"lightRed": "#d1383d", "lightRed": "#d1383d",
"lightOrange": "#EC5B2B", "lightOrange": "#EC5B2B",
"lightGreen": "#3d9a57", "lightBlue": "#0062d1",
"lightCyan": "#318795", "lightCyan": "#318795",
"lightYellow": "#b0851f" "lightYellow": "#b0851f"
}, },
@ -62,8 +62,8 @@
"light": "lightOrange" "light": "lightOrange"
}, },
"success": { "success": {
"dark": "darkGreen", "dark": "darkBlue",
"light": "lightGreen" "light": "lightBlue"
}, },
"info": { "info": {
"dark": "darkCyan", "dark": "darkCyan",
@ -102,8 +102,8 @@
"light": "lightStep6" "light": "lightStep6"
}, },
"diffAdded": { "diffAdded": {
"dark": "#4fd6be", "dark": "#6ba1e6",
"light": "#1e725c" "light": "#0062d1"
}, },
"diffRemoved": { "diffRemoved": {
"dark": "#c53b53", "dark": "#c53b53",
@ -118,16 +118,16 @@
"light": "#7086b5" "light": "#7086b5"
}, },
"diffHighlightAdded": { "diffHighlightAdded": {
"dark": "#b8db87", "dark": "#6ba1e6",
"light": "#4db380" "light": "#0062d1"
}, },
"diffHighlightRemoved": { "diffHighlightRemoved": {
"dark": "#e26a75", "dark": "#e26a75",
"light": "#f52a65" "light": "#f52a65"
}, },
"diffAddedBg": { "diffAddedBg": {
"dark": "#20303b", "dark": "#1a2a3d",
"light": "#d5e5d5" "light": "#e0edfa"
}, },
"diffRemovedBg": { "diffRemovedBg": {
"dark": "#37222c", "dark": "#37222c",
@ -142,8 +142,8 @@
"light": "lightStep3" "light": "lightStep3"
}, },
"diffAddedLineNumberBg": { "diffAddedLineNumberBg": {
"dark": "#1b2b34", "dark": "#162535",
"light": "#c5d5c5" "light": "#d0e5f5"
}, },
"diffRemovedLineNumberBg": { "diffRemovedLineNumberBg": {
"dark": "#2d1f26", "dark": "#2d1f26",
@ -166,8 +166,8 @@
"light": "lightCyan" "light": "lightCyan"
}, },
"markdownCode": { "markdownCode": {
"dark": "darkGreen", "dark": "darkBlue",
"light": "lightGreen" "light": "lightBlue"
}, },
"markdownBlockQuote": { "markdownBlockQuote": {
"dark": "#FFF7F1", "dark": "#FFF7F1",
@ -222,8 +222,8 @@
"light": "lightRed" "light": "lightRed"
}, },
"syntaxString": { "syntaxString": {
"dark": "darkGreen", "dark": "darkBlue",
"light": "lightGreen" "light": "lightBlue"
}, },
"syntaxNumber": { "syntaxNumber": {
"dark": "#FFF7F1", "dark": "#FFF7F1",

View file

@ -10,7 +10,7 @@ export function Footer() {
const { theme } = useTheme() const { theme } = useTheme()
const sync = useSync() const sync = useSync()
const route = useRoute() const route = useRoute()
const mcp = createMemo(() => Object.keys(sync.data.mcp)) const mcp = createMemo(() => Object.values(sync.data.mcp).filter((x) => x.status === "connected").length)
const mcpError = createMemo(() => Object.values(sync.data.mcp).some((x) => x.status === "failed")) const mcpError = createMemo(() => Object.values(sync.data.mcp).some((x) => x.status === "failed"))
const lsp = createMemo(() => Object.keys(sync.data.lsp)) const lsp = createMemo(() => Object.keys(sync.data.lsp))
const permissions = createMemo(() => { const permissions = createMemo(() => {
@ -66,7 +66,7 @@ export function Footer() {
<text fg={theme.text}> <text fg={theme.text}>
<span style={{ fg: theme.success }}></span> {lsp().length} LSP <span style={{ fg: theme.success }}></span> {lsp().length} LSP
</text> </text>
<Show when={mcp().length}> <Show when={mcp()}>
<text fg={theme.text}> <text fg={theme.text}>
<Switch> <Switch>
<Match when={mcpError()}> <Match when={mcpError()}>
@ -76,7 +76,7 @@ export function Footer() {
<span style={{ fg: theme.success }}> </span> <span style={{ fg: theme.success }}> </span>
</Match> </Match>
</Switch> </Switch>
{mcp().length} MCP {mcp()} MCP
</text> </text>
</Show> </Show>
<text fg={theme.textMuted}>/status</text> <text fg={theme.textMuted}>/status</text>

View file

@ -227,11 +227,12 @@ export namespace ProviderTransform {
result["promptCacheKey"] = sessionID result["promptCacheKey"] = sessionID
} }
if ( if (model.api.npm === "@openrouter/ai-sdk-provider" && model.api.id.includes("gemini-3")) {
model.providerID === "google" || result["reasoning"] = { effort: "high" }
(model.providerID.startsWith("opencode") && model.api.id.includes("gemini-3")) }
) { if (model.api.npm === "@ai-sdk/google" || model.api.npm === "@ai-sdk/google-vertex") {
result["thinkingConfig"] = { result["thinkingConfig"] = {
thinkingLevel: "high",
includeThoughts: true, includeThoughts: true,
} }
} }

View file

@ -1460,12 +1460,15 @@ export namespace Server {
} }
} }
const providers = mapValues(filteredProviders, (x) => Provider.fromModelsDevProvider(x)) const connected = await Provider.list()
const connected = await Provider.list().then((x) => Object.keys(x)) const providers = Object.assign(
mapValues(filteredProviders, (x) => Provider.fromModelsDevProvider(x)),
connected,
)
return c.json({ return c.json({
all: Object.values(providers), all: Object.values(providers),
default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id), default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id),
connected, connected: Object.keys(connected),
}) })
}, },
) )

View file

@ -15,12 +15,15 @@ You can also check out [awesome-opencode](https://github.com/awesome-opencode/aw
## Plugins ## Plugins
| Name | Description | | Name | Description |
| ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| [opencode-skills](https://github.com/malhashemi/opencode-skills) | Manage and organize OpenCode skills and capabilities | | [opencode-skills](https://github.com/malhashemi/opencode-skills) | Manage and organize OpenCode skills and capabilities |
| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits | | [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Auto-inject TypeScript/Svelte types into file reads with lookup tools |
| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing | | [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits |
| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs | | [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing |
| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Use Antigravity's free models instead of API billing |
| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs |
| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Track OpenCode usage with Wakatime |
--- ---