@pome-sh/cli 0.7.0 → 0.8.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.
- package/dist/build-info.json +3 -3
- package/dist/src/cli/docs-topics.js +5 -3
- package/dist/src/runner/runTask.d.ts +14 -0
- package/dist/src/task/taskSchema.d.ts +52 -16
- package/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +27 -0
- package/node_modules/@pome-sh/shared-types/dist/seed-state.js +12 -0
- package/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -1
- package/node_modules/@pome-sh/shared-types/dist/task.d.ts +18 -0
- package/node_modules/@pome-sh/shared-types/package.json +1 -1
- package/node_modules/@pome-sh/shared-types/trace-contract.json +1 -1
- package/node_modules/@pome-sh/twin-gmail/CHANGELOG.md +21 -0
- package/node_modules/@pome-sh/twin-gmail/HOSTED.md +37 -15
- package/node_modules/@pome-sh/twin-gmail/LIMITS.md +10 -0
- package/node_modules/@pome-sh/twin-gmail/README.md +52 -11
- package/node_modules/@pome-sh/twin-gmail/dist/fixtures/mcp-tools-list.canonical.json +242 -7
- package/node_modules/@pome-sh/twin-gmail/dist/src/db.js +6 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/db.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.d.ts +41 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js +138 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.d.ts +10 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/{domain-search.js → domain/filters.js} +52 -36
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/{domain.d.ts → domain/gmail-domain.d.ts} +45 -34
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js +174 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.d.ts +8 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js +122 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.d.ts +4 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js +5 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.d.ts +40 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js +122 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.d.ts +49 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js +276 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.d.ts +19 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js +179 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.d.ts +27 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js +98 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js +2 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.d.ts +21 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js +52 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.d.ts +1 -6
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js +0 -11
- package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.d.ts +4 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.js +3 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/index.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.d.ts +48 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js +23 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.d.ts +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js +39 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js +4 -5
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.d.ts +2 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js +4 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js +7 -8
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js +20 -21
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.d.ts +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.d.ts +2 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js +4 -6
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.d.ts +4 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js +179 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.d.ts +61 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js +318 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js.map +1 -0
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.d.ts +3 -61
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.js +2 -503
- package/node_modules/@pome-sh/twin-gmail/dist/src/search.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.d.ts +13 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js +3 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/server.js +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/server.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.d.ts +2 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js +1 -4
- package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js.map +1 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/types.d.ts +1 -0
- package/node_modules/@pome-sh/twin-gmail/fidelity.inventory.json +42 -435
- package/node_modules/@pome-sh/twin-gmail/fixtures/README.md +4 -4
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.canonical.json +242 -7
- package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.meta.json +3 -3
- package/node_modules/@pome-sh/twin-gmail/package.json +3 -2
- package/node_modules/hono/dist/cjs/client/utils.js +1 -1
- package/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
- package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/compress/index.js +2 -1
- package/node_modules/hono/dist/cjs/middleware/method-override/index.js +5 -3
- package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +10 -4
- package/node_modules/hono/dist/cjs/request.js +8 -3
- package/node_modules/hono/dist/cjs/utils/accept.js +1 -1
- package/node_modules/hono/dist/cjs/utils/body.js +6 -0
- package/node_modules/hono/dist/cjs/utils/url.js +1 -1
- package/node_modules/hono/dist/client/utils.js +1 -1
- package/node_modules/hono/dist/helper/streaming/sse.js +5 -4
- package/node_modules/hono/dist/middleware/cache/index.js +1 -1
- package/node_modules/hono/dist/middleware/compress/index.js +2 -1
- package/node_modules/hono/dist/middleware/method-override/index.js +5 -3
- package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +10 -4
- package/node_modules/hono/dist/request.js +8 -3
- package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
- package/node_modules/hono/dist/types/helper/websocket/index.d.ts +1 -1
- package/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
- package/node_modules/hono/dist/utils/accept.js +1 -1
- package/node_modules/hono/dist/utils/body.js +6 -0
- package/node_modules/hono/dist/utils/url.js +1 -1
- package/node_modules/hono/package.json +3 -3
- package/package.json +3 -3
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.d.ts +0 -5
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js +0 -407
- package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js.map +0 -1
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.d.ts +0 -75
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.js +0 -282
- package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.js.map +0 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { CATEGORY_LABELS, parseDate, parseSize } from "../search-parse.js";
|
|
3
|
+
/**
|
|
4
|
+
* Private SQL prefilter for conjunctive search ASTs.
|
|
5
|
+
* Returns null when the query needs a full in-memory scan (OR/NOT/AROUND/free-text).
|
|
6
|
+
*/
|
|
7
|
+
export function compileSearchToSql(ast, options = {}) {
|
|
8
|
+
const terms = flattenAndTerms(ast);
|
|
9
|
+
if (terms === null)
|
|
10
|
+
return null;
|
|
11
|
+
const clauses = [];
|
|
12
|
+
const params = [];
|
|
13
|
+
let exact = true;
|
|
14
|
+
let folderConstrained = false;
|
|
15
|
+
for (const term of terms) {
|
|
16
|
+
if (term.type === "around")
|
|
17
|
+
return null;
|
|
18
|
+
if (term.type !== "term")
|
|
19
|
+
return null;
|
|
20
|
+
const field = term.field;
|
|
21
|
+
const value = term.value;
|
|
22
|
+
if (!field)
|
|
23
|
+
return null;
|
|
24
|
+
if (field === "is") {
|
|
25
|
+
const status = value.toLocaleLowerCase("en-US");
|
|
26
|
+
if (status === "unread") {
|
|
27
|
+
pushHasLabel(clauses, params, "UNREAD");
|
|
28
|
+
}
|
|
29
|
+
else if (status === "read") {
|
|
30
|
+
pushNotHasLabel(clauses, params, "UNREAD");
|
|
31
|
+
}
|
|
32
|
+
else if (status === "starred") {
|
|
33
|
+
pushHasLabel(clauses, params, "STARRED");
|
|
34
|
+
}
|
|
35
|
+
else if (status === "important") {
|
|
36
|
+
pushHasLabel(clauses, params, "IMPORTANT");
|
|
37
|
+
}
|
|
38
|
+
else if (status === "muted") {
|
|
39
|
+
pushHasLabel(clauses, params, "MUTED");
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
pushHasLabel(clauses, params, value.toUpperCase());
|
|
43
|
+
exact = false;
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (field === "in") {
|
|
48
|
+
const folder = value.toLocaleLowerCase("en-US");
|
|
49
|
+
if (folder === "anywhere") {
|
|
50
|
+
folderConstrained = true;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (folder === "archive") {
|
|
54
|
+
pushNotHasLabel(clauses, params, "INBOX");
|
|
55
|
+
folderConstrained = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (folder === "draft") {
|
|
59
|
+
pushHasLabel(clauses, params, "DRAFT");
|
|
60
|
+
folderConstrained = true;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (["inbox", "trash", "spam", "sent"].includes(folder)) {
|
|
64
|
+
pushHasLabel(clauses, params, folder.toUpperCase());
|
|
65
|
+
folderConstrained = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (field === "label") {
|
|
71
|
+
clauses.push(`EXISTS (
|
|
72
|
+
SELECT 1 FROM message_labels ml
|
|
73
|
+
JOIN labels l ON l.mailbox_id = ml.mailbox_id AND l.id = ml.label_id
|
|
74
|
+
WHERE ml.mailbox_id = messages.mailbox_id AND ml.message_id = messages.id
|
|
75
|
+
AND (l.id = ? COLLATE NOCASE OR l.name = ? COLLATE NOCASE)
|
|
76
|
+
)`);
|
|
77
|
+
params.push(value, value);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (field === "category") {
|
|
81
|
+
const mapped = CATEGORY_LABELS[value.toLocaleLowerCase("en-US")];
|
|
82
|
+
if (!mapped)
|
|
83
|
+
return null;
|
|
84
|
+
pushHasLabel(clauses, params, mapped);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (field === "from") {
|
|
88
|
+
clauses.push("LOWER(from_address) LIKE ?");
|
|
89
|
+
params.push(`%${value.toLocaleLowerCase("en-US")}%`);
|
|
90
|
+
exact = false;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (field === "to") {
|
|
94
|
+
clauses.push("LOWER(to_json) LIKE ?");
|
|
95
|
+
params.push(`%${value.toLocaleLowerCase("en-US")}%`);
|
|
96
|
+
exact = false;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (field === "subject") {
|
|
100
|
+
clauses.push("LOWER(subject) LIKE ?");
|
|
101
|
+
params.push(`%${value.toLocaleLowerCase("en-US")}%`);
|
|
102
|
+
exact = false;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (field === "after" || field === "newer") {
|
|
106
|
+
clauses.push("internal_date > ?");
|
|
107
|
+
params.push(parseDate(value));
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (field === "before" || field === "older") {
|
|
111
|
+
clauses.push("internal_date < ?");
|
|
112
|
+
params.push(parseDate(value));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (field === "larger") {
|
|
116
|
+
clauses.push("size_estimate > ?");
|
|
117
|
+
params.push(parseSize(value));
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (field === "smaller") {
|
|
121
|
+
clauses.push("size_estimate < ?");
|
|
122
|
+
params.push(parseSize(value));
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (field === "size") {
|
|
126
|
+
clauses.push("size_estimate = ?");
|
|
127
|
+
params.push(parseSize(value));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (field === "has") {
|
|
131
|
+
const has = value.toLocaleLowerCase("en-US");
|
|
132
|
+
if (has === "attachment") {
|
|
133
|
+
clauses.push(`EXISTS (
|
|
134
|
+
SELECT 1 FROM attachments a
|
|
135
|
+
WHERE a.mailbox_id = messages.mailbox_id AND a.message_id = messages.id
|
|
136
|
+
)`);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
if (!options.includeTrash && !options.explicitAnywhere && !folderConstrained) {
|
|
144
|
+
for (const label of ["TRASH", "SPAM", "DRAFT"]) {
|
|
145
|
+
pushNotHasLabel(clauses, params, label);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { clauses, params, exact };
|
|
149
|
+
}
|
|
150
|
+
function flattenAndTerms(node) {
|
|
151
|
+
if (node.type === "and") {
|
|
152
|
+
const out = [];
|
|
153
|
+
for (const child of node.children) {
|
|
154
|
+
const nested = flattenAndTerms(child);
|
|
155
|
+
if (nested === null)
|
|
156
|
+
return null;
|
|
157
|
+
out.push(...nested);
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
if (node.type === "term" || node.type === "around")
|
|
162
|
+
return [node];
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
function pushHasLabel(clauses, params, labelId) {
|
|
166
|
+
clauses.push(`EXISTS (
|
|
167
|
+
SELECT 1 FROM message_labels ml
|
|
168
|
+
WHERE ml.mailbox_id = messages.mailbox_id AND ml.message_id = messages.id AND ml.label_id = ?
|
|
169
|
+
)`);
|
|
170
|
+
params.push(labelId);
|
|
171
|
+
}
|
|
172
|
+
function pushNotHasLabel(clauses, params, labelId) {
|
|
173
|
+
clauses.push(`NOT EXISTS (
|
|
174
|
+
SELECT 1 FROM message_labels ml
|
|
175
|
+
WHERE ml.mailbox_id = messages.mailbox_id AND ml.message_id = messages.id AND ml.label_id = ?
|
|
176
|
+
)`);
|
|
177
|
+
params.push(labelId);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=search-sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-sql.js","sourceRoot":"","sources":["../../../src/domain/search-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HistoryEvent } from "../types.js";
|
|
2
|
+
import type { GmailDomain } from "./gmail-domain.js";
|
|
3
|
+
export declare function profile(domain: GmailDomain, email: string): {
|
|
4
|
+
emailAddress: string;
|
|
5
|
+
messagesTotal: number;
|
|
6
|
+
threadsTotal: number;
|
|
7
|
+
historyId: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function currentHistoryIdFor(domain: GmailDomain, email: string): string;
|
|
10
|
+
export declare function latestMessageHistory(domain: GmailDomain, email: string, messageId: string): string;
|
|
11
|
+
export declare function latestThreadHistory(domain: GmailDomain, email: string, threadId: string): string;
|
|
12
|
+
export declare function listHistory(domain: GmailDomain, email: string, startHistoryId: string, options?: {
|
|
13
|
+
types?: string[];
|
|
14
|
+
}): {
|
|
15
|
+
history: HistoryEvent[];
|
|
16
|
+
historyId: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function forwardingAddresses(domain: GmailDomain, email: string): Array<{
|
|
19
|
+
forwardingEmail: string;
|
|
20
|
+
verificationStatus: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function forwardingAddress(domain: GmailDomain, email: string, forwardingEmail: string): {
|
|
23
|
+
forwardingEmail: string;
|
|
24
|
+
verificationStatus: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function sendAs(domain: GmailDomain, email: string): Array<Record<string, unknown>>;
|
|
27
|
+
export declare function sendAsAddress(domain: GmailDomain, email: string, sendAsEmail: string): Record<string, unknown>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { invalidArgument, notFound } from "../errors.js";
|
|
3
|
+
export function profile(domain, email) {
|
|
4
|
+
const mailboxId = domain.mailboxId(email);
|
|
5
|
+
const totals = domain.db
|
|
6
|
+
.prepare(`SELECT COUNT(*) AS messagesTotal, COUNT(DISTINCT thread_id) AS threadsTotal
|
|
7
|
+
FROM messages WHERE mailbox_id = ?`)
|
|
8
|
+
.get(mailboxId);
|
|
9
|
+
return { emailAddress: email, ...totals, historyId: currentHistoryId(domain, mailboxId) };
|
|
10
|
+
}
|
|
11
|
+
export function currentHistoryIdFor(domain, email) {
|
|
12
|
+
return currentHistoryId(domain, domain.mailboxId(email));
|
|
13
|
+
}
|
|
14
|
+
export function latestMessageHistory(domain, email, messageId) {
|
|
15
|
+
const mailboxId = domain.mailboxId(email);
|
|
16
|
+
const row = domain.db
|
|
17
|
+
.prepare("SELECT MAX(id) AS id FROM history WHERE mailbox_id = ? AND message_id = ?")
|
|
18
|
+
.get(mailboxId, messageId);
|
|
19
|
+
return String(row.id ?? Number(currentHistoryId(domain, mailboxId)));
|
|
20
|
+
}
|
|
21
|
+
export function latestThreadHistory(domain, email, threadId) {
|
|
22
|
+
const mailboxId = domain.mailboxId(email);
|
|
23
|
+
const row = domain.db
|
|
24
|
+
.prepare("SELECT MAX(id) AS id FROM history WHERE mailbox_id = ? AND thread_id = ?")
|
|
25
|
+
.get(mailboxId, threadId);
|
|
26
|
+
return String(row.id ?? Number(currentHistoryId(domain, mailboxId)));
|
|
27
|
+
}
|
|
28
|
+
export function listHistory(domain, email, startHistoryId, options = {}) {
|
|
29
|
+
const mailboxId = domain.mailboxId(email);
|
|
30
|
+
const start = Number(startHistoryId);
|
|
31
|
+
if (!Number.isSafeInteger(start) || start < 0)
|
|
32
|
+
invalidArgument("Invalid startHistoryId");
|
|
33
|
+
const current = Number(currentHistoryId(domain, mailboxId));
|
|
34
|
+
if (start > current)
|
|
35
|
+
notFound("History");
|
|
36
|
+
const rows = domain.db
|
|
37
|
+
.prepare(`SELECT h.*, m.email AS mailbox_email
|
|
38
|
+
FROM history h JOIN mailboxes m ON m.id = h.mailbox_id
|
|
39
|
+
WHERE h.mailbox_id = ? AND h.id > ? ORDER BY h.id`)
|
|
40
|
+
.all(mailboxId, start);
|
|
41
|
+
return {
|
|
42
|
+
history: rows
|
|
43
|
+
.filter((row) => !options.types?.length || options.types.includes(row.event_type))
|
|
44
|
+
.map((row) => ({
|
|
45
|
+
id: String(row.id),
|
|
46
|
+
mailboxEmail: row.mailbox_email,
|
|
47
|
+
messageId: row.message_id,
|
|
48
|
+
threadId: row.thread_id,
|
|
49
|
+
type: row.event_type,
|
|
50
|
+
labelIds: JSON.parse(row.label_ids_json),
|
|
51
|
+
timestamp: row.created_at,
|
|
52
|
+
})),
|
|
53
|
+
historyId: String(current),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function forwardingAddresses(domain, email) {
|
|
57
|
+
const mailboxId = domain.mailboxId(email);
|
|
58
|
+
const rows = domain.db
|
|
59
|
+
.prepare("SELECT email, verification_status FROM forwarding_addresses WHERE mailbox_id = ? ORDER BY email COLLATE NOCASE")
|
|
60
|
+
.all(mailboxId);
|
|
61
|
+
return rows.map((row) => ({ forwardingEmail: row.email, verificationStatus: row.verification_status }));
|
|
62
|
+
}
|
|
63
|
+
export function forwardingAddress(domain, email, forwardingEmail) {
|
|
64
|
+
const found = forwardingAddresses(domain, email).find((item) => item.forwardingEmail.toLowerCase() === forwardingEmail.toLowerCase());
|
|
65
|
+
if (!found)
|
|
66
|
+
notFound("Forwarding address");
|
|
67
|
+
return found;
|
|
68
|
+
}
|
|
69
|
+
export function sendAs(domain, email) {
|
|
70
|
+
const mailboxId = domain.mailboxId(email);
|
|
71
|
+
const rows = domain.db
|
|
72
|
+
.prepare(`SELECT email, display_name, reply_to_address, is_primary, is_default, verification_status
|
|
73
|
+
FROM send_as WHERE mailbox_id = ? ORDER BY is_primary DESC, email COLLATE NOCASE`)
|
|
74
|
+
.all(mailboxId);
|
|
75
|
+
return rows.map((row) => ({
|
|
76
|
+
sendAsEmail: row.email,
|
|
77
|
+
displayName: row.display_name,
|
|
78
|
+
...(row.reply_to_address ? { replyToAddress: row.reply_to_address } : {}),
|
|
79
|
+
isPrimary: Boolean(row.is_primary),
|
|
80
|
+
isDefault: Boolean(row.is_default),
|
|
81
|
+
verificationStatus: row.verification_status,
|
|
82
|
+
treatAsAlias: !row.is_primary,
|
|
83
|
+
signature: "",
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
export function sendAsAddress(domain, email, sendAsEmail) {
|
|
87
|
+
const found = sendAs(domain, email).find((item) => String(item.sendAsEmail).toLowerCase() === sendAsEmail.toLowerCase());
|
|
88
|
+
if (!found)
|
|
89
|
+
notFound("Send-as alias");
|
|
90
|
+
return found;
|
|
91
|
+
}
|
|
92
|
+
function currentHistoryId(domain, mailboxId) {
|
|
93
|
+
const row = domain.db
|
|
94
|
+
.prepare("SELECT history_counter FROM mailbox_counters WHERE mailbox_id = ?")
|
|
95
|
+
.get(mailboxId);
|
|
96
|
+
return String(row.history_counter);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/domain/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { GmailTwinDatabase } from "./types.js";
|
|
3
|
+
export declare const gmailFaultSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodEnum<{
|
|
5
|
+
"rate-limited": "rate-limited";
|
|
6
|
+
}>;
|
|
7
|
+
target: z.ZodDefault<z.ZodString>;
|
|
8
|
+
succeedFirst: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
throttleFor: z.ZodDefault<z.ZodNumber>;
|
|
10
|
+
retryAfterSeconds: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
}, z.core.$strict>;
|
|
12
|
+
export type GmailFault = z.output<typeof gmailFaultSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* Increment the per-operation call counter and, if a `rate-limited` fault is
|
|
15
|
+
* armed for `operation`, throw a 429 during the throttle window. Deterministic
|
|
16
|
+
* and clock-free: calls 1..succeedFirst pass, the next `throttleFor` calls
|
|
17
|
+
* throw, every call after passes. EVERY matching call (including throttled
|
|
18
|
+
* ones) advances the counter, so an agent that retries with backoff clears the
|
|
19
|
+
* window while one that doesn't leaves those sends undelivered.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkFault(db: GmailTwinDatabase, operation: string): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { GmailError } from "./errors.js";
|
|
4
|
+
// Named, reusable fault-injection primitives. A seed lists faults by NAME; the
|
|
5
|
+
// name is teaching vocabulary. Default seeds carry none, so faults are strictly
|
|
6
|
+
// opt-in (mirrors twin-linear `strictScopes`). Extend KNOWN_FAULT_NAMES to add
|
|
7
|
+
// a primitive.
|
|
8
|
+
const KNOWN_FAULT_NAMES = ["rate-limited"];
|
|
9
|
+
export const gmailFaultSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
name: z.enum(KNOWN_FAULT_NAMES),
|
|
12
|
+
target: z.string().min(1).max(128).default("messages.send"),
|
|
13
|
+
succeedFirst: z.number().int().nonnegative().max(1000).default(2),
|
|
14
|
+
throttleFor: z.number().int().positive().max(1000).default(3),
|
|
15
|
+
retryAfterSeconds: z.number().int().positive().max(3600).default(1),
|
|
16
|
+
})
|
|
17
|
+
.strict();
|
|
18
|
+
/**
|
|
19
|
+
* Increment the per-operation call counter and, if a `rate-limited` fault is
|
|
20
|
+
* armed for `operation`, throw a 429 during the throttle window. Deterministic
|
|
21
|
+
* and clock-free: calls 1..succeedFirst pass, the next `throttleFor` calls
|
|
22
|
+
* throw, every call after passes. EVERY matching call (including throttled
|
|
23
|
+
* ones) advances the counter, so an agent that retries with backoff clears the
|
|
24
|
+
* window while one that doesn't leaves those sends undelivered.
|
|
25
|
+
*/
|
|
26
|
+
export function checkFault(db, operation) {
|
|
27
|
+
const fault = readFaults(db).find((f) => f.target === operation);
|
|
28
|
+
if (!fault)
|
|
29
|
+
return;
|
|
30
|
+
const calls = bumpFaultCounter(db, operation);
|
|
31
|
+
if (calls > fault.succeedFirst && calls <= fault.succeedFirst + fault.throttleFor) {
|
|
32
|
+
throw new GmailError(429, "rateLimitExceeded", `Rate limit exceeded for ${operation}. Retry after ${fault.retryAfterSeconds}s.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function readFaults(db) {
|
|
36
|
+
const row = db.prepare("SELECT value FROM gmail_config WHERE key = 'faults'").get();
|
|
37
|
+
if (!row)
|
|
38
|
+
return [];
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(row.value);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function bumpFaultCounter(db, operation) {
|
|
47
|
+
db.prepare("INSERT INTO fault_counters(operation, calls) VALUES (?, 1) " +
|
|
48
|
+
"ON CONFLICT(operation) DO UPDATE SET calls = calls + 1").run(operation);
|
|
49
|
+
const row = db.prepare("SELECT calls FROM fault_counters WHERE operation = ?").get(operation);
|
|
50
|
+
return row.calls;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=faults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faults.js","sourceRoot":"","sources":["../../src/faults.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,eAAe;AACf,MAAM,iBAAiB,GAAG,CAAC,cAAc,CAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAC3D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACpE,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,SAAiB;IACjE,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClF,MAAM,IAAI,UAAU,CAClB,GAAG,EACH,mBAAmB,EACnB,2BAA2B,SAAS,iBAAiB,KAAK,CAAC,iBAAiB,IAAI,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAqB;IACvC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAEpE,CAAC;IACd,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAiB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAqB,EAAE,SAAiB;IAChE,EAAE,CAAC,OAAO,CACR,6DAA6D;QAC3D,wDAAwD,CAC3D,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,SAAS,CAE3F,CAAC;IACF,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import type { SessionValue } from "@pome-sh/sdk/server";
|
|
2
|
-
import type { GmailIdentity
|
|
2
|
+
import type { GmailIdentity } from "./types.js";
|
|
3
3
|
export declare const DEFAULT_GMAIL_EMAIL = "pome-agent@pome-twin.test";
|
|
4
4
|
export declare function identityFromSession(session?: SessionValue): GmailIdentity;
|
|
5
5
|
export declare function resolveUserEmail(userId: string, session?: SessionValue): string;
|
|
6
|
-
export declare function requireMailbox(db: GmailTwinDatabase, email: string): {
|
|
7
|
-
id: number;
|
|
8
|
-
email: string;
|
|
9
|
-
};
|
|
10
|
-
export declare function resolveTokenAlias(env?: NodeJS.ProcessEnv): string | undefined;
|
|
@@ -15,15 +15,4 @@ export function resolveUserEmail(userId, session) {
|
|
|
15
15
|
notFound("User");
|
|
16
16
|
return identity.email;
|
|
17
17
|
}
|
|
18
|
-
export function requireMailbox(db, email) {
|
|
19
|
-
const row = db
|
|
20
|
-
.prepare("SELECT id, email FROM mailboxes WHERE email = ? COLLATE NOCASE")
|
|
21
|
-
.get(email);
|
|
22
|
-
if (!row)
|
|
23
|
-
notFound("User");
|
|
24
|
-
return row;
|
|
25
|
-
}
|
|
26
|
-
export function resolveTokenAlias(env = process.env) {
|
|
27
|
-
return env.POME_GMAIL_TOKEN ?? env.POME_AUTH_TOKEN;
|
|
28
|
-
}
|
|
29
18
|
//# sourceMappingURL=identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,CAAC;IACnC,OAAO;QACL,KAAK,EACH,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,CAAC,CAAC,mBAAmB;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAsB;IACrE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,QAAQ,CAAC,KAAK;QAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,CAAC;IACnC,OAAO;QACL,KAAK,EACH,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,CAAC,CAAC,mBAAmB;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAsB;IACrE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,QAAQ,CAAC,KAAK;QAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
export { GmailDomain } from "./domain.js";
|
|
1
|
+
export { GmailDomain } from "./domain/index.js";
|
|
2
|
+
export type { DraftResource, FilterResource, LabelResource } from "./domain/index.js";
|
|
2
3
|
export { openGmailTwinDatabase, migrate, resetDatabase } from "./db.js";
|
|
3
4
|
export { GmailError, gmailErrorEnvelope } from "./errors.js";
|
|
4
|
-
export { DEFAULT_GMAIL_EMAIL, identityFromSession, resolveUserEmail
|
|
5
|
+
export { DEFAULT_GMAIL_EMAIL, identityFromSession, resolveUserEmail } from "./identity.js";
|
|
5
6
|
export { canonicalRaw, composeMime, decodeGmailRaw, encodeGmailRaw, mimeSha256, normalizeSubject, parseMime, stripBcc, } from "./mime.js";
|
|
6
7
|
export { gmailTools } from "./mcp.js";
|
|
7
8
|
export { projectGmailRecording } from "./recording.js";
|
|
8
|
-
export {
|
|
9
|
+
export { matchesSearch, parseSearchQuery, SEARCH_MAILBOX_MESSAGE_BUDGET, stripHtmlTags, validateSearchQuery, } from "./search.js";
|
|
9
10
|
export { agentPathInboxMailbox, DEFAULT_GMAIL_AGENT_EMAIL, defaultSeedState, gmailSeedSchema, loadSeedFromEnv, parseSeed, } from "./seed.js";
|
|
10
11
|
export { capExportRows, exportGmailState, gmailStateDelta, STATE_EXPORT_COLLECTION_CAP, STATE_EXPORT_FULL_MESSAGE_BUDGET, } from "./state.js";
|
|
11
12
|
export { createGmailTwinApp, gmailTwinDefinition, registerGmailRoutes } from "./twin.js";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
export { GmailDomain } from "./domain.js";
|
|
2
|
+
export { GmailDomain } from "./domain/index.js";
|
|
3
3
|
export { openGmailTwinDatabase, migrate, resetDatabase } from "./db.js";
|
|
4
4
|
export { GmailError, gmailErrorEnvelope } from "./errors.js";
|
|
5
|
-
export { DEFAULT_GMAIL_EMAIL, identityFromSession, resolveUserEmail
|
|
5
|
+
export { DEFAULT_GMAIL_EMAIL, identityFromSession, resolveUserEmail } from "./identity.js";
|
|
6
6
|
export { canonicalRaw, composeMime, decodeGmailRaw, encodeGmailRaw, mimeSha256, normalizeSubject, parseMime, stripBcc, } from "./mime.js";
|
|
7
7
|
export { gmailTools } from "./mcp.js";
|
|
8
8
|
export { projectGmailRecording } from "./recording.js";
|
|
9
|
-
export {
|
|
9
|
+
export { matchesSearch, parseSearchQuery, SEARCH_MAILBOX_MESSAGE_BUDGET, stripHtmlTags, validateSearchQuery, } from "./search.js";
|
|
10
10
|
export { agentPathInboxMailbox, DEFAULT_GMAIL_AGENT_EMAIL, defaultSeedState, gmailSeedSchema, loadSeedFromEnv, parseSeed, } from "./seed.js";
|
|
11
11
|
export { capExportRows, exportGmailState, gmailStateDelta, STATE_EXPORT_COLLECTION_CAP, STATE_EXPORT_FULL_MESSAGE_BUDGET, } from "./state.js";
|
|
12
12
|
export { createGmailTwinApp, gmailTwinDefinition, registerGmailRoutes } from "./twin.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,6BAA6B,EAC7B,aAAa,EACb,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -35,6 +35,15 @@ export declare const getThreadInputSchema: z.ZodObject<{
|
|
|
35
35
|
}>>;
|
|
36
36
|
threadId: z.ZodString;
|
|
37
37
|
}, z.core.$loose>;
|
|
38
|
+
export declare const getMessageInputSchema: z.ZodObject<{
|
|
39
|
+
messageFormat: z.ZodOptional<z.ZodEnum<{
|
|
40
|
+
MESSAGE_FORMAT_UNSPECIFIED: "MESSAGE_FORMAT_UNSPECIFIED";
|
|
41
|
+
MINIMAL: "MINIMAL";
|
|
42
|
+
FULL_CONTENT: "FULL_CONTENT";
|
|
43
|
+
METADATA_ONLY: "METADATA_ONLY";
|
|
44
|
+
}>>;
|
|
45
|
+
messageId: z.ZodString;
|
|
46
|
+
}, z.core.$loose>;
|
|
38
47
|
export declare const searchThreadsInputSchema: z.ZodObject<{
|
|
39
48
|
includeTrash: z.ZodOptional<z.ZodBoolean>;
|
|
40
49
|
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
@@ -50,6 +59,22 @@ export declare const threadLabelsInputSchema: z.ZodObject<{
|
|
|
50
59
|
labelIds: z.ZodArray<z.ZodString>;
|
|
51
60
|
threadId: z.ZodString;
|
|
52
61
|
}, z.core.$loose>;
|
|
62
|
+
export declare const sensitiveThreadLabelInputSchema: z.ZodObject<{
|
|
63
|
+
labelOption: z.ZodEnum<{
|
|
64
|
+
SPAM: "SPAM";
|
|
65
|
+
TRASH: "TRASH";
|
|
66
|
+
LABEL_OPTION_UNSPECIFIED: "LABEL_OPTION_UNSPECIFIED";
|
|
67
|
+
}>;
|
|
68
|
+
threadId: z.ZodString;
|
|
69
|
+
}, z.core.$loose>;
|
|
70
|
+
export declare const sensitiveMessageLabelInputSchema: z.ZodObject<{
|
|
71
|
+
labelOption: z.ZodEnum<{
|
|
72
|
+
SPAM: "SPAM";
|
|
73
|
+
TRASH: "TRASH";
|
|
74
|
+
LABEL_OPTION_UNSPECIFIED: "LABEL_OPTION_UNSPECIFIED";
|
|
75
|
+
}>;
|
|
76
|
+
messageId: z.ZodString;
|
|
77
|
+
}, z.core.$loose>;
|
|
53
78
|
export declare const listLabelsInputSchema: z.ZodObject<{
|
|
54
79
|
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
55
80
|
pageToken: z.ZodOptional<z.ZodString>;
|
|
@@ -113,6 +138,24 @@ export declare const mcpOutputSchemas: {
|
|
|
113
138
|
toRecipients: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
114
139
|
}, z.core.$loose>>>;
|
|
115
140
|
}, z.core.$loose>;
|
|
141
|
+
readonly get_message: z.ZodObject<{
|
|
142
|
+
attachmentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
143
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
144
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
145
|
+
id: z.ZodOptional<z.ZodString>;
|
|
146
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
147
|
+
}, z.core.$loose>>>;
|
|
148
|
+
ccRecipients: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
149
|
+
date: z.ZodOptional<z.ZodString>;
|
|
150
|
+
htmlBody: z.ZodOptional<z.ZodString>;
|
|
151
|
+
id: z.ZodOptional<z.ZodString>;
|
|
152
|
+
labelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
153
|
+
plaintextBody: z.ZodOptional<z.ZodString>;
|
|
154
|
+
sender: z.ZodOptional<z.ZodString>;
|
|
155
|
+
snippet: z.ZodOptional<z.ZodString>;
|
|
156
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
157
|
+
toRecipients: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
158
|
+
}, z.core.$loose>;
|
|
116
159
|
readonly search_threads: z.ZodObject<{
|
|
117
160
|
nextPageToken: z.ZodOptional<z.ZodString>;
|
|
118
161
|
resultCountEstimate: z.ZodOptional<z.ZodString>;
|
|
@@ -140,6 +183,7 @@ export declare const mcpOutputSchemas: {
|
|
|
140
183
|
}, z.core.$loose>;
|
|
141
184
|
readonly label_thread: z.ZodObject<{}, z.core.$loose>;
|
|
142
185
|
readonly unlabel_thread: z.ZodObject<{}, z.core.$loose>;
|
|
186
|
+
readonly apply_sensitive_thread_label: z.ZodObject<{}, z.core.$loose>;
|
|
143
187
|
readonly list_labels: z.ZodObject<{
|
|
144
188
|
labels: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
145
189
|
color: z.ZodOptional<z.ZodObject<{
|
|
@@ -155,6 +199,7 @@ export declare const mcpOutputSchemas: {
|
|
|
155
199
|
}, z.core.$loose>;
|
|
156
200
|
readonly label_message: z.ZodObject<{}, z.core.$loose>;
|
|
157
201
|
readonly unlabel_message: z.ZodObject<{}, z.core.$loose>;
|
|
202
|
+
readonly apply_sensitive_message_label: z.ZodObject<{}, z.core.$loose>;
|
|
158
203
|
readonly create_label: z.ZodObject<{
|
|
159
204
|
color: z.ZodOptional<z.ZodObject<{
|
|
160
205
|
backgroundColor: z.ZodOptional<z.ZodString>;
|
|
@@ -169,8 +214,11 @@ export declare const mcpOutputSchemas: {
|
|
|
169
214
|
export type CreateDraftInput = z.output<typeof createDraftInputSchema>;
|
|
170
215
|
export type ListDraftsInput = z.output<typeof listDraftsInputSchema>;
|
|
171
216
|
export type GetThreadInput = z.output<typeof getThreadInputSchema>;
|
|
217
|
+
export type GetMessageInput = z.output<typeof getMessageInputSchema>;
|
|
172
218
|
export type SearchThreadsInput = z.output<typeof searchThreadsInputSchema>;
|
|
173
219
|
export type ThreadLabelsInput = z.output<typeof threadLabelsInputSchema>;
|
|
220
|
+
export type SensitiveThreadLabelInput = z.output<typeof sensitiveThreadLabelInputSchema>;
|
|
174
221
|
export type ListLabelsInput = z.output<typeof listLabelsInputSchema>;
|
|
175
222
|
export type MessageLabelsInput = z.output<typeof messageLabelsInputSchema>;
|
|
223
|
+
export type SensitiveMessageLabelInput = z.output<typeof sensitiveMessageLabelInputSchema>;
|
|
176
224
|
export type CreateLabelInput = z.output<typeof createLabelInputSchema>;
|