refactor: make TaskPromptOps effectful (#21971)

This commit is contained in:
Kit Langton
2026-04-10 22:57:47 -04:00
committed by GitHub
parent 2a8a59ded9
commit af8aff3788
3 changed files with 26 additions and 27 deletions

View File

@@ -1665,8 +1665,8 @@ NOTE: At any point in time through this workflow you should feel free to ask the
const promptOps: TaskPromptOps = { const promptOps: TaskPromptOps = {
cancel: (sessionID) => run.fork(cancel(sessionID)), cancel: (sessionID) => run.fork(cancel(sessionID)),
resolvePromptParts: (template) => run.promise(resolvePromptParts(template)), resolvePromptParts: (template) => resolvePromptParts(template),
prompt: (input) => run.promise(prompt(input)), prompt: (input) => prompt(input),
} }
return Service.of({ return Service.of({

View File

@@ -12,8 +12,8 @@ import { Log } from "@/util/log"
export interface TaskPromptOps { export interface TaskPromptOps {
cancel(sessionID: SessionID): void cancel(sessionID: SessionID): void
resolvePromptParts(template: string): Promise<SessionPrompt.PromptInput["parts"]> resolvePromptParts(template: string): Effect.Effect<SessionPrompt.PromptInput["parts"]>
prompt(input: SessionPrompt.PromptInput): Promise<MessageV2.WithParts> prompt(input: SessionPrompt.PromptInput): Effect.Effect<MessageV2.WithParts>
} }
const id = "task" const id = "task"
@@ -132,24 +132,22 @@ export const TaskTool = Tool.define(
}), }),
() => () =>
Effect.gen(function* () { Effect.gen(function* () {
const parts = yield* Effect.promise(() => ops.resolvePromptParts(params.prompt)) const parts = yield* ops.resolvePromptParts(params.prompt)
const result = yield* Effect.promise(() => const result = yield* ops.prompt({
ops.prompt({ messageID,
messageID, sessionID: nextSession.id,
sessionID: nextSession.id, model: {
model: { modelID: model.modelID,
modelID: model.modelID, providerID: model.providerID,
providerID: model.providerID, },
}, agent: next.name,
agent: next.name, tools: {
tools: { ...(canTodo ? {} : { todowrite: false }),
...(canTodo ? {} : { todowrite: false }), ...(canTask ? {} : { task: false }),
...(canTask ? {} : { task: false }), ...Object.fromEntries((cfg.experimental?.primary_tools ?? []).map((item) => [item, false])),
...Object.fromEntries((cfg.experimental?.primary_tools ?? []).map((item) => [item, false])), },
}, parts,
parts, })
}),
)
return { return {
title: params.description, title: params.description,

View File

@@ -65,11 +65,12 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") {
function stubOps(opts?: { onPrompt?: (input: SessionPrompt.PromptInput) => void; text?: string }): TaskPromptOps { function stubOps(opts?: { onPrompt?: (input: SessionPrompt.PromptInput) => void; text?: string }): TaskPromptOps {
return { return {
cancel() {}, cancel() {},
resolvePromptParts: async (template) => [{ type: "text", text: template }], resolvePromptParts: (template) => Effect.succeed([{ type: "text" as const, text: template }]),
prompt: async (input) => { prompt: (input) =>
opts?.onPrompt?.(input) Effect.sync(() => {
return reply(input, opts?.text ?? "done") opts?.onPrompt?.(input)
}, return reply(input, opts?.text ?? "done")
}),
} }
} }