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..a816a9cce2f5 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`, + sessionStatus: `${root}/:sessionID/status`, get: `${root}/:sessionID`, children: `${root}/:sessionID/children`, todo: `${root}/:sessionID/todo`, @@ -125,6 +126,19 @@ export const SessionApi = HttpApi.make("session") description: "Retrieve the current status of all sessions, including active, idle, and completed states.", }), ), + HttpApiEndpoint.get("sessionStatus", SessionPaths.sessionStatus, { + params: { sessionID: SessionID }, + query: WorkspaceRoutingQuery, + success: described(SessionStatus.Info, "Get session status"), + error: [HttpApiError.BadRequest, ApiNotFoundError], + }).annotateMerge( + OpenApi.annotations({ + identifier: "session.sessionStatus", + summary: "Get single session status", + description: + "Retrieve the current status of a specific session, including active, idle, and completed states.", + }), + ), 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..109c161841dc 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,13 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return Object.fromEntries(yield* statusSvc.list()) }) + const sessionStatus = Effect.fn("SessionHttpApi.sessionStatus")(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 +413,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", return handlers .handle("list", list) .handle("status", status) + .handle("sessionStatus", sessionStatus) .handle("get", get) .handle("children", children) .handle("todo", todo)