| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import { expect, test } from "bun:test"
- import { ExecuteTool } from "@opencode-ai/core/tool/execute"
- import { Tool } from "@opencode-ai/core/tool/tool"
- import { Agent } from "@opencode-ai/schema/agent"
- import { Session } from "@opencode-ai/schema/session"
- import { SessionMessage } from "@opencode-ai/schema/session-message"
- import { Effect, Schema } from "effect"
- test("execute preserves successful results with visible unhandled rejections", async () => {
- const child = Tool.make({
- description: "Always fail",
- input: Schema.Struct({}),
- output: Schema.String,
- execute: () => Effect.fail(new Tool.Failure({ message: "Lookup refused" })),
- })
- const execute = ExecuteTool.create(new Map([["fail", { tool: child, name: "fail" }]]))
- const result = await Effect.runPromise(
- Tool.settle(
- execute,
- {
- type: "tool-call",
- id: "call_execute",
- name: "execute",
- input: { code: `tools.fail({}); return "done"` },
- },
- {
- sessionID: Session.ID.make("ses_execute"),
- agent: Agent.ID.make("build"),
- messageID: SessionMessage.ID.make("msg_execute"),
- callID: "call_execute",
- progress: () => Effect.void,
- },
- ),
- )
- expect(result.structured).toEqual({ toolCalls: [{ tool: "fail", status: "error" }] })
- expect(result.content).toEqual([
- {
- type: "text",
- text: [
- "done",
- "",
- "Warnings:",
- "- [ToolFailure] Unhandled rejection from an un-awaited promise: Lookup refused",
- ].join("\n"),
- },
- ])
- })
- test("execute supports callable namespace tools", async () => {
- const callable = Tool.make({
- description: "Administer Slack",
- input: Schema.Struct({}),
- output: Schema.String,
- execute: () => Effect.succeed("admin"),
- })
- const child = Tool.make({
- description: "Create a Slack resource",
- input: Schema.Struct({}),
- output: Schema.String,
- execute: () => Effect.succeed("created"),
- })
- const execute = ExecuteTool.create(
- new Map([
- ["slack_admin", { tool: callable, name: "admin", namespace: "slack" }],
- ["slack_admin_create", { tool: child, name: "create", namespace: "slack.admin" }],
- ]),
- )
- const result = await Effect.runPromise(
- Tool.settle(
- execute,
- {
- type: "tool-call",
- id: "call_execute",
- name: "execute",
- input: { code: "return [await tools.slack.admin({}), await tools.slack.admin.create({})]" },
- },
- {
- sessionID: Session.ID.make("ses_execute"),
- agent: Agent.ID.make("build"),
- messageID: SessionMessage.ID.make("msg_execute"),
- callID: "call_execute",
- progress: () => Effect.void,
- },
- ),
- )
- expect(result.structured).toEqual({
- toolCalls: [
- { tool: "slack.admin", status: "completed" },
- { tool: "slack.admin.create", status: "completed" },
- ],
- })
- expect(result.content).toEqual([{ type: "text", text: '[\n "admin",\n "created"\n]' }])
- })
|