fakeplane 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +12 -0
  3. package/README.md +225 -2
  4. package/demo/agents/careful.mjs +89 -0
  5. package/demo/agents/naive.mjs +50 -0
  6. package/demo/scenarios/large-refund-escalation.yaml +38 -0
  7. package/demo/scenarios/refund-ambiguous-timeout.yaml +40 -0
  8. package/demo/scenarios/refund-duplicate-webhook.yaml +40 -0
  9. package/dist/agent.d.ts +28 -0
  10. package/dist/agent.js +113 -0
  11. package/dist/agent.js.map +1 -0
  12. package/dist/assertions.d.ts +21 -0
  13. package/dist/assertions.js +180 -0
  14. package/dist/assertions.js.map +1 -0
  15. package/dist/backends/common.d.ts +13 -0
  16. package/dist/backends/common.js +37 -0
  17. package/dist/backends/common.js.map +1 -0
  18. package/dist/backends/generic.d.ts +79 -0
  19. package/dist/backends/generic.js +227 -0
  20. package/dist/backends/generic.js.map +1 -0
  21. package/dist/backends/graphql.d.ts +22 -0
  22. package/dist/backends/graphql.js +248 -0
  23. package/dist/backends/graphql.js.map +1 -0
  24. package/dist/backends/index.d.ts +24 -0
  25. package/dist/backends/index.js +27 -0
  26. package/dist/backends/index.js.map +1 -0
  27. package/dist/backends/linear.d.ts +123 -0
  28. package/dist/backends/linear.js +451 -0
  29. package/dist/backends/linear.js.map +1 -0
  30. package/dist/backends/slack.d.ts +92 -0
  31. package/dist/backends/slack.js +221 -0
  32. package/dist/backends/slack.js.map +1 -0
  33. package/dist/backends/zendesk.d.ts +94 -0
  34. package/dist/backends/zendesk.js +455 -0
  35. package/dist/backends/zendesk.js.map +1 -0
  36. package/dist/cli.d.ts +2 -0
  37. package/dist/cli.js +340 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/index.d.ts +15 -0
  40. package/dist/index.js +16 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/matchers.d.ts +11 -0
  43. package/dist/matchers.js +156 -0
  44. package/dist/matchers.js.map +1 -0
  45. package/dist/mcp.d.ts +43 -0
  46. package/dist/mcp.js +116 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/pii.d.ts +17 -0
  49. package/dist/pii.js +79 -0
  50. package/dist/pii.js.map +1 -0
  51. package/dist/report.d.ts +13 -0
  52. package/dist/report.js +97 -0
  53. package/dist/report.js.map +1 -0
  54. package/dist/runner.d.ts +56 -0
  55. package/dist/runner.js +114 -0
  56. package/dist/runner.js.map +1 -0
  57. package/dist/scenario.d.ts +270 -0
  58. package/dist/scenario.js +270 -0
  59. package/dist/scenario.js.map +1 -0
  60. package/dist/server.d.ts +40 -0
  61. package/dist/server.js +241 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/trace.d.ts +42 -0
  64. package/dist/trace.js +432 -0
  65. package/dist/trace.js.map +1 -0
  66. package/dist/types.d.ts +70 -0
  67. package/dist/types.js +16 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/util.d.ts +13 -0
  70. package/dist/util.js +89 -0
  71. package/dist/util.js.map +1 -0
  72. package/dist/version.d.ts +1 -0
  73. package/dist/version.js +2 -0
  74. package/dist/version.js.map +1 -0
  75. package/dist/world.d.ts +149 -0
  76. package/dist/world.js +187 -0
  77. package/dist/world.js.map +1 -0
  78. package/package.json +68 -4
