@pome-sh/cli 0.7.0 → 0.9.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 (154) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/src/cli/agent-identity.js +7 -2
  3. package/dist/src/cli/compile-seeds.js +51 -5
  4. package/dist/src/cli/docs-topics.js +5 -3
  5. package/dist/src/cli/main.js +21 -11
  6. package/dist/src/cli/project-config.d.ts +8 -0
  7. package/dist/src/cli/project-config.js +18 -0
  8. package/dist/src/cli/register.d.ts +15 -0
  9. package/dist/src/cli/register.js +26 -3
  10. package/dist/src/cli/session.d.ts +10 -0
  11. package/dist/src/cli/session.js +28 -2
  12. package/dist/src/fix-prompt/index.d.ts +1 -1
  13. package/dist/src/fix-prompt/index.js +2 -2
  14. package/dist/src/fix-prompt/prompt.d.ts +2 -2
  15. package/dist/src/fix-prompt/prompt.js +9 -9
  16. package/dist/src/hosted/client.d.ts +8 -2
  17. package/dist/src/hosted/client.js +108 -26
  18. package/dist/src/hosted/errors.d.ts +14 -0
  19. package/dist/src/hosted/errors.js +22 -0
  20. package/dist/src/hosted/evalResultCache.d.ts +4 -4
  21. package/dist/src/hosted/evalResultCache.js +10 -3
  22. package/dist/src/recorder/artifacts.d.ts +1 -1
  23. package/dist/src/recorder/artifacts.js +8 -1
  24. package/dist/src/runner/runTask.d.ts +14 -0
  25. package/dist/src/runner/runTaskHosted.js +9 -2
  26. package/dist/src/runner/runTrialGroup.js +4 -1
  27. package/dist/src/task/taskSchema.d.ts +52 -16
  28. package/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +27 -0
  29. package/node_modules/@pome-sh/shared-types/dist/seed-state.js +12 -0
  30. package/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -1
  31. package/node_modules/@pome-sh/shared-types/dist/task.d.ts +18 -0
  32. package/node_modules/@pome-sh/shared-types/package.json +1 -1
  33. package/node_modules/@pome-sh/shared-types/trace-contract.json +1 -1
  34. package/node_modules/@pome-sh/twin-gmail/CHANGELOG.md +21 -0
  35. package/node_modules/@pome-sh/twin-gmail/HOSTED.md +37 -15
  36. package/node_modules/@pome-sh/twin-gmail/LIMITS.md +10 -0
  37. package/node_modules/@pome-sh/twin-gmail/README.md +52 -11
  38. package/node_modules/@pome-sh/twin-gmail/dist/fixtures/mcp-tools-list.canonical.json +242 -7
  39. package/node_modules/@pome-sh/twin-gmail/dist/src/db.js +6 -0
  40. package/node_modules/@pome-sh/twin-gmail/dist/src/db.js.map +1 -1
  41. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.d.ts +41 -0
  42. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js +138 -0
  43. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/drafts.js.map +1 -0
  44. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.d.ts +10 -0
  45. package/node_modules/@pome-sh/twin-gmail/dist/src/{domain-search.js → domain/filters.js} +52 -36
  46. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/filters.js.map +1 -0
  47. package/node_modules/@pome-sh/twin-gmail/dist/src/{domain.d.ts → domain/gmail-domain.d.ts} +45 -34
  48. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js +174 -0
  49. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/gmail-domain.js.map +1 -0
  50. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.d.ts +8 -0
  51. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js +122 -0
  52. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/hydrate.js.map +1 -0
  53. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.d.ts +4 -0
  54. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js +5 -0
  55. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/index.js.map +1 -0
  56. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.d.ts +40 -0
  57. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js +122 -0
  58. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/labels.js.map +1 -0
  59. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.d.ts +49 -0
  60. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js +276 -0
  61. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/messages.js.map +1 -0
  62. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.d.ts +19 -0
  63. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js +179 -0
  64. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/search-sql.js.map +1 -0
  65. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.d.ts +27 -0
  66. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js +98 -0
  67. package/node_modules/@pome-sh/twin-gmail/dist/src/domain/settings.js.map +1 -0
  68. package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js +2 -0
  69. package/node_modules/@pome-sh/twin-gmail/dist/src/errors.js.map +1 -1
  70. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.d.ts +21 -0
  71. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js +52 -0
  72. package/node_modules/@pome-sh/twin-gmail/dist/src/faults.js.map +1 -0
  73. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.d.ts +1 -6
  74. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js +0 -11
  75. package/node_modules/@pome-sh/twin-gmail/dist/src/identity.js.map +1 -1
  76. package/node_modules/@pome-sh/twin-gmail/dist/src/index.d.ts +4 -3
  77. package/node_modules/@pome-sh/twin-gmail/dist/src/index.js +3 -3
  78. package/node_modules/@pome-sh/twin-gmail/dist/src/index.js.map +1 -1
  79. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.d.ts +48 -0
  80. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js +23 -0
  81. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp-schemas.js.map +1 -1
  82. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.d.ts +1 -1
  83. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js +39 -1
  84. package/node_modules/@pome-sh/twin-gmail/dist/src/mcp.js.map +1 -1
  85. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js +4 -5
  86. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-drafts.js.map +1 -1
  87. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.d.ts +2 -3
  88. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js +4 -4
  89. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-kit.js.map +1 -1
  90. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js +7 -8
  91. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-messages.js.map +1 -1
  92. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js +20 -21
  93. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes-resources.js.map +1 -1
  94. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-routes.d.ts +1 -1
  95. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.d.ts +2 -4
  96. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js +4 -6
  97. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-serializers.js.map +1 -1
  98. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.d.ts +4 -0
  99. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js +179 -0
  100. package/node_modules/@pome-sh/twin-gmail/dist/src/search-match.js.map +1 -0
  101. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.d.ts +61 -0
  102. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js +318 -0
  103. package/node_modules/@pome-sh/twin-gmail/dist/src/search-parse.js.map +1 -0
  104. package/node_modules/@pome-sh/twin-gmail/dist/src/search.d.ts +3 -61
  105. package/node_modules/@pome-sh/twin-gmail/dist/src/search.js +2 -503
  106. package/node_modules/@pome-sh/twin-gmail/dist/src/search.js.map +1 -1
  107. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.d.ts +13 -4
  108. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js +3 -1
  109. package/node_modules/@pome-sh/twin-gmail/dist/src/seed.js.map +1 -1
  110. package/node_modules/@pome-sh/twin-gmail/dist/src/server.js +1 -1
  111. package/node_modules/@pome-sh/twin-gmail/dist/src/server.js.map +1 -1
  112. package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js +1 -1
  113. package/node_modules/@pome-sh/twin-gmail/dist/src/storage.js.map +1 -1
  114. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.d.ts +2 -3
  115. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js +1 -4
  116. package/node_modules/@pome-sh/twin-gmail/dist/src/twin.js.map +1 -1
  117. package/node_modules/@pome-sh/twin-gmail/dist/src/types.d.ts +1 -0
  118. package/node_modules/@pome-sh/twin-gmail/fidelity.inventory.json +42 -435
  119. package/node_modules/@pome-sh/twin-gmail/fixtures/README.md +4 -4
  120. package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.canonical.json +242 -7
  121. package/node_modules/@pome-sh/twin-gmail/fixtures/mcp-tools-list.meta.json +3 -3
  122. package/node_modules/@pome-sh/twin-gmail/package.json +3 -2
  123. package/node_modules/hono/dist/cjs/client/utils.js +1 -1
  124. package/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  125. package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
  126. package/node_modules/hono/dist/cjs/middleware/compress/index.js +2 -1
  127. package/node_modules/hono/dist/cjs/middleware/method-override/index.js +5 -3
  128. package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +10 -4
  129. package/node_modules/hono/dist/cjs/request.js +8 -3
  130. package/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  131. package/node_modules/hono/dist/cjs/utils/body.js +6 -0
  132. package/node_modules/hono/dist/cjs/utils/url.js +1 -1
  133. package/node_modules/hono/dist/client/utils.js +1 -1
  134. package/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  135. package/node_modules/hono/dist/middleware/cache/index.js +1 -1
  136. package/node_modules/hono/dist/middleware/compress/index.js +2 -1
  137. package/node_modules/hono/dist/middleware/method-override/index.js +5 -3
  138. package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +10 -4
  139. package/node_modules/hono/dist/request.js +8 -3
  140. package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  141. package/node_modules/hono/dist/types/helper/websocket/index.d.ts +1 -1
  142. package/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  143. package/node_modules/hono/dist/utils/accept.js +1 -1
  144. package/node_modules/hono/dist/utils/body.js +6 -0
  145. package/node_modules/hono/dist/utils/url.js +1 -1
  146. package/node_modules/hono/package.json +3 -3
  147. package/package.json +3 -3
  148. package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.d.ts +0 -5
  149. package/node_modules/@pome-sh/twin-gmail/dist/src/domain-search.js.map +0 -1
  150. package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js +0 -407
  151. package/node_modules/@pome-sh/twin-gmail/dist/src/domain.js.map +0 -1
  152. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.d.ts +0 -75
  153. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.js +0 -282
  154. package/node_modules/@pome-sh/twin-gmail/dist/src/rest-store.js.map +0 -1
