zele 0.3.0 → 0.3.5

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 (157) hide show
  1. package/README.md +1 -1
  2. package/bin/zele +27 -0
  3. package/dist/api-utils.d.ts +51 -2
  4. package/dist/api-utils.js +89 -3
  5. package/dist/api-utils.js.map +1 -1
  6. package/dist/auth.d.ts +27 -6
  7. package/dist/auth.js +185 -129
  8. package/dist/auth.js.map +1 -1
  9. package/dist/calendar-client.d.ts +16 -9
  10. package/dist/calendar-client.js +163 -59
  11. package/dist/calendar-client.js.map +1 -1
  12. package/dist/cli.js +26 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/attachment.js +17 -15
  15. package/dist/commands/attachment.js.map +1 -1
  16. package/dist/commands/auth-cmd.js +20 -9
  17. package/dist/commands/auth-cmd.js.map +1 -1
  18. package/dist/commands/calendar.js +67 -78
  19. package/dist/commands/calendar.js.map +1 -1
  20. package/dist/commands/draft.js +25 -18
  21. package/dist/commands/draft.js.map +1 -1
  22. package/dist/commands/label.js +33 -45
  23. package/dist/commands/label.js.map +1 -1
  24. package/dist/commands/mail-actions.js +11 -13
  25. package/dist/commands/mail-actions.js.map +1 -1
  26. package/dist/commands/mail.js +112 -126
  27. package/dist/commands/mail.js.map +1 -1
  28. package/dist/commands/profile.js +18 -21
  29. package/dist/commands/profile.js.map +1 -1
  30. package/dist/commands/watch.js +33 -261
  31. package/dist/commands/watch.js.map +1 -1
  32. package/dist/db.js +12 -13
  33. package/dist/db.js.map +1 -1
  34. package/dist/generated/browser.d.ts +12 -27
  35. package/dist/generated/client.d.ts +13 -28
  36. package/dist/generated/client.js +1 -1
  37. package/dist/generated/commonInputTypes.d.ts +90 -26
  38. package/dist/generated/enums.d.ts +0 -4
  39. package/dist/generated/enums.js +0 -3
  40. package/dist/generated/enums.js.map +1 -1
  41. package/dist/generated/internal/class.d.ts +22 -55
  42. package/dist/generated/internal/class.js +12 -4
  43. package/dist/generated/internal/class.js.map +1 -1
  44. package/dist/generated/internal/prismaNamespace.d.ts +272 -511
  45. package/dist/generated/internal/prismaNamespace.js +54 -66
  46. package/dist/generated/internal/prismaNamespace.js.map +1 -1
  47. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +60 -74
  48. package/dist/generated/internal/prismaNamespaceBrowser.js +50 -62
  49. package/dist/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  50. package/dist/generated/models/Account.d.ts +1637 -0
  51. package/dist/generated/models/Account.js +2 -0
  52. package/dist/generated/models/Account.js.map +1 -0
  53. package/dist/generated/models/CalendarList.d.ts +1161 -0
  54. package/dist/generated/models/CalendarList.js +2 -0
  55. package/dist/generated/models/CalendarList.js.map +1 -0
  56. package/dist/generated/models/Label.d.ts +1161 -0
  57. package/dist/generated/models/Label.js +2 -0
  58. package/dist/generated/models/Label.js.map +1 -0
  59. package/dist/generated/models/Profile.d.ts +1269 -0
  60. package/dist/generated/models/Profile.js +2 -0
  61. package/dist/generated/models/Profile.js.map +1 -0
  62. package/dist/generated/models/SyncState.d.ts +1130 -0
  63. package/dist/generated/models/SyncState.js +2 -0
  64. package/dist/generated/models/SyncState.js.map +1 -0
  65. package/dist/generated/models/Thread.d.ts +1608 -0
  66. package/dist/generated/models/Thread.js +2 -0
  67. package/dist/generated/models/Thread.js.map +1 -0
  68. package/dist/generated/models.d.ts +6 -9
  69. package/dist/gmail-client.d.ts +119 -94
  70. package/dist/gmail-client.js +862 -322
  71. package/dist/gmail-client.js.map +1 -1
  72. package/dist/mail-tui.d.ts +1 -0
  73. package/dist/mail-tui.js +517 -0
  74. package/dist/mail-tui.js.map +1 -0
  75. package/dist/output.d.ts +6 -0
  76. package/dist/output.js +124 -11
  77. package/dist/output.js.map +1 -1
  78. package/package.json +39 -11
  79. package/schema.prisma +81 -113
  80. package/src/api-utils.ts +103 -5
  81. package/src/auth.ts +224 -143
  82. package/src/calendar-client.ts +196 -89
  83. package/src/cli.ts +30 -1
  84. package/src/commands/attachment.ts +18 -19
  85. package/src/commands/auth-cmd.ts +19 -9
  86. package/src/commands/calendar.ts +42 -85
  87. package/src/commands/draft.ts +19 -22
  88. package/src/commands/label.ts +21 -57
  89. package/src/commands/mail-actions.ts +11 -19
  90. package/src/commands/mail.ts +102 -147
  91. package/src/commands/profile.ts +12 -28
  92. package/src/commands/watch.ts +37 -304
  93. package/src/db.ts +13 -16
  94. package/src/generated/browser.ts +49 -0
  95. package/src/generated/client.ts +71 -0
  96. package/src/generated/commonInputTypes.ts +332 -0
  97. package/src/generated/enums.ts +17 -0
  98. package/src/generated/internal/class.ts +250 -0
  99. package/src/generated/internal/prismaNamespace.ts +1198 -0
  100. package/src/generated/internal/prismaNamespaceBrowser.ts +169 -0
  101. package/src/generated/models/Account.ts +1848 -0
  102. package/src/generated/models/CalendarList.ts +1331 -0
  103. package/src/generated/models/Label.ts +1331 -0
  104. package/src/generated/models/Profile.ts +1439 -0
  105. package/src/generated/models/SyncState.ts +1300 -0
  106. package/src/generated/models/Thread.ts +1787 -0
  107. package/src/generated/models.ts +17 -0
  108. package/src/gmail-client.test.ts +59 -0
  109. package/src/gmail-client.ts +1034 -429
  110. package/src/mail-tui.tsx +1061 -0
  111. package/src/output.test.ts +1093 -0
  112. package/src/output.ts +128 -13
  113. package/src/schema.sql +58 -68
  114. package/src/test-fixtures/email-html/safe-claude-event.html +28 -0
  115. package/src/test-fixtures/email-html/safe-product-announcement.html +25 -0
  116. package/src/test-fixtures/email-html/safe-tracked-links.html +27 -0
  117. package/src/test-fixtures/email-html-snapshots/safe-claude-event.html.md +9 -0
  118. package/src/test-fixtures/email-html-snapshots/safe-product-announcement.html.md +13 -0
  119. package/src/test-fixtures/email-html-snapshots/safe-tracked-links.html.md +7 -0
  120. package/AGENTS.md +0 -26
  121. package/CHANGELOG.md +0 -43
  122. package/dist/generated/models/accounts.d.ts +0 -2000
  123. package/dist/generated/models/accounts.js +0 -2
  124. package/dist/generated/models/accounts.js.map +0 -1
  125. package/dist/generated/models/calendar_events.d.ts +0 -1433
  126. package/dist/generated/models/calendar_events.js +0 -2
  127. package/dist/generated/models/calendar_events.js.map +0 -1
  128. package/dist/generated/models/calendar_lists.d.ts +0 -1131
  129. package/dist/generated/models/calendar_lists.js +0 -2
  130. package/dist/generated/models/calendar_lists.js.map +0 -1
  131. package/dist/generated/models/label_counts.d.ts +0 -1131
  132. package/dist/generated/models/label_counts.js +0 -2
  133. package/dist/generated/models/label_counts.js.map +0 -1
  134. package/dist/generated/models/labels.d.ts +0 -1131
  135. package/dist/generated/models/labels.js +0 -2
  136. package/dist/generated/models/labels.js.map +0 -1
  137. package/dist/generated/models/profiles.d.ts +0 -1131
  138. package/dist/generated/models/profiles.js +0 -2
  139. package/dist/generated/models/profiles.js.map +0 -1
  140. package/dist/generated/models/sync_states.d.ts +0 -1107
  141. package/dist/generated/models/sync_states.js +0 -2
  142. package/dist/generated/models/sync_states.js.map +0 -1
  143. package/dist/generated/models/thread_lists.d.ts +0 -1404
  144. package/dist/generated/models/thread_lists.js +0 -2
  145. package/dist/generated/models/thread_lists.js.map +0 -1
  146. package/dist/generated/models/threads.d.ts +0 -1247
  147. package/dist/generated/models/threads.js +0 -2
  148. package/dist/generated/models/threads.js.map +0 -1
  149. package/dist/gmail-cache.d.ts +0 -60
  150. package/dist/gmail-cache.js +0 -264
  151. package/dist/gmail-cache.js.map +0 -1
  152. package/docs/gogcli-gmail-implementation.md +0 -599
  153. package/scripts/test-device-code-clients.ts +0 -186
  154. package/scripts/test-micropython-scopes.ts +0 -72
  155. package/scripts/test-oauth-clients.ts +0 -257
  156. package/src/gmail-cache.ts +0 -339
  157. package/tsconfig.json +0 -16
