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
@@ -0,0 +1,92 @@
1
+ import { ApiError, type JsonObject } from "../types.js";
2
+ import type { Backend, HttpRoute, Operation, TurnInjection, World } from "../world.js";
3
+ export interface SlackMessage {
4
+ type: "message";
5
+ channel: string;
6
+ user?: string;
7
+ bot_id?: string;
8
+ text: string;
9
+ ts: string;
10
+ thread_ts?: string;
11
+ blocks?: unknown;
12
+ reactions?: {
13
+ name: string;
14
+ users: string[];
15
+ count: number;
16
+ }[];
17
+ edited?: {
18
+ user: string;
19
+ ts: string;
20
+ };
21
+ }
22
+ export interface SlackSeed {
23
+ bot_user_id?: string;
24
+ users?: {
25
+ id: string;
26
+ name: string;
27
+ real_name?: string;
28
+ email?: string;
29
+ is_bot?: boolean;
30
+ }[];
31
+ channels?: {
32
+ id: string;
33
+ name: string;
34
+ is_private?: boolean;
35
+ }[];
36
+ messages?: (Partial<SlackMessage> & {
37
+ channel: string;
38
+ text: string;
39
+ })[];
40
+ }
41
+ export declare class SlackBackend implements Backend {
42
+ private readonly world;
43
+ readonly name = "slack";
44
+ readonly mounts: {
45
+ prefix: string;
46
+ strip: boolean;
47
+ }[];
48
+ private channels;
49
+ private users;
50
+ private botUserId;
51
+ constructor(world: World, seed?: SlackSeed);
52
+ private nextTs;
53
+ private channel;
54
+ private findMessage;
55
+ private post;
56
+ operations(): Operation[];
57
+ routes(): HttpRoute[];
58
+ errorResponse(err: ApiError): {
59
+ status: number;
60
+ body: {
61
+ ok: boolean;
62
+ error: string;
63
+ };
64
+ headers: {
65
+ "Retry-After": string;
66
+ };
67
+ } | {
68
+ status: number;
69
+ body: {
70
+ ok: boolean;
71
+ error: string;
72
+ };
73
+ headers?: undefined;
74
+ };
75
+ injectTurn(turn: TurnInjection, { deliveryId }: {
76
+ world: World;
77
+ deliveryId: string;
78
+ }): JsonObject;
79
+ seededSensitiveValues(): string[];
80
+ snapshot(): {
81
+ channels: Record<string, unknown>;
82
+ users: {
83
+ [k: string]: {
84
+ id: string;
85
+ name: string;
86
+ real_name?: string;
87
+ email?: string;
88
+ is_bot?: boolean;
89
+ };
90
+ };
91
+ };
92
+ }
@@ -0,0 +1,221 @@
1
+ import { ApiError } from "../types.js";
2
+ import { IDEMPOTENCY_KEY, int, obj, required, str } from "./common.js";
3
+ export class SlackBackend {
4
+ world;
5
+ name = "slack";
6
+ mounts = [
7
+ { prefix: "/slack", strip: true },
8
+ { prefix: "/api", strip: false },
9
+ ];
10
+ channels = new Map();
11
+ users = new Map();
12
+ botUserId;
13
+ constructor(world, seed = {}) {
14
+ this.world = world;
15
+ this.botUserId = seed.bot_user_id ?? "UBOT";
16
+ this.users.set(this.botUserId, { id: this.botUserId, name: "agent-bot", is_bot: true });
17
+ for (const u of seed.users ?? [])
18
+ this.users.set(u.id, { ...u });
19
+ for (const c of seed.channels ?? [])
20
+ this.channels.set(c.id, { id: c.id, name: c.name.replace(/^#/, ""), is_private: c.is_private ?? false, messages: [] });
21
+ for (const m of seed.messages ?? []) {
22
+ const ch = this.channel(m.channel);
23
+ ch.messages.push({ ...m, type: "message", channel: ch.id, text: m.text, ts: m.ts ?? this.nextTs() });
24
+ }
25
+ }
26
+ nextTs() {
27
+ const seconds = Math.floor(this.world.nowMs() / 1000);
28
+ return `${seconds}.${String(this.world.next("slack.ts")).padStart(6, "0")}`;
29
+ }
30
+ channel(idOrName) {
31
+ const key = String(idOrName ?? "").replace(/^#/, "");
32
+ const ch = this.channels.get(key) ?? [...this.channels.values()].find((c) => c.name === key);
33
+ if (!ch)
34
+ throw new ApiError(404, "channel_not_found", `Channel ${String(idOrName)} not found`);
35
+ return ch;
36
+ }
37
+ findMessage(channel, ts) {
38
+ const ch = this.channel(channel);
39
+ const msg = ch.messages.find((m) => m.ts === String(ts));
40
+ if (!msg)
41
+ throw new ApiError(404, "message_not_found", `Message ${String(ts)} not found`);
42
+ return { ch, msg };
43
+ }
44
+ post(ctx, input) {
45
+ const ch = this.channel(required(input, "channel"));
46
+ const text = input.text === undefined ? "" : String(input.text);
47
+ const blocks = typeof input.blocks === "string" ? safeJson(input.blocks) : input.blocks;
48
+ if (!text && !blocks)
49
+ throw new ApiError(400, "no_text", "text or blocks is required");
50
+ const threadTs = input.thread_ts ? String(input.thread_ts) : undefined;
51
+ if (threadTs && !ch.messages.some((m) => m.ts === threadTs))
52
+ throw new ApiError(404, "thread_not_found", `Thread ${threadTs} not found`);
53
+ const msg = { type: "message", channel: ch.id, user: this.botUserId, bot_id: "BAGENT", text, ts: this.nextTs(), ...(threadTs ? { thread_ts: threadTs } : {}), ...(blocks ? { blocks } : {}) };
54
+ ch.messages.push(msg);
55
+ ctx.effect("slack.message.post", { channel: ch.id, channel_name: ch.name, text, thread_ts: threadTs, blocks, ts: msg.ts }, `channel:${ch.id}`);
56
+ return { ok: true, channel: ch.id, ts: msg.ts, message: { ...msg } };
57
+ }
58
+ operations() {
59
+ const b = "slack";
60
+ return [
61
+ {
62
+ id: "slack.chat.postMessage",
63
+ backend: b,
64
+ write: true,
65
+ tool: {
66
+ name: "slack_post_message",
67
+ description: "Post a message to a Slack channel, or reply in a thread with thread_ts.",
68
+ inputSchema: obj({ channel: str("Channel id or name"), text: str("Message text"), thread_ts: str("Parent message ts to reply in thread"), idempotency_key: IDEMPOTENCY_KEY }, ["channel", "text"]),
69
+ },
70
+ run: (input, ctx) => this.post(ctx, input),
71
+ },
72
+ {
73
+ id: "slack.chat.update",
74
+ backend: b,
75
+ write: true,
76
+ tool: {
77
+ name: "slack_update_message",
78
+ description: "Edit a message the bot posted.",
79
+ inputSchema: obj({ channel: str("Channel id"), ts: str("Message ts"), text: str("New text"), idempotency_key: IDEMPOTENCY_KEY }, ["channel", "ts", "text"]),
80
+ },
81
+ run: (input, ctx) => {
82
+ const { ch, msg } = this.findMessage(required(input, "channel"), required(input, "ts"));
83
+ if (msg.user !== this.botUserId)
84
+ throw new ApiError(403, "cant_update_message", "Only messages posted by the bot can be edited");
85
+ const before = msg.text;
86
+ msg.text = String(required(input, "text"));
87
+ msg.edited = { user: this.botUserId, ts: this.nextTs() };
88
+ ctx.effect("slack.message.update", { channel: ch.id, ts: msg.ts, text: msg.text, previous_text: before }, `channel:${ch.id}`);
89
+ return { ok: true, channel: ch.id, ts: msg.ts, text: msg.text };
90
+ },
91
+ },
92
+ {
93
+ id: "slack.conversations.history",
94
+ backend: b,
95
+ write: false,
96
+ tool: {
97
+ name: "slack_get_history",
98
+ description: "Read recent top-level messages in a channel, newest first.",
99
+ inputSchema: obj({ channel: str("Channel id or name"), limit: int("Max messages (default 100)") }, ["channel"]),
100
+ },
101
+ run: (input) => {
102
+ const ch = this.channel(required(input, "channel"));
103
+ const limit = Number(input.limit ?? 100);
104
+ const top = ch.messages.filter((m) => !m.thread_ts || m.thread_ts === m.ts);
105
+ return { ok: true, messages: [...top].reverse().slice(0, limit).map((m) => ({ ...m, reply_count: ch.messages.filter((r) => r.thread_ts === m.ts && r.ts !== m.ts).length })), has_more: top.length > limit };
106
+ },
107
+ },
108
+ {
109
+ id: "slack.conversations.replies",
110
+ backend: b,
111
+ write: false,
112
+ tool: {
113
+ name: "slack_get_thread",
114
+ description: "Read a thread: the parent message and its replies, oldest first.",
115
+ inputSchema: obj({ channel: str("Channel id or name"), ts: str("Parent message ts") }, ["channel", "ts"]),
116
+ },
117
+ run: (input) => {
118
+ const { ch, msg } = this.findMessage(required(input, "channel"), required(input, "ts"));
119
+ return { ok: true, messages: [msg, ...ch.messages.filter((m) => m.thread_ts === msg.ts && m.ts !== msg.ts)].map((m) => ({ ...m })), has_more: false };
120
+ },
121
+ },
122
+ {
123
+ id: "slack.conversations.list",
124
+ backend: b,
125
+ write: false,
126
+ tool: { name: "slack_list_channels", description: "List channels.", inputSchema: obj({}) },
127
+ run: () => ({ ok: true, channels: [...this.channels.values()].map((c) => ({ id: c.id, name: c.name, is_private: c.is_private })) }),
128
+ },
129
+ {
130
+ id: "slack.reactions.add",
131
+ backend: b,
132
+ write: true,
133
+ tool: {
134
+ name: "slack_add_reaction",
135
+ description: "Add an emoji reaction to a message.",
136
+ inputSchema: obj({ channel: str("Channel id"), timestamp: str("Message ts"), name: str("Emoji name without colons"), idempotency_key: IDEMPOTENCY_KEY }, ["channel", "timestamp", "name"]),
137
+ },
138
+ run: (input, ctx) => {
139
+ const { ch, msg } = this.findMessage(required(input, "channel"), required(input, "timestamp", "ts"));
140
+ const name = String(required(input, "name")).replace(/:/g, "");
141
+ msg.reactions ??= [];
142
+ const existing = msg.reactions.find((r) => r.name === name);
143
+ if (existing?.users.includes(this.botUserId))
144
+ throw new ApiError(400, "already_reacted", "Already reacted with this emoji");
145
+ if (existing) {
146
+ existing.users.push(this.botUserId);
147
+ existing.count += 1;
148
+ }
149
+ else
150
+ msg.reactions.push({ name, users: [this.botUserId], count: 1 });
151
+ ctx.effect("slack.reaction.add", { channel: ch.id, ts: msg.ts, name }, `channel:${ch.id}`);
152
+ return { ok: true };
153
+ },
154
+ },
155
+ {
156
+ id: "slack.users.info",
157
+ backend: b,
158
+ write: false,
159
+ tool: { name: "slack_get_user", description: "Get a Slack user's profile.", inputSchema: obj({ user: str("User id") }, ["user"]) },
160
+ run: (input) => {
161
+ const u = this.users.get(String(required(input, "user")));
162
+ if (!u)
163
+ throw new ApiError(404, "user_not_found", `User ${String(input.user)} not found`);
164
+ return { ok: true, user: { ...u, profile: { real_name: u.real_name ?? u.name, email: u.email } } };
165
+ },
166
+ },
167
+ ];
168
+ }
169
+ routes() {
170
+ const methods = [
171
+ ["chat.postMessage", "slack.chat.postMessage"],
172
+ ["chat.update", "slack.chat.update"],
173
+ ["conversations.history", "slack.conversations.history"],
174
+ ["conversations.replies", "slack.conversations.replies"],
175
+ ["conversations.list", "slack.conversations.list"],
176
+ ["reactions.add", "slack.reactions.add"],
177
+ ["users.info", "slack.users.info"],
178
+ ];
179
+ return methods.flatMap(([method, op]) => ["GET", "POST"].map((verb) => ({
180
+ method: verb,
181
+ path: `/api/${method}`,
182
+ op,
183
+ toInput: (r) => ({ ...r.query, ...(r.body ?? {}) }),
184
+ })));
185
+ }
186
+ errorResponse(err) {
187
+ if (err.status === 429)
188
+ return { status: 429, body: { ok: false, error: "ratelimited" }, headers: { "Retry-After": String(err.retryAfter ?? 1) } };
189
+ if (err.status >= 500)
190
+ return { status: err.status, body: { ok: false, error: err.code } };
191
+ // Slack reports API errors with HTTP 200 and ok:false.
192
+ return { status: 200, body: { ok: false, error: err.code } };
193
+ }
194
+ injectTurn(turn, { deliveryId }) {
195
+ const ch = this.channel(turn.channel ?? [...this.channels.keys()][0]);
196
+ const user = String(turn.user ?? "UCUSTOMER");
197
+ if (!this.users.has(user))
198
+ this.users.set(user, { id: user, name: user.toLowerCase() });
199
+ const msg = { type: "message", channel: ch.id, user, text: String(turn.text ?? ""), ts: this.nextTs(), ...(turn.thread_ts ? { thread_ts: String(turn.thread_ts) } : {}) };
200
+ ch.messages.push(msg);
201
+ return { type: "event_callback", event_id: deliveryId, event: { ...msg, type: turn.mention ? "app_mention" : "message" } };
202
+ }
203
+ seededSensitiveValues() {
204
+ return [...this.users.values()].flatMap((u) => (u.email ? [u.email] : []));
205
+ }
206
+ snapshot() {
207
+ const channels = {};
208
+ for (const [id, c] of this.channels)
209
+ channels[id] = { ...c, messages: c.messages.map((m) => ({ ...m })) };
210
+ return { channels, users: Object.fromEntries([...this.users].map(([id, u]) => [id, { ...u }])) };
211
+ }
212
+ }
213
+ function safeJson(text) {
214
+ try {
215
+ return JSON.parse(text);
216
+ }
217
+ catch {
218
+ return text;
219
+ }
220
+ }
221
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/backends/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { ApiError, type JsonObject } from "../types.js";
2
+ import type { Backend, HttpRoute, Operation, TurnInjection, World } from "../world.js";
3
+ export interface ZendeskUser {
4
+ id: number;
5
+ name: string;
6
+ email?: string;
7
+ phone?: string;
8
+ role?: "end-user" | "agent" | "admin";
9
+ [key: string]: unknown;
10
+ }
11
+ export interface ZendeskComment {
12
+ id: number;
13
+ type: "Comment";
14
+ author_id: number;
15
+ body: string;
16
+ public: boolean;
17
+ created_at: string;
18
+ }
19
+ export interface ZendeskTicket {
20
+ id: number;
21
+ subject: string;
22
+ description: string;
23
+ status: string;
24
+ priority: string | null;
25
+ type: string | null;
26
+ tags: string[];
27
+ requester_id: number | null;
28
+ assignee_id: number | null;
29
+ group_id: number | null;
30
+ custom_fields: {
31
+ id: number | string;
32
+ value: unknown;
33
+ }[];
34
+ created_at: string;
35
+ updated_at: string;
36
+ comments: ZendeskComment[];
37
+ [key: string]: unknown;
38
+ }
39
+ export interface ZendeskSeed {
40
+ /** User id the agent writes as. Default 1. */
41
+ agent_user_id?: number;
42
+ users?: Partial<ZendeskUser>[];
43
+ groups?: {
44
+ id: number;
45
+ name: string;
46
+ }[];
47
+ /** Ticket fields as in the Zendesk API, plus optional inline `requester` and `comments`. */
48
+ tickets?: Record<string, any>[];
49
+ }
50
+ export declare class ZendeskBackend implements Backend {
51
+ private readonly world;
52
+ readonly name = "zendesk";
53
+ readonly mounts: {
54
+ prefix: string;
55
+ strip: boolean;
56
+ }[];
57
+ private tickets;
58
+ private users;
59
+ private groups;
60
+ private agentUserId;
61
+ constructor(world: World, seed?: ZendeskSeed);
62
+ private upsertUser;
63
+ private ticket;
64
+ private view;
65
+ private addComment;
66
+ private applyUpdate;
67
+ operations(): Operation[];
68
+ private search;
69
+ routes(): HttpRoute[];
70
+ errorResponse(err: ApiError): {
71
+ status: number;
72
+ body: {
73
+ details?: {} | undefined;
74
+ error: string;
75
+ description: string;
76
+ };
77
+ headers: Record<string, string>;
78
+ };
79
+ injectTurn(turn: TurnInjection, { deliveryId }: {
80
+ world: World;
81
+ deliveryId: string;
82
+ }): JsonObject;
83
+ seededSensitiveValues(): string[];
84
+ snapshot(): {
85
+ tickets: Record<string, unknown>;
86
+ users: Record<string, unknown>;
87
+ groups: {
88
+ [k: string]: {
89
+ id: number;
90
+ name: string;
91
+ };
92
+ };
93
+ };
94
+ }