refactor: make TaskPromptOps effectful (#21971)
This commit is contained in:
@@ -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({
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user