package/dist/output.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // Output formatting utilities for zele CLI.
2
2
  // Handles YAML output with TTY-aware coloring, date formatting,
3
3
  // HTML-to-markdown email conversion (turndown), and stderr hints.
4
- // Follows gogcli pattern: data to stdout, hints/progress to stderr.
4
+ // Data goes to stdout (console.log), hints/progress/errors to stderr (console.error).
5
+ // Prefer console.log/console.error over raw process.stdout/stderr when possible.
5
6
  //
6
7
  // All structured data is output as YAML (js-yaml). In TTY mode, keys are
7
8
  // colored cyan and values are left at the terminal default. In non-TTY mode,
@@ -9,7 +10,9 @@
9
10
  // Line wrapping is set to Infinity (no folding) everywhere.
10
11
  import yaml from 'js-yaml';
11
12
  import TurndownService from 'turndown';
13
+ import { remark } from 'remark';
12
14
  import pc from 'picocolors';
15
+ import EmailReplyParser from 'email-reply-parser';
13
16
  // ---------------------------------------------------------------------------
14
17
  // TTY detection (used for coloring + wrapping decisions)
15
18
  // ---------------------------------------------------------------------------
@@ -38,7 +41,7 @@ turndown.addRule('tracking-pixels', {
38
41
  },
39
42
  replacement: () => '',
40
43
  });