package/dist/cli.js ADDED
@@ -0,0 +1,340 @@
1
+ #!/usr/bin/env node
2
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { parseArgs } from "node:util";
6
+ import { agentEnv } from "./agent.js";
7
+ import { evaluateAssertions } from "./assertions.js";
8
+ import { createWorld } from "./backends/index.js";
9
+ import { McpHandler, serveStdio } from "./mcp.js";
10
+ import { color, formatScenario, formatSummary, toJUnit, toMarkdown } from "./report.js";
11
+ import { buildWorld, injectTurn, runScenarios } from "./runner.js";
12
+ import { AssertionSchema, loadConfig, loadScenarioFile, loadScenarios, normalizeScenario, ScenarioError } from "./scenario.js";
13
+ import { FakeServer } from "./server.js";
14
+ import { parseTrace, traceToScenario } from "./trace.js";
15
+ import { asArray } from "./util.js";
16
+ import { VERSION } from "./version.js";
17
+ const HELP = `fakeplane ${VERSION}: stateful fake backends for testing AI agents
18
+
19
+ Usage:
20
+ fakeplane run [paths...] Run scenarios against your agent (default: ./scenarios)
21
+ --agent <cmd> Agent command; gets each turn as JSON on stdin
22
+ --agent-url <url> Or POST each turn to this URL
23
+ --agent-module <file> Or call this JS module's default export
24
+ --junit <file> Write JUnit XML (for CI test reports)
25
+ --json <file> Write the full JSON report (calls, effects, state)
26
+ --markdown <file> Write a Markdown summary (e.g. $GITHUB_STEP_SUMMARY)
27
+ --repeat <n> Run each scenario n times (agents are non-deterministic)
28
+ --filter <text> Only scenarios whose name or path contains text
29
+ --bail Stop at the first failing scenario
30
+ --verbose Show passing assertions too
31
+ --config <file> Config file (default: ./fakeplane.config.yaml if present)
32
+ fakeplane up [--scenario f] [--port 4010] [--host 127.0.0.1] [--record f]
33
+ Serve the fakes (HTTP + MCP) for manual or external runs
34
+ fakeplane mcp [--scenario f] [--record f]
35
+ Serve the fakes as an MCP server over stdio
36
+ fakeplane report [--url u] [--assert scenario.yaml] [--json]
37
+ Show what a running 'up' server recorded; optionally assert
38
+ fakeplane from-trace <trace.json> [-o out.yaml] [--name n] [--no-redact]
39
+ Turn a production trace (OTLP JSON or chat transcript) into a scenario
40
+ fakeplane validate [paths...] Check scenario files without running them
41
+ fakeplane demo Run the bundled demo: a naive agent fails, a careful one passes
42
+ fakeplane init [dir] Write a starter scenario, config and example agent
43
+
44
+ Exit codes: 0 all passed, 1 a scenario failed, 2 usage or config error.
45
+ Docs: https://github.com/shmindmaster/fakeplane`;
46
+ const here = dirname(fileURLToPath(import.meta.url));
47
+ const packageRoot = resolve(here, "..");
48
+ function fail(message) {
49
+ process.stderr.write(`${color.red("error")} ${message}\n`);
50
+ process.exit(2);
51
+ }
52
+ function quote(p) {
53
+ return /[\s"]/.test(p) ? `"${p.replace(/"/g, '\\"')}"` : p;
54
+ }
55
+ function agentFromFlags(v) {
56
+ if (typeof v.agent === "string")
57
+ return { command: v.agent };
58
+ if (typeof v["agent-url"] === "string")
59
+ return { url: v["agent-url"] };
60
+ if (typeof v["agent-module"] === "string")
61
+ return { module: resolve(v["agent-module"]) };
62
+ return undefined;
63
+ }
64
+ function writeOut(file, content) {
65
+ mkdirSync(dirname(resolve(file)), { recursive: true });
66
+ writeFileSync(file, content);
67
+ }
68
+ async function cmdRun(args) {
69
+ const { values, positionals } = parseArgs({
70
+ args,
71
+ allowPositionals: true,
72
+ options: {
73
+ agent: { type: "string" },
74
+ "agent-url": { type: "string" },
75
+ "agent-module": { type: "string" },
76
+ junit: { type: "string" },
77
+ json: { type: "string" },
78
+ markdown: { type: "string" },
79
+ repeat: { type: "string" },
80
+ filter: { type: "string" },
81
+ bail: { type: "boolean" },
82
+ verbose: { type: "boolean" },
83
+ config: { type: "string" },
84
+ quiet: { type: "boolean" },
85
+ },
86
+ });
87
+ const config = loadConfig(values.config);
88
+ const paths = positionals.length ? positionals : config?.scenarios ? asArray(config.scenarios).map((p) => resolve(config.dir, p)) : ["scenarios"];
89
+ const list = loadScenarios(paths);
90
+ if (list.length === 0)
91
+ fail(`no scenario files found in ${paths.join(", ")}`);
92
+ const repeat = values.repeat ? Number(values.repeat) : config?.repeat;
93
+ if (repeat !== undefined && (!Number.isInteger(repeat) || repeat < 1))
94
+ fail("--repeat must be a positive integer");
95
+ const options = {
96
+ agent: agentFromFlags(values),
97
+ defaultAgent: config?.agent,
98
+ defaultAgentDir: config?.dir,
99
+ extraAssertions: config?.assert,
100
+ repeat,
101
+ filter: values.filter,
102
+ bail: values.bail,
103
+ onScenarioDone: (r) => {
104
+ if (!values.quiet)
105
+ process.stdout.write(formatScenario(r, values.verbose) + "\n");
106
+ },
107
+ };
108
+ if (!values.quiet)
109
+ process.stdout.write(color.dim(`fakeplane ${VERSION}: ${list.length} scenario(s)\n\n`));
110
+ const report = await runScenarios(list, options);
111
+ process.stdout.write(formatSummary(report) + "\n");
112
+ if (values.junit)
113
+ writeOut(values.junit, toJUnit(report));
114
+ if (values.json)
115
+ writeOut(values.json, JSON.stringify(report, null, 2));
116
+ if (values.markdown)
117
+ writeOut(values.markdown, toMarkdown(report));
118
+ return report.failed + report.errored === 0 ? 0 : 1;
119
+ }
120
+ function scenarioOrEmpty(file) {
121
+ if (!file)
122
+ return { build: () => createWorld({ scenario: "default" }) };
123
+ const [loaded] = loadScenarioFile(file);
124
+ if (!loaded)
125
+ fail(`${file} contains no scenario`);
126
+ return { loaded, build: () => buildWorld(loaded.scenario) };
127
+ }
128
+ async function cmdUp(args) {
129
+ const { values } = parseArgs({ args, options: { scenario: { type: "string" }, port: { type: "string" }, host: { type: "string" }, record: { type: "string" } } });
130
+ const { loaded, build } = scenarioOrEmpty(values.scenario);
131
+ const server = new FakeServer(build(), {
132
+ host: values.host ?? "127.0.0.1",
133
+ port: Number(values.port ?? 4010),
134
+ hooks: {
135
+ reset: build,
136
+ assert: async (world, raw) => {
137
+ const parsed = raw.map((a) => AssertionSchema.parse(a));
138
+ const results = await evaluateAssertions(parsed, { world, turns: [], dir: loaded?.dir ?? process.cwd() });
139
+ return { ok: results.every((r) => r.ok), results };
140
+ },
141
+ injectTurn: (world, raw) => {
142
+ const s = normalizeScenario({ seed: loaded?.scenario.seed, turns: [raw] }, "turn");
143
+ return injectTurn(world, s.turns[0], `evt_manual_${world.calls.length + 1}`);
144
+ },
145
+ },
146
+ });
147
+ const urls = await server.start();
148
+ const out = process.stdout;
149
+ out.write(`${color.bold("fakeplane up")} ${color.dim(loaded ? `scenario: ${loaded.scenario.name}` : "empty world (all backends)")}\n\n`);
150
+ out.write(` HTTP ${urls.base}\n MCP ${urls.mcp} (Streamable HTTP)\n Control ${urls.base}/_fakeplane/{state,calls,effects,report,reset}\n\n`);
151
+ out.write(color.dim("Point your agent at it:\n"));
152
+ for (const [k, v] of Object.entries(agentEnv(urls, loaded?.scenario.name ?? "default")))
153
+ out.write(` ${k}=${v}\n`);
154
+ out.write(color.dim(`\nThen: fakeplane report --url ${urls.base}\nCtrl+C to stop.\n`));
155
+ await new Promise((resolveStop) => {
156
+ const stop = () => resolveStop();
157
+ process.once("SIGINT", stop);
158
+ process.once("SIGTERM", stop);
159
+ });
160
+ if (values.record)
161
+ writeOut(values.record, JSON.stringify({ calls: server.world.calls, effects: server.world.effects, state: server.world.snapshot() }, null, 2));
162
+ await server.stop();
163
+ return 0;
164
+ }
165
+ async function cmdMcp(args) {
166
+ const { values } = parseArgs({ args, options: { scenario: { type: "string" }, record: { type: "string" } } });
167
+ const { loaded, build } = scenarioOrEmpty(values.scenario);
168
+ const world = build();
169
+ process.stderr.write(`fakeplane mcp: ${world.tools().length} tools${loaded ? ` (scenario: ${loaded.scenario.name})` : ""}\n`);
170
+ await serveStdio(new McpHandler(() => world));
171
+ if (values.record)
172
+ writeOut(values.record, JSON.stringify({ calls: world.calls, effects: world.effects, state: world.snapshot() }, null, 2));
173
+ return 0;
174
+ }
175
+ async function cmdReport(args) {
176
+ const { values } = parseArgs({ args, options: { url: { type: "string" }, assert: { type: "string" }, json: { type: "boolean" } } });
177
+ const base = (values.url ?? process.env.FAKEPLANE_URL ?? "http://127.0.0.1:4010").replace(/\/+$/, "");
178
+ let report;
179
+ try {
180
+ const res = await fetch(`${base}/_fakeplane/report`);
181
+ report = await res.json();
182
+ }
183
+ catch {
184
+ fail(`could not reach a fakeplane server at ${base}. Start one with: fakeplane up`);
185
+ }
186
+ if (values.json) {
187
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
188
+ }
189
+ else {
190
+ process.stdout.write(`${color.bold(`Scenario: ${report.scenario}`)} ${report.calls.length} calls, ${report.effects.length} side effects\n\n`);
191
+ for (const c of report.calls) {
192
+ const mark = c.ok ? color.green(String(c.status)) : color.red(String(c.status));
193
+ process.stdout.write(` #${String(c.seq).padEnd(3)} ${mark} ${c.transport.padEnd(4)} ${c.tool ?? c.op}${c.fault ? color.yellow(` [fault: ${c.fault}${c.committed ? ", committed" : ""}]`) : ""}${c.replayed ? color.dim(" [idempotent replay]") : ""}\n`);
194
+ }
195
+ if (report.effects.length)
196
+ process.stdout.write(`\n${color.bold("Side effects (what the real systems would have seen):")}\n`);
197
+ for (const e of report.effects)
198
+ process.stdout.write(` #${String(e.seq).padEnd(3)} ${e.kind} ${color.dim(e.target ?? "")} ${JSON.stringify(e.data).slice(0, 140)}\n`);
199
+ }
200
+ if (!values.assert)
201
+ return 0;
202
+ const [loaded] = loadScenarioFile(values.assert);
203
+ const res = await fetch(`${base}/_fakeplane/assert`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ assert: loaded.scenario.assert }) });
204
+ const body = await res.json();
205
+ if (!res.ok)
206
+ fail(body?.error?.message ?? `assert failed with HTTP ${res.status}`);
207
+ process.stdout.write(`\n${color.bold("Assertions:")}\n`);
208
+ for (const r of body.results)
209
+ process.stdout.write(r.ok ? ` ${color.green("✓")} ${r.name}\n` : ` ${color.red("✗")} ${r.name}\n ${color.dim(r.message)}\n`);
210
+ return body.ok ? 0 : 1;
211
+ }
212
+ function readTrace(file) {
213
+ const text = readFileSync(file, "utf8");
214
+ if (file.endsWith(".jsonl") || file.endsWith(".ndjson")) {
215
+ const lines = text
216
+ .split(/\r?\n/)
217
+ .filter((l) => l.trim())
218
+ .map((l) => JSON.parse(l));
219
+ if (lines.every((l) => Array.isArray(l?.resourceSpans)))
220
+ return { resourceSpans: lines.flatMap((l) => l.resourceSpans) };
221
+ return lines;
222
+ }
223
+ return JSON.parse(text);
224
+ }
225
+ async function cmdFromTrace(args) {
226
+ const { values, positionals } = parseArgs({ args, allowPositionals: true, options: { output: { type: "string", short: "o" }, name: { type: "string" }, "no-redact": { type: "boolean" } } });
227
+ const file = positionals[0];
228
+ if (!file)
229
+ fail("usage: fakeplane from-trace <trace.json> [-o scenario.yaml]");
230
+ let doc;
231
+ try {
232
+ doc = readTrace(file);
233
+ }
234
+ catch (err) {
235
+ fail(`could not read ${file}: ${err.message}`);
236
+ }
237
+ const parsed = parseTrace(doc);
238
+ const result = traceToScenario(parsed, { name: values.name, source: file.replace(/\\/g, "/").split("/").pop(), redact: !values["no-redact"] });
239
+ normalizeScenario(result.scenario, values.output ?? "generated scenario");
240
+ if (values.output) {
241
+ writeOut(values.output, result.yaml);
242
+ process.stderr.write(`${color.green("wrote")} ${values.output} (${parsed.format}: ${parsed.events.length} events)\n`);
243
+ }
244
+ else {
245
+ process.stdout.write(result.yaml);
246
+ }
247
+ for (const n of result.notes)
248
+ process.stderr.write(`${color.dim("note:")} ${n}\n`);
249
+ return 0;
250
+ }
251
+ function cmdValidate(args) {
252
+ const { positionals } = parseArgs({ args, allowPositionals: true, options: {} });
253
+ const list = loadScenarios(positionals.length ? positionals : ["scenarios"]);
254
+ for (const s of list)
255
+ process.stdout.write(`${color.green("ok")} ${s.scenario.name} ${color.dim(`(${s.scenario.turns.length} turns, ${s.scenario.faults.length} faults, ${s.scenario.assert.length} assertions)`)}\n`);
256
+ process.stdout.write(`${list.length} scenario(s) valid\n`);
257
+ return 0;
258
+ }
259
+ async function cmdDemo() {
260
+ const scenarios = loadScenarios([join(packageRoot, "demo", "scenarios")]);
261
+ const node = quote(process.execPath);
262
+ const out = process.stdout;
263
+ out.write(`${color.bold("fakeplane demo")}: the same scenarios against two support agents.\n`);
264
+ out.write(color.dim("Both agents resolve a refund ticket over the fake Zendesk + order API + Slack.\nThe scenarios inject an ambiguous timeout, a duplicate webhook and a large refund.\n\n"));
265
+ out.write(`${color.bold("1. naive agent")} ${color.dim("(retries blindly, no idempotency keys, pastes customer details into Slack)")}\n\n`);
266
+ const naive = await runScenarios(scenarios, { agent: { command: `${node} ${quote(join(packageRoot, "demo", "agents", "naive.mjs"))}` }, onScenarioDone: (r) => out.write(formatScenario(r) + "\n") });
267
+ out.write(formatSummary(naive) + "\n\n");
268
+ out.write(`${color.bold("2. careful agent")} ${color.dim("(reads back before retrying, idempotency keys, redacts, escalates large refunds)")}\n\n`);
269
+ const careful = await runScenarios(scenarios, { agent: { command: `${node} ${quote(join(packageRoot, "demo", "agents", "careful.mjs"))}` }, onScenarioDone: (r) => out.write(formatScenario(r) + "\n") });
270
+ out.write(formatSummary(careful) + "\n\n");
271
+ const shown = naive.failed > 0 && careful.failed + careful.errored === 0;
272
+ out.write(shown ? `${color.green("fakeplane caught the naive agent's bugs before any customer saw them.")}\nNext: fakeplane init, then point the scenario at your agent.\n` : color.red("Unexpected demo result.\n"));
273
+ return shown ? 0 : 1;
274
+ }
275
+ function cmdInit(args) {
276
+ const { positionals } = parseArgs({ args, allowPositionals: true, options: {} });
277
+ const dir = resolve(positionals[0] ?? ".");
278
+ const files = [
279
+ [join(packageRoot, "demo", "scenarios", "refund-ambiguous-timeout.yaml"), join(dir, "scenarios", "refund-ambiguous-timeout.yaml")],
280
+ [join(packageRoot, "demo", "agents", "careful.mjs"), join(dir, "example-agent.mjs")],
281
+ ];
282
+ for (const [from, to] of files) {
283
+ if (existsSync(to)) {
284
+ process.stdout.write(`${color.dim("exists")} ${to}\n`);
285
+ continue;
286
+ }
287
+ mkdirSync(dirname(to), { recursive: true });
288
+ copyFileSync(from, to);
289
+ process.stdout.write(`${color.green("created")} ${to}\n`);
290
+ }
291
+ const config = join(dir, "fakeplane.config.yaml");
292
+ if (!existsSync(config)) {
293
+ writeFileSync(config, `# fakeplane config: applies to every scenario under scenarios/\nscenarios: scenarios\nagent:\n # Replace with your agent. It receives each turn as JSON on stdin and\n # finds the fakes through FAKEPLANE_* environment variables.\n command: node example-agent.mjs\n# Assertions added to every scenario\nassert:\n - no_duplicate_effects: true\n - no_pii: true\n`);
294
+ process.stdout.write(`${color.green("created")} ${config}\n`);
295
+ }
296
+ process.stdout.write(`\nNext: ${color.bold("npx fakeplane run")}\n`);
297
+ return 0;
298
+ }
299
+ async function main(argv) {
300
+ const [command, ...rest] = argv;
301
+ switch (command) {
302
+ case "run":
303
+ return cmdRun(rest);
304
+ case "up":
305
+ return cmdUp(rest);
306
+ case "mcp":
307
+ return cmdMcp(rest);
308
+ case "report":
309
+ return cmdReport(rest);
310
+ case "from-trace":
311
+ return cmdFromTrace(rest);
312
+ case "validate":
313
+ return cmdValidate(rest);
314
+ case "demo":
315
+ return cmdDemo();
316
+ case "init":
317
+ return cmdInit(rest);
318
+ case "--version":
319
+ case "-v":
320
+ case "version":
321
+ process.stdout.write(VERSION + "\n");
322
+ return 0;
323
+ case undefined:
324
+ case "help":
325
+ case "--help":
326
+ case "-h":
327
+ process.stdout.write(HELP + "\n");
328
+ return 0;
329
+ default:
330
+ process.stderr.write(`Unknown command: ${command}\n\n${HELP}\n`);
331
+ return 2;
332
+ }
333
+ }
334
+ main(process.argv.slice(2)).then((code) => process.exit(code), (err) => {
335
+ if (err instanceof ScenarioError || err?.code === "ERR_PARSE_ARGS_UNKNOWN_OPTION" || err?.code === "ERR_PARSE_ARGS_INVALID_OPTION_VALUE")
336
+ fail(err.message);
337
+ process.stderr.write(`${color.red("error")} ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
338
+ process.exit(2);
339
+ });
340
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export { createWorld, BACKEND_NAMES, type BackendName, type CreateWorldOptions, type Seed } from "./backends/index.js";
2
+ export { ZendeskBackend, SlackBackend, LinearBackend, GenericBackend } from "./backends/index.js";
3
+ export { World, type Backend, type Operation, type FaultSpec, type FaultKind, type DispatchResult } from "./world.js";
4
+ export { FakeServer, type ServerUrls, type FakeServerOptions } from "./server.js";
5
+ export { McpHandler, serveStdio, MCP_PROTOCOL_VERSIONS } from "./mcp.js";
6
+ export { evaluateAssertions, evaluateAssertion, type AssertionResult, type AssertionContext } from "./assertions.js";
7
+ export { loadScenarios, loadScenarioFile, loadConfig, normalizeScenario, ScenarioError, type Scenario, type Assertion, type AgentSpec, type LoadedScenario } from "./scenario.js";
8
+ export { runScenarios, runScenario, runAttempt, buildWorld, injectTurn, type RunReport, type ScenarioResult, type AttemptResult, type RunOptions } from "./runner.js";
9
+ export { invokeAgent, agentEnv, type TurnPayload } from "./agent.js";
10
+ export { toJUnit, toMarkdown, formatScenario, formatSummary } from "./report.js";
11
+ export { parseTrace, traceToScenario, type ParsedTrace, type TimelineEvent } from "./trace.js";
12
+ export { matchValue } from "./matchers.js";
13
+ export { scanText, scanValue, type PiiFinding } from "./pii.js";
14
+ export { ApiError, type CallRecord, type Effect, type TurnRecord } from "./types.js";
15
+ export { VERSION } from "./version.js";
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export { createWorld, BACKEND_NAMES } from "./backends/index.js";
2
+ export { ZendeskBackend, SlackBackend, LinearBackend, GenericBackend } from "./backends/index.js";
3
+ export { World } from "./world.js";
4
+ export { FakeServer } from "./server.js";
5
+ export { McpHandler, serveStdio, MCP_PROTOCOL_VERSIONS } from "./mcp.js";
6
+ export { evaluateAssertions, evaluateAssertion } from "./assertions.js";
7
+ export { loadScenarios, loadScenarioFile, loadConfig, normalizeScenario, ScenarioError } from "./scenario.js";
8
+ export { runScenarios, runScenario, runAttempt, buildWorld, injectTurn } from "./runner.js";
9
+ export { invokeAgent, agentEnv } from "./agent.js";
10
+ export { toJUnit, toMarkdown, formatScenario, formatSummary } from "./report.js";
11
+ export { parseTrace, traceToScenario } from "./trace.js";
12
+ export { matchValue } from "./matchers.js";
13
+ export { scanText, scanValue } from "./pii.js";
14
+ export { ApiError } from "./types.js";
15
+ export { VERSION } from "./version.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAwD,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,KAAK,EAAqF,MAAM,YAAY,CAAC;AACtH,OAAO,EAAE,UAAU,EAA2C,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAA+C,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAsE,MAAM,eAAe,CAAC;AAClL,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAA4E,MAAM,aAAa,CAAC;AACtK,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAwC,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAiD,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface MatchResult {
2
+ ok: boolean;
3
+ reason?: string;
4
+ }
5
+ /**
6
+ * Match `actual` against an expectation.
7
+ * - Operator objects (`{ gt: 100 }`, `{ contains: "x" }`) apply each operator.
8
+ * - Plain objects match as a subset; keys may be dotted paths.
9
+ * - Everything else uses loose equality (`1` equals `"1"`).
10
+ */
11
+ export declare function matchValue(actual: unknown, expected: unknown): MatchResult;
@@ -0,0 +1,156 @@
1
+ import { getPath, isPlainObject, stableStringify } from "./util.js";
2
+ const OPERATORS = new Set([
3
+ "eq",
4
+ "ne",
5
+ "gt",
6
+ "gte",
7
+ "lt",
8
+ "lte",
9
+ "contains",
10
+ "icontains",
11
+ "not_contains",
12
+ "matches",
13
+ "in",
14
+ "not_in",
15
+ "exists",
16
+ "length",
17
+ "not",
18
+ ]);
19
+ const OK = { ok: true };
20
+ function isOperatorObject(value) {
21
+ if (!isPlainObject(value))
22
+ return false;
23
+ const keys = Object.keys(value);
24
+ return keys.length > 0 && keys.every((k) => OPERATORS.has(k));
25
+ }
26
+ function looseEqual(a, b) {
27
+ if (a === b)
28
+ return true;
29
+ if (typeof a === "number" && typeof b === "string" && b.trim() !== "" && Number(b) === a)
30
+ return true;
31
+ if (typeof b === "number" && typeof a === "string" && a.trim() !== "" && Number(a) === b)
32
+ return true;
33
+ if (typeof a === "object" && typeof b === "object" && a !== null && b !== null) {
34
+ return stableStringify(a) === stableStringify(b);
35
+ }
36
+ return false;
37
+ }
38
+ function toRegExp(pattern) {
39
+ const m = /^\/(.*)\/([a-z]*)$/s.exec(pattern);
40
+ return m ? new RegExp(m[1], m[2]) : new RegExp(pattern);
41
+ }
42
+ function show(value) {
43
+ const s = JSON.stringify(value);
44
+ if (s === undefined)
45
+ return String(value);
46
+ return s.length > 120 ? s.slice(0, 117) + "..." : s;
47
+ }
48
+ function compareNumbers(actual, expected, op) {
49
+ const a = typeof actual === "string" && actual.trim() !== "" ? Number(actual) : actual;
50
+ const e = Number(expected);
51
+ if (typeof a !== "number" || Number.isNaN(a))
52
+ return { ok: false, reason: `expected a number ${op} ${show(expected)}, got ${show(actual)}` };
53
+ const ok = op === "gt" ? a > e : op === "gte" ? a >= e : op === "lt" ? a < e : a <= e;
54
+ return ok ? OK : { ok: false, reason: `expected ${show(actual)} ${op} ${show(expected)}` };
55
+ }
56
+ function applyOperator(actual, op, expected) {
57
+ switch (op) {
58
+ case "eq":
59
+ return looseEqual(actual, expected) ? OK : { ok: false, reason: `expected ${show(expected)}, got ${show(actual)}` };
60
+ case "ne":
61
+ return !looseEqual(actual, expected) ? OK : { ok: false, reason: `expected anything but ${show(expected)}` };
62
+ case "gt":
63
+ case "gte":
64
+ case "lt":
65
+ case "lte":
66
+ return compareNumbers(actual, expected, op);
67
+ case "contains":
68
+ case "icontains": {
69
+ if (typeof actual === "string") {
70
+ const hay = op === "icontains" ? actual.toLowerCase() : actual;
71
+ const needle = op === "icontains" ? String(expected).toLowerCase() : String(expected);
72
+ return hay.includes(needle) ? OK : { ok: false, reason: `expected text to contain ${show(expected)}, got ${show(actual)}` };
73
+ }
74
+ if (Array.isArray(actual)) {
75
+ return actual.some((item) => matchValue(item, expected).ok)
76
+ ? OK
77
+ : { ok: false, reason: `expected list to contain ${show(expected)}, got ${show(actual)}` };
78
+ }
79
+ return { ok: false, reason: `expected text or list containing ${show(expected)}, got ${show(actual)}` };
80
+ }
81
+ case "not_contains": {
82
+ const r = applyOperator(actual, "contains", expected);
83
+ if (actual === undefined || actual === null)
84
+ return OK;
85
+ return r.ok ? { ok: false, reason: `expected not to contain ${show(expected)}, got ${show(actual)}` } : OK;
86
+ }
87
+ case "matches":
88
+ return typeof actual === "string" && toRegExp(String(expected)).test(actual)
89
+ ? OK
90
+ : { ok: false, reason: `expected ${show(actual)} to match ${String(expected)}` };
91
+ case "in":
92
+ return Array.isArray(expected) && expected.some((e) => looseEqual(actual, e))
93
+ ? OK
94
+ : { ok: false, reason: `expected one of ${show(expected)}, got ${show(actual)}` };
95
+ case "not_in":
96
+ return Array.isArray(expected) && expected.some((e) => looseEqual(actual, e))
97
+ ? { ok: false, reason: `expected none of ${show(expected)}, got ${show(actual)}` }
98
+ : OK;
99
+ case "exists": {
100
+ const present = actual !== undefined && actual !== null;
101
+ return present === Boolean(expected) ? OK : { ok: false, reason: expected ? "expected value to exist" : `expected no value, got ${show(actual)}` };
102
+ }
103
+ case "length": {
104
+ const len = typeof actual === "string" || Array.isArray(actual) ? actual.length : undefined;
105
+ if (len === undefined)
106
+ return { ok: false, reason: `expected text or list, got ${show(actual)}` };
107
+ const r = matchValue(len, expected);
108
+ return r.ok ? OK : { ok: false, reason: `length ${len}: ${r.reason}` };
109
+ }
110
+ case "not": {
111
+ const r = matchValue(actual, expected);
112
+ return r.ok ? { ok: false, reason: `expected not to match ${show(expected)}` } : OK;
113
+ }
114
+ default:
115
+ return { ok: false, reason: `unknown operator ${op}` };
116
+ }
117
+ }
118
+ /**
119
+ * Match `actual` against an expectation.
120
+ * - Operator objects (`{ gt: 100 }`, `{ contains: "x" }`) apply each operator.
121
+ * - Plain objects match as a subset; keys may be dotted paths.
122
+ * - Everything else uses loose equality (`1` equals `"1"`).
123
+ */
124
+ export function matchValue(actual, expected) {
125
+ if (isOperatorObject(expected)) {
126
+ for (const [op, arg] of Object.entries(expected)) {
127
+ const r = applyOperator(actual, op, arg);
128
+ if (!r.ok)
129
+ return r;
130
+ }
131
+ return OK;
132
+ }
133
+ if (isPlainObject(expected)) {
134
+ if (!isPlainObject(actual))
135
+ return { ok: false, reason: `expected an object, got ${show(actual)}` };
136
+ for (const [key, exp] of Object.entries(expected)) {
137
+ const r = matchValue(getPath(actual, key), exp);
138
+ if (!r.ok)
139
+ return { ok: false, reason: `${key}: ${r.reason}` };
140
+ }
141
+ return OK;
142
+ }
143
+ if (Array.isArray(expected)) {
144
+ if (!Array.isArray(actual) || actual.length !== expected.length) {
145
+ return { ok: false, reason: `expected ${show(expected)}, got ${show(actual)}` };
146
+ }
147
+ for (let i = 0; i < expected.length; i++) {
148
+ const r = matchValue(actual[i], expected[i]);
149
+ if (!r.ok)
150
+ return { ok: false, reason: `[${i}]: ${r.reason}` };
151
+ }
152
+ return OK;
153
+ }
154
+ return looseEqual(actual, expected) ? OK : { ok: false, reason: `expected ${show(expected)}, got ${show(actual)}` };
155
+ }
156
+ //# sourceMappingURL=matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../src/matchers.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import type { World } from "./world.js";
2
+ export declare const MCP_PROTOCOL_VERSIONS: string[];
3
+ type JsonRpcResponse = {
4
+ jsonrpc: "2.0";
5
+ id: string | number | null;
6
+ result: unknown;
7
+ } | {
8
+ jsonrpc: "2.0";
9
+ id: string | number | null;
10
+ error: {
11
+ code: number;
12
+ message: string;
13
+ data?: unknown;
14
+ };
15
+ };
16
+ /** Minimal MCP server exposing every fake operation that has a tool spec. Tools only; no resources or prompts. */
17
+ export declare class McpHandler {
18
+ private readonly getWorld;
19
+ constructor(getWorld: () => World);
20
+ listTools(): {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: import("./types.js").JsonSchema;
24
+ annotations: {
25
+ readOnlyHint: boolean;
26
+ idempotentHint: boolean;
27
+ openWorldHint: boolean;
28
+ };
29
+ }[];
30
+ callTool(name: string, args?: Record<string, unknown>): Promise<{
31
+ content: {
32
+ type: string;
33
+ text: string;
34
+ }[];
35
+ isError: boolean;
36
+ } | undefined>;
37
+ /** Handle one JSON-RPC message or a batch. Returns undefined when nothing should be sent back. */
38
+ handle(payload: unknown): Promise<JsonRpcResponse | JsonRpcResponse[] | undefined>;
39
+ private handleOne;
40
+ }
41
+ /** Serve MCP over stdio (newline-delimited JSON-RPC). Resolves when stdin closes. */
42
+ export declare function serveStdio(handler: McpHandler, input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream): Promise<void>;
43
+ export {};