From 9b0be412060b5847d60ac53f652c070182463630 Mon Sep 17 00:00:00 2001 From: Hemanth Reddy Date: Mon, 25 May 2026 21:36:26 +0530 Subject: [PATCH 1/4] feat(api): add single-session status HTTP endpoint --- .../routes/instance/httpapi/groups/session.ts | 13 +++++++++++++ .../routes/instance/httpapi/handlers/session.ts | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts index cd2f3be19c81..e26ffa570a71 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts @@ -74,6 +74,7 @@ export const PermissionResponsePayload = Schema.Struct({ export const SessionPaths = { list: root, status: `${root}/status`, + singleStatus: `${root}/:sessionID/status`, get: `${root}/:sessionID`, children: `${root}/:sessionID/children`, todo: `${root}/:sessionID/todo`, @@ -125,6 +126,18 @@ export const SessionApi = HttpApi.make("session") description: "Retrieve the current status of all sessions, including active, idle, and completed states.", }), ), + HttpApiEndpoint.get("singleStatus", SessionPaths.singleStatus, { + params: { sessionID: SessionID }, + query: WorkspaceRoutingQuery, + success: described(SessionStatus.Info, "Get single session status"), + error: [HttpApiError.BadRequest, ApiNotFoundError], + }).annotateMerge( + OpenApi.annotations({ + identifier: "session.singleStatus", + summary: "Get single session status", + description: "Retrieve the current status of a specific session.", + }), + ), HttpApiEndpoint.get("get", SessionPaths.get, { params: { sessionID: SessionID }, query: WorkspaceRoutingQuery, diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index 4d4cce367b41..e38cc357c141 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -75,6 +75,11 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return Object.fromEntries(yield* statusSvc.list()) }) + const singleStatus = Effect.fn("SessionHttpApi.singleStatus")(function* (ctx: { params: { sessionID: SessionID } }) { + yield* requireSession(ctx.params.sessionID) + return yield* statusSvc.get(ctx.params.sessionID) + }) + const requireSession = Effect.fn("SessionHttpApi.requireSession")(function* (sessionID: SessionID) { return yield* SessionError.mapStorageNotFound(session.get(sessionID)) }) @@ -406,6 +411,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return handlers .handle("list", list) .handle("status", status) + .handle("singleStatus", singleStatus) .handle("get", get) .handle("children", children) .handle("todo", todo) From ff3af2c66f60ca59915d4527795835ef500aca7c Mon Sep 17 00:00:00 2001 From: Hemanth Reddy Date: Mon, 25 May 2026 21:41:40 +0530 Subject: [PATCH 2/4] fix(api): address copilot review on requireSession declaration order --- .../server/routes/instance/httpapi/handlers/session.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index e38cc357c141..27ccffc41bfa 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -75,15 +75,15 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return Object.fromEntries(yield* statusSvc.list()) }) + const requireSession = Effect.fn("SessionHttpApi.requireSession")(function* (sessionID: SessionID) { + return yield* SessionError.mapStorageNotFound(session.get(sessionID)) + }) + const singleStatus = Effect.fn("SessionHttpApi.singleStatus")(function* (ctx: { params: { sessionID: SessionID } }) { yield* requireSession(ctx.params.sessionID) return yield* statusSvc.get(ctx.params.sessionID) }) - const requireSession = Effect.fn("SessionHttpApi.requireSession")(function* (sessionID: SessionID) { - return yield* SessionError.mapStorageNotFound(session.get(sessionID)) - }) - const get = Effect.fn("SessionHttpApi.get")(function* (ctx: { params: { sessionID: SessionID } }) { return yield* requireSession(ctx.params.sessionID) }) From 1c2f72a964c5db682edc59c02b4dadb31cb08b8a Mon Sep 17 00:00:00 2001 From: Hemanth Reddy Date: Mon, 25 May 2026 21:48:00 +0530 Subject: [PATCH 3/4] refactor(api): rename singleStatus endpoint to getStatus as per PR feedback --- .../src/server/routes/instance/httpapi/groups/session.ts | 4 ++-- .../src/server/routes/instance/httpapi/handlers/session.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts index e26ffa570a71..d574cd66beac 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts @@ -126,14 +126,14 @@ export const SessionApi = HttpApi.make("session") description: "Retrieve the current status of all sessions, including active, idle, and completed states.", }), ), - HttpApiEndpoint.get("singleStatus", SessionPaths.singleStatus, { + HttpApiEndpoint.get("getStatus", SessionPaths.singleStatus, { params: { sessionID: SessionID }, query: WorkspaceRoutingQuery, success: described(SessionStatus.Info, "Get single session status"), error: [HttpApiError.BadRequest, ApiNotFoundError], }).annotateMerge( OpenApi.annotations({ - identifier: "session.singleStatus", + identifier: "session.getStatus", summary: "Get single session status", description: "Retrieve the current status of a specific session.", }), diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index 27ccffc41bfa..5f8afbc022a3 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -79,7 +79,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return yield* SessionError.mapStorageNotFound(session.get(sessionID)) }) - const singleStatus = Effect.fn("SessionHttpApi.singleStatus")(function* (ctx: { params: { sessionID: SessionID } }) { + const getStatus = Effect.fn("SessionHttpApi.getStatus")(function* (ctx: { params: { sessionID: SessionID } }) { yield* requireSession(ctx.params.sessionID) return yield* statusSvc.get(ctx.params.sessionID) }) @@ -411,7 +411,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return handlers .handle("list", list) .handle("status", status) - .handle("singleStatus", singleStatus) + .handle("getStatus", getStatus) .handle("get", get) .handle("children", children) .handle("todo", todo) From c9c5c99b08d66952a3944c78a302f116e9fbb14a Mon Sep 17 00:00:00 2001 From: Hemanth Reddy Date: Mon, 25 May 2026 22:08:10 +0530 Subject: [PATCH 4/4] refactor(api): rename SessionPaths.singleStatus to getStatus for consistency --- .../src/server/routes/instance/httpapi/groups/session.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts index d574cd66beac..bd2067b2b351 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts @@ -74,7 +74,7 @@ export const PermissionResponsePayload = Schema.Struct({ export const SessionPaths = { list: root, status: `${root}/status`, - singleStatus: `${root}/:sessionID/status`, + getStatus: `${root}/:sessionID/status`, get: `${root}/:sessionID`, children: `${root}/:sessionID/children`, todo: `${root}/:sessionID/todo`, @@ -126,7 +126,7 @@ export const SessionApi = HttpApi.make("session") description: "Retrieve the current status of all sessions, including active, idle, and completed states.", }), ), - HttpApiEndpoint.get("getStatus", SessionPaths.singleStatus, { + HttpApiEndpoint.get("getStatus", SessionPaths.getStatus, { params: { sessionID: SessionID }, query: WorkspaceRoutingQuery, success: described(SessionStatus.Info, "Get single session status"),