41
- // Strip <style> and <head> tags
44
+ // Strip <style>, <head>, <script> tags
42
45
  turndown.addRule('strip-style', {
43
46
  filter: ['style', 'head', 'script'],
44
47
  replacement: () => '',
@@ -52,27 +55,121 @@ turndown.addRule('images', {
52
55
  },
53
56
  });
54
57
  // ---------------------------------------------------------------------------
58
+ // Email-specific turndown rules
59
+ // Email HTML heavily relies on layout tables. These are not data tables —
60
+ // they're used for positioning (like a 600px centered wrapper). We unwrap
61
+ // them so only the cell content survives as markdown.
62
+ // ---------------------------------------------------------------------------
63
+ // Strip common quoted-reply wrappers from Gmail/Outlook.
64
+ turndown.addRule('quoted-replies', {
65
+ filter: (node) => {
66
+ const hasClass = (name) => {
67
+ const cls = node.getAttribute('class') ?? '';
68
+ return new RegExp(`(^|\\s)${name}(\\s|$)`).test(cls);
69
+ };
70
+ if (node.nodeName === 'DIV') {
71
+ if (hasClass('gmail_quote') || hasClass('gmail_extra'))
72
+ return true;
73
+ const id = node.getAttribute('id') ?? '';
74
+ if (id === 'appendonsend' || id === 'divRplyFwdMsg')
75
+ return true;
76
+ }
77
+ if (node.nodeName === 'BLOCKQUOTE') {
78
+ const type = node.getAttribute('type') ?? '';
79
+ if (type === 'cite')
80
+ return true;
81
+ }
82
+ return false;
83
+ },
84
+ replacement: () => '',
85
+ });
86
+ // Unwrap layout tables: tables used for email layout (width, align, role="presentation")
87
+ // just pass through their text content instead of rendering as markdown tables.
88
+ turndown.addRule('layout-tables', {
89
+ filter: (node) => {
90
+ if (node.nodeName !== 'TABLE')
91
+ return false;
92
+ const role = (node.getAttribute('role') ?? '').toLowerCase();
93
+ if (role === 'presentation')
94
+ return true;
95
+ // Heuristic: tables with explicit width or align are almost always layout
96
+ const width = node.getAttribute('width') ?? '';
97
+ const align = node.getAttribute('align') ?? '';
98
+ if (width || align)
99
+ return true;
100
+ // Tables with cellpadding/cellspacing/border="0" are layout tables
101
+ const border = (node.getAttribute('border') ?? '').trim();
102
+ const cellpadding = node.getAttribute('cellpadding') ?? '';
103
+ const cellspacing = node.getAttribute('cellspacing') ?? '';
104
+ if (border === '0' || cellpadding || cellspacing)
105
+ return true;
106
+ return false;
107
+ },
108
+ replacement: (content) => {
109
+ // _content already has the inner text converted by turndown
110
+ return content;
111
+ },
112
+ });
113
+ // Strip hidden/preheader elements.
114
+ turndown.addRule('hidden-elements', {
115
+ filter: (node) => {
116
+ const style = node.getAttribute('style') ?? '';
117
+ if (/display\s*:\s*none/i.test(style))
118
+ return true;
119
+ if (/mso-hide\s*:\s*all/i.test(style))
120
+ return true;
121
+ if (node.hasAttribute('hidden'))
122
+ return true;
123
+ const cls = node.getAttribute('class') ?? '';
124
+ if (/(^|\s)preheader(\s|$)/.test(cls))
125
+ return true;
126
+ if (/(^|\s)preview-text(\s|$)/.test(cls))
127
+ return true;
128
+ return false;
129
+ },
130
+ replacement: () => '',
131
+ });
132
+ // ---------------------------------------------------------------------------
55
133
  // HTML -> Markdown conversion
56
134
  // ---------------------------------------------------------------------------
57
135
  export function htmlToMarkdown(html) {
58
136
  // Pre-clean: remove common email noise
59
137
  const cleaned = html
60
138
  .replace(/<!\-\-[\s\S]*?\-\->/g, '') // HTML comments
61
- .replace(/<o:p>[\s\S]*?<\/o:p>/gi, ''); // Outlook tags
62
- const md = turndown.turndown(cleaned);
63
- // Post-clean: collapse excessive blank lines
64
- return md.replace(/\n{3,}/g, '\n\n').trim();
139
+ .replace(/<o:p>[\s\S]*?<\/o:p>/gi, '') // Outlook tags
140
+ .replace(/<!\[if[\s\S]*?<!\[endif\]>/gi, ''); // Outlook conditional comments
141
+ let md = turndown.turndown(cleaned);
142
+ // Replace non-breaking/zero-width spaces before remark sees them
143
+ md = md.replace(/[\u00A0\u200B\u200C\u200D\uFEFF]/g, ' ');
144
+ // Parse and re-serialize through remark for stable, normalized markdown.
145
+ // This collapses whitespace, fixes list indentation, and validates structure.
146
+ const normalized = remark().processSync(md).toString();
147
+ // Remark escapes certain characters for markdown safety. Undo escapes that
148
+ // hurt readability in terminal output:
149
+ // - brackets: only for our synthetic [image: ...] placeholders
150
+ // - ampersands: only inside link destination parens (URL readability)
151
+ return normalized
152
+ .replace(/\\\[image:/g, '[image:')
153
+ .replace(/\(([^\n)]*)\)/g, (whole, inner) => {
154
+ if (!/(https?:\/\/|mailto:)/i.test(inner))
155
+ return whole;
156
+ return `(${inner.replace(/\\&/g, '&')})`;
157
+ })
158
+ .trim();
65
159
  }
66
160
  // ---------------------------------------------------------------------------
67
161
  // Email body rendering (auto-detect HTML vs plain text)
68
162
  // ---------------------------------------------------------------------------
69
163
  export function renderEmailBody(body, mimeType) {
70
- if (mimeType === 'text/html') {
164
+ if (mimeType === 'text/html')
71
165
  return htmlToMarkdown(body);
72
- }
73
166
  return body.trim();
74
167
  }
75
168
  // ---------------------------------------------------------------------------
169
+ // Quoted reply stripping (email-reply-parser)
170
+ // ---------------------------------------------------------------------------
171
+ export const replyParser = new EmailReplyParser();
172
+ // ---------------------------------------------------------------------------
76
173
  // YAML output
77
174
  // ---------------------------------------------------------------------------
78
175
  /**
@@ -202,12 +299,28 @@ export function formatFlags(item) {
202
299
  // Stderr hints (following gogcli pattern: data to stdout, hints to stderr)
203
300
  // ---------------------------------------------------------------------------
204
301
  export function hint(msg) {
205
- process.stderr.write(pc.dim(`# ${msg}`) + '\n');
302
+ console.error(pc.dim(`# ${msg}`));
206
303
  }
207
304
  export function success(msg) {
208
- process.stderr.write(pc.green(msg) + '\n');
305
+ console.error(pc.green(msg));
209
306
  }
210
307
  export function error(msg) {
211
- process.stderr.write(pc.red(msg) + '\n');
308
+ console.error(pc.red(msg));
309
+ }
310
+ // ---------------------------------------------------------------------------
311
+ // Centralized command error handler (errore pattern)
312
+ // ---------------------------------------------------------------------------
313
+ import { AuthError } from './api-utils.js';
314
+ /** Handle any error from a client method in a command context.
315
+ * Prints a user-friendly message to stderr and exits.
316
+ * AuthError gets a "Try: zele login" hint; all others print their message. */
317
+ export function handleCommandError(err) {
318
+ if (err instanceof AuthError) {
319
+ error(`${err.message}. Try: zele login`);
320
+ }
321
+ else {
322
+ error(err.message);
323
+ }
324
+ process.exit(1);
212
325
  }
213
326
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "zele",
3
- "version": "0.3.0",
3
+ "version": "0.3.5",
4
4
  "description": "Gmail CLI — manage email from your terminal",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
7
- "bin": "./dist/cli.js",
7
+ "bin": "./bin/zele",
8
+ "scripts": {
9
+ "build": "rm -rf dist && tsc",
10
+ "prepublishOnly": "bun run build",
11
+ "dev": "tsx src/cli.ts",
12
+ "generate": "prisma generate && bun run generate:sql",
13
+ "generate:sql": "rm -f dev.db && prisma db push --url 'file:dev.db' --accept-data-loss && echo '-- Generated by bun run generate:sql. Do not edit.' > src/schema.sql && sqlite3 dev.db '.schema' >> src/schema.sql",
14
+ "test": "vitest"
15
+ },
8
16
  "keywords": [
9
17
  "gmail",
10
18
  "cli",
@@ -12,37 +20,57 @@
12
20
  ],
13
21
  "author": "remorses",
14
22
  "license": "ISC",
23
+ "packageManager": "bun@1.3.9",
15
24
  "dependencies": {
16
25
  "@googleapis/gmail": "^16.1.1",
17
26
  "@libsql/client": "^0.15.15",
18
27
  "@prisma/adapter-libsql": "^7.3.0",
19
28
  "@prisma/client": "^7.3.0",
29
+ "@termcast/utils": "^2.2.6",
20
30
  "email-addresses": "^5.0.0",
31
+ "email-reply-parser": "^2.3.5",
32
+ "errore": "^0.11.0",
21
33
  "fkill": "^10.0.3",
22
34
  "goke": "^6.1.3",
23
35
  "google-auth-library": "^10.5.0",
24
36
  "js-yaml": "^4.1.1",
25
37
  "mimetext": "^3.0.28",
26
38
  "picocolors": "^1.1.1",
39
+ "react": "^19.2.4",
40
+ "remark": "^15.0.1",
41
+ "termcast": "^1.3.38",
27
42
  "ts-ics": "^2.4.0",
28
43
  "tsdav": "^2.1.7",
29
44
  "turndown": "^7.2.0",
30
45
  "zod": "^4.3.6"
31
46
  },
47
+ "commands": [
48
+ {
49
+ "name": "mail-tui",
50
+ "title": "Mail",
51
+ "description": "Browse and read emails",
52
+ "mode": "view"
53
+ }
54
+ ],
32
55
  "devDependencies": {
33
56
  "@types/email-addresses": "^3.0.0",
34
57
  "@types/js-yaml": "^4.0.9",
35
58
  "@types/node": "^25.2.0",
59
+ "@types/react": "^19.1.2",
36
60
  "@types/turndown": "^5.0.5",
37
61
  "prisma": "^7.3.0",
38
62
  "tsx": "^4.19.4",
39
- "typescript": "^5.9.3"
63
+ "typescript": "^5.9.3",
64
+ "vitest": "^4.0.18"
40
65
  },
41
- "scripts": {
42
- "build": "rm -rf dist && tsc",
43
- "dev": "tsx src/cli.ts",
44
- "generate": "prisma generate && pnpm generate:sql",
45
- "generate:sql": "rm -f dev.db && prisma db push --url 'file:dev.db' --accept-data-loss && echo '-- Generated by pnpm generate:sql. Do not edit.' > src/schema.sql && sqlite3 dev.db '.schema' >> src/schema.sql",
46
- "test": "echo \"Error: no test specified\" && exit 1"
47
- }
48
- }
66
+ "trustedDependencies": [
67
+ "@prisma/engines",
68
+ "prisma"
69
+ ],
70
+ "files": [
71
+ "dist",
72
+ "bin",
73
+ "src",
74
+ "schema.prisma"
75
+ ]
76
+ }
package/schema.prisma CHANGED
@@ -7,152 +7,120 @@ datasource db {
7
7
  provider = "sqlite"
8
8
  }