@@ -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 "./seed.js";
2
- import type { GmailStateSeed, GmailTwinDatabase, HistoryEvent, SeedAttachment, SemanticMessage } from "./types.js";
3
- import { type GmailStateExport } from "./state.js";
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<GmailDomain["sendMessage"]>;
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
- id: string;
70
- labelIds: string[];
71
- messages: SemanticMessage[];
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): Array<{
81
- id: string;
82
- name: string;
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
- threadsTotal: number;
88
- threadsUnread: number;
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<GmailDomain["getThread"]>[];
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":"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"}
@@ -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,4 @@
1
+ export { GmailDomain } from "./gmail-domain.js";
2
+ export type { DraftResource } from "./drafts.js";
3
+ export type { FilterResource } from "./filters.js";
4
+ export type { LabelResource } from "./labels.js";
@@ -0,0 +1,5 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ //
3
+ // Domain barrel (F-679): re-exports only.
4
+ export { GmailDomain } from "./gmail-domain.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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;
@@ -0,0 +1,122 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { invalidArgument, notFound } from "../errors.js";
3
+ import { nextId } from "../storage.js";
4
+ export function createLabel(domain, email, name, color) {
5
+ const mailboxId = domain.mailboxId(email);
6
+ if (!name.trim())
7
+ invalidArgument("Label name is required");
8
+ return domain.db.transaction(() => {
9
+ const id = nextId(domain.db, mailboxId, "label_counter", "Label");
10
+ try {
11
+ domain.db
12
+ .prepare("INSERT INTO labels(mailbox_id, id, name, type, text_color, background_color) VALUES (?, ?, ?, 'user', ?, ?)")
13
+ .run(mailboxId, id, name.trim(), color?.textColor ?? null, color?.backgroundColor ?? null);
14
+ }
15
+ catch {
16
+ invalidArgument(`Label already exists: ${name}`);
17
+ }
18
+ return { id, name: name.trim() };
19
+ }).immediate();
20
+ }
21
+ export function listUserLabels(domain, email) {
22
+ const mailboxId = domain.mailboxId(email);
23
+ const rows = domain.db
24
+ .prepare(`SELECT l.id, l.name, l.text_color, l.background_color,
25
+ COUNT(DISTINCT m.thread_id) AS threads_total,
26
+ COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN m.thread_id END) AS threads_unread
27
+ FROM labels l
28
+ LEFT JOIN message_labels ml
29
+ ON ml.mailbox_id = l.mailbox_id AND ml.label_id = l.id
30
+ LEFT JOIN messages m
31
+ ON m.mailbox_id = ml.mailbox_id AND m.id = ml.message_id
32
+ LEFT JOIN message_labels unread
33
+ ON unread.mailbox_id = m.mailbox_id
34
+ AND unread.message_id = m.id
35
+ AND unread.label_id = 'UNREAD'
36
+ WHERE l.mailbox_id = ? AND l.type = 'user'
37
+ GROUP BY l.mailbox_id, l.id
38
+ ORDER BY l.name COLLATE NOCASE, l.id`)
39
+ .all(mailboxId);
40
+ return rows.map((row) => ({
41
+ id: row.id,
42
+ name: row.name,
43
+ ...(row.text_color || row.background_color
44
+ ? {
45
+ color: {
46
+ ...(row.text_color ? { textColor: row.text_color } : {}),
47
+ ...(row.background_color ? { backgroundColor: row.background_color } : {}),
48
+ },
49
+ }
50
+ : {}),
51
+ threadsTotal: row.threads_total,
52
+ threadsUnread: row.threads_unread,
53
+ }));
54
+ }
55
+ /** Batch label list with counts (replaces per-label N+1 from rest-store). */
56
+ export function labels(domain, email) {
57
+ const mailboxId = domain.mailboxId(email);
58
+ const rows = domain.db
59
+ .prepare(`SELECT l.id, l.name, l.type, l.text_color, l.background_color,
60
+ COUNT(DISTINCT ml.message_id) AS messagesTotal,
61
+ COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN ml.message_id END) AS messagesUnread,
62
+ COUNT(DISTINCT m.thread_id) AS threadsTotal,
63
+ COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN m.thread_id END) AS threadsUnread
64
+ FROM labels l
65
+ LEFT JOIN message_labels ml
66
+ ON ml.mailbox_id = l.mailbox_id AND ml.label_id = l.id
67
+ LEFT JOIN messages m
68
+ ON m.mailbox_id = ml.mailbox_id AND m.id = ml.message_id
69
+ LEFT JOIN message_labels unread
70
+ ON unread.mailbox_id = ml.mailbox_id
71
+ AND unread.message_id = ml.message_id
72
+ AND unread.label_id = 'UNREAD'
73
+ WHERE l.mailbox_id = ?
74
+ GROUP BY l.mailbox_id, l.id
75
+ ORDER BY CASE l.type WHEN 'system' THEN 0 ELSE 1 END, l.name COLLATE NOCASE, l.id`)
76
+ .all(mailboxId);
77
+ return rows.map((row) => ({
78
+ id: row.id,
79
+ name: row.name,
80
+ type: row.type,
81
+ textColor: row.text_color,
82
+ backgroundColor: row.background_color,
83
+ messagesTotal: row.messagesTotal,
84
+ messagesUnread: row.messagesUnread,
85
+ threadsTotal: row.threadsTotal,
86
+ threadsUnread: row.threadsUnread,
87
+ }));
88
+ }
89
+ export function label(domain, email, labelId) {
90
+ const found = labels(domain, email).find((item) => item.id === labelId);
91
+ if (!found)
92
+ notFound("Label");
93
+ return found;
94
+ }
95
+ export function updateLabel(domain, email, labelId, input, replace) {
96
+ const mailboxId = domain.mailboxId(email);
97
+ const current = label(domain, email, labelId);
98
+ if (current.type !== "user")
99
+ invalidArgument("System labels cannot be modified");
100
+ const name = replace ? input.name : input.name ?? current.name;
101
+ if (!name?.trim())
102
+ invalidArgument("Label name is required");
103
+ const textColor = input.color?.textColor ?? (replace ? null : current.textColor);
104
+ const backgroundColor = input.color?.backgroundColor ?? (replace ? null : current.backgroundColor);
105
+ try {
106
+ domain.db
107
+ .prepare("UPDATE labels SET name = ?, text_color = ?, background_color = ? WHERE mailbox_id = ? AND id = ?")
108
+ .run(name.trim(), textColor, backgroundColor, mailboxId, labelId);
109
+ }
110
+ catch {
111
+ invalidArgument(`Label already exists: ${name}`);
112
+ }
113
+ return label(domain, email, labelId);
114
+ }
115
+ export function deleteLabel(domain, email, labelId) {
116
+ const mailboxId = domain.mailboxId(email);
117
+ const current = label(domain, email, labelId);
118
+ if (current.type !== "user")
119
+ invalidArgument("System labels cannot be deleted");
120
+ domain.db.prepare("DELETE FROM labels WHERE mailbox_id = ? AND id = ?").run(mailboxId, labelId);
121
+ }
122
+ //# sourceMappingURL=labels.js.map