import { HttpApiBuilder } from "effect/unstable/httpapi";import { Effect } from "effect";import { ToolNotFoundError, type Tool } from "@executor-js/sdk"; import { ExecutorApi } from "../api";import { ExecutorService } from "../services";import { capture } from "@executor-js/api"; const toMetadata = (t: Tool) => ({ address: t.address, owner: t.owner, integration: t.integration, connection: t.connection, name: t.name, pluginId: t.pluginId, description: t.description, mayElicit: t.annotations?.mayElicit, requiresApproval: t.annotations?.requiresApproval, approvalDescription: t.annotations?.approvalDescription, static: t.static,}); export const ToolsHandlers = HttpApiBuilder.group(ExecutorApi, "tools", (handlers) => handlers .handle("list", ({ query }) => capture( Effect.gen(function* () { const executor = yield* ExecutorService; const tools = yield* executor.tools.list({ integration: query.integration, owner: query.owner, connection: query.connection, query: query.query, includeAnnotations: query.includeAnnotations === "true", includeBlocked: query.includeBlocked !== "false", }); return tools.map(toMetadata); }), ), ) .handle("schema", ({ query }) => capture( Effect.gen(function* () { const executor = yield* ExecutorService; const schema = yield* executor.tools.schema(query.address); if (schema === null) { return yield* new ToolNotFoundError({ address: query.address }); } return schema; }), ), ),);
import { HttpApiBuilder } from "effect/unstable/httpapi";
import { Effect } from "effect";
import { ToolNotFoundError, type Tool } from "@executor-js/sdk";
import { ExecutorApi } from "../api";
import { ExecutorService } from "../services";
import { capture } from "@executor-js/api";
const toMetadata = (t: Tool) => ({
address: t.address,
owner: t.owner,
integration: t.integration,
connection: t.connection,
name: t.name,
pluginId: t.pluginId,
description: t.description,
mayElicit: t.annotations?.mayElicit,
requiresApproval: t.annotations?.requiresApproval,
approvalDescription: t.annotations?.approvalDescription,
static: t.static,
});
export const ToolsHandlers = HttpApiBuilder.group(ExecutorApi, "tools", (handlers) =>
handlers
.handle("list", ({ query }) =>
capture(
Effect.gen(function* () {
const executor = yield* ExecutorService;
const tools = yield* executor.tools.list({
integration: query.integration,
owner: query.owner,
connection: query.connection,
query: query.query,
includeAnnotations: query.includeAnnotations === "true",
includeBlocked: query.includeBlocked !== "false",
});
return tools.map(toMetadata);
}),
),
)
.handle("schema", ({ query }) =>
capture(
Effect.gen(function* () {
const executor = yield* ExecutorService;
const schema = yield* executor.tools.schema(query.address);
if (schema === null) {
return yield* new ToolNotFoundError({ address: query.address });
}
return schema;
}),
),
),
);