9
9
 
10
- // Lifecycle status for account credentials stored in `accounts`.
10
+ // Lifecycle status for account credentials stored in `Account`.
11
11
  enum AccountStatus {
12
12
  active
13
13
  disabled
14
14
  }
15
15
 
16
- // Stores one OAuth credential set per Gmail account email.
17
- // This is the source of truth for auth state (tokens, refresh metadata).
18
- model accounts {
19
- email String @id
20
- account_status AccountStatus @default(active)
21
- tokens String // JSON-encoded OAuth2 Credentials
22
- created_at DateTime @default(now())
23
- updated_at DateTime @updatedAt
24
-
25
- thread_lists thread_lists[]
26
- threads threads[]
27
- labels labels?
28
- label_counts label_counts?
29
- profiles profiles?
30
- sync_states sync_states[]
31
- calendar_lists calendar_lists?
32
- calendar_events calendar_events[]
33
- }
34
-
35
- // Caches thread list/search responses per account and query parameters.
36
- // Used for fast list/search rendering and reduced Gmail API calls.
37
- model thread_lists {
38
- id Int @id @default(autoincrement())
39
- email String
40
- folder String @default("")
41
- query String @default("")
42
- label_ids String @default("")
43
- page_token String @default("")
44
- max_results Int @default(0)
45
- data String // JSON blob of ThreadListResult
46
- ttl_ms Int
47
- created_at DateTime @default(now())
48
-
49
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
50
-
51
- @@unique([email, folder, query, label_ids, page_token, max_results])
16
+ // Stores one OAuth credential set per (email, appId) pair.
17
+ // appId is the Google OAuth client ID used during login, enabling
18
+ // multiple OAuth apps per email (different quotas, scopes, etc.).
19
+ // Default is the Thunderbird client ID (the original/only client).
20
+ model Account {
21
+ email String
22
+ appId String
23
+ accountStatus AccountStatus
24
+ tokens String // JSON-encoded OAuth2 Credentials
25
+ createdAt DateTime
26
+ updatedAt DateTime @updatedAt
27
+
28
+ threads Thread[]
29
+ labels Label?
30
+ profiles Profile?
31
+ syncStates SyncState[]
32
+ calendarLists CalendarList?
33
+
34
+ @@id([email, appId])
52
35
  }
53
36
 
54
37
  // Caches hydrated thread payloads per account + thread ID.
55
38
  // Used by mail read and post-mutation cache invalidation.
56
- model threads {
57
- id Int @id @default(autoincrement())
58
- email String
59
- thread_id String
60
- data String // JSON blob of ThreadData
61
- ttl_ms Int
62
- created_at DateTime @default(now())
63
-
64
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
65
-
66
- @@unique([email, thread_id])
39
+ // rawData stores the raw Google gmail_v1.Schema$Thread response (format: full)
40
+ // so the cache is resilient to changes in our own ThreadData type.
41
+ // Indexed columns are extracted for queryability and display.
42
+ model Thread {
43
+ id Int @id @default(autoincrement())
44
+ email String
45
+ appId String
46
+ threadId String
47
+ subject String // extracted for display/search
48
+ snippet String // extracted for display
49
+ fromEmail String // extracted for filtering
50
+ fromName String // extracted for display
51
+ date String // extracted for sorting (RFC2822 from header)
52
+ labelIds String // comma-separated, extracted for filtering
53
+ hasUnread Boolean // extracted for filtering
54
+ msgCount Int // extracted for display
55
+ historyId String? // for sync
56
+ rawData String // raw Google API response JSON (gmail_v1.Schema$Thread)
57
+ ttlMs Int
58
+ createdAt DateTime
59
+
60
+ account Account @relation(fields: [email, appId], references: [email, appId], onDelete: Cascade)
61
+
62
+ @@unique([email, appId, threadId])
67
63
  }
68
64
 
69
65
  // Caches label metadata per account (label id/name/type payload).
70
66
  // Used by label list/get and related command outputs.
71
- model labels {
72
- email String @id
73
- data String // JSON blob of label list
74
- ttl_ms Int
75
- created_at DateTime @default(now())
76
-
77
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
78
- }
67
+ // rawData stores the raw Google gmail_v1.Schema$Label[] response.
68
+ model Label {
69
+ email String
70
+ appId String
71
+ rawData String // raw Google API response JSON (gmail_v1.Schema$Label[])
72
+ ttlMs Int
73
+ createdAt DateTime
79
74
 
80
- // Caches unread counts per label per account.
81
- // Used by label counts to avoid recomputing on every invocation.
82
- model label_counts {
83
- email String @id
84
- data String // JSON blob of label counts
85
- ttl_ms Int
86
- created_at DateTime @default(now())
75
+ account Account @relation(fields: [email, appId], references: [email, appId], onDelete: Cascade)
87
76
 
88
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
77
+ @@id([email, appId])
89
78
  }
90
79
 
91
80
  // Caches Gmail profile payload per account (totals/history id).
92
81
  // Used by profile command and account metadata lookups.
93
- model profiles {
94
- email String @id
95
- data String // JSON blob of profile
96
- ttl_ms Int
97
- created_at DateTime @default(now())
98
-
99
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
82
+ // Fully flattened — no JSON blob needed, only 4 fields from Google.
83
+ model Profile {
84
+ email String
85
+ appId String
86
+ emailAddress String // from Gmail API
87
+ messagesTotal Int // from Gmail API
88
+ threadsTotal Int // from Gmail API
89
+ historyId String // from Gmail API
90
+ ttlMs Int
91
+ createdAt DateTime
92
+
93
+ account Account @relation(fields: [email, appId], references: [email, appId], onDelete: Cascade)
94
+
95
+ @@id([email, appId])
100
96
  }
101
97
 
102
98
  // Caches calendar list per account.
103
99
  // Used by cal list to avoid fetching calendar metadata on every invocation.
104
- model calendar_lists {
105
- email String @id
106
- data String // JSON blob of CalendarListItem[]
107
- ttl_ms Int
108
- created_at DateTime @default(now())
100
+ // rawData stores parsed CalendarListItem[] JSON (not raw tsdav — parsed at write time).
101
+ model CalendarList {
102
+ email String
103
+ appId String
104
+ rawData String // JSON blob of CalendarListItem[]
105
+ ttlMs Int
106
+ createdAt DateTime
109
107
 
110
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
111
- }
112
-
113
- // Caches calendar event list responses per account and query parameters.
114
- // Used for fast cal events rendering and reduced Calendar API calls.
115
- model calendar_events {
116
- id Int @id @default(autoincrement())
117
- email String
118
- calendar_id String @default("")
119
- time_min String @default("")
120
- time_max String @default("")
121
- query String @default("")
122
- max_results Int @default(0)
123
- page_token String @default("")
124
- data String // JSON blob of EventListResult
125
- ttl_ms Int
126
- created_at DateTime @default(now())
127
-
128
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
129
-
130
- @@unique([email, calendar_id, time_min, time_max, query, max_results, page_token])
131
- }
108
+ account Account @relation(fields: [email, appId], references: [email, appId], onDelete: Cascade)
132
109
 
133
- // Allowed keys for sync_states entries.
134
- // Add new values here as sync metadata needs evolve.
135
- enum SyncStateKey {
136
- history_id
110
+ @@id([email, appId])
137
111
  }
138
112
 
139
113
  // Stores persistent per-account sync metadata as generic key/value pairs.
140
114
  // Use this for lightweight sync cursors and markers that are not cached API
141
115
  // payloads, for example `history_id` (incremental Gmail history cursor),
142
116
  // `last_full_sync_at`, or other small account-scoped checkpoints.
143
- //
144
- // Why generic instead of typed columns/tables:
145
- // - keeps schema stable while sync features evolve
146
- // - enables simple upsert by (email, key)
147
- //
148
- // If many core sync fields become permanent, consider promoting them to a
149
- // typed table for stronger validation and query ergonomics.
150
- model sync_states {
117
+ model SyncState {
151
118
  email String
152
- key SyncStateKey
119
+ appId String
120
+ key String
153
121
  value String
154
122
 
155
- account accounts @relation(fields: [email], references: [email], onDelete: Cascade)
123
+ account Account @relation(fields: [email, appId], references: [email, appId], onDelete: Cascade)
156
124
 
157
- @@id([email, key])
125
+ @@id([email, appId, key])
158
126
  }