@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.
Files changed (131) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/src/cli/docs-topics.js +5 -3
  3. package/dist/src/runner/runTask.d.ts +14 -0
  4. package/dist/src/task/taskSchema.d.ts +52 -16
  5. package/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +27 -0
  6. package/node_modules/@pome-sh/shared-types/dist/seed-state.js +12 -0
  7. package/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -1
  8. package/node_modules/@pome-sh/shared-types/dist/task.d.ts +18 -0
  9. package/node_modules/@pome-sh/shared-types/package.json +1 -1
  10. package/node_modules/@pome-sh/shared-types/trace-contract.json +1 -1
  11. package/node_modules/@pome-sh/twin-gmail/CHANGELOG.md +21 -0
  12. package/node_modules/@pome-sh/twin-gmail/HOSTED.md +37 -15
  13. package/node_modules/@pome-sh/twin-gmail/LIMITS.md +10 -0
  14. package/node_modules/@pome-sh/twin-gmail/README.md +52 -11
  15. package/node_modules/@pome-sh/twin-gmail/dist/fixtures/mcp-tools-list.canonical.json +242 -7
  16. package/node_modules/@pome-sh/twin-gmail/dist/src/db.js +6 -0
  17. package/node_modules/@pome-sh/twin-gmail/dist/src/db.js.map +1 -1
  18. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.d.ts +41 -0
  19. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js +138 -0
  20. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js.map +1 -0
  21. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.d.ts +10 -0
  22. package/node_modules/@pome-sh/twin-gmail/dist/src/{domain-search.js → domain/filters.js} +52 -36
  23. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.js.map +1 -0
  24. package/node_modules/@pome-sh/twin-gmail/dist/src/{domain.d.ts → domain/gmail-domain.d.ts} +45 -34
  25. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js +174 -0
  26. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js.map +1 -0
  27. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.d.ts +8 -0
  28. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js +122 -0
  29. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js.map +1 -0
  30. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.d.ts +4 -0
  31. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js +5 -0
  32. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js.map +1 -0
  33. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.d.ts +40 -0
  34. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js +122 -0
  35. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js.map +1 -0
  36. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.d.ts +49 -0
  37. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js +276 -0
  38. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js.map +1 -0
  39. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.d.ts +19 -0
  40. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js +179 -0
  41. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js.map +1 -0
  42. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.d.ts +27 -0
  43. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js +98 -0
  44. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js.map +1 -0
  45. package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js +2 -0
  46. package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js.map +1 -1
  47. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.d.ts +21 -0
  48. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js +52 -0
  49. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js.map +1 -0
  50. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.d.ts +1 -6
  51. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js +0 -11
  52. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js.map +1 -1
  53. package/node_modules/@pome-sh/twin-gmail/dist/src/index.d.ts +4 -3
  54. package/node_modules/@pome-sh/twin-gmail/dist/src/index.js +3 -3
  55. package/node_modules/@pome-sh/twin-gmail/dist/src/index.js.map +1 -1
  56. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.d.ts +48 -0
  57. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js +23 -0
  58. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js.map +1 -1
  59. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.d.ts +1 -1
  60. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js +39 -1
  61. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js.map +1 -1
  62. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js +4 -5
  63. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js.map +1 -1
  64. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.d.ts +2 -3
  65. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js +4 -4
  66. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js.map +1 -1
  67. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js +7 -8
  68. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js.map +1 -1
  69. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js +20 -21
  70. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js.map +1 -1
  71. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.d.ts +1 -1
  72. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.d.ts +2 -4
  73. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js +4 -6
  74. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js.map +1 -1
  75. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.d.ts +4 -0
  76. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js +179 -0
  77. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js.map +1 -0
  78. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.d.ts +61 -0
  79. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js +318 -0
  80. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js.map +1 -0
  81. package/node_modules/@pome-sh/twin-gmail/dist/src/search.d.ts +3 -61
  82. package/node_modules/@pome-sh/twin-gmail/dist/src/search.js +2 -503
  83. package/node_modules/@pome-sh/twin-gmail/dist/src/search.js.map +1 -1
  84. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.d.ts +13 -4
  85. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js +3 -1
  86. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js.map +1 -1
  87. package/node_modules/@pome-sh/twin-gmail/dist/src/server.js +1 -1
  88. package/node_modules/@pome-sh/twin-gmail/dist/src/server.js.map +1 -1
  89. package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js +1 -1
  90. package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js.map +1 -1
  91. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.d.ts +2 -3
  92. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js +1 -4
  93. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js.map +1 -1
  94. package/node_modules/@pome-sh/twin-gmail/dist/src/types.d.ts +1 -0
  95. package/node_modules/@pome-sh/twin-gmail/fidelity.inventory.json +42 -435
  96. package/node_modules/@pome-sh/twin-gmail/fixtures/README.md +4 -4
  97. package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.canonical.json +242 -7
  98. package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.meta.json +3 -3
  99. package/node_modules/@pome-sh/twin-gmail/package.json +3 -2
  100. package/node_modules/hono/dist/cjs/client/utils.js +1 -1
  101. package/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  102. package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
  103. package/node_modules/hono/dist/cjs/middleware/compress/index.js +2 -1
  104. package/node_modules/hono/dist/cjs/middleware/method-override/index.js +5 -3
  105. package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +10 -4
  106. package/node_modules/hono/dist/cjs/request.js +8 -3
  107. package/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  108. package/node_modules/hono/dist/cjs/utils/body.js +6 -0
  109. package/node_modules/hono/dist/cjs/utils/url.js +1 -1
  110. package/node_modules/hono/dist/client/utils.js +1 -1
  111. package/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  112. package/node_modules/hono/dist/middleware/cache/index.js +1 -1
  113. package/node_modules/hono/dist/middleware/compress/index.js +2 -1
  114. package/node_modules/hono/dist/middleware/method-override/index.js +5 -3
  115. package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +10 -4
  116. package/node_modules/hono/dist/request.js +8 -3
  117. package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  118. package/node_modules/hono/dist/types/helper/websocket/index.d.ts +1 -1
  119. package/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  120. package/node_modules/hono/dist/utils/accept.js +1 -1
  121. package/node_modules/hono/dist/utils/body.js +6 -0
  122. package/node_modules/hono/dist/utils/url.js +1 -1
  123. package/node_modules/hono/package.json +3 -3
  124. package/package.json +3 -3
  125. package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.d.ts +0 -5
  126. package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.js.map +0 -1
  127. package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js +0 -407
  128. package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js.map +0 -1
  129. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.d.ts +0 -75
  130. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.js +0 -282
  131. 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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"}
