158 lines · 4.7 KB · TypeScript
RawDownload
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";import { tmpdir } from "node:os";import { dirname, join } from "node:path";import { fileURLToPath } from "node:url"; const fixtureDir = dirname(fileURLToPath(import.meta.url)); const run = (cwd: string, args: readonly string[], stdin?: string): string => {  const proc = Bun.spawnSync({    cmd: ["git", ...args],    cwd,    stdin: stdin ? new TextEncoder().encode(stdin) : undefined,  });  if (!proc.success) {    throw new Error(      `git ${args.join(" ")} failed\n${proc.stderr.toString()}\n${proc.stdout.toString()}`,    );  }  return proc.stdout.toString().trim();}; const write = async (root: string, path: string, body: string) => {  await mkdir(dirname(join(root, path)), { recursive: true });  await writeFile(join(root, path), body);}; const packageJson = JSON.stringify({ dependencies: { effect: "4.0.0-beta.59", zod: "4.3.6" } });const executorJson = JSON.stringify({ description: "Custom tools e2e fixture" }); const echoTool = `import { z } from "zod";import { defineTool, integration } from "executor:app"; export default defineTool({  description: "Echo a message through a projected app connection.",  integrations: { apps: integration("repo") },  input: z.object({ message: z.string() }),  output: {    type: "object",    properties: { message: { type: "string" }, version: { type: "string" } },    required: ["message", "version"],  },  annotations: { readOnly: true },  async handler(input) {    return { message: input.message, version: "v1" };  },});`; const staticTool = `import { defineTool } from "executor:app"; export default defineTool({  description: "Return a static fixture marker.",  input: { type: "object", properties: {} },  output: {    type: "object",    properties: { ok: { type: "boolean" } },    required: ["ok"],  },  annotations: { readOnly: true },  async handler() {    return { ok: true };  },});`; const effectTool = `import { Effect } from "effect";import { defineTool } from "executor:app"; export default defineTool({  description: "Return a marker produced through Effect.",  input: { type: "object", properties: {} },  output: {    type: "object",    properties: { ok: { type: "boolean" }, dependency: { type: "string" } },    required: ["ok", "dependency"],  },  annotations: { readOnly: true },  async handler() {    return Effect.runSync(Effect.succeed({ ok: true, dependency: "effect" }));  },});`; const extraTool = `import { defineTool } from "executor:app"; export default defineTool({  description: "Return a second static fixture marker.",  input: { type: "object", properties: {} },  output: {    type: "object",    properties: { added: { type: "boolean" } },    required: ["added"],  },  annotations: { readOnly: true },  async handler() {    return { added: true };  },});`; const badCollectTool = `import { defineTool } from "executor:app"; const input = { type: "object", properties: {} }; export default {  "bad-collect": defineTool({    description: "Trigger a collect-stage fixture failure.",    input,    async handler() {      return { ok: true };    },  }),};`; const commit = (root: string, message: string): string => {  run(root, ["add", "."]);  run(root, ["commit", "-q", "-m", message]);  return run(root, ["rev-parse", "HEAD"]);}; const pack = async (root: string, sha: string, name: string) => {  const proc = Bun.spawnSync({    cmd: ["git", "pack-objects", "--stdout", "--revs"],    cwd: root,    stdin: new TextEncoder().encode(`${sha}\n`),  });  if (!proc.success) throw new Error(`git pack-objects failed: ${proc.stderr.toString()}`);  await writeFile(join(fixtureDir, name), proc.stdout);}; const root = await mkdtemp(join(tmpdir(), "custom-tools-git-"));try {  run(root, ["init", "-q"]);  run(root, ["config", "user.name", "Fixture Generator"]);  run(root, ["config", "user.email", "fixture@example.test"]);   await write(root, "executor.json", executorJson);  await write(root, "package.json", packageJson);  await write(root, "bun.lock", "");  await write(root, "tools/echo-tool.ts", echoTool);  await write(root, "tools/static-tool.ts", staticTool);  await write(root, "tools/effect-tool.ts", effectTool);  const sha1 = commit(root, "custom tools v1");   await write(root, "tools/extra-tool.ts", extraTool);  const sha2 = commit(root, "custom tools v2");   await write(root, "tools/bad-collect.ts", badCollectTool);  const sha3 = commit(root, "custom tools v3");   await writeFile(join(fixtureDir, "custom-tools-shas.txt"), `${sha1}\n${sha2}\n${sha3}\n`);  await pack(root, sha1, "custom-tools-v1.pack");  await pack(root, sha2, "custom-tools-v2.pack");  await pack(root, sha3, "custom-tools-v3.pack");} finally {  await rm(root, { recursive: true, force: true });}