@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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
import { unsupported } from "
|
|
3
|
-
import { matchesSearch
|
|
4
|
-
import {
|
|
2
|
+
import { invalidArgument, notFound, unsupported } from "../errors.js";
|
|
3
|
+
import { matchesSearch } from "../search-match.js";
|
|
4
|
+
import { parseSearchQuery, validateSearchQuery } from "../search-parse.js";
|
|
5
|
+
import { addHistory, assertLabels, nextId, semanticMessage } from "../storage.js";
|
|
6
|
+
import { searchDocument, searchNow } from "./hydrate.js";
|
|
5
7
|
export function applyInboundFilters(db, mailboxId, messageId) {
|
|
6
8
|
const filters = db
|
|
7
9
|
.prepare("SELECT criteria_json, action_json FROM filters WHERE mailbox_id = ? ORDER BY id")
|
|
@@ -51,39 +53,53 @@ export function applyInboundFilters(db, mailboxId, messageId) {
|
|
|
51
53
|
addHistory(db, mailboxId, messageId, message.threadId, "labelRemoved", removed);
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
|
-
export function
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
export function filters(domain, email) {
|
|
57
|
+
const mailboxId = domain.mailboxId(email);
|
|
58
|
+
const rows = domain.db
|
|
59
|
+
.prepare("SELECT id, criteria_json, action_json FROM filters WHERE mailbox_id = ? ORDER BY id")
|
|
60
|
+
.all(mailboxId);
|
|
61
|
+
return rows.map(toFilter);
|
|
62
|
+
}
|
|
63
|
+
export function filter(domain, email, filterId) {
|
|
64
|
+
const mailboxId = domain.mailboxId(email);
|
|
65
|
+
const row = domain.db
|
|
66
|
+
.prepare("SELECT id, criteria_json, action_json FROM filters WHERE mailbox_id = ? AND id = ?")
|
|
67
|
+
.get(mailboxId, filterId);
|
|
68
|
+
if (!row)
|
|
69
|
+
notFound("Filter");
|
|
70
|
+
return toFilter(row);
|
|
71
|
+
}
|
|
72
|
+
export function createFilter(domain, email, criteria = {}, action = {}) {
|
|
73
|
+
if (action.forward)
|
|
74
|
+
unsupported("Filter action.forward is not supported by the Gmail twin");
|
|
75
|
+
const mailboxId = domain.mailboxId(email);
|
|
76
|
+
const count = domain.db.prepare("SELECT COUNT(*) AS count FROM filters WHERE mailbox_id = ?").get(mailboxId);
|
|
77
|
+
if (count.count >= 1000)
|
|
78
|
+
invalidArgument("Filter limit exceeded");
|
|
79
|
+
assertLabels(domain.db, mailboxId, [...(action.addLabelIds ?? []), ...(action.removeLabelIds ?? [])]);
|
|
80
|
+
if (criteria.query)
|
|
81
|
+
validateSearchQuery(criteria.query);
|
|
82
|
+
if (criteria.negatedQuery)
|
|
83
|
+
validateSearchQuery(criteria.negatedQuery);
|
|
84
|
+
const id = nextId(domain.db, mailboxId, "filter_counter", "filter");
|
|
85
|
+
domain.db
|
|
86
|
+
.prepare("INSERT INTO filters(mailbox_id, id, criteria_json, action_json) VALUES (?, ?, ?, ?)")
|
|
87
|
+
.run(mailboxId, id, JSON.stringify(criteria), JSON.stringify(action));
|
|
88
|
+
return { id, criteria, action };
|
|
89
|
+
}
|
|
90
|
+
export function deleteFilter(domain, email, filterId) {
|
|
91
|
+
const mailboxId = domain.mailboxId(email);
|
|
92
|
+
const result = domain.db
|
|
93
|
+
.prepare("DELETE FROM filters WHERE mailbox_id = ? AND id = ?")
|
|
94
|
+
.run(mailboxId, filterId);
|
|
95
|
+
if (result.changes === 0)
|
|
96
|
+
notFound("Filter");
|
|
97
|
+
}
|
|
98
|
+
function toFilter(row) {
|
|
63
99
|
return {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
bcc: message.bcc.map((item) => item.toLowerCase()),
|
|
68
|
-
deliveredTo: row.delivered_to.toLowerCase(),
|
|
69
|
-
subject: message.subject,
|
|
70
|
-
text: message.text,
|
|
71
|
-
html: message.html,
|
|
72
|
-
dateMs: message.internalDate,
|
|
73
|
-
rfcMessageId: message.rfcMessageId,
|
|
74
|
-
size: message.sizeEstimate,
|
|
75
|
-
labels: message.labelIds,
|
|
76
|
-
userLabelCount,
|
|
77
|
-
attachmentNames: message.attachments.map((attachment) => attachment.filename),
|
|
78
|
-
attachmentMimeTypes: message.attachments.map((attachment) => attachment.mimeType),
|
|
79
|
-
headers: JSON.parse(row.headers_json),
|
|
100
|
+
id: row.id,
|
|
101
|
+
criteria: JSON.parse(row.criteria_json),
|
|
102
|
+
action: JSON.parse(row.action_json),
|
|
80
103
|
};
|
|
81
104
|
}
|
|
82
|
-
|
|
83
|
-
const clock = db.prepare("SELECT value FROM gmail_config WHERE key = 'clock'").get();
|
|
84
|
-
const row = db
|
|
85
|
-
.prepare("SELECT COALESCE(MAX(logical_clock), 0) AS value FROM mailbox_counters")
|
|
86
|
-
.get();
|
|
87
|
-
return Date.parse(clock.value) + row.value * 1000;
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=domain-search.js.map
|
|
105
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/domain/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import { type ParsedGmailStateSeed } from "
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { type ParsedGmailStateSeed } from "../seed.js";
|
|
2
|
+
import { type GmailStateExport } from "../state.js";
|
|
3
|
+
import type { GmailStateSeed, GmailTwinDatabase, HistoryEvent, SeedAttachment, SeedFilter, SemanticMessage } from "../types.js";
|
|
4
|
+
import * as drafts from "./drafts.js";
|
|
5
|
+
import * as filters from "./filters.js";
|
|
6
|
+
import * as labels from "./labels.js";
|
|
7
|
+
import * as messages from "./messages.js";
|
|
8
|
+
import * as settings from "./settings.js";
|
|
4
9
|
export declare class GmailDomain {
|
|
5
10
|
readonly db: GmailTwinDatabase;
|
|
6
11
|
constructor(db: GmailTwinDatabase);
|
|
@@ -14,11 +19,7 @@ export declare class GmailDomain {
|
|
|
14
19
|
mailboxId(email: string): number;
|
|
15
20
|
getRaw(email: string, messageId: string): Buffer;
|
|
16
21
|
getMessage(email: string, messageId: string): SemanticMessage;
|
|
17
|
-
getThread(email: string, threadId: string):
|
|
18
|
-
id: string;
|
|
19
|
-
labelIds: string[];
|
|
20
|
-
messages: SemanticMessage[];
|
|
21
|
-
};
|
|
22
|
+
getThread(email: string, threadId: string): ReturnType<typeof messages.getThread>;
|
|
22
23
|
insertMessage(email: string, raw: Uint8Array | string, options?: {
|
|
23
24
|
threadId?: string;
|
|
24
25
|
labels?: string[];
|
|
@@ -26,13 +27,7 @@ export declare class GmailDomain {
|
|
|
26
27
|
}): SemanticMessage;
|
|
27
28
|
sendMessage(email: string, raw: Uint8Array | string, options?: {
|
|
28
29
|
threadId?: string;
|
|
29
|
-
}):
|
|
30
|
-
sender: SemanticMessage;
|
|
31
|
-
deliveries: Array<{
|
|
32
|
-
mailboxEmail: string;
|
|
33
|
-
message: SemanticMessage;
|
|
34
|
-
}>;
|
|
35
|
-
};
|
|
30
|
+
}): ReturnType<typeof messages.sendMessage>;
|
|
36
31
|
createDraft(email: string, raw: Uint8Array | string, options?: {
|
|
37
32
|
threadId?: string;
|
|
38
33
|
}): {
|
|
@@ -56,20 +51,30 @@ export declare class GmailDomain {
|
|
|
56
51
|
id: string;
|
|
57
52
|
message: SemanticMessage;
|
|
58
53
|
}>;
|
|
54
|
+
drafts(email: string, query?: string, includeTrash?: boolean): drafts.DraftResource[];
|
|
55
|
+
draft(email: string, draftId: string): drafts.DraftResource;
|
|
59
56
|
updateDraft(email: string, draftId: string, raw: Uint8Array | string, options?: {
|
|
60
57
|
threadId?: string;
|
|
61
58
|
}): {
|
|
62
59
|
id: string;
|
|
63
60
|
message: SemanticMessage;
|
|
64
61
|
};
|
|
65
|
-
sendDraft(email: string, draftId: string): ReturnType<
|
|
62
|
+
sendDraft(email: string, draftId: string): ReturnType<typeof messages.sendMessage>;
|
|
66
63
|
deleteDraft(email: string, draftId: string): void;
|
|
67
64
|
modifyMessageLabels(email: string, messageId: string, add?: string[], remove?: string[]): SemanticMessage;
|
|
68
|
-
modifyThreadLabels(email: string, threadId: string, add?: string[], remove?: string[]):
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
modifyThreadLabels(email: string, threadId: string, add?: string[], remove?: string[]): ReturnType<typeof messages.getThread>;
|
|
66
|
+
deleteMessage(email: string, messageId: string): void;
|
|
67
|
+
batchDeleteMessages(email: string, messageIds: string[]): void;
|
|
68
|
+
deleteThread(email: string, threadId: string): void;
|
|
69
|
+
headers(email: string, messageId: string): Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
value: string;
|
|
72
|
+
}>;
|
|
73
|
+
attachment(email: string, messageId: string, attachmentId: string): {
|
|
74
|
+
size: number;
|
|
75
|
+
data: string;
|
|
72
76
|
};
|
|
77
|
+
applyInternalDateSource(email: string, messageId: string, source: "receivedTime" | "dateHeader"): SemanticMessage;
|
|
73
78
|
createLabel(email: string, name: string, color?: {
|
|
74
79
|
textColor?: string;
|
|
75
80
|
backgroundColor?: string;
|
|
@@ -77,34 +82,40 @@ export declare class GmailDomain {
|
|
|
77
82
|
id: string;
|
|
78
83
|
name: string;
|
|
79
84
|
};
|
|
80
|
-
listUserLabels(email: string):
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
listUserLabels(email: string): ReturnType<typeof labels.listUserLabels>;
|
|
86
|
+
labels(email: string): labels.LabelResource[];
|
|
87
|
+
label(email: string, labelId: string): labels.LabelResource;
|
|
88
|
+
updateLabel(email: string, labelId: string, input: {
|
|
89
|
+
name?: string;
|
|
83
90
|
color?: {
|
|
84
91
|
textColor?: string;
|
|
85
92
|
backgroundColor?: string;
|
|
86
93
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
}, replace: boolean): labels.LabelResource;
|
|
95
|
+
deleteLabel(email: string, labelId: string): void;
|
|
96
|
+
filters(email: string): filters.FilterResource[];
|
|
97
|
+
filter(email: string, filterId: string): filters.FilterResource;
|
|
98
|
+
createFilter(email: string, criteria?: SeedFilter["criteria"], action?: SeedFilter["action"]): filters.FilterResource;
|
|
99
|
+
deleteFilter(email: string, filterId: string): void;
|
|
90
100
|
listHistory(email: string, startHistoryId: string, options?: {
|
|
91
101
|
types?: string[];
|
|
92
102
|
}): {
|
|
93
103
|
history: HistoryEvent[];
|
|
94
104
|
historyId: string;
|
|
95
105
|
};
|
|
106
|
+
profile(email: string): ReturnType<typeof settings.profile>;
|
|
107
|
+
currentHistoryIdFor(email: string): string;
|
|
108
|
+
latestMessageHistory(email: string, messageId: string): string;
|
|
109
|
+
latestThreadHistory(email: string, threadId: string): string;
|
|
110
|
+
forwardingAddresses(email: string): ReturnType<typeof settings.forwardingAddresses>;
|
|
111
|
+
forwardingAddress(email: string, forwardingEmail: string): ReturnType<typeof settings.forwardingAddress>;
|
|
112
|
+
sendAs(email: string): Array<Record<string, unknown>>;
|
|
113
|
+
sendAsAddress(email: string, sendAsEmail: string): Record<string, unknown>;
|
|
96
114
|
searchMessages(email: string, query?: string, options?: {
|
|
97
115
|
includeTrash?: boolean;
|
|
98
116
|
}): SemanticMessage[];
|
|
99
117
|
searchThreads(email: string, query?: string, options?: {
|
|
100
118
|
includeTrash?: boolean;
|
|
101
|
-
}): ReturnType<
|
|
119
|
+
}): ReturnType<typeof messages.getThread>[];
|
|
102
120
|
exportState(): GmailStateExport;
|
|
103
|
-
/** Snapshot high-water for opaque page tokens (mailbox history counter). */
|
|
104
|
-
currentHistoryIdFor(email: string): string;
|
|
105
|
-
private requireDraft;
|
|
106
|
-
private removeEmptyThread;
|
|
107
|
-
private currentHistoryId;
|
|
108
|
-
private deliveryMode;
|
|
109
|
-
private assertAcceptedFrom;
|
|
110
121
|
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { notFound } from "../errors.js";
|
|
3
|
+
import { defaultSeedState, parseSeed } from "../seed.js";
|
|
4
|
+
import { resetDatabase } from "../db.js";
|
|
5
|
+
import { exportGmailState } from "../state.js";
|
|
6
|
+
import { seedMailbox } from "../seeding.js";
|
|
7
|
+
import * as drafts from "./drafts.js";
|
|
8
|
+
import * as filters from "./filters.js";
|
|
9
|
+
import * as labels from "./labels.js";
|
|
10
|
+
import * as messages from "./messages.js";
|
|
11
|
+
import * as settings from "./settings.js";
|
|
12
|
+
export class GmailDomain {
|
|
13
|
+
db;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
seed(input) {
|
|
18
|
+
const seed = parseSeed(input);
|
|
19
|
+
this.db.transaction(() => {
|
|
20
|
+
resetDatabase(this.db);
|
|
21
|
+
this.db.prepare("INSERT INTO gmail_config(key, value) VALUES ('clock', ?)").run(seed.clock);
|
|
22
|
+
this.db.prepare("INSERT INTO gmail_config(key, value) VALUES ('delivery_mode', ?)").run(seed.deliveryMode);
|
|
23
|
+
this.db.prepare("INSERT INTO gmail_config(key, value) VALUES ('faults', ?)").run(JSON.stringify(seed.faults ?? []));
|
|
24
|
+
for (const mailbox of [seed.primaryMailbox, ...seed.mailboxes])
|
|
25
|
+
seedMailbox(this.db, mailbox);
|
|
26
|
+
}).immediate();
|
|
27
|
+
}
|
|
28
|
+
applySeed(input) {
|
|
29
|
+
this.seed(parseSeed(input));
|
|
30
|
+
return { ok: true };
|
|
31
|
+
}
|
|
32
|
+
resetToDefault() {
|
|
33
|
+
this.seed(defaultSeedState());
|
|
34
|
+
return { ok: true };
|
|
35
|
+
}
|
|
36
|
+
mailboxId(email) {
|
|
37
|
+
const row = this.db
|
|
38
|
+
.prepare("SELECT id FROM mailboxes WHERE email = ? COLLATE NOCASE")
|
|
39
|
+
.get(email);
|
|
40
|
+
if (!row)
|
|
41
|
+
notFound("User");
|
|
42
|
+
return row.id;
|
|
43
|
+
}
|
|
44
|
+
getRaw(email, messageId) {
|
|
45
|
+
return messages.getRaw(this, email, messageId);
|
|
46
|
+
}
|
|
47
|
+
getMessage(email, messageId) {
|
|
48
|
+
return messages.getMessage(this, email, messageId);
|
|
49
|
+
}
|
|
50
|
+
getThread(email, threadId) {
|
|
51
|
+
return messages.getThread(this, email, threadId);
|
|
52
|
+
}
|
|
53
|
+
insertMessage(email, raw, options = {}) {
|
|
54
|
+
return messages.insertMessage(this, email, raw, options);
|
|
55
|
+
}
|
|
56
|
+
sendMessage(email, raw, options = {}) {
|
|
57
|
+
return messages.sendMessage(this, email, raw, options);
|
|
58
|
+
}
|
|
59
|
+
createDraft(email, raw, options = {}) {
|
|
60
|
+
return drafts.createDraft(this, email, raw, options);
|
|
61
|
+
}
|
|
62
|
+
createComposedDraft(email, input) {
|
|
63
|
+
return drafts.createComposedDraft(this, email, input);
|
|
64
|
+
}
|
|
65
|
+
listDrafts(email, query = "") {
|
|
66
|
+
return drafts.listDrafts(this, email, query);
|
|
67
|
+
}
|
|
68
|
+
drafts(email, query = "", includeTrash = false) {
|
|
69
|
+
return drafts.drafts(this, email, query, includeTrash);
|
|
70
|
+
}
|
|
71
|
+
draft(email, draftId) {
|
|
72
|
+
return drafts.draft(this, email, draftId);
|
|
73
|
+
}
|
|
74
|
+
updateDraft(email, draftId, raw, options = {}) {
|
|
75
|
+
return drafts.updateDraft(this, email, draftId, raw, options);
|
|
76
|
+
}
|
|
77
|
+
sendDraft(email, draftId) {
|
|
78
|
+
return drafts.sendDraft(this, email, draftId);
|
|
79
|
+
}
|
|
80
|
+
deleteDraft(email, draftId) {
|
|
81
|
+
drafts.deleteDraft(this, email, draftId);
|
|
82
|
+
}
|
|
83
|
+
modifyMessageLabels(email, messageId, add = [], remove = []) {
|
|
84
|
+
return messages.modifyMessageLabels(this, email, messageId, add, remove);
|
|
85
|
+
}
|
|
86
|
+
modifyThreadLabels(email, threadId, add = [], remove = []) {
|
|
87
|
+
return messages.modifyThreadLabels(this, email, threadId, add, remove);
|
|
88
|
+
}
|
|
89
|
+
deleteMessage(email, messageId) {
|
|
90
|
+
messages.deleteMessage(this, email, messageId);
|
|
91
|
+
}
|
|
92
|
+
batchDeleteMessages(email, messageIds) {
|
|
93
|
+
messages.batchDeleteMessages(this, email, messageIds);
|
|
94
|
+
}
|
|
95
|
+
deleteThread(email, threadId) {
|
|
96
|
+
messages.deleteThread(this, email, threadId);
|
|
97
|
+
}
|
|
98
|
+
headers(email, messageId) {
|
|
99
|
+
return messages.headers(this, email, messageId);
|
|
100
|
+
}
|
|
101
|
+
attachment(email, messageId, attachmentId) {
|
|
102
|
+
return messages.attachment(this, email, messageId, attachmentId);
|
|
103
|
+
}
|
|
104
|
+
applyInternalDateSource(email, messageId, source) {
|
|
105
|
+
return messages.applyInternalDateSource(this, email, messageId, source);
|
|
106
|
+
}
|
|
107
|
+
createLabel(email, name, color) {
|
|
108
|
+
return labels.createLabel(this, email, name, color);
|
|
109
|
+
}
|
|
110
|
+
listUserLabels(email) {
|
|
111
|
+
return labels.listUserLabels(this, email);
|
|
112
|
+
}
|
|
113
|
+
labels(email) {
|
|
114
|
+
return labels.labels(this, email);
|
|
115
|
+
}
|
|
116
|
+
label(email, labelId) {
|
|
117
|
+
return labels.label(this, email, labelId);
|
|
118
|
+
}
|
|
119
|
+
updateLabel(email, labelId, input, replace) {
|
|
120
|
+
return labels.updateLabel(this, email, labelId, input, replace);
|
|
121
|
+
}
|
|
122
|
+
deleteLabel(email, labelId) {
|
|
123
|
+
labels.deleteLabel(this, email, labelId);
|
|
124
|
+
}
|
|
125
|
+
filters(email) {
|
|
126
|
+
return filters.filters(this, email);
|
|
127
|
+
}
|
|
128
|
+
filter(email, filterId) {
|
|
129
|
+
return filters.filter(this, email, filterId);
|
|
130
|
+
}
|
|
131
|
+
createFilter(email, criteria = {}, action = {}) {
|
|
132
|
+
return filters.createFilter(this, email, criteria, action);
|
|
133
|
+
}
|
|
134
|
+
deleteFilter(email, filterId) {
|
|
135
|
+
filters.deleteFilter(this, email, filterId);
|
|
136
|
+
}
|
|
137
|
+
listHistory(email, startHistoryId, options = {}) {
|
|
138
|
+
return settings.listHistory(this, email, startHistoryId, options);
|
|
139
|
+
}
|
|
140
|
+
profile(email) {
|
|
141
|
+
return settings.profile(this, email);
|
|
142
|
+
}
|
|
143
|
+
currentHistoryIdFor(email) {
|
|
144
|
+
return settings.currentHistoryIdFor(this, email);
|
|
145
|
+
}
|
|
146
|
+
latestMessageHistory(email, messageId) {
|
|
147
|
+
return settings.latestMessageHistory(this, email, messageId);
|
|
148
|
+
}
|
|
149
|
+
latestThreadHistory(email, threadId) {
|
|
150
|
+
return settings.latestThreadHistory(this, email, threadId);
|
|
151
|
+
}
|
|
152
|
+
forwardingAddresses(email) {
|
|
153
|
+
return settings.forwardingAddresses(this, email);
|
|
154
|
+
}
|
|
155
|
+
forwardingAddress(email, forwardingEmail) {
|
|
156
|
+
return settings.forwardingAddress(this, email, forwardingEmail);
|
|
157
|
+
}
|
|
158
|
+
sendAs(email) {
|
|
159
|
+
return settings.sendAs(this, email);
|
|
160
|
+
}
|
|
161
|
+
sendAsAddress(email, sendAsEmail) {
|
|
162
|
+
return settings.sendAsAddress(this, email, sendAsEmail);
|
|
163
|
+
}
|
|
164
|
+
searchMessages(email, query = "", options = {}) {
|
|
165
|
+
return messages.searchMessages(this, email, query, options);
|
|
166
|
+
}
|
|
167
|
+
searchThreads(email, query = "", options = {}) {
|
|
168
|
+
return messages.searchThreads(this, email, query, options);
|
|
169
|
+
}
|
|
170
|
+
exportState() {
|
|
171
|
+
return exportGmailState(this.db);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=gmail-domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-domain.js","sourceRoot":"","sources":["../../../src/domain/gmail-domain.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,MAAM,OAAO,WAAW;IACD;IAArB,YAAqB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE9C,IAAI,CAAC,KAA4C;QAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5F,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3G,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;YACpH,KAAK,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,yDAAyD,CAAC;aAClE,GAAG,CAAC,KAAK,CAA+B,CAAC;QAC5C,IAAI,CAAC,GAAG;YAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,SAAiB;QACrC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,SAAiB;QACzC,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAgB;QACvC,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CACX,KAAa,EACb,GAAwB,EACxB,UAAwE,EAAE;QAE1E,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,CACT,KAAa,EACb,GAAwB,EACxB,UAAiC,EAAE;QAEnC,OAAO,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CACT,KAAa,EACb,GAAwB,EACxB,UAAiC,EAAE;QAEnC,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,mBAAmB,CACjB,KAAa,EACb,KASC;QAED,OAAO,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAClC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE,EAAE,YAAY,GAAG,KAAK;QACpD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,OAAe;QAClC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CACT,KAAa,EACb,OAAe,EACf,GAAwB,EACxB,UAAiC,EAAE;QAEnC,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,OAAe;QACtC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,OAAe;QACxC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,SAAiB,EAAE,MAAgB,EAAE,EAAE,SAAmB,EAAE;QAC7F,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,kBAAkB,CAChB,KAAa,EACb,QAAgB,EAChB,MAAgB,EAAE,EAClB,SAAmB,EAAE;QAErB,OAAO,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,SAAiB;QAC5C,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,UAAoB;QACrD,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,QAAgB;QAC1C,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,SAAiB;QACtC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,SAAiB,EAAE,YAAoB;QAC/D,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,uBAAuB,CACrB,KAAa,EACb,SAAiB,EACjB,MAAqC;QAErC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,WAAW,CACT,KAAa,EACb,IAAY,EACZ,KAAwD;QAExD,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,OAAe;QAClC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CACT,KAAa,EACb,OAAe,EACf,KAAkF,EAClF,OAAgB;QAEhB,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,OAAe;QACxC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAgB;QACpC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CACV,KAAa,EACb,WAAmC,EAAE,EACrC,SAA+B,EAAE;QAEjC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,QAAgB;QAC1C,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,WAAW,CACT,KAAa,EACb,cAAsB,EACtB,UAAgC,EAAE;QAElC,OAAO,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,oBAAoB,CAAC,KAAa,EAAE,SAAiB;QACnD,OAAO,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,QAAgB;QACjD,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,iBAAiB,CAAC,KAAa,EAAE,eAAuB;QACtD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,WAAmB;QAC9C,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE,EAAE,UAAsC,EAAE;QAChF,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,aAAa,CACX,KAAa,EACb,KAAK,GAAG,EAAE,EACV,UAAsC,EAAE;QAExC,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW;QACT,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SearchDocument } from "../search-parse.js";
|
|
2
|
+
import type { GmailTwinDatabase, SemanticMessage } from "../types.js";
|
|
3
|
+
/** Batch-load labels + attachments for many message ids (avoids semanticMessage × N). */
|
|
4
|
+
export declare function batchSemanticMessages(db: GmailTwinDatabase, mailboxId: number, messageIds: string[]): SemanticMessage[];
|
|
5
|
+
/** Build search documents for already-hydrated messages with batched header/user-label lookups. */
|
|
6
|
+
export declare function batchSearchDocuments(db: GmailTwinDatabase, mailboxId: number, messages: SemanticMessage[]): SearchDocument[];
|
|
7
|
+
export declare function searchDocument(db: GmailTwinDatabase, mailboxId: number, message: SemanticMessage): SearchDocument;
|
|
8
|
+
export declare function searchNow(db: GmailTwinDatabase): number;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { notFound } from "../errors.js";
|
|
3
|
+
/** Batch-load labels + attachments for many message ids (avoids semanticMessage × N). */
|
|
4
|
+
export function batchSemanticMessages(db, mailboxId, messageIds) {
|
|
5
|
+
if (!messageIds.length)
|
|
6
|
+
return [];
|
|
7
|
+
const placeholders = messageIds.map(() => "?").join(", ");
|
|
8
|
+
const rows = db
|
|
9
|
+
.prepare(`SELECT * FROM messages
|
|
10
|
+
WHERE mailbox_id = ? AND id IN (${placeholders})`)
|
|
11
|
+
.all(mailboxId, ...messageIds);
|
|
12
|
+
if (rows.length !== messageIds.length) {
|
|
13
|
+
const found = new Set(rows.map((row) => row.id));
|
|
14
|
+
const missing = messageIds.find((id) => !found.has(id));
|
|
15
|
+
if (missing)
|
|
16
|
+
notFound("Message");
|
|
17
|
+
}
|
|
18
|
+
const byId = new Map(rows.map((row) => [row.id, row]));
|
|
19
|
+
const labelRows = db
|
|
20
|
+
.prepare(`SELECT message_id, label_id FROM message_labels
|
|
21
|
+
WHERE mailbox_id = ? AND message_id IN (${placeholders})
|
|
22
|
+
ORDER BY message_id, label_id`)
|
|
23
|
+
.all(mailboxId, ...messageIds);
|
|
24
|
+
const labelsByMessage = new Map();
|
|
25
|
+
for (const row of labelRows) {
|
|
26
|
+
const list = labelsByMessage.get(row.message_id) ?? [];
|
|
27
|
+
list.push(row.label_id);
|
|
28
|
+
labelsByMessage.set(row.message_id, list);
|
|
29
|
+
}
|
|
30
|
+
const attachmentRows = db
|
|
31
|
+
.prepare(`SELECT message_id, id, filename, mime_type, disposition, content_id, sha256, size, part_index
|
|
32
|
+
FROM attachments
|
|
33
|
+
WHERE mailbox_id = ? AND message_id IN (${placeholders})
|
|
34
|
+
ORDER BY message_id, part_index`)
|
|
35
|
+
.all(mailboxId, ...messageIds);
|
|
36
|
+
const attachmentsByMessage = new Map();
|
|
37
|
+
for (const row of attachmentRows) {
|
|
38
|
+
const list = attachmentsByMessage.get(row.message_id) ?? [];
|
|
39
|
+
list.push({
|
|
40
|
+
id: row.id,
|
|
41
|
+
filename: row.filename,
|
|
42
|
+
mimeType: row.mime_type,
|
|
43
|
+
disposition: row.disposition,
|
|
44
|
+
contentId: row.content_id,
|
|
45
|
+
sha256: row.sha256,
|
|
46
|
+
size: row.size,
|
|
47
|
+
});
|
|
48
|
+
attachmentsByMessage.set(row.message_id, list);
|
|
49
|
+
}
|
|
50
|
+
return messageIds.map((id) => {
|
|
51
|
+
const row = byId.get(id);
|
|
52
|
+
return {
|
|
53
|
+
id: row.id,
|
|
54
|
+
threadId: row.thread_id,
|
|
55
|
+
rfcMessageId: row.rfc_message_id,
|
|
56
|
+
internalDate: row.internal_date,
|
|
57
|
+
from: row.from_address,
|
|
58
|
+
to: JSON.parse(row.to_json),
|
|
59
|
+
cc: JSON.parse(row.cc_json),
|
|
60
|
+
bcc: JSON.parse(row.bcc_json),
|
|
61
|
+
subject: row.subject,
|
|
62
|
+
snippet: row.snippet,
|
|
63
|
+
text: row.text_body,
|
|
64
|
+
html: row.html_body,
|
|
65
|
+
sizeEstimate: row.size_estimate,
|
|
66
|
+
labelIds: labelsByMessage.get(id) ?? [],
|
|
67
|
+
attachments: attachmentsByMessage.get(id) ?? [],
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/** Build search documents for already-hydrated messages with batched header/user-label lookups. */
|
|
72
|
+
export function batchSearchDocuments(db, mailboxId, messages) {
|
|
73
|
+
if (!messages.length)
|
|
74
|
+
return [];
|
|
75
|
+
const ids = messages.map((message) => message.id);
|
|
76
|
+
const placeholders = ids.map(() => "?").join(", ");
|
|
77
|
+
const metaRows = db
|
|
78
|
+
.prepare(`SELECT id, delivered_to, headers_json FROM messages
|
|
79
|
+
WHERE mailbox_id = ? AND id IN (${placeholders})`)
|
|
80
|
+
.all(mailboxId, ...ids);
|
|
81
|
+
const metaById = new Map(metaRows.map((row) => [row.id, row]));
|
|
82
|
+
const userLabelRows = db
|
|
83
|
+
.prepare(`SELECT ml.message_id, COUNT(*) AS count
|
|
84
|
+
FROM message_labels ml
|
|
85
|
+
JOIN labels l ON l.mailbox_id = ml.mailbox_id AND l.id = ml.label_id
|
|
86
|
+
WHERE ml.mailbox_id = ? AND ml.message_id IN (${placeholders}) AND l.type = 'user'
|
|
87
|
+
GROUP BY ml.message_id`)
|
|
88
|
+
.all(mailboxId, ...ids);
|
|
89
|
+
const userLabelCount = new Map(userLabelRows.map((row) => [row.message_id, row.count]));
|
|
90
|
+
return messages.map((message) => {
|
|
91
|
+
const meta = metaById.get(message.id);
|
|
92
|
+
return {
|
|
93
|
+
from: message.from.toLowerCase(),
|
|
94
|
+
to: message.to.map((item) => item.toLowerCase()),
|
|
95
|
+
cc: message.cc.map((item) => item.toLowerCase()),
|
|
96
|
+
bcc: message.bcc.map((item) => item.toLowerCase()),
|
|
97
|
+
deliveredTo: meta.delivered_to.toLowerCase(),
|
|
98
|
+
subject: message.subject,
|
|
99
|
+
text: message.text,
|
|
100
|
+
html: message.html,
|
|
101
|
+
dateMs: message.internalDate,
|
|
102
|
+
rfcMessageId: message.rfcMessageId,
|
|
103
|
+
size: message.sizeEstimate,
|
|
104
|
+
labels: message.labelIds,
|
|
105
|
+
userLabelCount: userLabelCount.get(message.id) ?? 0,
|
|
106
|
+
attachmentNames: message.attachments.map((attachment) => attachment.filename),
|
|
107
|
+
attachmentMimeTypes: message.attachments.map((attachment) => attachment.mimeType),
|
|
108
|
+
headers: JSON.parse(meta.headers_json),
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export function searchDocument(db, mailboxId, message) {
|
|
113
|
+
return batchSearchDocuments(db, mailboxId, [message])[0];
|
|
114
|
+
}
|
|
115
|
+
export function searchNow(db) {
|
|
116
|
+
const clock = db.prepare("SELECT value FROM gmail_config WHERE key = 'clock'").get();
|
|
117
|
+
const row = db
|
|
118
|
+
.prepare("SELECT COALESCE(MAX(logical_clock), 0) AS value FROM mailbox_counters")
|
|
119
|
+
.get();
|
|
120
|
+
return Date.parse(clock.value) + row.value * 1000;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=hydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../../../src/domain/hydrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,0CAA0C;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { GmailDomain } from "./gmail-domain.js";
|
|
2
|
+
export type LabelResource = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
type: "system" | "user";
|
|
6
|
+
textColor: string | null;
|
|
7
|
+
backgroundColor: string | null;
|
|
8
|
+
messagesTotal: number;
|
|
9
|
+
messagesUnread: number;
|
|
10
|
+
threadsTotal: number;
|
|
11
|
+
threadsUnread: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function createLabel(domain: GmailDomain, email: string, name: string, color?: {
|
|
14
|
+
textColor?: string;
|
|
15
|
+
backgroundColor?: string;
|
|
16
|
+
}): {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function listUserLabels(domain: GmailDomain, email: string): Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
color?: {
|
|
24
|
+
textColor?: string;
|
|
25
|
+
backgroundColor?: string;
|
|
26
|
+
};
|
|
27
|
+
threadsTotal: number;
|
|
28
|
+
threadsUnread: number;
|
|
29
|
+
}>;
|
|
30
|
+
/** Batch label list with counts (replaces per-label N+1 from rest-store). */
|
|
31
|
+
export declare function labels(domain: GmailDomain, email: string): LabelResource[];
|
|
32
|
+
export declare function label(domain: GmailDomain, email: string, labelId: string): LabelResource;
|
|
33
|
+
export declare function updateLabel(domain: GmailDomain, email: string, labelId: string, input: {
|
|
34
|
+
name?: string;
|
|
35
|
+
color?: {
|
|
36
|
+
textColor?: string;
|
|
37
|
+
backgroundColor?: string;
|
|
38
|
+
};
|
|
39
|
+
}, replace: boolean): LabelResource;
|
|
40
|
+
export declare function deleteLabel(domain: GmailDomain, email: string, labelId: string): void;
|