@@ -106,6 +106,8 @@ function googleStatus(status) {
106
106
  return "PERMISSION_DENIED";
107
107
  if (status === 404)
108
108
  return "NOT_FOUND";
109
+ if (status === 429)
110
+ return "RESOURCE_EXHAUSTED";
109
111
  if (status === 409)
110
112
  return "ALREADY_EXISTS";
111
113
  if (status === 501)
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,OAAO,UAAW,SAAQ,KAAK;IAExB;IACA;IAFX,YACW,MAAc,EACd,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QAIvB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,MAAM;oBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC5E,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;iBACnC;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,QAAQ,IAAI,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QACvF,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,iBAAiB;oBAC1B,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBACrF,MAAM,EAAE,kBAAkB;iBAC3B;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBAClF,MAAM,EAAE,kBAAkB;iBAC3B;aACF;SACF,CAAC;IACJ,CAAC;IACD,IACE,KAAK,YAAY,KAAK;QACtB,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,EACjE,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC;QACtD,MAAM,MAAM,GACV,WAAW;YACT,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,OAAQ,KAAsC,CAAC,MAAM,KAAK,QAAQ;gBAClE,CAAC,CAAE,KAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,GAAG,CAAC;QACZ,OAAO;YACL,MAAM;YACN,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE;wBACN;4BACE,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,MAAM,EAAE,QAAQ;4BAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB;yBACrD;qBACF;oBACD,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;gBACjF,MAAM,EAAE,UAAU;aACnB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAQ,GAAG,kBAAkB;IACpD,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,QAAQ,iBAAiB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,CAAC;IAC9C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,iBAAiB,CAAC;IAC7C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,gBAAgB,CAAC;IAC5C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC;IAC3C,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,OAAO,UAAW,SAAQ,KAAK;IAExB;IACA;IAFX,YACW,MAAc,EACd,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QAIvB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,MAAM;oBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC5E,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;iBACnC;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,QAAQ,IAAI,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QACvF,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,iBAAiB;oBAC1B,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBACrF,MAAM,EAAE,kBAAkB;iBAC3B;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBAClF,MAAM,EAAE,kBAAkB;iBAC3B;aACF;SACF,CAAC;IACJ,CAAC;IACD,IACE,KAAK,YAAY,KAAK;QACtB,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,EACjE,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC;QACtD,MAAM,MAAM,GACV,WAAW;YACT,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,OAAQ,KAAsC,CAAC,MAAM,KAAK,QAAQ;gBAClE,CAAC,CAAE,KAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,GAAG,CAAC;QACZ,OAAO;YACL,MAAM;YACN,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE;wBACN;4BACE,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,MAAM,EAAE,QAAQ;4BAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB;yBACrD;qBACF;oBACD,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;gBACjF,MAAM,EAAE,UAAU;aACnB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAQ,GAAG,kBAAkB;IACpD,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,QAAQ,iBAAiB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,CAAC;IAC9C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,iBAAiB,CAAC;IAC7C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,oBAAoB,CAAC;IAChD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,gBAAgB,CAAC;IAC5C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC;IAC3C,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -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, GmailTwinDatabase } from "./types.js";
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;AAED,MAAM,UAAU,cAAc,CAAC,EAAqB,EAAE,KAAa;IACjE,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,gEAAgE,CAAC;SACzE,GAAG,CAAC,KAAK,CAA8C,CAAC;IAC3D,IAAI,CAAC,GAAG;QAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,OAAO,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,eAAe,CAAC;AACrD,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, resolveTokenAlias } from "./identity.js";
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 { compileSearchToSql, matchesSearch, parseSearchQuery, SEARCH_MAILBOX_MESSAGE_BUDGET, stripHtmlTags, validateSearchQuery, } from "./search.js";
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, resolveTokenAlias } from "./identity.js";
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 { compileSearchToSql, matchesSearch, parseSearchQuery, SEARCH_MAILBOX_MESSAGE_BUDGET, stripHtmlTags, validateSearchQuery, } from "./search.js";
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,aAAa,CAAC;AAC1C,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,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9G,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,kBAAkB,EAClB,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"}
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>;