import { HttpApiBuilder } from "effect/unstable/httpapi";import { Effect } from "effect";import { ToolId, ToolNotFoundError } from "@executor-js/sdk"; import { ExecutorApi } from "../api";import { ExecutorService } from "../services";import { capture } from "@executor-js/api"; export const ToolsHandlers = HttpApiBuilder.group(ExecutorApi, "tools", (handlers) => handlers .handle("list", () => capture( Effect.gen(function* () { const executor = yield* ExecutorService; // Keep the all-tools view bounded to metadata already available // from discovery. Per-source detail loads annotations for the // smaller source-local management view. const tools = yield* executor.tools.list({ includeAnnotations: false, includeBlocked: true, }); return tools.map((t) => ({ id: ToolId.make(t.id), pluginId: t.pluginId, sourceId: t.sourceId, name: t.name, description: t.description, mayElicit: t.annotations?.mayElicit, requiresApproval: t.annotations?.requiresApproval, })); }), ), ) .handle("schema", ({ params: path }) => capture( Effect.gen(function* () { const executor = yield* ExecutorService; const schema = yield* executor.tools.schema(path.toolId); if (schema === null) { return yield* new ToolNotFoundError({ toolId: path.toolId }); } return schema; }), ), ),);
import { HttpApiBuilder } from "effect/unstable/httpapi";
import { Effect } from "effect";
import { ToolId, ToolNotFoundError } from "@executor-js/sdk";
import { ExecutorApi } from "../api";
import { ExecutorService } from "../services";
import { capture } from "@executor-js/api";
export const ToolsHandlers = HttpApiBuilder.group(ExecutorApi, "tools", (handlers) =>
handlers
.handle("list", () =>
capture(
Effect.gen(function* () {
const executor = yield* ExecutorService;
// Keep the all-tools view bounded to metadata already available
// from discovery. Per-source detail loads annotations for the
// smaller source-local management view.
const tools = yield* executor.tools.list({
includeAnnotations: false,
includeBlocked: true,
});
return tools.map((t) => ({
id: ToolId.make(t.id),
pluginId: t.pluginId,
sourceId: t.sourceId,
name: t.name,
description: t.description,
mayElicit: t.annotations?.mayElicit,
requiresApproval: t.annotations?.requiresApproval,
}));
}),
),
)
.handle("schema", ({ params: path }) =>
capture(
Effect.gen(function* () {
const executor = yield* ExecutorService;
const schema = yield* executor.tools.schema(path.toolId);
if (schema === null) {
return yield* new ToolNotFoundError({ toolId: path.toolId });
}
return schema;
}),
),
),
);