summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJames Long <[email protected]>2026-02-28 20:44:54 -0500
committerGitHub <[email protected]>2026-02-28 20:44:54 -0500
commitcec16dfe953a67cce9c0b6e597d323fb78600c57 (patch)
tree035a51e1242860f225e90850fb2df09c08837021
parent114eb42444bcf347a99dec756bd2ac90c679c66c (diff)
downloadopencode-cec16dfe953a67cce9c0b6e597d323fb78600c57.tar.gz
opencode-cec16dfe953a67cce9c0b6e597d323fb78600c57.zip
feat(core): add WorkspaceContext (#15409)
-rw-r--r--packages/opencode/src/control-plane/workspace-context.ts23
-rw-r--r--packages/opencode/src/server/server.ts26
2 files changed, 44 insertions, 5 deletions
diff --git a/packages/opencode/src/control-plane/workspace-context.ts b/packages/opencode/src/control-plane/workspace-context.ts
new file mode 100644
index 000000000..f7297b3f4
--- /dev/null
+++ b/packages/opencode/src/control-plane/workspace-context.ts
@@ -0,0 +1,23 @@
+import { Context } from "../util/context"
+
+interface Context {
+ workspaceID?: string
+}
+
+const context = Context.create<Context>("workspace")
+
+export const WorkspaceContext = {
+ async provide<R>(input: { workspaceID?: string; fn: () => R }): Promise<R> {
+ return context.provide({ workspaceID: input.workspaceID }, async () => {
+ return input.fn()
+ })
+ },
+
+ get workspaceID() {
+ try {
+ return context.use().workspaceID
+ } catch (e) {
+ return undefined
+ }
+ },
+}
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index 9fba9c1fe..85049650c 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -21,6 +21,7 @@ import { Auth } from "../auth"
import { Flag } from "../flag/flag"
import { Command } from "../command"
import { Global } from "../global"
+import { WorkspaceContext } from "../control-plane/workspace-context"
import { ProjectRoutes } from "./routes/project"
import { SessionRoutes } from "./routes/session"
import { PtyRoutes } from "./routes/pty"
@@ -194,6 +195,7 @@ export namespace Server {
)
.use(async (c, next) => {
if (c.req.path === "/log") return next()
+ const workspaceID = c.req.query("workspace") || c.req.header("x-opencode-workspace")
const raw = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd()
const directory = (() => {
try {
@@ -202,11 +204,17 @@ export namespace Server {
return raw
}
})()
- return Instance.provide({
- directory,
- init: InstanceBootstrap,
+
+ return WorkspaceContext.provide({
+ workspaceID,
async fn() {
- return next()
+ return Instance.provide({
+ directory,
+ init: InstanceBootstrap,
+ async fn() {
+ return next()
+ },
+ })
},
})
})
@@ -223,7 +231,15 @@ export namespace Server {
},
}),
)
- .use(validator("query", z.object({ directory: z.string().optional() })))
+ .use(
+ validator(
+ "query",
+ z.object({
+ directory: z.string().optional(),
+ workspace: z.string().optional(),
+ }),
+ ),
+ )
.route("/project", ProjectRoutes())
.route("/pty", PtyRoutes())
.route("/config", ConfigRoutes())