summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2025-10-29 16:16:56 +0000
committerDavid Hill <[email protected]>2025-10-29 16:16:56 +0000
commit4a77e94e3c6f6ab96e347038cc2548888aecb673 (patch)
tree05e0e4670486e6bcd8b031f6d71f1d59a019af2f
parent4c563ea4051a1ea38651e7a383b30638f790bfeb (diff)
parent58752574629fdf2ad6d87861c3dd5e9a89c42805 (diff)
downloadopencode-4a77e94e3c6f6ab96e347038cc2548888aecb673.tar.gz
opencode-4a77e94e3c6f6ab96e347038cc2548888aecb673.zip
Merge branch 'dev' of https://github.com/sst/opencode into dev
-rw-r--r--CONTRIBUTING.md1
-rw-r--r--bun.lock22
-rw-r--r--packages/console/app/package.json2
-rw-r--r--packages/console/core/package.json2
-rw-r--r--packages/console/function/package.json2
-rw-r--r--packages/console/mail/package.json2
-rw-r--r--packages/desktop/package.json2
-rw-r--r--packages/desktop/src/components/prompt-input.tsx8
-rw-r--r--packages/desktop/src/context/local.tsx1
-rw-r--r--packages/function/package.json2
-rw-r--r--packages/opencode/package.json2
-rw-r--r--packages/opencode/src/installation/index.ts4
-rw-r--r--packages/opencode/src/session/prompt.ts69
-rw-r--r--packages/opencode/src/session/summary.ts28
-rw-r--r--packages/plugin/package.json2
-rw-r--r--packages/sdk/js/package.json2
-rw-r--r--packages/sdk/js/src/gen/sdk.gen.ts39
-rw-r--r--packages/sdk/js/src/gen/types.gen.ts40
-rw-r--r--packages/slack/package.json2
-rw-r--r--packages/ui/package.json2
-rw-r--r--packages/web/package.json2
-rw-r--r--sdks/vscode/package.json2
22 files changed, 180 insertions, 58 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8be1b4dba..41ca2f1cf 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,6 +17,7 @@ If you are unsure if a PR would be accepted, feel free to ask a maintainer or lo
- [`help wanted`](https://github.com/sst/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Ahelp-wanted)
- [`good first issue`](https://github.com/sst/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)
- [`bug`](https://github.com/sst/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug)
+- [`perf`](https://github.com/sst/opencode/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22perf%22)
> [!NOTE]
> PRs that ignore these guardrails will likely be closed.
diff --git a/bun.lock b/bun.lock
index 79bdbde5a..d5b1451fc 100644
--- a/bun.lock
+++ b/bun.lock
@@ -37,7 +37,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -64,7 +64,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2",
@@ -88,7 +88,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -109,7 +109,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -150,7 +150,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "22.0.0",
@@ -166,7 +166,7 @@
},
"packages/opencode": {
"name": "opencode",
- "version": "0.15.23",
+ "version": "0.15.25",
"bin": {
"opencode": "./bin/opencode",
},
@@ -230,7 +230,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"zod": "catalog:",
@@ -250,7 +250,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
- "version": "0.15.23",
+ "version": "0.15.25",
"devDependencies": {
"@hey-api/openapi-ts": "0.81.0",
"@tsconfig/node22": "catalog:",
@@ -261,7 +261,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -274,7 +274,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@kobalte/core": "catalog:",
"@pierre/precision-diffs": "catalog:",
@@ -297,7 +297,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
diff --git a/packages/console/app/package.json b/packages/console/app/package.json
index d9d0d5ca7..04c1ecde0 100644
--- a/packages/console/app/package.json
+++ b/packages/console/app/package.json
@@ -7,7 +7,7 @@
"dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev",
"build": "vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json",
"start": "vinxi start",
- "version": "0.15.23"
+ "version": "0.15.25"
},
"dependencies": {
"@ibm/plex": "6.4.1",
diff --git a/packages/console/core/package.json b/packages/console/core/package.json
index 1361600b1..09ae9301d 100644
--- a/packages/console/core/package.json
+++ b/packages/console/core/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
- "version": "0.15.23",
+ "version": "0.15.25",
"private": true,
"type": "module",
"dependencies": {
diff --git a/packages/console/function/package.json b/packages/console/function/package.json
index 6229a5309..6de6c6733 100644
--- a/packages/console/function/package.json
+++ b/packages/console/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
- "version": "0.15.23",
+ "version": "0.15.25",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json
index bd54e9134..a0f636f85 100644
--- a/packages/console/mail/package.json
+++ b/packages/console/mail/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
- "version": "0.15.23",
+ "version": "0.15.25",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
diff --git a/packages/desktop/package.json b/packages/desktop/package.json
index 8e5b0167e..00d2f5316 100644
--- a/packages/desktop/package.json
+++ b/packages/desktop/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/desktop",
- "version": "0.15.23",
+ "version": "0.15.25",
"description": "",
"type": "module",
"scripts": {
diff --git a/packages/desktop/src/components/prompt-input.tsx b/packages/desktop/src/components/prompt-input.tsx
index e6701bddc..d6276c158 100644
--- a/packages/desktop/src/components/prompt-input.tsx
+++ b/packages/desktop/src/components/prompt-input.tsx
@@ -393,9 +393,11 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
<img src={`https://models.dev/logos/${i.provider.id}.svg`} class="size-6 p-0.5 shrink-0 " />
<div class="flex gap-x-3 items-baseline flex-[1_0_0]">
<span class="text-14-medium text-text-strong overflow-hidden text-ellipsis">{i.name}</span>
- <span class="text-12-medium text-text-weak overflow-hidden text-ellipsis truncate min-w-0">
- {DateTime.fromFormat(i.release_date, "yyyy-MM-dd").toFormat("LLL yyyy")}
- </span>
+ <Show when={i.release_date}>
+ <span class="text-12-medium text-text-weak overflow-hidden text-ellipsis truncate min-w-0">
+ {DateTime.fromFormat(i.release_date, "yyyy-MM-dd").toFormat("LLL yyyy")}
+ </span>
+ </Show>
</div>
</div>
<Show when={!i.cost || i.cost?.input === 0}>
diff --git a/packages/desktop/src/context/local.tsx b/packages/desktop/src/context/local.tsx
index 91c1d688f..9c4d70fc5 100644
--- a/packages/desktop/src/context/local.tsx
+++ b/packages/desktop/src/context/local.tsx
@@ -481,7 +481,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
if (!message) return ""
if (Array.isArray(message)) return message.map((m) => getMessageText(m)).join(" ")
const fileParts = sync.data.part[message.id]?.filter((p) => p.type === "file")
- console.log(fileParts)
return sync.data.part[message.id]
?.filter((p) => p.type === "text")
diff --git a/packages/function/package.json b/packages/function/package.json
index 837f093b0..1bd7bc493 100644
--- a/packages/function/package.json
+++ b/packages/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/function",
- "version": "0.15.23",
+ "version": "0.15.25",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index ce7934b10..541a38e4a 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "0.15.23",
+ "version": "0.15.25",
"name": "opencode",
"type": "module",
"private": true,
diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts
index 19c6674cc..f2df5b409 100644
--- a/packages/opencode/src/installation/index.ts
+++ b/packages/opencode/src/installation/index.ts
@@ -142,7 +142,9 @@ export namespace Installation {
export const USER_AGENT = `opencode/${CHANNEL}/${VERSION}`
export async function latest() {
- return fetch(`https://registry.npmjs.org/opencode-ai/${CHANNEL}`)
+ const [major] = VERSION.split(".").map((x) => Number(x))
+ const channel = CHANNEL === "latest" ? `latest-${major}` : CHANNEL
+ return fetch(`https://registry.npmjs.org/opencode-ai/${channel}`)
.then((res) => {
if (!res.ok) throw new Error(res.statusText)
return res.json()
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 144d61d18..32c72e23e 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -286,7 +286,11 @@ export namespace SessionPrompt {
OUTPUT_TOKEN_MAX,
),
abortSignal: abort.signal,
- providerOptions: ProviderTransform.providerOptions(model.npm, model.providerID, params.options),
+ providerOptions: ProviderTransform.providerOptions(
+ model.npm,
+ model.providerID,
+ params.options,
+ ),
stopWhen: stepCountIs(1),
temperature: params.temperature,
topP: params.topP,
@@ -321,7 +325,11 @@ export namespace SessionPrompt {
async transformParams(args) {
if (args.type === "stream") {
// @ts-expect-error
- args.params.prompt = ProviderTransform.message(args.params.prompt, model.providerID, model.modelID)
+ args.params.prompt = ProviderTransform.message(
+ args.params.prompt,
+ model.providerID,
+ model.modelID,
+ )
}
return args.params
},
@@ -504,7 +512,11 @@ export namespace SessionPrompt {
)
for (const item of await ToolRegistry.tools(input.providerID, input.modelID)) {
if (Wildcard.all(item.id, enabledTools) === false) continue
- const schema = ProviderTransform.schema(input.providerID, input.modelID, z.toJSONSchema(item.parameters))
+ const schema = ProviderTransform.schema(
+ input.providerID,
+ input.modelID,
+ z.toJSONSchema(item.parameters),
+ )
tools[item.id] = tool({
id: item.id as any,
description: item.description,
@@ -521,6 +533,7 @@ export namespace SessionPrompt {
args,
},
)
+ item.parameters.parse(args)
const result = await item.execute(args, {
sessionID: input.sessionID,
abort: options.abortSignal!,
@@ -585,17 +598,7 @@ export namespace SessionPrompt {
args,
},
)
- const result = await execute(args, opts).catch((err: unknown) => {
- log.error("Error executing tool", { error: err, tool: key })
- return {
- content: [
- {
- type: "text",
- text: `Failed to execute tool: ${err instanceof Error ? err.message : String(err)}`,
- },
- ],
- }
- })
+ const result = await execute(args, opts)
await Plugin.trigger(
"tool.execute.after",
@@ -809,7 +812,9 @@ export namespace SessionPrompt {
messageID: info.id,
sessionID: input.sessionID,
type: "file",
- url: `data:${part.mime};base64,` + Buffer.from(await file.bytes()).toString("base64"),
+ url:
+ `data:${part.mime};base64,` +
+ Buffer.from(await file.bytes()).toString("base64"),
mime: part.mime,
filename: part.filename!,
source: part.source,
@@ -883,7 +888,9 @@ export namespace SessionPrompt {
synthetic: true,
})
}
- const wasPlan = input.messages.some((msg) => msg.info.role === "assistant" && msg.info.mode === "plan")
+ const wasPlan = input.messages.some(
+ (msg) => msg.info.role === "assistant" && msg.info.mode === "plan",
+ )
if (wasPlan && input.agent.name === "build") {
userMessage.parts.push({
id: Identifier.ascending("part"),
@@ -963,7 +970,10 @@ export namespace SessionPrompt {
partFromToolCall(toolCallID: string) {
return toolcalls[toolCallID]
},
- async process(stream: StreamTextResult<Record<string, AITool>, never>, retries: { count: number; max: number }) {
+ async process(
+ stream: StreamTextResult<Record<string, AITool>, never>,
+ retries: { count: number; max: number },
+ ) {
log.info("process")
if (!assistantMsg) throw new Error("call next() first before processing")
let shouldRetry = false
@@ -1094,7 +1104,10 @@ export namespace SessionPrompt {
status: "error",
input: value.input,
error: (value.error as any).toString(),
- metadata: value.error instanceof Permission.RejectedError ? value.error.metadata : undefined,
+ metadata:
+ value.error instanceof Permission.RejectedError
+ ? value.error.metadata
+ : undefined,
time: {
start: match.state.time.start,
end: Date.now(),
@@ -1218,7 +1231,11 @@ export namespace SessionPrompt {
error: e,
})
const error = MessageV2.fromError(e, { providerID: input.providerID })
- if (retries.count < retries.max && MessageV2.APIError.isInstance(error) && error.data.isRetryable) {
+ if (
+ retries.count < retries.max &&
+ MessageV2.APIError.isInstance(error) &&
+ error.data.isRetryable
+ ) {
shouldRetry = true
await Session.updatePart({
id: Identifier.ascending("part"),
@@ -1241,7 +1258,11 @@ export namespace SessionPrompt {
}
const p = await Session.getParts(assistantMsg.id)
for (const part of p) {
- if (part.type === "tool" && part.state.status !== "completed" && part.state.status !== "error") {
+ if (
+ part.type === "tool" &&
+ part.state.status !== "completed" &&
+ part.state.status !== "error"
+ ) {
Session.updatePart({
...part,
state: {
@@ -1705,11 +1726,13 @@ export namespace SessionPrompt {
if (input.session.parentID) return
if (!Session.isDefaultTitle(input.session.title)) return
const isFirst =
- input.history.filter((m) => m.info.role === "user" && !m.parts.every((p) => "synthetic" in p && p.synthetic))
- .length === 1
+ input.history.filter(
+ (m) => m.info.role === "user" && !m.parts.every((p) => "synthetic" in p && p.synthetic),
+ ).length === 1
if (!isFirst) return
const small =
- (await Provider.getSmallModel(input.providerID)) ?? (await Provider.getModel(input.providerID, input.modelID))
+ (await Provider.getSmallModel(input.providerID)) ??
+ (await Provider.getModel(input.providerID, input.modelID))
const options = {
...ProviderTransform.options(small.providerID, small.modelID, input.session.id),
...small.info.options,
diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts
index 2a31f39ea..744465dcf 100644
--- a/packages/opencode/src/session/summary.ts
+++ b/packages/opencode/src/session/summary.ts
@@ -29,7 +29,15 @@ export namespace SessionSummary {
)
async function summarizeSession(input: { sessionID: string; messages: MessageV2.WithParts[] }) {
- const diffs = await computeDiff({ messages: input.messages })
+ const files = new Set(
+ input.messages
+ .flatMap((x) => x.parts)
+ .filter((x) => x.type === "patch")
+ .flatMap((x) => x.files),
+ )
+ const diffs = await computeDiff({ messages: input.messages }).then((x) =>
+ x.filter((x) => files.has(x.file)),
+ )
await Session.update(input.sessionID, (draft) => {
draft.summary = {
diffs,
@@ -39,7 +47,9 @@ export namespace SessionSummary {
async function summarizeMessage(input: { messageID: string; messages: MessageV2.WithParts[] }) {
const messages = input.messages.filter(
- (m) => m.info.id === input.messageID || (m.info.role === "assistant" && m.info.parentID === input.messageID),
+ (m) =>
+ m.info.id === input.messageID ||
+ (m.info.role === "assistant" && m.info.parentID === input.messageID),
)
const msgWithParts = messages.find((m) => m.info.id === input.messageID)!
const userMsg = msgWithParts.info as MessageV2.User
@@ -50,11 +60,14 @@ export namespace SessionSummary {
}
await Session.updateMessage(userMsg)
- const assistantMsg = messages.find((m) => m.info.role === "assistant")!.info as MessageV2.Assistant
+ const assistantMsg = messages.find((m) => m.info.role === "assistant")!
+ .info as MessageV2.Assistant
const small = await Provider.getSmallModel(assistantMsg.providerID)
if (!small) return
- const textPart = msgWithParts.parts.find((p) => p.type === "text" && !p.synthetic) as MessageV2.TextPart
+ const textPart = msgWithParts.parts.find(
+ (p) => p.type === "text" && !p.synthetic,
+ ) as MessageV2.TextPart
if (textPart && !userMsg.summary?.title) {
const result = await generateText({
maxOutputTokens: small.info.reasoning ? 1500 : 20,
@@ -81,7 +94,8 @@ export namespace SessionSummary {
if (
messages.some(
(m) =>
- m.info.role === "assistant" && m.parts.some((p) => p.type === "step-finish" && p.reason !== "tool-calls"),
+ m.info.role === "assistant" &&
+ m.parts.some((p) => p.type === "step-finish" && p.reason !== "tool-calls"),
)
) {
const result = await generateText({
@@ -114,7 +128,9 @@ export namespace SessionSummary {
let all = await Session.messages(input.sessionID)
if (input.messageID)
all = all.filter(
- (x) => x.info.id === input.messageID || (x.info.role === "assistant" && x.info.parentID === input.messageID),
+ (x) =>
+ x.info.id === input.messageID ||
+ (x.info.role === "assistant" && x.info.parentID === input.messageID),
)
return computeDiff({
diff --git a/packages/plugin/package.json b/packages/plugin/package.json
index 037cdb646..85a2df16b 100644
--- a/packages/plugin/package.json
+++ b/packages/plugin/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin",
- "version": "0.15.23",
+ "version": "0.15.25",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json
index 46ceefd0c..de13658bf 100644
--- a/packages/sdk/js/package.json
+++ b/packages/sdk/js/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk",
- "version": "0.15.23",
+ "version": "0.15.25",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
diff --git a/packages/sdk/js/src/gen/sdk.gen.ts b/packages/sdk/js/src/gen/sdk.gen.ts
index 42e575dc2..5eb12b0f5 100644
--- a/packages/sdk/js/src/gen/sdk.gen.ts
+++ b/packages/sdk/js/src/gen/sdk.gen.ts
@@ -125,6 +125,10 @@ import type {
TuiExecuteCommandErrors,
TuiShowToastData,
TuiShowToastResponses,
+ TuiControlNextData,
+ TuiControlNextResponses,
+ TuiControlResponseData,
+ TuiControlResponseResponses,
AuthSetData,
AuthSetResponses,
AuthSetErrors,
@@ -750,6 +754,40 @@ class Mcp extends _HeyApiClient {
}
}
+class Control extends _HeyApiClient {
+ /**
+ * Get the next TUI request from the queue
+ */
+ public next<ThrowOnError extends boolean = false>(
+ options?: Options<TuiControlNextData, ThrowOnError>,
+ ) {
+ return (options?.client ?? this._client).get<TuiControlNextResponses, unknown, ThrowOnError>({
+ url: "/tui/control/next",
+ ...options,
+ })
+ }
+
+ /**
+ * Submit a response to the TUI request queue
+ */
+ public response<ThrowOnError extends boolean = false>(
+ options?: Options<TuiControlResponseData, ThrowOnError>,
+ ) {
+ return (options?.client ?? this._client).post<
+ TuiControlResponseResponses,
+ unknown,
+ ThrowOnError
+ >({
+ url: "/tui/control/response",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options?.headers,
+ },
+ })
+ }
+}
+
class Tui extends _HeyApiClient {
/**
* Append prompt to the TUI
@@ -878,6 +916,7 @@ class Tui extends _HeyApiClient {
},
})
}
+ control = new Control({ client: this._client })
}
class Auth extends _HeyApiClient {
diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts
index 0b8948c57..14343f5a1 100644
--- a/packages/sdk/js/src/gen/types.gen.ts
+++ b/packages/sdk/js/src/gen/types.gen.ts
@@ -2632,6 +2632,46 @@ export type TuiShowToastResponses = {
export type TuiShowToastResponse = TuiShowToastResponses[keyof TuiShowToastResponses]
+export type TuiControlNextData = {
+ body?: never
+ path?: never
+ query?: {
+ directory?: string
+ }
+ url: "/tui/control/next"
+}
+
+export type TuiControlNextResponses = {
+ /**
+ * Next TUI request
+ */
+ 200: {
+ path: string
+ body: unknown
+ }
+}
+
+export type TuiControlNextResponse = TuiControlNextResponses[keyof TuiControlNextResponses]
+
+export type TuiControlResponseData = {
+ body?: unknown
+ path?: never
+ query?: {
+ directory?: string
+ }
+ url: "/tui/control/response"
+}
+
+export type TuiControlResponseResponses = {
+ /**
+ * Response submitted successfully
+ */
+ 200: boolean
+}
+
+export type TuiControlResponseResponse =
+ TuiControlResponseResponses[keyof TuiControlResponseResponses]
+
export type AuthSetData = {
body?: Auth
path: {
diff --git a/packages/slack/package.json b/packages/slack/package.json
index 933136c08..2efcccc70 100644
--- a/packages/slack/package.json
+++ b/packages/slack/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/slack",
- "version": "0.15.23",
+ "version": "0.15.25",
"type": "module",
"scripts": {
"dev": "bun run src/index.ts",
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 888bfc369..74c90f5a9 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
- "version": "0.15.23",
+ "version": "0.15.25",
"type": "module",
"exports": {
".": "./src/components/index.ts",
diff --git a/packages/web/package.json b/packages/web/package.json
index 80c88ebfc..dc8f0fef0 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/web",
"type": "module",
- "version": "0.15.23",
+ "version": "0.15.25",
"scripts": {
"dev": "astro dev",
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",
diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json
index c3b801178..af0918f91 100644
--- a/sdks/vscode/package.json
+++ b/sdks/vscode/package.json
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
- "version": "0.15.23",
+ "version": "0.15.25",
"publisher": "sst-dev",
"repository": {
"type": "git",