@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
@@ -1,504 +1,3 @@
1
- // file-size: Gmail search keeps tokenize/parse/validate/match in one module so the grammar and in-memory evaluator share one AST and fail-closed operator set.
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { invalidArgument } from "./errors.js";
4
- const MAX_QUERY_BYTES = 4096;
5
- const MAX_TOKENS = 256;
6
- const MAX_DEPTH = 20;
7
- const MAX_BRANCHES = 256;
8
- /**
9
- * Hard mailbox-size budget for the intentional in-memory search evaluator.
10
- * Search hydrates semantic rows in process; exceeding this fails loudly before OOM.
11
- * Parameterized SQL compile of the AST remains a dedicated follow-up.
12
- */
13
- export const SEARCH_MAILBOX_MESSAGE_BUDGET = 10_000;
14
- /** Operators supported by the twin search grammar (unknowns are rejected). */
15
- const KNOWN_FIELDS = new Set([
16
- "from",
17
- "to",
18
- "cc",
19
- "bcc",
20
- "deliveredto",
21
- "list",
22
- "subject",
23
- "rfc822msgid",
24
- "filename",
25
- "after",
26
- "newer",
27
- "before",
28
- "older",
29
- "newer_than",
30
- "older_than",
31
- "size",
32
- "larger",
33
- "smaller",
34
- "label",
35
- "category",
36
- "in",
37
- "is",
38
- "has",
39
- ]);
40
- /** Gmail `category:` aliases → system label ids. */
41
- const CATEGORY_LABELS = {
42
- primary: "CATEGORY_PERSONAL",
43
- personal: "CATEGORY_PERSONAL",
44
- social: "CATEGORY_SOCIAL",
45
- promotions: "CATEGORY_PROMOTIONS",
46
- updates: "CATEGORY_UPDATES",
47
- forums: "CATEGORY_FORUMS",
48
- };
49
- /**
50
- * Parse a Gmail query and reject operators/values that would throw at match time
51
- * (unknown fields, categories, and invalid date/size/duration literals).
52
- */
53
- export function validateSearchQuery(query) {
54
- const node = parseSearchQuery(query);
55
- const walk = (current) => {
56
- switch (current.type) {
57
- case "and":
58
- case "or":
59
- for (const child of current.children)
60
- walk(child);
61
- return;
62
- case "not":
63
- walk(current.child);
64
- return;
65
- case "around":
66
- return;
67
- case "term":
68
- assertSearchTerm(current.field, current.value);
69
- return;
70
- }
71
- };
72
- walk(node);
73
- return node;
74
- }
75
- function assertSearchTerm(field, value) {
76
- if (!field)
77
- return;
78
- if (!KNOWN_FIELDS.has(field)) {
79
- invalidArgument(`Unsupported search operator: ${field}`);
80
- }
81
- if (field === "category") {
82
- if (!CATEGORY_LABELS[value.toLocaleLowerCase("en-US")]) {
83
- invalidArgument(`Unsupported search category: ${value}`);
84
- }
85
- return;
86
- }
87
- if (field === "after" || field === "newer" || field === "before" || field === "older") {
88
- parseDate(value);
89
- return;
90
- }
91
- if (field === "newer_than" || field === "older_than") {
92
- parseDuration(value);
93
- return;
94
- }
95
- if (field === "size" || field === "larger" || field === "smaller") {
96
- parseSize(value);
97
- return;
98
- }
99
- if (field === "has") {
100
- assertHasOperator(value);
101
- }
102
- }
103
- export function parseSearchQuery(query) {
104
- if (Buffer.byteLength(query) > MAX_QUERY_BYTES)
105
- invalidArgument("Search query exceeds limit");
106
- const tokens = tokenize(query);
107
- if (tokens.length > MAX_TOKENS)
108
- invalidArgument("Search query has too many tokens");
109
- if (tokens.length === 0)
110
- return { type: "and", children: [] };
111
- let position = 0;
112
- const parseExpression = (depth, stop) => {
113
- if (depth > MAX_DEPTH)
114
- invalidArgument("Search query nesting exceeds limit");
115
- const alternatives = [];
116
- let conjunction = [];
117
- const flush = () => {
118
- alternatives.push(conjunction.length === 1 ? conjunction[0] : { type: "and", children: conjunction });
119
- conjunction = [];
120
- };
121
- while (position < tokens.length) {
122
- const token = tokens[position];
123
- if (stop && token.value === stop)
124
- break;
125
- if (token.value.toUpperCase() === "OR") {
126
- position++;
127
- if (!conjunction.length)
128
- invalidArgument("OR requires a left expression");
129
- flush();
130
- continue;
131
- }
132
- if (token.value.toUpperCase() === "AND") {
133
- position++;
134
- continue;
135
- }
136
- conjunction.push(parsePrimary(depth + 1));
137
- }
138
- if (conjunction.length)
139
- flush();
140
- if (!alternatives.length)
141
- return { type: "and", children: [] };
142
- return alternatives.length === 1 ? alternatives[0] : { type: "or", children: alternatives };
143
- };
144
- const parsePrimary = (depth) => {
145
- const token = tokens[position++];
146
- if (token.value === "(" || token.value === "{") {
147
- const end = token.value === "(" ? ")" : "}";
148
- const child = parseExpression(depth, end);
149
- if (tokens[position]?.value !== end)
150
- invalidArgument(`Unclosed ${token.value}`);
151
- position++;
152
- return token.value === "{" ? makeImplicitOr(child) : child;
153
- }
154
- if (token.value === ")" || token.value === "}")
155
- invalidArgument(`Unexpected ${token.value}`);
156
- let value = token.value;
157
- let negate = false;
158
- if (value === "-") {
159
- negate = true;
160
- const next = tokens[position++];
161
- if (!next)
162
- invalidArgument("Negation requires an expression");
163
- position--;
164
- const child = parsePrimary(depth + 1);
165
- return { type: "not", child };
166
- }
167
- if (value.startsWith("-") && value.length > 1) {
168
- negate = true;
169
- value = value.slice(1);
170
- }
171
- const around = tokens[position]?.value.toUpperCase() === "AROUND";
172
- if (around) {
173
- position++;
174
- const distance = Number(tokens[position++]?.value);
175
- const right = tokens[position++]?.value;
176
- if (!Number.isInteger(distance) || distance < 1 || distance > 100 || !right) {
177
- invalidArgument("AROUND requires a distance and right term");
178
- }
179
- const node = { type: "around", left: value, right, distance };
180
- return negate ? { type: "not", child: node } : node;
181
- }
182
- const colon = value.indexOf(":");
183
- let node;
184
- if (colon > 0) {
185
- const field = value.slice(0, colon).toLowerCase();
186
- let fieldValue = value.slice(colon + 1);
187
- if (!fieldValue && (tokens[position]?.value === "(" || tokens[position]?.value === "{")) {
188
- node = parseFieldGroup(field, depth + 1);
189
- return negate ? { type: "not", child: node } : node;
190
- }
191
- if (!fieldValue && tokens[position] && !["AND", "OR", ")", "}"].includes(tokens[position].value.toUpperCase())) {
192
- fieldValue = tokens[position++].value;
193
- }
194
- node = { type: "term", field, value: fieldValue, exact: token.quoted };
195
- }
196
- else {
197
- node = { type: "term", value: value.startsWith("+") ? value.slice(1) : value, exact: token.quoted || value.startsWith("+") };
198
- }
199
- return negate ? { type: "not", child: node } : node;
200
- };
201
- const parseFieldGroup = (field, depth) => {
202
- if (depth > MAX_DEPTH)
203
- invalidArgument("Search query nesting exceeds limit");
204
- const opening = tokens[position++].value;
205
- const end = opening === "(" ? ")" : "}";
206
- const groups = [[]];
207
- while (position < tokens.length && tokens[position].value !== end) {
208
- const token = tokens[position++];
209
- if (token.value.toUpperCase() === "OR") {
210
- groups.push([]);
211
- continue;
212
- }
213
- if (token.value.toUpperCase() === "AND")
214
- continue;
215
- if (["(", "{", ")", "}"].includes(token.value))
216
- invalidArgument("Nested field groups are unsupported");
217
- let value = token.value;
218
- let negate = false;
219
- if (value.startsWith("-")) {
220
- negate = true;
221
- value = value.slice(1);
222
- }
223
- const term = { type: "term", field, value, exact: token.quoted };
224
- groups.at(-1).push(negate ? { type: "not", child: term } : term);
225
- }
226
- if (tokens[position]?.value !== end)
227
- invalidArgument(`Unclosed ${opening}`);
228
- position++;
229
- const nodes = groups.map((children) => children.length === 1 ? children[0] : { type: "and", children });
230
- const useOr = opening === "{" || nodes.length > 1;
231
- return useOr ? { type: "or", children: nodes } : nodes[0] ?? { type: "and", children: [] };
232
- };
233
- const root = parseExpression(0);
234
- if (position !== tokens.length)
235
- invalidArgument("Unexpected search token");
236
- if (countBranches(root) > MAX_BRANCHES)
237
- invalidArgument("Search query has too many branches");
238
- return root;
239
- }
240
- function countBranches(node) {
241
- switch (node.type) {
242
- case "and":
243
- case "or":
244
- return node.children.reduce((sum, child) => sum + countBranches(child), 0);
245
- case "not":
246
- return countBranches(node.child);
247
- case "around":
248
- case "term":
249
- return 1;
250
- }
251
- }
252
- export function matchesSearch(node, document, nowMs = Date.now()) {
253
- switch (node.type) {
254
- case "and":
255
- return node.children.every((child) => matchesSearch(child, document, nowMs));
256
- case "or":
257
- return node.children.some((child) => matchesSearch(child, document, nowMs));
258
- case "not":
259
- return !matchesSearch(node.child, document, nowMs);
260
- case "around":
261
- return matchesAround(searchable(document), node.left, node.right, node.distance);
262
- case "term":
263
- return matchesTerm(node.field, node.value, node.exact === true, document, nowMs);
264
- }
265
- }
266
- export function compileSearchToSql(mailboxId, node) {
267
- // The mailbox read is deliberately fixed SQL. Complex Gmail operators are
268
- // evaluated against bounded semantic rows; query text is never interpolated.
269
- return {
270
- sql: "SELECT * FROM messages WHERE mailbox_id = ? ORDER BY internal_date DESC, id DESC",
271
- params: [mailboxId],
272
- predicate: (document) => matchesSearch(node, document),
273
- };
274
- }
275
- function matchesTerm(field, rawValue, exact, document, nowMs) {
276
- const value = rawValue.toLocaleLowerCase("en-US");
277
- const contains = (candidate) => matchText(candidate, value, exact);
278
- if (!field)
279
- return contains(searchable(document));
280
- if (!KNOWN_FIELDS.has(field)) {
281
- invalidArgument(`Unsupported search operator: ${field}`);
282
- }
283
- if (field === "from")
284
- return contains(document.from);
285
- if (field === "to")
286
- return document.to.some(contains);
287
- if (field === "cc")
288
- return document.cc.some(contains);
289
- if (field === "bcc")
290
- return document.bcc.some(contains);
291
- if (field === "deliveredto")
292
- return contains(document.deliveredTo);
293
- if (field === "list") {
294
- return document.headers.some((header) => header.name.toLowerCase() === "list-id" && contains(header.value));
295
- }
296
- if (field === "subject")
297
- return contains(document.subject);
298
- if (field === "rfc822msgid")
299
- return normalizeMessageId(document.rfcMessageId) === normalizeMessageId(value);
300
- if (field === "filename") {
301
- return document.attachmentNames.some(contains) || document.attachmentMimeTypes.some(contains);
302
- }
303
- if (field === "after" || field === "newer")
304
- return document.dateMs > parseDate(value);
305
- if (field === "before" || field === "older")
306
- return document.dateMs < parseDate(value);
307
- if (field === "newer_than")
308
- return document.dateMs > nowMs - parseDuration(value);
309
- if (field === "older_than")
310
- return document.dateMs < nowMs - parseDuration(value);
311
- if (field === "size")
312
- return document.size === parseSize(value);
313
- if (field === "larger")
314
- return document.size > parseSize(value);
315
- if (field === "smaller")
316
- return document.size < parseSize(value);
317
- if (field === "label")
318
- return hasLabel(document, value);
319
- if (field === "category")
320
- return matchesCategory(value, document);
321
- if (field === "in")
322
- return matchesFolder(value, document);
323
- if (field === "is")
324
- return matchesStatus(value, document);
325
- if (field === "has")
326
- return matchesHas(value, document);
327
- invalidArgument(`Unsupported search operator: ${field}`);
328
- }
329
- function matchesCategory(value, document) {
330
- const mapped = CATEGORY_LABELS[value.toLocaleLowerCase("en-US")];
331
- if (!mapped)
332
- invalidArgument(`Unsupported search category: ${value}`);
333
- return hasLabel(document, mapped);
334
- }
335
- function matchesFolder(value, document) {
336
- if (value === "anywhere")
337
- return true;
338
- if (value === "archive")
339
- return !hasLabel(document, "inbox");
340
- if (value === "draft")
341
- return hasLabel(document, "draft");
342
- return hasLabel(document, value);
343
- }
344
- function matchesStatus(value, document) {
345
- if (value === "read")
346
- return !hasLabel(document, "unread");
347
- if (value === "unread")
348
- return hasLabel(document, "unread");
349
- if (value === "starred")
350
- return hasLabel(document, "starred");
351
- if (value === "important")
352
- return hasLabel(document, "important");
353
- if (value === "muted")
354
- return hasLabel(document, "muted");
355
- return hasLabel(document, value);
356
- }
357
- function assertHasOperator(value) {
358
- const normalized = value.toLocaleLowerCase("en-US");
359
- if (normalized.endsWith("-star")) {
360
- invalidArgument(`Unsupported colored-star operator: has:${value}; twin maps only STARRED via is:starred`);
361
- }
362
- }
363
- function matchesHas(value, document) {
364
- const normalized = value.toLocaleLowerCase("en-US");
365
- assertHasOperator(normalized);
366
- if (normalized === "attachment")
367
- return document.attachmentNames.length > 0;
368
- if (normalized === "userlabels")
369
- return document.userLabelCount > 0;
370
- if (normalized === "nouserlabels")
371
- return document.userLabelCount === 0;
372
- if (normalized === "youtube")
373
- return /youtube\.com|youtu\.be/i.test(searchable(document));
374
- if (["drive", "document"].includes(normalized)) {
375
- return /drive\.google\.com|docs\.google\.com/i.test(searchable(document));
376
- }
377
- return false;
378
- }
379
- function hasLabel(document, value) {
380
- const normalized = value.toLocaleLowerCase("en-US");
381
- return document.labels.some((label) => label.toLocaleLowerCase("en-US") === normalized);
382
- }
383
- function searchable(document) {
384
- // Strip tags with a linear scan — avoid backtracking regex on hostile HTML.
385
- const htmlText = stripHtmlTags(document.html);
386
- return [
387
- document.from,
388
- ...document.to,
389
- ...document.cc,
390
- ...document.bcc,
391
- document.subject,
392
- document.text,
393
- htmlText,
394
- ...document.attachmentNames,
395
- ].join(" ");
396
- }
397
- /** Linear HTML tag strip — safe for untrusted MIME (no ReDoS). */
398
- export function stripHtmlTags(value) {
399
- let out = "";
400
- let inTag = false;
401
- for (let index = 0; index < value.length; index += 1) {
402
- const char = value[index];
403
- if (char === "<") {
404
- inTag = true;
405
- continue;
406
- }
407
- if (char === ">" && inTag) {
408
- inTag = false;
409
- out += " ";
410
- continue;
411
- }
412
- if (!inTag)
413
- out += char;
414
- }
415
- return out;
416
- }
417
- function matchText(candidate, value, exact) {
418
- const haystack = candidate.toLocaleLowerCase("en-US");
419
- if (!exact)
420
- return haystack.includes(value);
421
- const pattern = new RegExp(`(?:^|[^\\p{L}\\p{N}])${escapeRegExp(value)}(?:$|[^\\p{L}\\p{N}])`, "iu");
422
- return value.includes(" ") ? haystack.includes(value) : pattern.test(haystack);
423
- }
424
- function matchesAround(text, left, right, distance) {
425
- const words = text.toLocaleLowerCase("en-US").split(/[^\p{L}\p{N}@._+-]+/u);
426
- const leftValue = left.toLocaleLowerCase("en-US");
427
- const rightValue = right.toLocaleLowerCase("en-US");
428
- const leftIndexes = words.flatMap((word, index) => (word === leftValue ? [index] : []));
429
- return leftIndexes.some((index) => words.slice(Math.max(0, index - distance), index + distance + 1).includes(rightValue));
430
- }
431
- function parseDate(value) {
432
- const normalized = /^\d{4}\/\d{1,2}\/\d{1,2}$/.test(value) ? value.replaceAll("/", "-") : value;
433
- const date = Date.parse(`${normalized}${/^\d{4}-\d/.test(normalized) ? "T00:00:00Z" : ""}`);
434
- if (Number.isNaN(date))
435
- invalidArgument(`Invalid search date: ${value}`);
436
- return date;
437
- }
438
- function parseDuration(value) {
439
- const match = value.match(/^(\d+)([dmy])$/i);
440
- if (!match)
441
- invalidArgument(`Invalid search duration: ${value}`);
442
- const units = { d: 86_400_000, m: 30 * 86_400_000, y: 365 * 86_400_000 };
443
- return Number(match[1]) * units[match[2].toLowerCase()];
444
- }
445
- function parseSize(value) {
446
- const match = value.match(/^(\d+(?:\.\d+)?)([kmg])?$/i);
447
- if (!match)
448
- invalidArgument(`Invalid search size: ${value}`);
449
- const scale = { k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
450
- return Math.floor(Number(match[1]) * (match[2] ? scale[match[2].toLowerCase()] : 1));
451
- }
452
- function tokenize(query) {
453
- const out = [];
454
- let index = 0;
455
- while (index < query.length) {
456
- if (/\s/.test(query[index])) {
457
- index++;
458
- continue;
459
- }
460
- const char = query[index];
461
- if ("(){}".includes(char)) {
462
- out.push({ value: char });
463
- index++;
464
- continue;
465
- }
466
- let value = "";
467
- let quoted = false;
468
- while (index < query.length && !/\s/.test(query[index]) && !"(){}".includes(query[index])) {
469
- if (query[index] === '"') {
470
- quoted = true;
471
- index++;
472
- while (index < query.length && query[index] !== '"') {
473
- if (query[index] === "\\" && index + 1 < query.length)
474
- index++;
475
- value += query[index++];
476
- }
477
- if (query[index] !== '"')
478
- invalidArgument("Unclosed search quote");
479
- index++;
480
- }
481
- else {
482
- value += query[index++];
483
- }
484
- }
485
- if (value)
486
- out.push({ value, quoted });
487
- }
488
- return out;
489
- }
490
- function makeImplicitOr(node) {
491
- return node.type === "and" ? { type: "or", children: node.children } : node;
492
- }
493
- function normalizeMessageId(value) {
494
- let normalized = value.trim();
495
- if (normalized.startsWith("<"))
496
- normalized = normalized.slice(1);
497
- if (normalized.endsWith(">"))
498
- normalized = normalized.slice(0, -1);
499
- return normalized.toLowerCase();
500
- }
501
- function escapeRegExp(value) {
502
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
503
- }
1
+ export { CATEGORY_LABELS, KNOWN_FIELDS, SEARCH_MAILBOX_MESSAGE_BUDGET, assertHasOperator, assertSearchTerm, parseDate, parseDuration, parseSearchQuery, parseSize, validateSearchQuery, } from "./search-parse.js";
2
+ export { matchesSearch, stripHtmlTags } from "./search-match.js";
504
3
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,6BAA6B,EAC7B,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -90,8 +90,8 @@ export declare const gmailSeedSchema: z.ZodObject<{
90
90
  forwardingAddresses: z.ZodDefault<z.ZodArray<z.ZodObject<{
91
91
  forwardingEmail: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
92
92
  verificationStatus: z.ZodDefault<z.ZodEnum<{
93
- pending: "pending";
94
93
  accepted: "accepted";
94
+ pending: "pending";
95
95
  }>>;
96
96
  }, z.core.$strict>>>;
97
97
  sendAs: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -101,8 +101,8 @@ export declare const gmailSeedSchema: z.ZodObject<{
101
101
  isPrimary: z.ZodDefault<z.ZodBoolean>;
102
102
  isDefault: z.ZodDefault<z.ZodBoolean>;
103
103
  verificationStatus: z.ZodDefault<z.ZodEnum<{
104
- pending: "pending";
105
104
  accepted: "accepted";
105
+ pending: "pending";
106
106
  }>>;
107
107
  }, z.core.$strict>>>;
108
108
  }, z.core.$strict>;
@@ -195,8 +195,8 @@ export declare const gmailSeedSchema: z.ZodObject<{
195
195
  forwardingAddresses: z.ZodDefault<z.ZodArray<z.ZodObject<{
196
196
  forwardingEmail: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
197
197
  verificationStatus: z.ZodDefault<z.ZodEnum<{
198
- pending: "pending";
199
198
  accepted: "accepted";
199
+ pending: "pending";
200
200
  }>>;
201
201
  }, z.core.$strict>>>;
202
202
  sendAs: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -206,8 +206,8 @@ export declare const gmailSeedSchema: z.ZodObject<{
206
206
  isPrimary: z.ZodDefault<z.ZodBoolean>;
207
207
  isDefault: z.ZodDefault<z.ZodBoolean>;
208
208
  verificationStatus: z.ZodDefault<z.ZodEnum<{
209
- pending: "pending";
210
209
  accepted: "accepted";
210
+ pending: "pending";
211
211
  }>>;
212
212
  }, z.core.$strict>>>;
213
213
  }, z.core.$strict>>>;
@@ -216,6 +216,15 @@ export declare const gmailSeedSchema: z.ZodObject<{
216
216
  "seeded-mailboxes": "seeded-mailboxes";
217
217
  }>>;
218
218
  clock: z.ZodDefault<z.ZodString>;
219
+ faults: z.ZodDefault<z.ZodArray<z.ZodObject<{
220
+ name: z.ZodEnum<{
221
+ "rate-limited": "rate-limited";
222
+ }>;
223
+ target: z.ZodDefault<z.ZodString>;
224
+ succeedFirst: z.ZodDefault<z.ZodNumber>;
225
+ throttleFor: z.ZodDefault<z.ZodNumber>;
226
+ retryAfterSeconds: z.ZodDefault<z.ZodNumber>;
227
+ }, z.core.$strict>>>;
219
228
  }, z.core.$strict>;
220
229
  export type ParsedGmailStateSeed = z.output<typeof gmailSeedSchema>;
221
230
  export declare function parseSeed(input: unknown): ParsedGmailStateSeed;
@@ -1,6 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  import { z } from "zod";
3
- import { validateSearchQuery } from "./search.js";
3
+ import { gmailFaultSchema } from "./faults.js";
4
+ import { validateSearchQuery } from "./search-parse.js";
4
5
  const email = z.string().trim().email().transform((value) => value.toLowerCase());
5
6
  const id = z.string().min(1).max(128).regex(/^[A-Za-z0-9_-]+$/);
6
7
  const attachmentSchema = z
@@ -112,6 +113,7 @@ export const gmailSeedSchema = z
112
113
  mailboxes: z.array(mailboxSchema).max(100).default([]),
113
114
  deliveryMode: z.enum(["sender-only", "seeded-mailboxes"]).default("sender-only"),
114
115
  clock: z.string().datetime({ offset: true }).default("2025-01-01T00:00:00.000Z"),
116
+ faults: z.array(gmailFaultSchema).max(50).default([]),
115
117
  })
116
118
  .strict()
117
119
  .superRefine((seed, ctx) => {