@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
@@ -1,75 +0,0 @@
1
- import type { GmailDomain } from "./domain.js";
2
- import type { GmailTwinDatabase, SeedFilter, SemanticMessage } from "./types.js";
3
- export type DraftResource = {
4
- id: string;
5
- message: SemanticMessage;
6
- updatedAt: string;
7
- };
8
- export type LabelResource = {
9
- id: string;
10
- name: string;
11
- type: "system" | "user";
12
- textColor: string | null;
13
- backgroundColor: string | null;
14
- messagesTotal: number;
15
- messagesUnread: number;
16
- threadsTotal: number;
17
- threadsUnread: number;
18
- };
19
- export type FilterResource = Required<Pick<SeedFilter, "criteria" | "action">> & {
20
- id: string;
21
- };
22
- export declare class GmailRestStore {
23
- private readonly db;
24
- private readonly domain;
25
- constructor(db: GmailTwinDatabase, domain: GmailDomain);
26
- profile(email: string): {
27
- emailAddress: string;
28
- messagesTotal: number;
29
- threadsTotal: number;
30
- historyId: string;
31
- };
32
- currentHistoryIdFor(email: string): string;
33
- latestMessageHistory(email: string, messageId: string): string;
34
- latestThreadHistory(email: string, threadId: string): string;
35
- headers(email: string, messageId: string): Array<{
36
- name: string;
37
- value: string;
38
- }>;
39
- attachment(email: string, messageId: string, attachmentId: string): {
40
- size: number;
41
- data: string;
42
- };
43
- applyInternalDateSource(email: string, messageId: string, source: "receivedTime" | "dateHeader"): SemanticMessage;
44
- drafts(email: string, query?: string, includeTrash?: boolean): DraftResource[];
45
- draft(email: string, draftId: string): DraftResource;
46
- deleteMessage(email: string, messageId: string): void;
47
- batchDeleteMessages(email: string, messageIds: string[]): void;
48
- deleteThread(email: string, threadId: string): void;
49
- labels(email: string): LabelResource[];
50
- label(email: string, labelId: string): LabelResource;
51
- updateLabel(email: string, labelId: string, input: {
52
- name?: string;
53
- color?: {
54
- textColor?: string;
55
- backgroundColor?: string;
56
- };
57
- }, replace: boolean): LabelResource;
58
- deleteLabel(email: string, labelId: string): void;
59
- filters(email: string): FilterResource[];
60
- filter(email: string, filterId: string): FilterResource;
61
- createFilter(email: string, criteria?: SeedFilter["criteria"], action?: SeedFilter["action"]): FilterResource;
62
- deleteFilter(email: string, filterId: string): void;
63
- forwardingAddresses(email: string): Array<{
64
- forwardingEmail: string;
65
- verificationStatus: string;
66
- }>;
67
- forwardingAddress(email: string, forwardingEmail: string): {
68
- forwardingEmail: string;
69
- verificationStatus: string;
70
- };
71
- sendAs(email: string): Array<Record<string, unknown>>;
72
- sendAsAddress(email: string, sendAsEmail: string): Record<string, unknown>;
73
- private currentHistoryId;
74
- private removeEmptyThread;
75
- }
@@ -1,282 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- import { invalidArgument, notFound, unsupported } from "./errors.js";
3
- import { validateSearchQuery } from "./search.js";
4
- import { addHistory, assertLabels, nextId, semanticMessage } from "./storage.js";
5
- export class GmailRestStore {
6
- db;
7
- domain;
8
- constructor(db, domain) {
9
- this.db = db;
10
- this.domain = domain;
11
- }
12
- profile(email) {
13
- const mailboxId = this.domain.mailboxId(email);
14
- const totals = this.db
15
- .prepare(`SELECT COUNT(*) AS messagesTotal, COUNT(DISTINCT thread_id) AS threadsTotal
16
- FROM messages WHERE mailbox_id = ?`)
17
- .get(mailboxId);
18
- return { emailAddress: email, ...totals, historyId: this.currentHistoryId(mailboxId) };
19
- }
20
- currentHistoryIdFor(email) {
21
- return this.currentHistoryId(this.domain.mailboxId(email));
22
- }
23
- latestMessageHistory(email, messageId) {
24
- const mailboxId = this.domain.mailboxId(email);
25
- const row = this.db
26
- .prepare("SELECT MAX(id) AS id FROM history WHERE mailbox_id = ? AND message_id = ?")
27
- .get(mailboxId, messageId);
28
- return String(row.id ?? Number(this.currentHistoryId(mailboxId)));
29
- }
30
- latestThreadHistory(email, threadId) {
31
- const mailboxId = this.domain.mailboxId(email);
32
- const row = this.db
33
- .prepare("SELECT MAX(id) AS id FROM history WHERE mailbox_id = ? AND thread_id = ?")
34
- .get(mailboxId, threadId);
35
- return String(row.id ?? Number(this.currentHistoryId(mailboxId)));
36
- }
37
- headers(email, messageId) {
38
- const mailboxId = this.domain.mailboxId(email);
39
- const row = this.db
40
- .prepare("SELECT headers_json FROM messages WHERE mailbox_id = ? AND id = ?")
41
- .get(mailboxId, messageId);
42
- if (!row)
43
- notFound("Message");
44
- return JSON.parse(row.headers_json);
45
- }
46
- attachment(email, messageId, attachmentId) {
47
- const mailboxId = this.domain.mailboxId(email);
48
- const row = this.db
49
- .prepare("SELECT size, data FROM attachments WHERE mailbox_id = ? AND message_id = ? AND id = ?")
50
- .get(mailboxId, messageId, attachmentId);
51
- if (!row)
52
- notFound("Attachment");
53
- return { size: row.size, data: Buffer.from(row.data).toString("base64url") };
54
- }
55
- applyInternalDateSource(email, messageId, source) {
56
- const mailboxId = this.domain.mailboxId(email);
57
- if (source === "receivedTime") {
58
- const history = this.db
59
- .prepare(`SELECT created_at FROM history
60
- WHERE mailbox_id = ? AND message_id = ? AND event_type = 'messageAdded'
61
- ORDER BY id DESC LIMIT 1`)
62
- .get(mailboxId, messageId);
63
- if (history) {
64
- this.db
65
- .prepare("UPDATE messages SET internal_date = ? WHERE mailbox_id = ? AND id = ?")
66
- .run(Date.parse(history.created_at), mailboxId, messageId);
67
- }
68
- }
69
- return semanticMessage(this.db, mailboxId, messageId);
70
- }
71
- drafts(email, query = "", includeTrash = false) {
72
- const mailboxId = this.domain.mailboxId(email);
73
- const matching = query
74
- ? new Set(this.domain.searchMessages(email, query, { includeTrash }).map((message) => message.id))
75
- : null;
76
- const rows = this.db
77
- .prepare("SELECT id, message_id, updated_at FROM drafts WHERE mailbox_id = ? ORDER BY updated_at DESC, id DESC")
78
- .all(mailboxId);
79
- return rows
80
- .filter((row) => !matching || matching.has(row.message_id))
81
- .map((row) => ({ id: row.id, message: semanticMessage(this.db, mailboxId, row.message_id), updatedAt: row.updated_at }));
82
- }
83
- draft(email, draftId) {
84
- const mailboxId = this.domain.mailboxId(email);
85
- const row = this.db
86
- .prepare("SELECT id, message_id, updated_at FROM drafts WHERE mailbox_id = ? AND id = ?")
87
- .get(mailboxId, draftId);
88
- if (!row)
89
- notFound("Draft");
90
- return { id: row.id, message: semanticMessage(this.db, mailboxId, row.message_id), updatedAt: row.updated_at };
91
- }
92
- deleteMessage(email, messageId) {
93
- const mailboxId = this.domain.mailboxId(email);
94
- this.db.transaction(() => {
95
- const message = semanticMessage(this.db, mailboxId, messageId);
96
- this.db.prepare("DELETE FROM messages WHERE mailbox_id = ? AND id = ?").run(mailboxId, messageId);
97
- addHistory(this.db, mailboxId, messageId, message.threadId, "messageDeleted");
98
- this.removeEmptyThread(mailboxId, message.threadId);
99
- }).immediate();
100
- }
101
- batchDeleteMessages(email, messageIds) {
102
- const mailboxId = this.domain.mailboxId(email);
103
- this.db.transaction(() => {
104
- for (const messageId of messageIds) {
105
- const exists = this.db
106
- .prepare("SELECT thread_id FROM messages WHERE mailbox_id = ? AND id = ?")
107
- .get(mailboxId, messageId);
108
- if (!exists)
109
- continue;
110
- this.db.prepare("DELETE FROM messages WHERE mailbox_id = ? AND id = ?").run(mailboxId, messageId);
111
- addHistory(this.db, mailboxId, messageId, exists.thread_id, "messageDeleted");
112
- this.removeEmptyThread(mailboxId, exists.thread_id);
113
- }
114
- }).immediate();
115
- }
116
- deleteThread(email, threadId) {
117
- const mailboxId = this.domain.mailboxId(email);
118
- this.db.transaction(() => {
119
- const thread = this.domain.getThread(email, threadId);
120
- this.db.prepare("DELETE FROM threads WHERE mailbox_id = ? AND id = ?").run(mailboxId, threadId);
121
- for (const message of thread.messages)
122
- addHistory(this.db, mailboxId, message.id, threadId, "messageDeleted");
123
- }).immediate();
124
- }
125
- labels(email) {
126
- const mailboxId = this.domain.mailboxId(email);
127
- const rows = this.db
128
- .prepare("SELECT id FROM labels WHERE mailbox_id = ? ORDER BY CASE type WHEN 'system' THEN 0 ELSE 1 END, name COLLATE NOCASE, id")
129
- .all(mailboxId);
130
- return rows.map((row) => this.label(email, row.id));
131
- }
132
- label(email, labelId) {
133
- const mailboxId = this.domain.mailboxId(email);
134
- const row = this.db
135
- .prepare(`SELECT id, name, type, text_color, background_color
136
- FROM labels WHERE mailbox_id = ? AND id = ?`)
137
- .get(mailboxId, labelId);
138
- if (!row)
139
- notFound("Label");
140
- const counts = this.db
141
- .prepare(`SELECT COUNT(DISTINCT ml.message_id) AS messagesTotal,
142
- COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN ml.message_id END) AS messagesUnread,
143
- COUNT(DISTINCT m.thread_id) AS threadsTotal,
144
- COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN m.thread_id END) AS threadsUnread
145
- FROM message_labels ml
146
- JOIN messages m ON m.mailbox_id = ml.mailbox_id AND m.id = ml.message_id
147
- LEFT JOIN message_labels unread ON unread.mailbox_id = ml.mailbox_id
148
- AND unread.message_id = ml.message_id AND unread.label_id = 'UNREAD'
149
- WHERE ml.mailbox_id = ? AND ml.label_id = ?`)
150
- .get(mailboxId, labelId);
151
- return {
152
- id: row.id,
153
- name: row.name,
154
- type: row.type,
155
- textColor: row.text_color,
156
- backgroundColor: row.background_color,
157
- ...counts,
158
- };
159
- }
160
- updateLabel(email, labelId, input, replace) {
161
- const mailboxId = this.domain.mailboxId(email);
162
- const current = this.label(email, labelId);
163
- if (current.type !== "user")
164
- invalidArgument("System labels cannot be modified");
165
- const name = replace ? input.name : input.name ?? current.name;
166
- if (!name?.trim())
167
- invalidArgument("Label name is required");
168
- const textColor = input.color?.textColor ?? (replace ? null : current.textColor);
169
- const backgroundColor = input.color?.backgroundColor ?? (replace ? null : current.backgroundColor);
170
- try {
171
- this.db
172
- .prepare("UPDATE labels SET name = ?, text_color = ?, background_color = ? WHERE mailbox_id = ? AND id = ?")
173
- .run(name.trim(), textColor, backgroundColor, mailboxId, labelId);
174
- }
175
- catch {
176
- invalidArgument(`Label already exists: ${name}`);
177
- }
178
- return this.label(email, labelId);
179
- }
180
- deleteLabel(email, labelId) {
181
- const mailboxId = this.domain.mailboxId(email);
182
- const label = this.label(email, labelId);
183
- if (label.type !== "user")
184
- invalidArgument("System labels cannot be deleted");
185
- this.db.prepare("DELETE FROM labels WHERE mailbox_id = ? AND id = ?").run(mailboxId, labelId);
186
- }
187
- filters(email) {
188
- const mailboxId = this.domain.mailboxId(email);
189
- const rows = this.db
190
- .prepare("SELECT id, criteria_json, action_json FROM filters WHERE mailbox_id = ? ORDER BY id")
191
- .all(mailboxId);
192
- return rows.map(toFilter);
193
- }
194
- filter(email, filterId) {
195
- const mailboxId = this.domain.mailboxId(email);
196
- const row = this.db
197
- .prepare("SELECT id, criteria_json, action_json FROM filters WHERE mailbox_id = ? AND id = ?")
198
- .get(mailboxId, filterId);
199
- if (!row)
200
- notFound("Filter");
201
- return toFilter(row);
202
- }
203
- createFilter(email, criteria = {}, action = {}) {
204
- if (action.forward)
205
- unsupported("Filter action.forward is not supported by the Gmail twin");
206
- const mailboxId = this.domain.mailboxId(email);
207
- const count = this.db.prepare("SELECT COUNT(*) AS count FROM filters WHERE mailbox_id = ?").get(mailboxId);
208
- if (count.count >= 1000)
209
- invalidArgument("Filter limit exceeded");
210
- assertLabels(this.db, mailboxId, [...(action.addLabelIds ?? []), ...(action.removeLabelIds ?? [])]);
211
- if (criteria.query)
212
- validateSearchQuery(criteria.query);
213
- if (criteria.negatedQuery)
214
- validateSearchQuery(criteria.negatedQuery);
215
- const id = nextId(this.db, mailboxId, "filter_counter", "filter");
216
- this.db
217
- .prepare("INSERT INTO filters(mailbox_id, id, criteria_json, action_json) VALUES (?, ?, ?, ?)")
218
- .run(mailboxId, id, JSON.stringify(criteria), JSON.stringify(action));
219
- return { id, criteria, action };
220
- }
221
- deleteFilter(email, filterId) {
222
- const mailboxId = this.domain.mailboxId(email);
223
- const result = this.db.prepare("DELETE FROM filters WHERE mailbox_id = ? AND id = ?").run(mailboxId, filterId);
224
- if (result.changes === 0)
225
- notFound("Filter");
226
- }
227
- forwardingAddresses(email) {
228
- const mailboxId = this.domain.mailboxId(email);
229
- const rows = this.db
230
- .prepare("SELECT email, verification_status FROM forwarding_addresses WHERE mailbox_id = ? ORDER BY email COLLATE NOCASE")
231
- .all(mailboxId);
232
- return rows.map((row) => ({ forwardingEmail: row.email, verificationStatus: row.verification_status }));
233
- }
234
- forwardingAddress(email, forwardingEmail) {
235
- const found = this.forwardingAddresses(email).find((item) => item.forwardingEmail.toLowerCase() === forwardingEmail.toLowerCase());
236
- if (!found)
237
- notFound("Forwarding address");
238
- return found;
239
- }
240
- sendAs(email) {
241
- const mailboxId = this.domain.mailboxId(email);
242
- const rows = this.db
243
- .prepare(`SELECT email, display_name, reply_to_address, is_primary, is_default, verification_status
244
- FROM send_as WHERE mailbox_id = ? ORDER BY is_primary DESC, email COLLATE NOCASE`)
245
- .all(mailboxId);
246
- return rows.map((row) => ({
247
- sendAsEmail: row.email,
248
- displayName: row.display_name,
249
- ...(row.reply_to_address ? { replyToAddress: row.reply_to_address } : {}),
250
- isPrimary: Boolean(row.is_primary),
251
- isDefault: Boolean(row.is_default),
252
- verificationStatus: row.verification_status,
253
- treatAsAlias: !row.is_primary,
254
- signature: "",
255
- }));
256
- }
257
- sendAsAddress(email, sendAsEmail) {
258
- const found = this.sendAs(email).find((item) => String(item.sendAsEmail).toLowerCase() === sendAsEmail.toLowerCase());
259
- if (!found)
260
- notFound("Send-as alias");
261
- return found;
262
- }
263
- currentHistoryId(mailboxId) {
264
- const row = this.db
265
- .prepare("SELECT history_counter FROM mailbox_counters WHERE mailbox_id = ?")
266
- .get(mailboxId);
267
- return String(row.history_counter);
268
- }
269
- removeEmptyThread(mailboxId, threadId) {
270
- if (!this.db.prepare("SELECT 1 FROM messages WHERE mailbox_id = ? AND thread_id = ? LIMIT 1").get(mailboxId, threadId)) {
271
- this.db.prepare("DELETE FROM threads WHERE mailbox_id = ? AND id = ?").run(mailboxId, threadId);
272
- }
273
- }
274
- }
275
- function toFilter(row) {
276
- return {
277
- id: row.id,
278
- criteria: JSON.parse(row.criteria_json),
279
- action: JSON.parse(row.action_json),
280
- };
281
- }
282
- //# sourceMappingURL=rest-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-store.js","sourceRoot":"","sources":["../../src/rest-store.ts"],"names":[],"mappings":"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"}