Compare commits

..

6 Commits

Author SHA1 Message Date
James Long 12395c37ad refactor(core): route aggregate layers through nodes 2026-06-30 10:25:13 -04:00
James Long c86066efef test(opencode): update help snapshots (#34639) 2026-06-30 10:22:21 -04:00
usrnk1 fa9ba2938e feat(desktop): make error view draggable (#34627) 2026-06-30 22:12:43 +08:00
usrnk1 63e24880e5 feat(desktop): polish inline session title editing (#34607) 2026-06-30 22:12:22 +08:00
opencode-agent[bot] eaf42c4ab0 chore: update nix node_modules hashes 2026-06-30 13:55:24 +00:00
Aiden Cline 8e10ab0aa7 chore: bump venice provider (#34629) 2026-06-30 08:40:09 -05:00
10 changed files with 90 additions and 88 deletions
+9 -5
View File
@@ -334,7 +334,7 @@
"npm-package-arg": "13.0.2", "npm-package-arg": "13.0.2",
"semver": "^7.6.3", "semver": "^7.6.3",
"turndown": "7.2.0", "turndown": "7.2.0",
"venice-ai-sdk-provider": "2.0.2", "venice-ai-sdk-provider": "2.1.1",
"which": "6.0.1", "which": "6.0.1",
"xdg-basedir": "5.1.0", "xdg-basedir": "5.1.0",
"zod": "catalog:", "zod": "catalog:",
@@ -637,7 +637,7 @@
"tree-sitter-powershell": "0.25.10", "tree-sitter-powershell": "0.25.10",
"turndown": "7.2.0", "turndown": "7.2.0",
"ulid": "catalog:", "ulid": "catalog:",
"venice-ai-sdk-provider": "2.0.2", "venice-ai-sdk-provider": "2.1.1",
"vscode-jsonrpc": "8.2.1", "vscode-jsonrpc": "8.2.1",
"web-tree-sitter": "0.25.10", "web-tree-sitter": "0.25.10",
"ws": "8.21.0", "ws": "8.21.0",
@@ -5429,7 +5429,7 @@
"vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
"venice-ai-sdk-provider": ["venice-ai-sdk-provider@2.0.2", "", { "dependencies": { "@ai-sdk/openai-compatible": "^2.0.47", "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.27" }, "peerDependencies": { "ai": "^6.0.90" } }, "sha512-aoa05nI3BTK5aGbjBflq+Gfln2AHAkwNbWuGGvCzUIsOfp5Y3iPD4O4PUGDAEiWVJWbjpPn0KfDa0H/HebwsaA=="], "venice-ai-sdk-provider": ["venice-ai-sdk-provider@2.1.1", "", { "dependencies": { "@ai-sdk/openai-compatible": "^2.0.51", "@ai-sdk/provider": "^3.0.10", "@ai-sdk/provider-utils": "^4.0.30" }, "peerDependencies": { "ai": "^6.0.90" } }, "sha512-w3OHkuzzKZ3r2TOxER6myBYzZJNoDqol+DUHu3NnfBN/GETnUVxecZJab0CHQQ8GZc0jjzpFymepjcLDPS4SQg=="],
"verror": ["verror@1.10.1", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg=="], "verror": ["verror@1.10.1", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg=="],
@@ -6449,11 +6449,11 @@
"unzipper/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], "unzipper/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
"venice-ai-sdk-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.47", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Enm5UlL0zUCrW3792opk5h7hRWxZOZzDe6eQYVFqX9LUOGGCe1h8MZWAGim765nwzgnjlpeYOsuzZmLtRsTPlg=="], "venice-ai-sdk-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.53", "", { "dependencies": { "@ai-sdk/provider": "3.0.12", "@ai-sdk/provider-utils": "4.0.32" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SoPSkrL5cbNQnAljRsJ7pOzJ2FmWgnhC0lfFOda873ycCdFJL1A+h3Ib7mX2spcv3XnNaO13y/45/0RyqNWlIQ=="],
"venice-ai-sdk-provider/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="], "venice-ai-sdk-provider/@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
"venice-ai-sdk-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="], "venice-ai-sdk-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.32", "", { "dependencies": { "@ai-sdk/provider": "3.0.12", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Kwj499fTcN9bP/AfGoPU7JWIXeP6VZqKI6omsH062c9E2G4gdjeJczkz4z/tYSkzYjLE2AI3DtZbMfs6D7vn2Q=="],
"verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
@@ -7073,6 +7073,10 @@
"unzipper/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], "unzipper/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
"venice-ai-sdk-provider/@ai-sdk/openai-compatible/@ai-sdk/provider": ["@ai-sdk/provider@3.0.12", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-sj9DWTJ2Ze0WR9qsiOPqoqzNx3OxL6iMxHImbhvoe9qOspekbzxNDMiJ4TIGfYHYh9w4OmBjz3prvqhzTi96+Q=="],
"venice-ai-sdk-provider/@ai-sdk/provider-utils/@ai-sdk/provider": ["@ai-sdk/provider@3.0.12", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-sj9DWTJ2Ze0WR9qsiOPqoqzNx3OxL6iMxHImbhvoe9qOspekbzxNDMiJ4TIGfYHYh9w4OmBjz3prvqhzTi96+Q=="],
"venice-ai-sdk-provider/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "venice-ai-sdk-provider/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
"vitest/@vitest/expect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "vitest/@vitest/expect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+4 -4
View File
@@ -1,8 +1,8 @@
{ {
"nodeModules": { "nodeModules": {
"x86_64-linux": "sha256-JXQ9PAqqRlJtHa8T3ZxqdRRyxC+0ip+2wSnehvKXUbI=", "x86_64-linux": "sha256-An7vZmA+sVlxoSOMK4vQvkq3KJOF6Rm9IBU62LN3Hkg=",
"aarch64-linux": "sha256-nI+RaxDXmAcjhSjCtIvyi292xBEg0E5NXaoyGrJE69s=", "aarch64-linux": "sha256-Hx4trrBLxRDyY4HQc96EQZUa8abIeetNvE8GtRFvrrc=",
"aarch64-darwin": "sha256-UleKpm7Khf3kibm4BqZJ9bmu0N2kOjNd77g1Bd2tmfw=", "aarch64-darwin": "sha256-/eXdkybUkDCrfQRCkZHsgCa3BM/OfaQzH/z7OxwlpVM=",
"x86_64-darwin": "sha256-V4AQH868dOfVhEj1mKTnZlhpZwFqBYsHS28Tx9VXHkE=" "x86_64-darwin": "sha256-flhsuFXikpI8tzK7nTwIVF/jzpmb5p+BWxGa/5vhN54="
} }
} }
+18 -35
View File
@@ -1,6 +1,6 @@
import { createSimpleContext } from "@opencode-ai/ui/context" import { createSimpleContext } from "@opencode-ai/ui/context"
import { base64Encode } from "@opencode-ai/core/util/encode" import { base64Encode } from "@opencode-ai/core/util/encode"
import { useParams, useSearchParams } from "@solidjs/router" import { useParams } from "@solidjs/router"
import { batch, createEffect, createMemo, startTransition } from "solid-js" import { batch, createEffect, createMemo, startTransition } from "solid-js"
import { createStore } from "solid-js/store" import { createStore } from "solid-js/store"
import { useModels } from "@/context/models" import { useModels } from "@/context/models"
@@ -18,12 +18,10 @@ type State = {
agent?: string agent?: string
model?: ModelKey model?: ModelKey
variant?: string | null variant?: string | null
source?: "manual" | "message"
} }
type Saved = { type Saved = {
session: Record<string, State | undefined> session: Record<string, State | undefined>
draft?: State
} }
const WORKSPACE_KEY = "__workspace__" const WORKSPACE_KEY = "__workspace__"
@@ -39,13 +37,11 @@ const migrate = (value: unknown) => {
pick?: Record<string, State | undefined> pick?: Record<string, State | undefined>
} }
const draft = "draft" in item && item.draft && typeof item.draft === "object" ? (item.draft as State) : undefined if (item.session && typeof item.session === "object") return { session: item.session }
if (item.session && typeof item.session === "object") return { session: item.session, draft }
if (!item.pick || typeof item.pick !== "object") return { session: {} } if (!item.pick || typeof item.pick !== "object") return { session: {} }
return { return {
session: Object.fromEntries(Object.entries(item.pick).filter(([key]) => key !== WORKSPACE_KEY)), session: Object.fromEntries(Object.entries(item.pick).filter(([key]) => key !== WORKSPACE_KEY)),
draft,
} }
} }
@@ -61,7 +57,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
name: "Local", name: "Local",
init: () => { init: () => {
const params = useParams() const params = useParams()
const [search] = useSearchParams<{ draftId?: string }>()
const sdk = useSDK() const sdk = useSDK()
const sync = useSync() const sync = useSync()
const serverSDK = useServerSDK() const serverSDK = useServerSDK()
@@ -69,15 +64,12 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const models = useModels() const models = useModels()
const id = createMemo(() => params.id || undefined) const id = createMemo(() => params.id || undefined)
const draftID = createMemo(() => search.draftId || undefined)
const list = createMemo(() => sync().data.agent.filter((item) => item.mode !== "subagent" && !item.hidden)) const list = createMemo(() => sync().data.agent.filter((item) => item.mode !== "subagent" && !item.hidden))
const connected = createMemo(() => new Set(providers.connected().map((item) => item.id))) const connected = createMemo(() => new Set(providers.connected().map((item) => item.id)))
const [saved, setSaved] = persisted( const [saved, setSaved] = persisted(
{ {
...(draftID() ...Persist.serverWorkspace(serverSDK().scope, sdk().directory, "model-selection", ["model-selection.v1"]),
? Persist.draft(draftID()!, "model-selection")
: Persist.serverWorkspace(serverSDK().scope, sdk().directory, "model-selection", ["model-selection.v1"])),
migrate, migrate,
}, },
createStore<Saved>({ createStore<Saved>({
@@ -132,7 +124,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const scope = createMemo<State | undefined>(() => { const scope = createMemo<State | undefined>(() => {
const session = id() const session = id()
if (!session) return saved.draft ?? store.draft ?? store.promoting if (!session) return store.draft ?? store.promoting
return saved.session[session] ?? handoff.get(handoffKey(serverSDK().scope, sdk().directory, session)) return saved.session[session] ?? handoff.get(handoffKey(serverSDK().scope, sdk().directory, session))
}) })
@@ -186,19 +178,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const fallback = createMemo<ModelKey | undefined>(() => configuredModel() ?? recentModel() ?? defaultModel()) const fallback = createMemo<ModelKey | undefined>(() => configuredModel() ?? recentModel() ?? defaultModel())
const save = (state: State) => {
const session = id()
if (session) {
setSaved("session", session, state)
return
}
if (draftID()) {
setSaved("draft", state)
return
}
setStore("draft", state)
}
const agent = { const agent = {
list, list,
current() { current() {
@@ -224,9 +203,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
agent: item.name, agent: item.name,
model: item.model ?? prev?.model, model: item.model ?? prev?.model,
variant: item.variant ?? prev?.variant, variant: item.variant ?? prev?.variant,
source: "manual",
} satisfies State } satisfies State
save(next) const session = id()
if (session) {
setSaved("session", session, next)
return
}
setStore("draft", next)
}) })
}, },
move(direction: 1 | -1) { move(direction: 1 | -1) {
@@ -280,10 +263,14 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const state = { const state = {
...(scope() ?? { agent: agent.current()?.name }), ...(scope() ?? { agent: agent.current()?.name }),
...next, ...next,
source: "manual",
} satisfies State } satisfies State
save(state) const session = id()
if (session) {
setSaved("session", session, state)
return
}
setStore("draft", state)
} }
const recent = createMemo(() => models.recent.list().map(models.find).filter(Boolean)) const recent = createMemo(() => models.recent.list().map(models.find).filter(Boolean))
@@ -390,12 +377,10 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
session: { session: {
reset() { reset() {
setStore({ draft: undefined, promoting: undefined }) setStore({ draft: undefined, promoting: undefined })
if (draftID()) setSaved("draft", undefined)
}, },
promote(dir: string, session: string) { promote(dir: string, session: string) {
const next = clone(snapshot()) const next = clone(snapshot())
if (!next) return if (!next) return
next.source = "manual"
const key = handoffKey(serverSDK().scope, dir, session) const key = handoffKey(serverSDK().scope, dir, session)
handoff.set(key, next) handoff.set(key, next)
@@ -406,19 +391,17 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
setStore("promoting", next) setStore("promoting", next)
setStore("draft", undefined) setStore("draft", undefined)
}, },
restore(msg: { id?: string; sessionID: string; agent: string; model: ModelKey }) { restore(msg: { sessionID: string; agent: string; model: ModelKey }) {
const session = id() const session = id()
if (!session) return if (!session) return
if (msg.sessionID !== session) return if (msg.sessionID !== session) return
const current = saved.session[session] if (saved.session[session] !== undefined) return
if (current?.source === "manual") return
if (handoff.has(handoffKey(serverSDK().scope, sdk().directory, session))) return if (handoff.has(handoffKey(serverSDK().scope, sdk().directory, session))) return
setSaved("session", session, { setSaved("session", session, {
agent: msg.agent, agent: msg.agent,
model: msg.model, model: msg.model,
variant: msg.model?.variant ?? null, variant: msg.model?.variant ?? null,
source: "message",
}) })
}, },
}, },
+4 -1
View File
@@ -276,7 +276,10 @@ export const ErrorPage: Component<ErrorPageProps> = (props) => {
} }
return ( return (
<div class="relative flex-1 h-screen w-screen min-h-0 flex flex-col items-center justify-center bg-background-base font-sans"> <div
class="relative flex-1 h-screen w-screen min-h-0 flex flex-col items-center justify-center bg-background-base font-sans"
data-tauri-drag-region
>
<div class="w-2/3 max-w-3xl flex flex-col items-center justify-center gap-8"> <div class="w-2/3 max-w-3xl flex flex-col items-center justify-center gap-8">
<Logo class="w-58.5 opacity-12 shrink-0" /> <Logo class="w-58.5 opacity-12 shrink-0" />
<div class="flex flex-col items-center gap-2 text-center"> <div class="flex flex-col items-center gap-2 text-center">
@@ -736,8 +736,9 @@ export function MessageTimeline(props: {
if (!sessionID() || parentID()) return if (!sessionID() || parentID()) return
setTitle({ editing: true, draft: titleLabel() ?? "" }) setTitle({ editing: true, draft: titleLabel() ?? "" })
requestAnimationFrame(() => { requestAnimationFrame(() => {
titleRef?.focus() if (!titleRef) return
titleRef?.select() titleRef.focus()
titleRef.select()
}) })
} }
@@ -1369,7 +1370,7 @@ export function MessageTimeline(props: {
"pr-3": !settings.general.newLayoutDesigns(), "pr-3": !settings.general.newLayoutDesigns(),
}} }}
> >
<div class="flex items-center min-w-0 grow-1"> <div class="flex items-center min-w-0 flex-1 w-full">
<Show when={parentID()}> <Show when={parentID()}>
<button <button
type="button" type="button"
@@ -1413,9 +1414,9 @@ export function MessageTimeline(props: {
value={title.draft} value={title.draft}
disabled={titleMutation.isPending} disabled={titleMutation.isPending}
classList={{ classList={{
"text-14-medium text-text-strong grow-1 min-w-0 pl-1 ml-1": true, "text-14-medium text-text-strong block": true,
"grow-1 min-w-0 pl-1 -ml-1 rounded-[6px]": !settings.general.newLayoutDesigns(), "w-full flex-1 grow-1 min-w-0 pl-1 -ml-1 rounded-[6px]": !settings.general.newLayoutDesigns(),
"rounded-[6px] -ml-2 px-2 py-1 h-6 leading-4 focus:shadow-none focus:outline focus:outline-1 focus:outline-offset-[-1px] focus:outline-v2-border-border-focus": "field-sizing-content self-start rounded-[6px] px-2 py-1 ":
settings.general.newLayoutDesigns(), settings.general.newLayoutDesigns(),
}} }}
style={{ style={{
+1 -1
View File
@@ -121,7 +121,7 @@
"npm-package-arg": "13.0.2", "npm-package-arg": "13.0.2",
"semver": "^7.6.3", "semver": "^7.6.3",
"turndown": "7.2.0", "turndown": "7.2.0",
"venice-ai-sdk-provider": "2.0.2", "venice-ai-sdk-provider": "2.1.1",
"which": "6.0.1", "which": "6.0.1",
"xdg-basedir": "5.1.0", "xdg-basedir": "5.1.0",
"zod": "catalog:" "zod": "catalog:"
+2 -1
View File
@@ -9,6 +9,7 @@ import { Global } from "./global"
import { EffectFlock } from "./util/effect-flock" import { EffectFlock } from "./util/effect-flock"
import { makeGlobalNode } from "./effect/app-node" import { makeGlobalNode } from "./effect/app-node"
import { filesystem } from "./effect/app-node-platform" import { filesystem } from "./effect/app-node-platform"
import { LayerNode } from "./effect/layer-node"
import { makeRuntime } from "./effect/runtime" import { makeRuntime } from "./effect/runtime"
import { NpmConfig } from "./npm-config" import { NpmConfig } from "./npm-config"
@@ -259,7 +260,7 @@ export const node = makeGlobalNode({
deps: [FSUtil.node, Global.node, filesystem, EffectFlock.node], deps: [FSUtil.node, Global.node, filesystem, EffectFlock.node],
}) })
const { runPromise } = makeRuntime(Service, defaultLayer) const { runPromise } = makeRuntime(Service, LayerNode.compile(node))
export async function install(...args: Parameters<Interface["install"]>) { export async function install(...args: Parameters<Interface["install"]>) {
return runPromise((svc) => svc.install(...args)) return runPromise((svc) => svc.install(...args))
+5 -3
View File
@@ -206,6 +206,8 @@ export const cleanupLayer = Layer.effectDiscard(
}), }),
) )
export const defaultCleanupLayer = Layer.merge(defaultLayer, cleanupLayer.pipe(Layer.provide(defaultLayer))) export const cleanupNode = makeGlobalNode({
name: "tool-output-cleanup",
export const cleanupNode = makeGlobalNode({ name: "tool-output-cleanup", layer: defaultCleanupLayer, deps: [] }) layer: Layer.merge(layer, cleanupLayer.pipe(Layer.provide(layer))),
deps: [FSUtil.node, Global.node],
})
+1 -1
View File
@@ -143,7 +143,7 @@
"tree-sitter-powershell": "0.25.10", "tree-sitter-powershell": "0.25.10",
"turndown": "7.2.0", "turndown": "7.2.0",
"ulid": "catalog:", "ulid": "catalog:",
"venice-ai-sdk-provider": "2.0.2", "venice-ai-sdk-provider": "2.1.1",
"vscode-jsonrpc": "8.2.1", "vscode-jsonrpc": "8.2.1",
"web-tree-sitter": "0.25.10", "web-tree-sitter": "0.25.10",
"ws": "8.21.0", "ws": "8.21.0",
@@ -76,39 +76,47 @@ Positionals:
message message to send [array] [default: []] message message to send [array] [default: []]
Options: Options:
-h, --help show help [boolean] -h, --help show help [boolean]
-v, --version show version number [boolean] -v, --version show version number [boolean]
--print-logs print logs to stderr [boolean] --print-logs print logs to stderr [boolean]
--log-level log level [string] [choices: "DEBUG", "INFO", "WARN", "ERROR"] --log-level log level
--pure run without external plugins [boolean] [string] [choices: "DEBUG", "INFO", "WARN", "ERROR"]
--command the command to run, use message for args [string] --pure run without external plugins [boolean]
-c, --continue continue the last session [boolean] --command the command to run, use message for args
-s, --session session id to continue [string] [string]
--fork fork the session before continuing (requires --continue or -c, --continue continue the last session [boolean]
--session) [boolean] -s, --session session id to continue [string]
--share share the session [boolean] --fork fork the session before continuing (requires
-m, --model model to use in the format of provider/model [string] --continue or --session) [boolean]
--agent agent to use [string] --share share the session [boolean]
--format format: default (formatted) or json (raw JSON events) -m, --model model to use in the format of provider/model
[string]
--agent agent to use [string]
--format format: default (formatted) or json (raw JSON
events)
[string] [choices: "default", "json"] [default: "default"] [string] [choices: "default", "json"] [default: "default"]
-f, --file file(s) to attach to message [array] -f, --file file(s) to attach to message [array]
--title title for the session (uses truncated prompt if no value --title title for the session (uses truncated prompt
provided) [string] if no value provided) [string]
--attach attach to a running opencode server (e.g., --attach attach to a running opencode server (e.g.,
http://localhost:4096) [string] http://localhost:4096) [string]
-p, --password basic auth password (defaults to OPENCODE_SERVER_PASSWORD) -p, --password basic auth password (defaults to
OPENCODE_SERVER_PASSWORD) [string]
-u, --username basic auth username (defaults to
OPENCODE_SERVER_USERNAME or 'opencode')
[string] [string]
-u, --username basic auth username (defaults to OPENCODE_SERVER_USERNAME or --dir directory to run in, path on remote server if
'opencode') [string] attaching [string]
--dir directory to run in, path on remote server if attaching --port port for the local server (defaults to random
[string] port if no value provided) [number]
--port port for the local server (defaults to random port if no value --variant model variant (provider-specific reasoning
provided) [number] effort, e.g., high, max, minimal) [string]
--variant model variant (provider-specific reasoning effort, e.g., high, --thinking show thinking blocks [boolean]
max, minimal) [string] -i, --interactive run in direct interactive split-footer mode
--thinking show thinking blocks [boolean] [boolean] [default: false]
--dangerously-skip-permissions auto-approve permissions that are not explicitly denied --auto, --yolo, --dangerously-skip-permissions auto-approve permissions that are not
(dangerous!) [boolean] [default: false]" explicitly denied (dangerous!)
[boolean] [default: false]"
`; `;
exports[`opencode CLI help-text snapshots every documented command emits stable help text: opencode debug --help 1`] = ` exports[`opencode CLI help-text snapshots every documented command emits stable help text: opencode debug --help 1`] = `