@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
@@ -49,14 +49,20 @@ var secureHeaders = (customOptions) => {
49
49
  const headersToSet = getFilteredHeaders(options);
50
50
  const callbacks = [];
51
51
  if (options.contentSecurityPolicy) {
52
- const [callback, value] = getCSPDirectives(options.contentSecurityPolicy);
52
+ const [callback, value] = getCSPDirectives(
53
+ options.contentSecurityPolicy,
54
+ "Content-Security-Policy"
55
+ );
53
56
  if (callback) {
54
57
  callbacks.push(callback);
55
58
  }
56
59
  headersToSet.push(["Content-Security-Policy", value]);
57
60
  }
58
61
  if (options.contentSecurityPolicyReportOnly) {
59
- const [callback, value] = getCSPDirectives(options.contentSecurityPolicyReportOnly);
62
+ const [callback, value] = getCSPDirectives(
63
+ options.contentSecurityPolicyReportOnly,
64
+ "Content-Security-Policy-Report-Only"
65
+ );
60
66
  if (callback) {
61
67
  callbacks.push(callback);
62
68
  }
@@ -89,7 +95,7 @@ function getFilteredHeaders(options) {
89
95
  return typeof overrideValue === "string" ? [defaultValue[0], overrideValue] : defaultValue;
90
96
  });
91
97
  }
