Skip to content

Commit 319b765

Browse files
authored
refactor(tool): destroy Truncate facade, effectify Tool.define (#22093)
1 parent 824c12c commit 319b765

14 files changed

Lines changed: 192 additions & 131 deletions

packages/opencode/src/tool/tool.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ export namespace Tool {
7070
? Def<P, M>
7171
: never
7272

73-
function wrap<Parameters extends z.ZodType, Result extends Metadata>(id: string, init: Init<Parameters, Result>) {
73+
function wrap<Parameters extends z.ZodType, Result extends Metadata>(
74+
id: string,
75+
init: Init<Parameters, Result>,
76+
truncate: Truncate.Interface,
77+
agents: Agent.Interface,
78+
) {
7479
return () =>
7580
Effect.gen(function* () {
7681
const toolInfo = init instanceof Function ? { ...(yield* init()) } : { ...init }
@@ -93,8 +98,8 @@ export namespace Tool {
9398
if (result.metadata.truncated !== undefined) {
9499
return result
95100
}
96-
const agent = yield* Effect.promise(() => Agent.get(ctx.agent))
97-
const truncated = yield* Effect.promise(() => Truncate.output(result.output, {}, agent))
101+
const agent = yield* agents.get(ctx.agent)
102+
const truncated = yield* truncate.output(result.output, {}, agent)
98103
return {
99104
...result,
100105
output: truncated.content,
@@ -112,9 +117,14 @@ export namespace Tool {
112117
export function define<Parameters extends z.ZodType, Result extends Metadata, R, ID extends string = string>(
113118
id: ID,
114119
init: Effect.Effect<Init<Parameters, Result>, never, R>,
115-
): Effect.Effect<Info<Parameters, Result>, never, R> & { id: ID } {
120+
): Effect.Effect<Info<Parameters, Result>, never, R | Truncate.Service | Agent.Service> & { id: ID } {
116121
return Object.assign(
117-
Effect.map(init, (init) => ({ id, init: wrap(id, init) })),
122+
Effect.gen(function* () {
123+
const resolved = yield* init
124+
const truncate = yield* Truncate.Service
125+
const agents = yield* Agent.Service
126+
return { id, init: wrap(id, resolved, truncate, agents) }
127+
}),
118128
{ id },
119129
)
120130
}

packages/opencode/src/tool/truncate.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { NodePath } from "@effect/platform-node"
22
import { Cause, Duration, Effect, Layer, Schedule, Context } from "effect"
33
import path from "path"
44
import type { Agent } from "../agent/agent"
5-
import { makeRuntime } from "@/effect/run-service"
65
import { AppFileSystem } from "@/filesystem"
76
import { evaluate } from "@/permission/evaluate"
87
import { Identifier } from "../id/id"
@@ -135,10 +134,4 @@ export namespace Truncate {
135134
)
136135

137136
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(NodePath.layer))
138-
139-
const { runPromise } = makeRuntime(Service, defaultLayer)
140-
141-
export async function output(text: string, options: Options = {}, agent?: Agent.Info): Promise<Result> {
142-
return runPromise((s) => s.output(text, options, agent))
143-
}
144137
}

packages/opencode/test/tool/apply_patch.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import { Instance } from "../../src/project/instance"
77
import { LSP } from "../../src/lsp"
88
import { AppFileSystem } from "../../src/filesystem"
99
import { Format } from "../../src/format"
10+
import { Agent } from "../../src/agent/agent"
1011
import { Bus } from "../../src/bus"
12+
import { Truncate } from "../../src/tool/truncate"
1113
import { tmpdir } from "../fixture/fixture"
1214
import { SessionID, MessageID } from "../../src/session/schema"
1315

1416
const runtime = ManagedRuntime.make(
15-
Layer.mergeAll(LSP.defaultLayer, AppFileSystem.defaultLayer, Format.defaultLayer, Bus.layer),
17+
Layer.mergeAll(LSP.defaultLayer, AppFileSystem.defaultLayer, Format.defaultLayer, Bus.layer, Truncate.defaultLayer, Agent.defaultLayer),
1618
)
1719

1820
const baseCtx = {

packages/opencode/test/tool/bash.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,21 @@ import { Instance } from "../../src/project/instance"
88
import { Filesystem } from "../../src/util/filesystem"
99
import { tmpdir } from "../fixture/fixture"
1010
import type { Permission } from "../../src/permission"
11+
import { Agent } from "../../src/agent/agent"
1112
import { Truncate } from "../../src/tool/truncate"
1213
import { SessionID, MessageID } from "../../src/session/schema"
1314
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
1415
import { AppFileSystem } from "../../src/filesystem"
1516
import { Plugin } from "../../src/plugin"
1617

1718
const runtime = ManagedRuntime.make(
18-
Layer.mergeAll(CrossSpawnSpawner.defaultLayer, AppFileSystem.defaultLayer, Plugin.defaultLayer),
19+
Layer.mergeAll(
20+
CrossSpawnSpawner.defaultLayer,
21+
AppFileSystem.defaultLayer,
22+
Plugin.defaultLayer,
23+
Truncate.defaultLayer,
24+
Agent.defaultLayer,
25+
),
1926
)
2027

2128
function initBash() {

packages/opencode/test/tool/edit.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import { FileTime } from "../../src/file/time"
99
import { LSP } from "../../src/lsp"
1010
import { AppFileSystem } from "../../src/filesystem"
1111
import { Format } from "../../src/format"
12+
import { Agent } from "../../src/agent/agent"
1213
import { Bus } from "../../src/bus"
1314
import { BusEvent } from "../../src/bus/bus-event"
15+
import { Truncate } from "../../src/tool/truncate"
1416
import { SessionID, MessageID } from "../../src/session/schema"
1517

1618
const ctx = {
@@ -34,7 +36,7 @@ async function touch(file: string, time: number) {
3436
}
3537

3638
const runtime = ManagedRuntime.make(
37-
Layer.mergeAll(LSP.defaultLayer, FileTime.defaultLayer, AppFileSystem.defaultLayer, Format.defaultLayer, Bus.layer),
39+
Layer.mergeAll(LSP.defaultLayer, FileTime.defaultLayer, AppFileSystem.defaultLayer, Format.defaultLayer, Bus.layer, Truncate.defaultLayer, Agent.defaultLayer),
3840
)
3941

4042
afterAll(async () => {

packages/opencode/test/tool/grep.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import { Instance } from "../../src/project/instance"
66
import { tmpdir } from "../fixture/fixture"
77
import { SessionID, MessageID } from "../../src/session/schema"
88
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
9+
import { Truncate } from "../../src/tool/truncate"
10+
import { Agent } from "../../src/agent/agent"
911

10-
const runtime = ManagedRuntime.make(Layer.mergeAll(CrossSpawnSpawner.defaultLayer))
12+
const runtime = ManagedRuntime.make(Layer.mergeAll(CrossSpawnSpawner.defaultLayer, Truncate.defaultLayer, Agent.defaultLayer))
1113

1214
function initGrep() {
1315
return runtime.runPromise(GrepTool.pipe(Effect.flatMap((info) => info.init())))

packages/opencode/test/tool/question.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import { Tool } from "../../src/tool/tool"
44
import { QuestionTool } from "../../src/tool/question"
55
import { Question } from "../../src/question"
66
import { SessionID, MessageID } from "../../src/session/schema"
7+
import { Agent } from "../../src/agent/agent"
78
import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
9+
import { Truncate } from "../../src/tool/truncate"
810
import { provideTmpdirInstance } from "../fixture/fixture"
911
import { testEffect } from "../lib/effect"
1012

@@ -19,7 +21,7 @@ const ctx = {
1921
ask: () => Effect.void,
2022
}
2123

22-
const it = testEffect(Layer.mergeAll(Question.defaultLayer, CrossSpawnSpawner.defaultLayer))
24+
const it = testEffect(Layer.mergeAll(Question.defaultLayer, CrossSpawnSpawner.defaultLayer, Truncate.defaultLayer, Agent.defaultLayer))
2325

2426
const pending = Effect.fn("QuestionToolTest.pending")(function* (question: Question.Interface) {
2527
for (;;) {

packages/opencode/test/tool/read.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Instance } from "../../src/project/instance"
1111
import { SessionID, MessageID } from "../../src/session/schema"
1212
import { Instruction } from "../../src/session/instruction"
1313
import { ReadTool } from "../../src/tool/read"
14+
import { Truncate } from "../../src/tool/truncate"
1415
import { Tool } from "../../src/tool/tool"
1516
import { Filesystem } from "../../src/util/filesystem"
1617
import { provideInstance, tmpdirScoped } from "../fixture/fixture"
@@ -41,6 +42,7 @@ const it = testEffect(
4142
FileTime.defaultLayer,
4243
Instruction.defaultLayer,
4344
LSP.defaultLayer,
45+
Truncate.defaultLayer,
4446
),
4547
)
4648

packages/opencode/test/tool/skill.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { Effect, Layer, ManagedRuntime } from "effect"
2+
import { Agent } from "../../src/agent/agent"
23
import { Skill } from "../../src/skill"
34
import { Ripgrep } from "../../src/file/ripgrep"
5+
import { Truncate } from "../../src/tool/truncate"
46
import { afterEach, describe, expect, test } from "bun:test"
57
import path from "path"
68
import { pathToFileURL } from "url"
@@ -150,7 +152,7 @@ Use this skill.
150152
await Instance.provide({
151153
directory: tmp.path,
152154
fn: async () => {
153-
const runtime = ManagedRuntime.make(Layer.mergeAll(Skill.defaultLayer, Ripgrep.defaultLayer))
155+
const runtime = ManagedRuntime.make(Layer.mergeAll(Skill.defaultLayer, Ripgrep.defaultLayer, Truncate.defaultLayer, Agent.defaultLayer))
154156
const info = await runtime.runPromise(SkillTool)
155157
const tool = await runtime.runPromise(info.init())
156158
const requests: Array<Omit<Permission.Request, "id" | "sessionID" | "tool">> = []

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { SessionPrompt } from "../../src/session/prompt"
1010
import { MessageID, PartID } from "../../src/session/schema"
1111
import { ModelID, ProviderID } from "../../src/provider/schema"
1212
import { TaskTool, type TaskPromptOps } from "../../src/tool/task"
13+
import { Truncate } from "../../src/tool/truncate"
1314
import { ToolRegistry } from "../../src/tool/registry"
1415
import { provideTmpdirInstance } from "../fixture/fixture"
1516
import { testEffect } from "../lib/effect"
@@ -29,6 +30,7 @@ const it = testEffect(
2930
Config.defaultLayer,
3031
CrossSpawnSpawner.defaultLayer,
3132
Session.defaultLayer,
33+
Truncate.defaultLayer,
3234
ToolRegistry.defaultLayer,
3335
),
3436
)

0 commit comments

Comments
 (0)