From a4330a225dda8aa088423ce3be88f7fad30fb862 Mon Sep 17 00:00:00 2001 From: James Long Date: Tue, 10 Mar 2026 11:12:51 -0400 Subject: [PATCH] feat(core): allow passing `workspaceID` into session create endpoint (#16798) --- packages/opencode/src/cli/cmd/tui/app.tsx | 3 +++ .../src/cli/cmd/tui/component/dialog-workspace-list.tsx | 2 +- .../opencode/src/cli/cmd/tui/component/prompt/index.tsx | 5 ++++- packages/opencode/src/cli/cmd/tui/context/route.tsx | 1 + packages/opencode/src/cli/cmd/tui/routes/home.tsx | 1 + packages/opencode/src/session/index.ts | 6 +++++- packages/sdk/js/src/v2/gen/sdk.gen.ts | 2 ++ packages/sdk/js/src/v2/gen/types.gen.ts | 1 + 8 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index d5aef34f6..4f7c94b1d 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -402,9 +402,12 @@ function App() { const current = promptRef.current // Don't require focus - if there's any text, preserve it const currentPrompt = current?.current?.input ? current.current : undefined + const workspaceID = + route.data.type === "session" ? sync.session.get(route.data.sessionID)?.workspaceID : undefined route.navigate({ type: "home", initialPrompt: currentPrompt, + workspaceID, }) dialog.clear() }, diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-workspace-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-workspace-list.tsx index a25b20505..b11ad6a73 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-workspace-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-workspace-list.tsx @@ -47,7 +47,7 @@ async function openWorkspace(input: { } let created: Session | undefined while (!created) { - const result = await client.session.create({}).catch(() => undefined) + const result = await client.session.create({ workspaceID: input.workspaceID }).catch(() => undefined) if (!result) { input.toast.show({ message: "Failed to open workspace", diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 77577b2a0..2d99051fb 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -37,6 +37,7 @@ import { DialogSkill } from "../dialog-skill" export type PromptProps = { sessionID?: string + workspaceID?: string visible?: boolean disabled?: boolean onSubmit?: () => void @@ -542,7 +543,9 @@ export function Prompt(props: PromptProps) { let sessionID = props.sessionID if (sessionID == null) { - const res = await sdk.client.session.create({}) + const res = await sdk.client.session.create({ + workspaceID: props.workspaceID, + }) if (res.error) { console.log("Creating a session failed:", res.error) diff --git a/packages/opencode/src/cli/cmd/tui/context/route.tsx b/packages/opencode/src/cli/cmd/tui/context/route.tsx index 358461921..e96cd2c3a 100644 --- a/packages/opencode/src/cli/cmd/tui/context/route.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/route.tsx @@ -5,6 +5,7 @@ import type { PromptInfo } from "../component/prompt/history" export type HomeRoute = { type: "home" initialPrompt?: PromptInfo + workspaceID?: string } export type SessionRoute = { diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index 24ea8f3b3..e76e165b2 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -121,6 +121,7 @@ export function Home() { promptRef.set(r) }} hint={Hint} + workspaceID={route.workspaceID} /> diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index b11763205..5cc4d7da8 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -219,6 +219,7 @@ export namespace Session { parentID: Identifier.schema("session").optional(), title: z.string().optional(), permission: Info.shape.permission, + workspaceID: Identifier.schema("workspace").optional(), }) .optional(), async (input) => { @@ -227,6 +228,7 @@ export namespace Session { directory: Instance.directory, title: input?.title, permission: input?.permission, + workspaceID: input?.workspaceID, }) }, ) @@ -242,6 +244,7 @@ export namespace Session { const title = getForkedTitle(original.title) const session = await createNext({ directory: Instance.directory, + workspaceID: original.workspaceID, title, }) const msgs = await messages({ sessionID: input.sessionID }) @@ -292,6 +295,7 @@ export namespace Session { id?: string title?: string parentID?: string + workspaceID?: string directory: string permission?: PermissionNext.Ruleset }) { @@ -301,7 +305,7 @@ export namespace Session { version: Installation.VERSION, projectID: Instance.project.id, directory: input.directory, - workspaceID: WorkspaceContext.workspaceID, + workspaceID: input.workspaceID, parentID: input.parentID, title: input.title ?? createDefaultTitle(!!input.parentID), permission: input.permission, diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 22dcfec35..2bb2edcd1 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -1295,6 +1295,7 @@ export class Session2 extends HeyApiClient { parentID?: string title?: string permission?: PermissionRuleset + workspaceID?: string }, options?: Options, ) { @@ -1308,6 +1309,7 @@ export class Session2 extends HeyApiClient { { in: "body", key: "parentID" }, { in: "body", key: "title" }, { in: "body", key: "permission" }, + { in: "body", key: "workspaceID" }, ], }, ], diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 71e075b39..e7ef9ae49 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -2764,6 +2764,7 @@ export type SessionCreateData = { parentID?: string title?: string permission?: PermissionRuleset + workspaceID?: string } path?: never query?: {