92
- function getCSPDirectives(contentSecurityPolicy) {
98
+ function getCSPDirectives(contentSecurityPolicy, headerName) {
93
99
  const callbacks = [];
94
100
  const resultValues = [];
95
101
  for (const [directive, value] of Object.entries(contentSecurityPolicy)) {
@@ -114,7 +120,7 @@ function getCSPDirectives(contentSecurityPolicy) {
114
120
  resultValues.pop();
115
121
  return callbacks.length === 0 ? [void 0, resultValues.join("")] : [
116
122
  (ctx, headersToSet) => headersToSet.map((values) => {
117
- if (values[0] === "Content-Security-Policy" || values[0] === "Content-Security-Policy-Report-Only") {
123
+ if (values[0] === headerName) {
118
124
  const clone = values[1].slice();
119
125
  callbacks.forEach((cb) => {
120
126
  cb(ctx, clone);
@@ -76,7 +76,7 @@ var HonoRequest = class {
76
76
  if (name) {
77
77
  return this.raw.headers.get(name) ?? void 0;
78
78
  }
79
- const headerData = {};
79
+ const headerData = /* @__PURE__ */ Object.create(null);
80
80
  this.raw.headers.forEach((value, key) => {
81
81
  headerData[key] = value;
82
82
  });
@@ -294,11 +294,16 @@ var cloneRawRequest = async (req) => {
294
294
  message: "Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly."
295
295
  });
296
296
  }
297
+ const body = await req[cacheKey]();
298
+ const headers = req.header();
299
+ if (body instanceof FormData) {
300
+ delete headers["content-type"];
301
+ }
297
302
  const requestInit = {
298
- body: await req[cacheKey](),
303
+ body,
299
304
  cache: req.raw.cache,
300
305
  credentials: req.raw.credentials,
301
- headers: req.header(),
306
+ headers,
302
307
  integrity: req.raw.integrity,
303
308
  keepalive: req.raw.keepalive,
304
309
  method: req.method,
@@ -96,6 +96,15 @@ interface Authorizer {
96
96
  userArn: string;
97
97
  userId: string;
98
98
  };
99
+ jwt?: {
100
+ claims: Record<string, string | number | boolean | string[]>;
101
+ scopes: string[] | null;
102
+ };
103
+ /**
104
+ * The `context` object returned by a Lambda (REQUEST) authorizer.
105
+ * It is `null` when the authorizer returns no context.
106
+ */
107
+ lambda?: Record<string, unknown> | null;
99
108
  }
100
109
  export interface ApiGatewayRequestContextV2 {
101
110
  accountId: string;
@@ -31,7 +31,7 @@ export type WSReadyState = 0 | 1 | 2 | 3;
31
31
  * An argument for WSContext class
32
32
  */
33
33
  export interface WSContextInit<T = unknown> {
34
- send(data: string | ArrayBuffer | Uint8Array, options: SendOptions): void;
34
+ send(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options: SendOptions): void;
35
35
  close(code?: number, reason?: string): void;
36
36
  raw?: T;
37
37
  readyState: WSReadyState;
@@ -71,7 +71,7 @@ export declare const every: (...middleware: (MiddlewareHandler | Condition)[]) =
71
71
  * @example
72
72
  * ```ts
73
73
  * import { except } from 'hono/combine'
74
- * import { bearerAuth } from 'hono/bearer-auth
74
+ * import { bearerAuth } from 'hono/bearer-auth'
75
75
  *
76
76
  * // If client is accessing public API, then skip authentication.
77
77
  * // Otherwise, require a valid token.
@@ -125,7 +125,7 @@ var getNextParam = (acceptHeader, startIndex) => {
125
125
  var getNextAcceptValue = (acceptHeader, startIndex) => {
126
126
  const accept = {
127
127
  type: "",
128
- params: {},
128
+ params: /* @__PURE__ */ Object.create(null),
129
129
  q: 1
130
130
  };
131
131
  startIndex = consumeWhitespace(acceptHeader, startIndex);
@@ -12,6 +12,12 @@ var parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) =
12
12
  return {};
13
13
  };
14
14
  async function parseFormData(request, options) {
15
+ if (!isRawRequest(request) && request.bodyCache.formData) {
16
+ return convertFormDataToBodyData(
17
+ await request.bodyCache.formData,
18
+ options
19
+ );
20
+ }
15
21
  const headers = isRawRequest(request) ? request.headers : request.raw.headers;
16
22
  const arrayBuffer = await request.arrayBuffer();
17
23
  const formDataPromise = bufferToFormData(arrayBuffer, headers.get("Content-Type") || "");
@@ -159,7 +159,7 @@ var _getQueryParam = (url, key, multiple) => {
159
159
  return void 0;
160
160
  }
161
161
  }
162
- const results = {};
162
+ const results = /* @__PURE__ */ Object.create(null);
163
163
  encoded ??= /[%+]/.test(url);
164
164
  let keyIndex = url.indexOf("?", 8);
165
165
  while (keyIndex !== -1) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.12.29",
3
+ "version": "4.12.32",
4
4
  "description": "Web framework built on Web Standards",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",
@@ -666,7 +666,7 @@
666
666
  "nodejs"
667
667
  ],
668
668
  "devDependencies": {
669
- "@hono/eslint-config": "^2.1.0",
669
+ "@hono/eslint-config": "^2.1.1",
670
670
  "@hono/node-server": "^2.0.2",
671
671
  "@types/jsdom": "^21.1.7",
672
672
  "@types/node": "^24.3.0",
@@ -684,7 +684,7 @@
684
684
  "pkg-pr-new": "^0.0.53",
685
685
  "prettier": "3.7.4",
686
686
  "publint": "0.3.15",
687
- "typescript": "^5.9.2",
687
+ "typescript": "^6.0.3",
688
688
  "undici": "^6.27.0",
689
689
  "vite-plugin-fastly-js-compute": "^0.4.2",
690
690
  "vitest": "^4.1.9",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Digital-twin testing for AI agents — run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
@@ -66,8 +66,8 @@
66
66
  "@hono/node-server": "^2.0.10",
67
67
  "@openrouter/ai-sdk-provider": "^3.0.0",
68
68
  "@pome-sh/sdk": "0.5.1",
69
- "@pome-sh/shared-types": "0.12.1",
70
- "@pome-sh/twin-gmail": "0.1.1",
69
+ "@pome-sh/shared-types": "0.12.2",
70
+ "@pome-sh/twin-gmail": "0.2.0",
71
71
  "@pome-sh/twin-github": "0.2.1",
72
72
  "@pome-sh/twin-linear": "0.1.0",
73
73
  "@pome-sh/twin-slack": "0.2.2",
@@ -1,5 +0,0 @@
1
- import { type SearchDocument } from "./search.js";
2
- import type { GmailTwinDatabase, SemanticMessage } from "./types.js";
3
- export declare function applyInboundFilters(db: GmailTwinDatabase, mailboxId: number, messageId: string): void;
4
- export declare function searchDocument(db: GmailTwinDatabase, mailboxId: number, message: SemanticMessage): SearchDocument;
5
- export declare function searchNow(db: GmailTwinDatabase): number;
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain-search.js","sourceRoot":"","sources":["../../src/domain-search.ts"],"names":[],"mappings":"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"}
@@ -1,407 +0,0 @@
1
- // file-size: GmailDomain is the single coordinator for mailbox/message/draft/history ops — splitting would scatter cross-table transactions and history recording across modules.
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { invalidArgument, notFound } from "./errors.js";
4
- import { canonicalRaw, composeMime, decodeGmailRaw, parseMime, stripBcc } from "./mime.js";
5
- import { validateSearchQuery, matchesSearch, SEARCH_MAILBOX_MESSAGE_BUDGET } from "./search.js";
6
- import { defaultSeedState, parseSeed } from "./seed.js";
7
- import { addHistory, assertLabels, insertStoredMessage, nextId, nextTimestamp, rawMessage, semanticMessage, } from "./storage.js";
8
- import { resetDatabase } from "./db.js";
9
- import { exportGmailState } from "./state.js";
10
- import { seedMailbox } from "./seeding.js";
11
- import { applyInboundFilters, searchDocument, searchNow } from "./domain-search.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
- for (const mailbox of [seed.primaryMailbox, ...seed.mailboxes])
24
- seedMailbox(this.db, mailbox);
25
- }).immediate();
26
- }
27
- applySeed(input) {
28
- this.seed(parseSeed(input));
29
- return { ok: true };
30
- }
31
- resetToDefault() {
32
- this.seed(defaultSeedState());
33
- return { ok: true };
34
- }
35
- mailboxId(email) {
36
- const row = this.db
37
- .prepare("SELECT id FROM mailboxes WHERE email = ? COLLATE NOCASE")
38
- .get(email);
39
- if (!row)
40
- notFound("User");
41
- return row.id;
42
- }
43
- getRaw(email, messageId) {
44
- return rawMessage(this.db, this.mailboxId(email), messageId);
45
- }
46
- getMessage(email, messageId) {
47
- return semanticMessage(this.db, this.mailboxId(email), messageId);
48
- }
49
- getThread(email, threadId) {
50
- const mailboxId = this.mailboxId(email);
51
- const rows = this.db
52
- .prepare("SELECT id FROM messages WHERE mailbox_id = ? AND thread_id = ? ORDER BY internal_date, id")
53
- .all(mailboxId, threadId);
54
- if (!rows.length)
55
- notFound("Thread");
56
- const messages = rows.map((row) => semanticMessage(this.db, mailboxId, row.id));
57
- return {
58
- id: threadId,
59
- labelIds: [...new Set(messages.flatMap((message) => message.labelIds))].sort(),
60
- messages,
61
- };
62
- }
63
- insertMessage(email, raw, options = {}) {
64
- const mailboxId = this.mailboxId(email);
65
- const bytes = acceptedRaw(raw);
66
- return this.db.transaction(() => {
67
- const message = insertStoredMessage(this.db, mailboxId, bytes, {
68
- threadId: options.threadId,
69
- labels: options.labels ?? (options.incoming ? ["INBOX"] : []),
70
- deliveredTo: options.incoming ? email : undefined,
71
- });
72
- if (options.incoming)
73
- applyInboundFilters(this.db, mailboxId, message.id);
74
- return semanticMessage(this.db, mailboxId, message.id);
75
- }).immediate();
76
- }
77
- sendMessage(email, raw, options = {}) {
78
- const senderMailboxId = this.mailboxId(email);
79
- const bytes = acceptedRaw(raw);
80
- const parsed = parseMime(bytes);
81
- this.assertAcceptedFrom(senderMailboxId, parsed.from);
82
- return this.db.transaction(() => {
83
- const recipientEmails = [...new Set([...parsed.to, ...parsed.cc, ...parsed.bcc].map((item) => item.toLowerCase()))];
84
- const selfDelivery = this.deliveryMode() === "seeded-mailboxes" && recipientEmails.includes(email.toLowerCase());
85
- const sender = insertStoredMessage(this.db, senderMailboxId, bytes, {
86
- threadId: options.threadId,
87
- labels: selfDelivery ? ["INBOX", "SENT"] : ["SENT"],
88
- });
89
- if (selfDelivery)
90
- applyInboundFilters(this.db, senderMailboxId, sender.id);
91
- const deliveries = [];
92
- if (this.deliveryMode() === "seeded-mailboxes") {
93
- const visibleRaw = stripBcc(bytes);
94
- for (const recipient of recipientEmails) {
95
- if (recipient === email.toLowerCase())
96
- continue;
97
- const mailbox = this.db
98
- .prepare("SELECT id, email FROM mailboxes WHERE email = ? COLLATE NOCASE")
99
- .get(recipient);
100
- if (!mailbox)
101
- continue;
102
- const copy = insertStoredMessage(this.db, mailbox.id, visibleRaw, {
103
- labels: ["INBOX"],
104
- deliveredTo: mailbox.email,
105
- });
106
- applyInboundFilters(this.db, mailbox.id, copy.id);
107
- deliveries.push({ mailboxEmail: mailbox.email, message: semanticMessage(this.db, mailbox.id, copy.id) });
108
- }
109
- }
110
- return { sender: semanticMessage(this.db, senderMailboxId, sender.id), deliveries };
111
- }).immediate();
112
- }
113
- createDraft(email, raw, options = {}) {
114
- const mailboxId = this.mailboxId(email);
115
- const bytes = acceptedRaw(raw);
116
- return this.db.transaction(() => {
117
- const message = insertStoredMessage(this.db, mailboxId, bytes, {
118
- threadId: options.threadId,
119
- draft: true,
120
- });
121
- const draftId = nextId(this.db, mailboxId, "draft_counter", "draft");
122
- const now = nextTimestamp(this.db, mailboxId);
123
- this.db
124
- .prepare("INSERT INTO drafts(mailbox_id, id, message_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?)")
125
- .run(mailboxId, draftId, message.id, now, now);
126
- addHistory(this.db, mailboxId, message.id, message.threadId, "draftCreated", ["DRAFT"]);
127
- return { id: draftId, message };
128
- }).immediate();
129
- }
130
- createComposedDraft(email, input) {
131
- const mailboxId = this.mailboxId(email);
132
- return this.db.transaction(() => {
133
- const reply = input.replyToMessageId
134
- ? semanticMessage(this.db, mailboxId, input.replyToMessageId)
135
- : undefined;
136
- const raw = composeMime({
137
- from: email,
138
- to: input.to,
139
- cc: input.cc,
140
- bcc: input.bcc,
141
- subject: input.subject ?? (reply ? `Re: ${reply.subject}` : ""),
142
- text: reply ? [input.text ?? "", reply.text].filter(Boolean).join("\r\n\r\n") : input.text,
143
- html: reply ? [input.html ?? "", reply.html].filter(Boolean).join("<br><br>") : input.html,
144
- date: nextTimestamp(this.db, mailboxId),
145
- messageId: `${nextId(this.db, mailboxId, "message_counter", "rfc")}@pome-twin.test`,
146
- inReplyTo: reply?.rfcMessageId,
147
- references: reply ? [reply.rfcMessageId] : undefined,
148
- attachments: input.attachments,
149
- });
150
- return this.createDraft(email, raw, { threadId: reply?.threadId });
151
- }).immediate();
152
- }
153
- listDrafts(email, query = "") {
154
- const mailboxId = this.mailboxId(email);
155
- const rows = this.db
156
- .prepare(`SELECT d.id, d.message_id
157
- FROM drafts d JOIN messages m ON m.mailbox_id = d.mailbox_id AND m.id = d.message_id
158
- WHERE d.mailbox_id = ? ORDER BY d.updated_at DESC, d.id DESC`)
159
- .all(mailboxId);
160
- const matchingIds = query
161
- ? new Set(this.searchMessages(email, `in:draft ${query}`, { includeTrash: true }).map((message) => message.id))
162
- : undefined;
163
- return rows
164
- .filter((row) => matchingIds?.has(row.message_id) ?? true)
165
- .map((row) => ({ id: row.id, message: semanticMessage(this.db, mailboxId, row.message_id) }));
166
- }
167
- updateDraft(email, draftId, raw, options = {}) {
168
- const mailboxId = this.mailboxId(email);
169
- const bytes = acceptedRaw(raw);
170
- return this.db.transaction(() => {
171
- const draft = this.requireDraft(mailboxId, draftId);
172
- const old = semanticMessage(this.db, mailboxId, draft.message_id);
173
- const replacement = insertStoredMessage(this.db, mailboxId, bytes, {
174
- threadId: options.threadId,
175
- draft: true,
176
- });
177
- const now = nextTimestamp(this.db, mailboxId);
178
- this.db
179
- .prepare("UPDATE drafts SET message_id = ?, updated_at = ? WHERE mailbox_id = ? AND id = ?")
180
- .run(replacement.id, now, mailboxId, draftId);
181
- this.db.prepare("DELETE FROM messages WHERE mailbox_id = ? AND id = ?").run(mailboxId, draft.message_id);
182
- this.removeEmptyThread(mailboxId, old.threadId);
183
- addHistory(this.db, mailboxId, draft.message_id, old.threadId, "draftReplaced");
184
- return { id: draftId, message: replacement };
185
- }).immediate();
186
- }
187
- sendDraft(email, draftId) {
188
- const mailboxId = this.mailboxId(email);
189
- return this.db.transaction(() => {
190
- const draft = this.requireDraft(mailboxId, draftId);
191
- const raw = rawMessage(this.db, mailboxId, draft.message_id);
192
- const old = semanticMessage(this.db, mailboxId, draft.message_id);
193
- this.db.prepare("DELETE FROM drafts WHERE mailbox_id = ? AND id = ?").run(mailboxId, draftId);
194
- this.db.prepare("DELETE FROM messages WHERE mailbox_id = ? AND id = ?").run(mailboxId, draft.message_id);
195
- // Keep the draft's thread row even when it becomes empty — send reuses
196
- // old.threadId (Gmail draft send identity). removeEmptyThread here would
197
- // drop solo-draft threads and force a new thread id on send.
198
- addHistory(this.db, mailboxId, draft.message_id, old.threadId, "draftSent");
199
- return this.sendMessage(email, raw, { threadId: old.threadId });
200
- }).immediate();
201
- }
202
- deleteDraft(email, draftId) {
203
- const mailboxId = this.mailboxId(email);
204
- this.db.transaction(() => {
205
- const draft = this.requireDraft(mailboxId, draftId);
206
- const message = semanticMessage(this.db, mailboxId, draft.message_id);
207
- this.db.prepare("DELETE FROM messages WHERE mailbox_id = ? AND id = ?").run(mailboxId, draft.message_id);
208
- this.removeEmptyThread(mailboxId, message.threadId);
209
- addHistory(this.db, mailboxId, draft.message_id, message.threadId, "draftDeleted");
210
- }).immediate();
211
- }
212
- modifyMessageLabels(email, messageId, add = [], remove = []) {
213
- const mailboxId = this.mailboxId(email);
214
- return this.db.transaction(() => {
215
- const before = semanticMessage(this.db, mailboxId, messageId);
216
- if (before.labelIds.includes("DRAFT") && (add.some((id) => id !== "DRAFT") || remove.includes("DRAFT"))) {
217
- invalidArgument("Draft messages may only carry the DRAFT label");
218
- }
219
- if (!before.labelIds.includes("DRAFT") && add.includes("DRAFT")) {
220
- invalidArgument("The DRAFT label is managed by draft operations");
221
- }
222
- assertLabels(this.db, mailboxId, [...add, ...remove]);
223
- const actualRemove = [...new Set(remove)].filter((label) => before.labelIds.includes(label));
224
- const actualAdd = [...new Set(add)].filter((label) => !before.labelIds.includes(label));
225
- for (const label of actualRemove) {
226
- this.db
227
- .prepare("DELETE FROM message_labels WHERE mailbox_id = ? AND message_id = ? AND label_id = ?")
228
- .run(mailboxId, messageId, label);
229
- }
230
- for (const label of actualAdd) {
231
- this.db
232
- .prepare("INSERT OR IGNORE INTO message_labels(mailbox_id, message_id, label_id) VALUES (?, ?, ?)")
233
- .run(mailboxId, messageId, label);
234
- }
235
- if (actualAdd.length)
236
- addHistory(this.db, mailboxId, messageId, before.threadId, "labelAdded", actualAdd);
237
- if (actualRemove.length)
238
- addHistory(this.db, mailboxId, messageId, before.threadId, "labelRemoved", actualRemove);
239
- return semanticMessage(this.db, mailboxId, messageId);
240
- }).immediate();
241
- }
242
- modifyThreadLabels(email, threadId, add = [], remove = []) {
243
- return this.db.transaction(() => {
244
- const thread = this.getThread(email, threadId);
245
- for (const message of thread.messages)
246
- this.modifyMessageLabels(email, message.id, add, remove);
247
- return this.getThread(email, threadId);
248
- }).immediate();
249
- }
250
- createLabel(email, name, color) {
251
- const mailboxId = this.mailboxId(email);
252
- if (!name.trim())
253
- invalidArgument("Label name is required");
254
- return this.db.transaction(() => {
255
- const id = nextId(this.db, mailboxId, "label_counter", "Label");
256
- try {
257
- this.db
258
- .prepare("INSERT INTO labels(mailbox_id, id, name, type, text_color, background_color) VALUES (?, ?, ?, 'user', ?, ?)")
259
- .run(mailboxId, id, name.trim(), color?.textColor ?? null, color?.backgroundColor ?? null);
260
- }
261
- catch {
262
- invalidArgument(`Label already exists: ${name}`);
263
- }
264
- return { id, name: name.trim() };
265
- }).immediate();
266
- }
267
- listUserLabels(email) {
268
- const mailboxId = this.mailboxId(email);
269
- const rows = this.db
270
- .prepare(`SELECT l.id, l.name, l.text_color, l.background_color,
271
- COUNT(DISTINCT m.thread_id) AS threads_total,
272
- COUNT(DISTINCT CASE WHEN unread.message_id IS NOT NULL THEN m.thread_id END) AS threads_unread
273
- FROM labels l
274
- LEFT JOIN message_labels ml
275
- ON ml.mailbox_id = l.mailbox_id AND ml.label_id = l.id
276
- LEFT JOIN messages m
277
- ON m.mailbox_id = ml.mailbox_id AND m.id = ml.message_id
278
- LEFT JOIN message_labels unread
279
- ON unread.mailbox_id = m.mailbox_id
280
- AND unread.message_id = m.id
281
- AND unread.label_id = 'UNREAD'
282
- WHERE l.mailbox_id = ? AND l.type = 'user'
283
- GROUP BY l.mailbox_id, l.id
284
- ORDER BY l.name COLLATE NOCASE, l.id`)
285
- .all(mailboxId);
286
- return rows.map((row) => ({
287
- id: row.id,
288
- name: row.name,
289
- ...(row.text_color || row.background_color
290
- ? {
291
- color: {
292
- ...(row.text_color ? { textColor: row.text_color } : {}),
293
- ...(row.background_color ? { backgroundColor: row.background_color } : {}),
294
- },
295
- }
296
- : {}),
297
- threadsTotal: row.threads_total,
298
- threadsUnread: row.threads_unread,
299
- }));
300
- }
301
- listHistory(email, startHistoryId, options = {}) {
302
- const mailboxId = this.mailboxId(email);
303
- const start = Number(startHistoryId);
304
- if (!Number.isSafeInteger(start) || start < 0)
305
- invalidArgument("Invalid startHistoryId");
306
- const current = this.currentHistoryId(mailboxId);
307
- if (start > current)
308
- notFound("History");
309
- const rows = this.db
310
- .prepare(`SELECT h.*, m.email AS mailbox_email
311
- FROM history h JOIN mailboxes m ON m.id = h.mailbox_id
312
- WHERE h.mailbox_id = ? AND h.id > ? ORDER BY h.id`)
313
- .all(mailboxId, start);
314
- return {
315
- history: rows
316
- .filter((row) => !options.types?.length || options.types.includes(row.event_type))
317
- .map((row) => ({
318
- id: String(row.id),
319
- mailboxEmail: row.mailbox_email,
320
- messageId: row.message_id,
321
- threadId: row.thread_id,
322
- type: row.event_type,
323
- labelIds: JSON.parse(row.label_ids_json),
324
- timestamp: row.created_at,
325
- })),
326
- historyId: String(current),
327
- };
328
- }
329
- searchMessages(email, query = "", options = {}) {
330
- const mailboxId = this.mailboxId(email);
331
- const ast = validateSearchQuery(query);
332
- const messageCount = this.db.prepare("SELECT COUNT(*) AS count FROM messages WHERE mailbox_id = ?").get(mailboxId).count;
333
- // Intentional in-memory bound: hydrate + JS predicate. Fail loud before OOM.
334
- // SQL compile of the AST (`compileSearchToSql`) is deferred until budgets land in prod paths.
335
- if (messageCount > SEARCH_MAILBOX_MESSAGE_BUDGET) {
336
- invalidArgument(`Mailbox exceeds in-memory search budget (${SEARCH_MAILBOX_MESSAGE_BUDGET} messages); reduce mailbox size or wait for SQL-backed search`);
337
- }
338
- const rows = this.db
339
- .prepare("SELECT id FROM messages WHERE mailbox_id = ? ORDER BY internal_date DESC, id DESC")
340
- .all(mailboxId);
341
- const explicitAnywhere = /\bin:(anywhere|trash|spam|draft)\b/i.test(query);
342
- return rows
343
- .map((row) => semanticMessage(this.db, mailboxId, row.id))
344
- .filter((message) => {
345
- if (!explicitAnywhere && !options.includeTrash && message.labelIds.some((id) => ["TRASH", "SPAM", "DRAFT"].includes(id))) {
346
- return false;
347
- }
348
- return matchesSearch(ast, searchDocument(this.db, mailboxId, message), searchNow(this.db));
349
- });
350
- }
351
- searchThreads(email, query = "", options = {}) {
352
- const matches = this.searchMessages(email, query, options);
353
- return [...new Set(matches.map((message) => message.threadId))].map((threadId) => this.getThread(email, threadId));
354
- }
355
- exportState() {
356
- return exportGmailState(this.db);
357
- }
358
- /** Snapshot high-water for opaque page tokens (mailbox history counter). */
359
- currentHistoryIdFor(email) {
360
- return String(this.currentHistoryId(this.mailboxId(email)));
361
- }
362
- requireDraft(mailboxId, draftId) {
363
- const row = this.db
364
- .prepare("SELECT * FROM drafts WHERE mailbox_id = ? AND id = ?")
365
- .get(mailboxId, draftId);
366
- if (!row)
367
- notFound("Draft");
368
- return row;
369
- }
370
- removeEmptyThread(mailboxId, threadId) {
371
- const member = this.db
372
- .prepare("SELECT 1 FROM messages WHERE mailbox_id = ? AND thread_id = ? LIMIT 1")
373
- .get(mailboxId, threadId);
374
- if (!member)
375
- this.db.prepare("DELETE FROM threads WHERE mailbox_id = ? AND id = ?").run(mailboxId, threadId);
376
- }
377
- currentHistoryId(mailboxId) {
378
- const row = this.db
379
- .prepare("SELECT history_counter FROM mailbox_counters WHERE mailbox_id = ?")
380
- .get(mailboxId);
381
- return row.history_counter;
382
- }
383
- deliveryMode() {
384
- const row = this.db
385
- .prepare("SELECT value FROM gmail_config WHERE key = 'delivery_mode'")
386
- .get();
387
- return row.value;
388
- }
389
- assertAcceptedFrom(mailboxId, from) {
390
- if (!from)
391
- invalidArgument("From header is required");
392
- const accepted = this.db
393
- .prepare(`SELECT 1 FROM send_as
394
- WHERE mailbox_id = ? AND email = ? COLLATE NOCASE AND verification_status = 'accepted'`)
395
- .get(mailboxId, from);
396
- if (!accepted)
397
- invalidArgument("From address is not an accepted send-as identity");
398
- }
399
- }
400
- function acceptedRaw(raw) {
401
- return typeof raw === "string"
402
- ? raw.includes("\n")
403
- ? canonicalRaw(raw)
404
- : decodeGmailRaw(raw)
405
- : canonicalRaw(raw);
406
- }
407
- //# sourceMappingURL=domain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/domain.ts"],"names":[],"mappings":"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"}