Skip to content

Commit af8aff3

Browse files
authored
refactor: make TaskPromptOps effectful (#21971)
1 parent 2a8a59d commit af8aff3

3 files changed

Lines changed: 26 additions & 27 deletions

File tree

packages/opencode/src/session/prompt.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,8 +1665,8 @@ NOTE: At any point in time through this workflow you should feel free to ask the
16651665

16661666
const promptOps: TaskPromptOps = {
16671667
cancel: (sessionID) => run.fork(cancel(sessionID)),
1668-
resolvePromptParts: (template) => run.promise(resolvePromptParts(template)),
1669-
prompt: (input) => run.promise(prompt(input)),
1668+
resolvePromptParts: (template) => resolvePromptParts(template),
1669+
prompt: (input) => prompt(input),
16701670
}
16711671

16721672
return Service.of({

packages/opencode/src/tool/task.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { Log } from "@/util/log"
1212

1313
export interface TaskPromptOps {
1414
cancel(sessionID: SessionID): void
15-
resolvePromptParts(template: string): Promise<SessionPrompt.PromptInput["parts"]>
16-
prompt(input: SessionPrompt.PromptInput): Promise<MessageV2.WithParts>
15+
resolvePromptParts(template: string): Effect.Effect<SessionPrompt.PromptInput["parts"]>
16+
prompt(input: SessionPrompt.PromptInput): Effect.Effect<MessageV2.WithParts>
1717
}
1818

1919
const id = "task"
@@ -132,24 +132,22 @@ export const TaskTool = Tool.define(
132132
}),
133133
() =>
134134
Effect.gen(function* () {
135-
const parts = yield* Effect.promise(() => ops.resolvePromptParts(params.prompt))
136-
const result = yield* Effect.promise(() =>
137-
ops.prompt({
138-
messageID,
139-
sessionID: nextSession.id,
140-
model: {
141-
modelID: model.modelID,
142-
providerID: model.providerID,
143-
},
144-
agent: next.name,
145-
tools: {
146-
...(canTodo ? {} : { todowrite: false }),
147-
...(canTask ? {} : { task: false }),
148-
...Object.fromEntries((cfg.experimental?.primary_tools ?? []).map((item) => [item, false])),
149-
},
150-
parts,
151-
}),
152-
)
135+
const parts = yield* ops.resolvePromptParts(params.prompt)
136+
const result = yield* ops.prompt({
137+
messageID,
138+
sessionID: nextSession.id,
139+
model: {
140+
modelID: model.modelID,
141+
providerID: model.providerID,
142+
},
143+
agent: next.name,
144+
tools: {
145+
...(canTodo ? {} : { todowrite: false }),
146+
...(canTask ? {} : { task: false }),
147+
...Object.fromEntries((cfg.experimental?.primary_tools ?? []).map((item) => [item, false])),
148+
},
149+
parts,
150+
})
153151

154152
return {
155153
title: params.description,

packages/opencode/test/tool/task.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,12 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") {
6565
function stubOps(opts?: { onPrompt?: (input: SessionPrompt.PromptInput) => void; text?: string }): TaskPromptOps {
6666
return {
6767
cancel() {},
68-
resolvePromptParts: async (template) => [{ type: "text", text: template }],
69-
prompt: async (input) => {
70-
opts?.onPrompt?.(input)
71-
return reply(input, opts?.text ?? "done")
72-
},
68+
resolvePromptParts: (template) => Effect.succeed([{ type: "text" as const, text: template }]),
69+
prompt: (input) =>
70+
Effect.sync(() => {
71+
opts?.onPrompt?.(input)
72+
return reply(input, opts?.text ?? "done")
73+
}),
7374
}
7475
}
7576

0 commit comments

Comments
 (0)