feat: background blocking tools
This commit is contained in:
parent
a10733dbf4
commit
e2bca216a2
15 changed files with 392 additions and 66 deletions
|
|
@ -3,6 +3,7 @@ import { DateTime, Effect, Stream } from "effect"
|
|||
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi"
|
||||
import { Api } from "../api"
|
||||
import { SessionsCursor } from "@opencode-ai/protocol/groups/session"
|
||||
import { Job } from "@opencode-ai/core/job"
|
||||
import {
|
||||
ConflictError,
|
||||
InvalidCursorError,
|
||||
|
|
@ -21,6 +22,7 @@ const DefaultSessionHistoryLimit = 50
|
|||
export const SessionHandler = HttpApiBuilder.group(Api, "server.session", (handlers) =>
|
||||
Effect.gen(function* () {
|
||||
const session = yield* SessionV2.Service
|
||||
const jobs = yield* Job.Service
|
||||
|
||||
return handlers
|
||||
.handle(
|
||||
|
|
@ -481,6 +483,48 @@ export const SessionHandler = HttpApiBuilder.group(Api, "server.session", (handl
|
|||
return HttpApiSchema.NoContent.make()
|
||||
}),
|
||||
)
|
||||
.handle(
|
||||
"session.background",
|
||||
Effect.fn(function* (ctx) {
|
||||
yield* session.get(ctx.params.sessionID).pipe(
|
||||
Effect.catchTag("Session.NotFoundError", (error) =>
|
||||
Effect.fail(
|
||||
new SessionNotFoundError({
|
||||
sessionID: error.sessionID,
|
||||
message: `Session not found: ${error.sessionID}`,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
const backgrounded = yield* jobs.backgroundAll({ sessionID: ctx.params.sessionID })
|
||||
if (backgrounded.length > 0)
|
||||
yield* session
|
||||
.synthetic({
|
||||
sessionID: ctx.params.sessionID,
|
||||
text: [
|
||||
"User requested that active blocking work be moved to the background.",
|
||||
"",
|
||||
"Backgrounded work:",
|
||||
...backgrounded.map(
|
||||
(job) => `- ${job.type}: ${job.title && job.title.length > 0 ? job.title : job.id}`,
|
||||
),
|
||||
"",
|
||||
"The backgrounded work is still unfinished. Move on to other work if you can. If there is nothing else useful to do, finish your response. Do not wait, sleep, poll, or report the backgrounded work as complete until a later completion notification is added to the conversation.",
|
||||
].join("\n"),
|
||||
})
|
||||
.pipe(
|
||||
Effect.catchTag("Session.NotFoundError", (error) =>
|
||||
Effect.fail(
|
||||
new SessionNotFoundError({
|
||||
sessionID: error.sessionID,
|
||||
message: `Session not found: ${error.sessionID}`,
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
return HttpApiSchema.NoContent.make()
|
||||
}),
|
||||
)
|
||||
.handle(
|
||||
"session.message",
|
||||
Effect.fn(function* (ctx) {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import { PermissionSaved } from "@opencode-ai/core/permission/saved"
|
|||
import { PtyTicket } from "@opencode-ai/core/pty/ticket"
|
||||
import { SessionV2 } from "@opencode-ai/core/session"
|
||||
import { SessionExecution } from "@opencode-ai/core/session/execution"
|
||||
import { Job } from "@opencode-ai/core/job"
|
||||
import { LocationServiceMap } from "@opencode-ai/core/location-service-map"
|
||||
import { SessionExecutionLocal } from "@opencode-ai/core/session/execution/local"
|
||||
import { PluginRuntime } from "@opencode-ai/core/plugin/runtime"
|
||||
|
|
@ -30,6 +31,7 @@ const applicationServices = LayerNode.group([
|
|||
EventV2.node,
|
||||
httpClient,
|
||||
ToolOutputStore.cleanupNode,
|
||||
Job.node,
|
||||
SessionV2.node,
|
||||
PluginRuntime.providerNode,
|
||||
PermissionSaved.node,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue