summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-10 23:12:04 -0400
committerGitHub <[email protected]>2026-04-10 23:12:04 -0400
commit3dd09147c2958cbb16bbe6ada43107a3c00ed8b6 (patch)
treef9de21707c3e674283631bba265cd5ad5b629a29
parent9581bf06709195368bc3220294c36f3527dbc5c6 (diff)
downloadopencode-3dd09147c2958cbb16bbe6ada43107a3c00ed8b6.tar.gz
opencode-3dd09147c2958cbb16bbe6ada43107a3c00ed8b6.zip
refactor(tool): Tool.Context.metadata returns Effect (#21972)
-rw-r--r--packages/opencode/src/cli/cmd/debug/agent.ts2
-rw-r--r--packages/opencode/src/session/prompt.ts49
-rw-r--r--packages/opencode/src/tool/bash.ts21
-rw-r--r--packages/opencode/src/tool/edit.ts2
-rw-r--r--packages/opencode/src/tool/task.ts2
-rw-r--r--packages/opencode/src/tool/tool.ts2
-rw-r--r--packages/opencode/test/tool/apply_patch.test.ts2
-rw-r--r--packages/opencode/test/tool/bash.test.ts26
-rw-r--r--packages/opencode/test/tool/edit.test.ts2
-rw-r--r--packages/opencode/test/tool/external-directory.test.ts2
-rw-r--r--packages/opencode/test/tool/grep.test.ts2
-rw-r--r--packages/opencode/test/tool/question.test.ts2
-rw-r--r--packages/opencode/test/tool/read.test.ts2
-rw-r--r--packages/opencode/test/tool/skill.test.ts2
-rw-r--r--packages/opencode/test/tool/task.test.ts8
-rw-r--r--packages/opencode/test/tool/webfetch.test.ts2
-rw-r--r--packages/opencode/test/tool/write.test.ts2
17 files changed, 63 insertions, 67 deletions
diff --git a/packages/opencode/src/cli/cmd/debug/agent.ts b/packages/opencode/src/cli/cmd/debug/agent.ts
index fde64e53f..32d10d5d7 100644
--- a/packages/opencode/src/cli/cmd/debug/agent.ts
+++ b/packages/opencode/src/cli/cmd/debug/agent.ts
@@ -158,7 +158,7 @@ async function createToolContext(agent: Agent.Info) {
agent: agent.name,
abort: new AbortController().signal,
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask(req: Omit<Permission.Request, "id" | "sessionID" | "tool">) {
return Effect.sync(() => {
for (const pattern of req.patterns) {
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 384147a12..de26e0328 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -364,21 +364,19 @@ NOTE: At any point in time through this workflow you should feel free to ask the
agent: input.agent.name,
messages: input.messages,
metadata: (val) =>
- run.promise(
- input.processor.updateToolCall(options.toolCallId, (match) => {
- if (!["running", "pending"].includes(match.state.status)) return match
- return {
- ...match,
- state: {
- title: val.title,
- metadata: val.metadata,
- status: "running",
- input: args,
- time: { start: Date.now() },
- },
- }
- }),
- ),
+ input.processor.updateToolCall(options.toolCallId, (match) => {
+ if (!["running", "pending"].includes(match.state.status)) return match
+ return {
+ ...match,
+ state: {
+ title: val.title,
+ metadata: val.metadata,
+ status: "running",
+ input: args,
+ time: { start: Date.now() },
+ },
+ }
+ }),
ask: (req) =>
permission
.ask({
@@ -592,17 +590,14 @@ NOTE: At any point in time through this workflow you should feel free to ask the
callID: part.callID,
extra: { bypassAgentCheck: true, promptOps },
messages: msgs,
- metadata(val: { title?: string; metadata?: Record<string, any> }) {
- return run.promise(
- Effect.gen(function* () {
- part = yield* sessions.updatePart({
- ...part,
- type: "tool",
- state: { ...part.state, ...val },
- } satisfies MessageV2.ToolPart)
- }),
- )
- },
+ metadata: (val: { title?: string; metadata?: Record<string, any> }) =>
+ Effect.gen(function* () {
+ part = yield* sessions.updatePart({
+ ...part,
+ type: "tool",
+ state: { ...part.state, ...val },
+ } satisfies MessageV2.ToolPart)
+ }),
ask: (req: any) =>
permission
.ask({
@@ -1054,7 +1049,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
messageID: info.id,
extra: { bypassCwdCheck: true, ...extra },
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
})
.pipe(Effect.onInterrupt(() => Effect.sync(() => controller.abort())))
diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts
index 2f81e56ae..ae9bc21dc 100644
--- a/packages/opencode/src/tool/bash.ts
+++ b/packages/opencode/src/tool/bash.ts
@@ -385,7 +385,7 @@ export const BashTool = Tool.define(
let expired = false
let aborted = false
- ctx.metadata({
+ yield* ctx.metadata({
metadata: {
output: "",
description: input.description,
@@ -397,16 +397,15 @@ export const BashTool = Tool.define(
const handle = yield* spawner.spawn(cmd(input.shell, input.name, input.command, input.cwd, input.env))
yield* Effect.forkScoped(
- Stream.runForEach(Stream.decodeText(handle.all), (chunk) =>
- Effect.sync(() => {
- output += chunk
- ctx.metadata({
- metadata: {
- output: preview(output),
- description: input.description,
- },
- })
- }),
+ Stream.runForEach(Stream.decodeText(handle.all), (chunk) => {
+ output += chunk
+ return ctx.metadata({
+ metadata: {
+ output: preview(output),
+ description: input.description,
+ },
+ })
+ },
),
)
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts
index a076d054f..a835714c6 100644
--- a/packages/opencode/src/tool/edit.ts
+++ b/packages/opencode/src/tool/edit.ts
@@ -158,7 +158,7 @@ export const EditTool = Tool.define(
if (change.removed) filediff.deletions += change.count || 0
}
- ctx.metadata({
+ yield* ctx.metadata({
metadata: {
diff,
filediff,
diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts
index a8e7a8d69..d0eaaf6f2 100644
--- a/packages/opencode/src/tool/task.ts
+++ b/packages/opencode/src/tool/task.ts
@@ -109,7 +109,7 @@ export const TaskTool = Tool.define(
providerID: msg.info.providerID,
}
- ctx.metadata({
+ yield* ctx.metadata({
title: params.description,
metadata: {
sessionId: nextSession.id,
diff --git a/packages/opencode/src/tool/tool.ts b/packages/opencode/src/tool/tool.ts
index 254cdb911..4cd3ba6e7 100644
--- a/packages/opencode/src/tool/tool.ts
+++ b/packages/opencode/src/tool/tool.ts
@@ -22,7 +22,7 @@ export namespace Tool {
callID?: string
extra?: { [key: string]: any }
messages: MessageV2.WithParts[]
- metadata(input: { title?: string; metadata?: M }): void
+ metadata(input: { title?: string; metadata?: M }): Effect.Effect<void>
ask(input: Omit<Permission.Request, "id" | "sessionID" | "tool">): Effect.Effect<void>
}
diff --git a/packages/opencode/test/tool/apply_patch.test.ts b/packages/opencode/test/tool/apply_patch.test.ts
index 53b5f61ff..7bd2e2a59 100644
--- a/packages/opencode/test/tool/apply_patch.test.ts
+++ b/packages/opencode/test/tool/apply_patch.test.ts
@@ -22,7 +22,7 @@ const baseCtx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
}
type AskInput = {
diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts
index 1f4001a0c..75836c6d9 100644
--- a/packages/opencode/test/tool/bash.test.ts
+++ b/packages/opencode/test/tool/bash.test.ts
@@ -29,7 +29,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
@@ -982,13 +982,14 @@ describe("tool.bash abort", () => {
{
...ctx,
abort: controller.signal,
- metadata: (input) => {
- const output = (input.metadata as { output?: string })?.output
- if (output && output.includes("before") && !controller.signal.aborted) {
- collected.push(output)
- controller.abort()
- }
- },
+ metadata: (input) =>
+ Effect.sync(() => {
+ const output = (input.metadata as { output?: string })?.output
+ if (output && output.includes("before") && !controller.signal.aborted) {
+ collected.push(output)
+ controller.abort()
+ }
+ }),
},
),
)
@@ -1074,10 +1075,11 @@ describe("tool.bash abort", () => {
},
{
...ctx,
- metadata: (input) => {
- const output = (input.metadata as { output?: string })?.output
- if (output) updates.push(output)
- },
+ metadata: (input) =>
+ Effect.sync(() => {
+ const output = (input.metadata as { output?: string })?.output
+ if (output) updates.push(output)
+ }),
},
),
)
diff --git a/packages/opencode/test/tool/edit.test.ts b/packages/opencode/test/tool/edit.test.ts
index df58f6aa3..1c2a4a26f 100644
--- a/packages/opencode/test/tool/edit.test.ts
+++ b/packages/opencode/test/tool/edit.test.ts
@@ -20,7 +20,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
diff --git a/packages/opencode/test/tool/external-directory.test.ts b/packages/opencode/test/tool/external-directory.test.ts
index 79b58c136..727ab74f1 100644
--- a/packages/opencode/test/tool/external-directory.test.ts
+++ b/packages/opencode/test/tool/external-directory.test.ts
@@ -16,7 +16,7 @@ const baseCtx: Omit<Tool.Context, "ask"> = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
}
const glob = (p: string) =>
diff --git a/packages/opencode/test/tool/grep.test.ts b/packages/opencode/test/tool/grep.test.ts
index f907b626e..c85daa057 100644
--- a/packages/opencode/test/tool/grep.test.ts
+++ b/packages/opencode/test/tool/grep.test.ts
@@ -20,7 +20,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
diff --git a/packages/opencode/test/tool/question.test.ts b/packages/opencode/test/tool/question.test.ts
index e02c57dcd..0ca72fdb2 100644
--- a/packages/opencode/test/tool/question.test.ts
+++ b/packages/opencode/test/tool/question.test.ts
@@ -15,7 +15,7 @@ const ctx = {
agent: "test-agent",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts
index a48cd4755..4e5419f51 100644
--- a/packages/opencode/test/tool/read.test.ts
+++ b/packages/opencode/test/tool/read.test.ts
@@ -29,7 +29,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
diff --git a/packages/opencode/test/tool/skill.test.ts b/packages/opencode/test/tool/skill.test.ts
index ebd62dbcf..ae662bc33 100644
--- a/packages/opencode/test/tool/skill.test.ts
+++ b/packages/opencode/test/tool/skill.test.ts
@@ -19,7 +19,7 @@ const baseCtx: Omit<Tool.Context, "ask"> = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
}
afterEach(async () => {
diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts
index 943e68e78..1fea684c7 100644
--- a/packages/opencode/test/tool/task.test.ts
+++ b/packages/opencode/test/tool/task.test.ts
@@ -209,7 +209,7 @@ describe("tool.task", () => {
abort: new AbortController().signal,
extra: { promptOps },
messages: [],
- metadata() {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
},
)
@@ -247,7 +247,7 @@ describe("tool.task", () => {
abort: new AbortController().signal,
extra: { promptOps, ...extra },
messages: [],
- metadata() {},
+ metadata: () => Effect.void,
ask: (input) =>
Effect.sync(() => {
calls.push(input)
@@ -296,7 +296,7 @@ describe("tool.task", () => {
abort: new AbortController().signal,
extra: { promptOps },
messages: [],
- metadata() {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
},
)
@@ -335,7 +335,7 @@ describe("tool.task", () => {
abort: new AbortController().signal,
extra: { promptOps },
messages: [],
- metadata() {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
},
)
diff --git a/packages/opencode/test/tool/webfetch.test.ts b/packages/opencode/test/tool/webfetch.test.ts
index d601f0deb..0773d5cc2 100644
--- a/packages/opencode/test/tool/webfetch.test.ts
+++ b/packages/opencode/test/tool/webfetch.test.ts
@@ -15,7 +15,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}
diff --git a/packages/opencode/test/tool/write.test.ts b/packages/opencode/test/tool/write.test.ts
index aac55f1e7..745058a19 100644
--- a/packages/opencode/test/tool/write.test.ts
+++ b/packages/opencode/test/tool/write.test.ts
@@ -22,7 +22,7 @@ const ctx = {
agent: "build",
abort: AbortSignal.any([]),
messages: [],
- metadata: () => {},
+ metadata: () => Effect.void,
ask: () => Effect.void,
}