Skip to content

Commit 1fabca9

Browse files
committed
style: format with oxfmt
1 parent 87e5468 commit 1fabca9

15 files changed

Lines changed: 629 additions & 299 deletions

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Instructions for AI agents working in this repository.
1010

1111
- **Runtime:** Bun + TypeScript, ES modules only.
1212
- Touch only code related to the task.
13-
- Comment *why*, never *what*.
13+
- Comment _why_, never _what_.
1414
- No emojis in code or docs.
1515

1616
## Build & Validation

‎CLAUDE.md‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
Default to using Bun instead of Node.js.
32

43
- Use `bun <file>` instead of `node <file>` or `ts-node <file>`

‎e2e/gmail.mutations.e2e.test.ts‎

Lines changed: 122 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010

1111
const LIVE_TEST_TIMEOUT_MS = 60_000;
1212
const mutationEnabled =
13-
process.env.GMAIL_LIVE_TEST === "1" && process.env.GMAIL_LIVE_MUTATION_TEST === "1";
13+
process.env.GMAIL_LIVE_TEST === "1" &&
14+
process.env.GMAIL_LIVE_MUTATION_TEST === "1";
1415

1516
if (!mutationEnabled) {
1617
test.skip("Gmail mutations require GMAIL_LIVE_TEST=1 and GMAIL_LIVE_MUTATION_TEST=1", () => {});
@@ -33,112 +34,141 @@ if (!mutationEnabled) {
3334
}
3435
});
3536

