import { describe, expect, it } from "@effect/vitest";import { Effect } from "effect"; import { createExecutor, definePlugin, makeTestConfig } from "@executor/sdk"; import { buildExecuteDescription } from "./description"; const EmptyInputSchema = { type: "object", properties: {}, additionalProperties: false,} as const; // Two plugins registering static sources whose ids are distinct from their// pluginIds/names. If `buildExecuteDescription` ever renders the wrong field// (e.g. pluginId, an internal UUID, or the source name), these assertions// fail — which is the class of bug a hand-rolled fake `Executor` would miss.const githubPlugin = definePlugin(() => ({ id: "github-plugin" as const, storage: () => ({}), staticSources: () => [ { id: "github", kind: "in-memory", name: "GitHub", tools: [ { name: "noop", description: "noop", inputSchema: EmptyInputSchema, handler: () => Effect.succeed(null), }, ], }, ],})); const slackPlugin = definePlugin(() => ({ id: "slack-plugin" as const, storage: () => ({}), staticSources: () => [ { id: "slack", kind: "in-memory", name: "Slack Workspace", tools: [ { name: "noop", description: "noop", inputSchema: EmptyInputSchema, handler: () => Effect.succeed(null), }, ], }, ],})); describe("buildExecuteDescription", () => { it.effect( "renders real source ids as namespaces (sorted) through the real executor flow", () => Effect.gen(function* () { // Intentionally register in non-alphabetical order — the formatter // is expected to sort by source id. const executor = yield* createExecutor( makeTestConfig({ plugins: [slackPlugin(), githubPlugin()] as const }), ); const description = yield* buildExecuteDescription(executor); // Stable anchor from the workflow preamble. expect(description).toContain( "Execute TypeScript in a sandboxed runtime", ); // The namespaces section header. expect(description).toContain("## Available namespaces"); // Each source renders with its ACTUAL id (not pluginId / name / UUID). expect(description).toContain("`github` — GitHub"); expect(description).toContain("`slack` — Slack Workspace"); // And the plugin ids must NOT leak into the namespace list. expect(description).not.toContain("`github-plugin`"); expect(description).not.toContain("`slack-plugin`"); // Sort order: `github` before `slack`. const githubIdx = description.indexOf("`github`"); const slackIdx = description.indexOf("`slack`"); expect(githubIdx).toBeGreaterThan(-1); expect(slackIdx).toBeGreaterThan(-1); expect(githubIdx).toBeLessThan(slackIdx); }), ); it.effect( "omits the Available namespaces section when no plugins register sources", () => Effect.gen(function* () { const executor = yield* createExecutor( makeTestConfig({ plugins: [] as const }), ); const description = yield* buildExecuteDescription(executor); expect(description).toContain( "Execute TypeScript in a sandboxed runtime", ); expect(description).not.toContain("## Available namespaces"); }), );});
import { describe, expect, it } from "@effect/vitest";
import { Effect } from "effect";
import { createExecutor, definePlugin, makeTestConfig } from "@executor/sdk";
import { buildExecuteDescription } from "./description";
const EmptyInputSchema = {
type: "object",
properties: {},
additionalProperties: false,
} as const;
// Two plugins registering static sources whose ids are distinct from their
// pluginIds/names. If `buildExecuteDescription` ever renders the wrong field
// (e.g. pluginId, an internal UUID, or the source name), these assertions
// fail — which is the class of bug a hand-rolled fake `Executor` would miss.
const githubPlugin = definePlugin(() => ({
id: "github-plugin" as const,
storage: () => ({}),
staticSources: () => [
{
id: "github",
kind: "in-memory",
name: "GitHub",
tools: [
{
name: "noop",
description: "noop",
inputSchema: EmptyInputSchema,
handler: () => Effect.succeed(null),
},
],
},
],
}));
const slackPlugin = definePlugin(() => ({
id: "slack-plugin" as const,
storage: () => ({}),
staticSources: () => [
{
id: "slack",
kind: "in-memory",
name: "Slack Workspace",
tools: [
{
name: "noop",
description: "noop",
inputSchema: EmptyInputSchema,
handler: () => Effect.succeed(null),
},
],
},
],
}));
describe("buildExecuteDescription", () => {
it.effect(
"renders real source ids as namespaces (sorted) through the real executor flow",
() =>
Effect.gen(function* () {
// Intentionally register in non-alphabetical order — the formatter
// is expected to sort by source id.
const executor = yield* createExecutor(
makeTestConfig({ plugins: [slackPlugin(), githubPlugin()] as const }),
);
const description = yield* buildExecuteDescription(executor);
// Stable anchor from the workflow preamble.
expect(description).toContain(
"Execute TypeScript in a sandboxed runtime",
);
// The namespaces section header.
expect(description).toContain("## Available namespaces");
// Each source renders with its ACTUAL id (not pluginId / name / UUID).
expect(description).toContain("`github` — GitHub");
expect(description).toContain("`slack` — Slack Workspace");
// And the plugin ids must NOT leak into the namespace list.
expect(description).not.toContain("`github-plugin`");
expect(description).not.toContain("`slack-plugin`");
// Sort order: `github` before `slack`.
const githubIdx = description.indexOf("`github`");
const slackIdx = description.indexOf("`slack`");
expect(githubIdx).toBeGreaterThan(-1);
expect(slackIdx).toBeGreaterThan(-1);
expect(githubIdx).toBeLessThan(slackIdx);
}),
);
it.effect(
"omits the Available namespaces section when no plugins register sources",
() =>
Effect.gen(function* () {
const executor = yield* createExecutor(
makeTestConfig({ plugins: [] as const }),
);
const description = yield* buildExecuteDescription(executor);
expect(description).toContain(
"Execute TypeScript in a sandboxed runtime",
);
expect(description).not.toContain("## Available namespaces");
}),
);
});