36-
test("creates and cleans up a draft, then restores fixture labels", async () => {
37-
const signal = new AbortController().signal;
38-
const run = (name: string, arguments_: Record<string, unknown>) =>
39-
harness.tools.run(
40-
{ id: `live-${name}`, name, arguments: arguments_ },
41-
signal,
42-
);
43-
const subject = `interchange-gmail-live-${crypto.randomUUID()}`;
44-
draftSubjects.add(subject);
45-
46-
const draftResult = await run("gmail_create_draft", {
47-
subject,
48-
body: "Standalone Gmail live-test draft.",
49-
});
50-
const draftId = getString(toolData(draftResult, "gmail_create_draft"), "id");
51-
if (draftId === undefined) throw new Error("gmail_create_draft did not return an ID");
52-
53-
const listDraftsResult = await run("gmail_list_drafts", {
54-
query: `subject:${subject}`,
55-
});
56-
const drafts = getArray(toolData(listDraftsResult, "gmail_list_drafts"), "drafts") ?? [];
57-
expect(
58-
drafts.some(
59-
(draft) => isRecord(draft) && getString(draft, "id") === draftId,
60-
),
61-
).toBe(true);
62-
63-
const originalMessage = await run("gmail_get_message", {
64-
messageId: harness.fixture.messageId,
65-
messageFormat: "METADATA_ONLY",
66-
});
67-
const messageWasStarred = (getArray(
68-
toolData(originalMessage, "gmail_get_message"),
69-
"labelIds",
70-
) ?? []).includes("STARRED");
37+
test(
38+
"creates and cleans up a draft, then restores fixture labels",
39+
async () => {
40+
const signal = new AbortController().signal;
41+
const run = (name: string, arguments_: Record<string, unknown>) =>
42+
harness.tools.run(
43+
{ id: `live-${name}`, name, arguments: arguments_ },
44+
signal,
45+
);
46+
const subject = `interchange-gmail-live-${crypto.randomUUID()}`;
47+
draftSubjects.add(subject);
7148

72-
const originalThread = await run("gmail_get_thread", {
73-
threadId: harness.fixture.threadId,
74-
messageFormat: "METADATA_ONLY",
75-
});
76-
const originalMessages = getArray(
77-
toolData(originalThread, "gmail_get_thread"),
78-
"messages",
79-
) ?? [];
80-
const originalMessageData = originalMessages[0];
81-
const threadWasStarred =
82-
isRecord(originalMessageData) &&
83-
(getArray(originalMessageData, "labelIds") ?? []).includes("STARRED");
49+
const draftResult = await run("gmail_create_draft", {
50+
subject,
51+
body: "Standalone Gmail live-test draft.",
52+
});
53+
const draftId = getString(
54+
toolData(draftResult, "gmail_create_draft"),
55+
"id",
56+
);
57+
if (draftId === undefined)
58+
throw new Error("gmail_create_draft did not return an ID");
8459

85-
try {
86-
const labelMessage = await run("gmail_label_message", {
87-
messageId: harness.fixture.messageId,
88-
labelIds: ["STARRED"],
60+
const listDraftsResult = await run("gmail_list_drafts", {
61+
query: `subject:${subject}`,
8962
});
63+
const drafts =
64+
getArray(toolData(listDraftsResult, "gmail_list_drafts"), "drafts") ??
65+
[];
9066
expect(
91-
(getArray(toolData(labelMessage, "gmail_label_message"), "labelIds") ?? []).includes(
92-
"STARRED",
67+
drafts.some(
68+
(draft) => isRecord(draft) && getString(draft, "id") === draftId,
9369
),
9470
).toBe(true);
9571

96-
const unlabelMessage = await run("gmail_unlabel_message", {
72+
const originalMessage = await run("gmail_get_message", {
9773
messageId: harness.fixture.messageId,
98-
labelIds: ["STARRED"],
74+
messageFormat: "METADATA_ONLY",
9975
});
100-
expect(
101-
(getArray(toolData(unlabelMessage, "gmail_unlabel_message"), "labelIds") ?? []).includes(
102-
"STARRED",
103-
),
104-
).toBe(false);
76+
const messageWasStarred = (
77+
getArray(
78+
toolData(originalMessage, "gmail_get_message"),
79+
"labelIds",
80+
) ?? []
81+
).includes("STARRED");
10582

106-
const labelThread = await run("gmail_label_thread", {
83+
const originalThread = await run("gmail_get_thread", {
10784
threadId: harness.fixture.threadId,
108-
labelIds: ["STARRED"],
85+
messageFormat: "METADATA_ONLY",
10986
});
110-
expect(
111-
(getArray(toolData(labelThread, "gmail_label_thread"), "messages") ?? []).every(
112-
(message) =>
113-
isRecord(message) &&
114-
(getArray(message, "labelIds") ?? []).includes("STARRED"),
115-
),
116-
).toBe(true);
87+
const originalMessages =
88+
getArray(toolData(originalThread, "gmail_get_thread"), "messages") ??
89+
[];
90+
const originalMessageData = originalMessages[0];
91+
const threadWasStarred =
92+
isRecord(originalMessageData) &&
93+
(getArray(originalMessageData, "labelIds") ?? []).includes("STARRED");
11794

118-
const unlabelThread = await run("gmail_unlabel_thread", {
119-
threadId: harness.fixture.threadId,
120-
labelIds: ["STARRED"],
121-
});
122-
expect(
123-
(getArray(toolData(unlabelThread, "gmail_unlabel_thread"), "messages") ?? []).every(
124-
(message) =>
125-
!isRecord(message) ||
126-
!(getArray(message, "labelIds") ?? []).includes("STARRED"),
127-
),
128-
).toBe(true);
129-
} finally {
13095
try {
131-
await run(
132-
messageWasStarred ? "gmail_label_message" : "gmail_unlabel_message",
133-
{ messageId: harness.fixture.messageId, labelIds: ["STARRED"] },
134-
);
96+
const labelMessage = await run("gmail_label_message", {
97+
messageId: harness.fixture.messageId,
98+
labelIds: ["STARRED"],
99+
});
100+
expect(
101+
(
102+
getArray(
103+
toolData(labelMessage, "gmail_label_message"),
104+
"labelIds",
105+
) ?? []
106+
).includes("STARRED"),
107+
).toBe(true);
108+
109+
const unlabelMessage = await run("gmail_unlabel_message", {
110+
messageId: harness.fixture.messageId,
111+
labelIds: ["STARRED"],
112+
});
113+
expect(
114+
(
115+
getArray(
116+
toolData(unlabelMessage, "gmail_unlabel_message"),
117+
"labelIds",
118+
) ?? []
119+
).includes("STARRED"),
120+
).toBe(false);
121+
122+
const labelThread = await run("gmail_label_thread", {
123+
threadId: harness.fixture.threadId,
124+
labelIds: ["STARRED"],
125+
});
126+
expect(
127+
(
128+
getArray(
129+
toolData(labelThread, "gmail_label_thread"),
130+
"messages",
131+
) ?? []
132+
).every(
133+
(message) =>
134+
isRecord(message) &&
135+
(getArray(message, "labelIds") ?? []).includes("STARRED"),
136+
),
137+
).toBe(true);
138+
139+
const unlabelThread = await run("gmail_unlabel_thread", {
140+
threadId: harness.fixture.threadId,
141+
labelIds: ["STARRED"],
142+
});
143+
expect(
144+
(
145+
getArray(
146+
toolData(unlabelThread, "gmail_unlabel_thread"),
147+
"messages",
148+
) ?? []
149+
).every(
150+
(message) =>
151+
!isRecord(message) ||
152+
!(getArray(message, "labelIds") ?? []).includes("STARRED"),
153+
),
154+
).toBe(true);
135155
} finally {
136-
await run(
137-
threadWasStarred ? "gmail_label_thread" : "gmail_unlabel_thread",
138-
{ threadId: harness.fixture.threadId, labelIds: ["STARRED"] },
139-
);
156+
try {
157+
await run(
158+
messageWasStarred
159+
? "gmail_label_message"
160+
: "gmail_unlabel_message",
161+
{ messageId: harness.fixture.messageId, labelIds: ["STARRED"] },
162+
);
163+
} finally {
164+
await run(
165+
threadWasStarred ? "gmail_label_thread" : "gmail_unlabel_thread",
166+
{ threadId: harness.fixture.threadId, labelIds: ["STARRED"] },
167+
);
168+
}
140169
}
141-
}
142-
}, LIVE_TEST_TIMEOUT_MS);
170+
},
171+
LIVE_TEST_TIMEOUT_MS,
172+
);
143173
});
144174
}

‎e2e/gmail.read.e2e.test.ts‎

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,45 @@ if (process.env.GMAIL_LIVE_TEST !== "1") {
1818
await harness?.dispose();
1919
});
2020

21-
test("reads the named fixture through every read tool", async () => {
22-
const signal = new AbortController().signal;
23-
const threadResult = await harness.tools.run(
24-
{
25-
id: "live-thread-read",
26-
name: "gmail_get_thread",
27-
arguments: { threadId: harness.fixture.threadId },
28-
},
29-
signal,
30-
);
31-
expect(toolId(threadResult, "gmail_get_thread")).toBe(harness.fixture.threadId);
32-
33-
const messageResult = await harness.tools.run(
34-
{
35-
id: "live-message-read",
36-
name: "gmail_get_message",
37-
arguments: {
38-
messageId: harness.fixture.messageId,
39-
messageFormat: "METADATA_ONLY",
21+
test(
22+
"reads the named fixture through every read tool",
23+
async () => {
24+
const signal = new AbortController().signal;
25+
const threadResult = await harness.tools.run(
26+
{
27+
id: "live-thread-read",
28+
name: "gmail_get_thread",
29+
arguments: { threadId: harness.fixture.threadId },
4030
},
41-
},
42-
signal,
43-
);
44-
expect(toolId(messageResult, "gmail_get_message")).toBe(harness.fixture.messageId);
45-
46-
const labelsResult = await harness.tools.run(
47-
{ id: "live-label-list", name: "gmail_list_labels", arguments: {} },
48-
signal,
49-
);
50-
const labels = toolData(labelsResult, "gmail_list_labels").labels;
51-
expect(Array.isArray(labels)).toBe(true);
52-
}, LIVE_TEST_TIMEOUT_MS);
31+
signal,
32+
);
33+
expect(toolId(threadResult, "gmail_get_thread")).toBe(
34+
harness.fixture.threadId,
35+
);
36+
37+
const messageResult = await harness.tools.run(
38+
{
39+
id: "live-message-read",
40+
name: "gmail_get_message",
41+
arguments: {
42+
messageId: harness.fixture.messageId,
43+
messageFormat: "METADATA_ONLY",
44+
},
45+
},
46+
signal,
47+
);
48+
expect(toolId(messageResult, "gmail_get_message")).toBe(
49+
harness.fixture.messageId,
50+
);
51+
52+
const labelsResult = await harness.tools.run(
53+
{ id: "live-label-list", name: "gmail_list_labels", arguments: {} },
54+
signal,
55+
);
56+
const labels = toolData(labelsResult, "gmail_list_labels").labels;
57+
expect(Array.isArray(labels)).toBe(true);
58+
},
59+
LIVE_TEST_TIMEOUT_MS,
60+
);
5361
});
5462
}

0 commit comments

Comments
 (0)