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
@@ -1,25 +1,11 @@
1
1
  // Mail watch command: poll for new emails using Gmail History API.
2
- // Uses incremental historyId-based sync each tick fetches only changes
3
- // since the last known historyId, not the full inbox. On a quiet inbox
4
- // this is a single API call returning nothing.
2
+ // Thin CLI wrapper around GmailClient.watchInbox() async generator.
5
3
  // Multi-account: watches all accounts concurrently and merges output.
6
4
  import { z } from 'zod';
7
5
  import { getClients } from '../auth.js';
8
- import { mapConcurrent } from '../api-utils.js';
9
- import * as cache from '../gmail-cache.js';
6
+ import { AuthError } from '../api-utils.js';
10
7
  import * as out from '../output.js';
11
8
  // ---------------------------------------------------------------------------
12
- // Folder label mapping (reuses mail list conventions)
13
- // ---------------------------------------------------------------------------
14
- const FOLDER_LABELS = {
15
- inbox: 'INBOX',
16
- sent: 'SENT',
17
- trash: 'TRASH',
18
- spam: 'SPAM',
19
- starred: 'STARRED',
20
- drafts: 'DRAFT',
21
- };
22
- // ---------------------------------------------------------------------------
23
9
  // Register commands
24
10
  // ---------------------------------------------------------------------------
25
11
  export function registerWatchCommands(cli) {
@@ -36,266 +22,52 @@ export function registerWatchCommands(cli) {
36
22
  process.exit(1);
37
23
  }
38
24
  const folder = options.folder ?? 'inbox';
39
- const filterLabelId = FOLDER_LABELS[folder];
40
- if (!filterLabelId) {
41
- out.error(`Unsupported folder for watch: "${folder}". Supported: ${Object.keys(FOLDER_LABELS).join(', ')}`);
42
- process.exit(1);
43
- }
44
25
  const clients = await getClients(options.account);
45
- // Seed historyId for each account
46
- const states = await Promise.all(clients.map(async ({ email, client }) => {
47
- let historyId = await cache.getLastHistoryId(email);
48
- if (!historyId) {
49
- const profile = await client.getProfile();
50
- historyId = profile.historyId;
51
- await cache.setLastHistoryId(email, historyId);
52
- out.hint(`${email}: watching from now (historyId ${historyId})`);
53
- }
54
- else {
55
- out.hint(`${email}: resuming from historyId ${historyId}`);
56
- }
57
- return { email, client, historyId };
58
- }));
59
26
  // Clean exit on SIGINT
60
- let running = true;
61
27
  process.on('SIGINT', () => {
62
- running = false;
63
28
  out.hint('Stopped watching');
64
29
  process.exit(0);
65
30
  });
66
31
  out.hint(`Polling every ${interval}s for ${folder} changes (Ctrl+C to stop)`);
67
- // Poll loop
68
- while (running) {
69
- const settled = await Promise.allSettled(states.map(async (state) => {
70
- try {
71
- return await pollAccount(state, filterLabelId, options.query);
72
- }
73
- catch (err) {
74
- // historyId expired Google only keeps ~7 days
75
- if (isHistoryExpired(err)) {
76
- out.hint(`${state.email}: history expired, re-seeding...`);
77
- const profile = await state.client.getProfile();
78
- state.historyId = profile.historyId;
79
- await cache.setLastHistoryId(state.email, state.historyId);
80
- // Retry once after reseed (important for --once mode)
81
- return await pollAccount(state, filterLabelId, options.query);
82
- }
83
- throw err;
84
- }
85
- }));
86
- const allItems = [];
87
- for (const result of settled) {
88
- if (result.status === 'fulfilled' && result.value) {
89
- allItems.push(...result.value);
32
+ // Watch all accounts concurrently, print events as they arrive
33
+ const generators = clients.map(({ client }) => client.watchInbox({
34
+ folder,
35
+ intervalMs: interval * 1000,
36
+ query: options.query,
37
+ once: options.once,
38
+ }));
39
+ // Consume all generators concurrently, surface errors to the user
40
+ const settled = await Promise.allSettled(generators.map(async (gen) => {
41
+ for await (const event of gen) {
42
+ out.printList([formatWatchEvent(event)]);
43
+ }
44
+ }));
45
+ for (const result of settled) {
46
+ if (result.status === 'rejected') {
47
+ const err = result.reason;
48
+ if (err instanceof AuthError) {
49
+ out.error(`${err.message}. Try: zele login`);
90
50
  }
91
- else if (result.status === 'rejected') {
92
- out.error(`${result.reason?.message ?? result.reason}`);
51
+ else {
52
+ out.error(`Watch failed: ${err instanceof Error ? err.message : String(err)}`);
93
53
  }
94
54
  }
95
- if (allItems.length > 0) {
96
- out.printList(allItems);
97
- }
98
- if (options.once)
99
- break;
100
- await sleep(interval * 1000);
101
55
  }
102
56
  });
103
57
  }
104
58
  // ---------------------------------------------------------------------------
105
- // Poll a single account for changes
106
- // ---------------------------------------------------------------------------
107
- async function pollAccount(state, filterLabelId, query) {
108
- const { history, historyId: newHistoryId } = await state.client.listHistory({
109
- startHistoryId: state.historyId,
110
- labelId: filterLabelId,
111
- historyTypes: ['messageAdded'],
112
- });
113
- // Update stored historyId even if no changes
114
- if (newHistoryId !== state.historyId) {
115
- state.historyId = newHistoryId;
116
- await cache.setLastHistoryId(state.email, newHistoryId);
117
- }
118
- if (history.length === 0)
119
- return [];
120
- // Collect unique message IDs from messageAdded events.
121
- // No client-side label filtering here — listHistory already filters by
122
- // labelId server-side, and the partial message objects in history responses
123
- // often have incomplete/missing labelIds.
124
- const seenIds = new Set();
125
- const messageIds = [];
126
- for (const entry of history) {
127
- for (const added of entry.messagesAdded ?? []) {
128
- const id = added.message?.id;
129
- if (id && !seenIds.has(id)) {
130
- seenIds.add(id);
131
- messageIds.push(id);
132
- }
133
- }
134
- }
135
- if (messageIds.length === 0)
136
- return [];
137
- // Hydrate messages with metadata (bounded concurrency)
138
- const hydrated = await mapConcurrent(messageIds, async (msgId) => {
139
- try {
140
- const msg = await state.client.getMessage({ messageId: msgId, format: 'metadata' });
141
- if ('raw' in msg)
142
- return null;
143
- // If user specified a query, do a client-side check on subject/from
144
- // (the history API doesn't support query filtering natively)
145
- if (query && !matchesQuery(msg, query))
146
- return null;
147
- return {
148
- account: state.email,
149
- type: 'new_message',
150
- from: out.formatSender(msg.from),
151
- subject: msg.subject,
152
- date: out.formatDate(msg.date),
153
- thread_id: msg.threadId,
154
- message_id: msg.id,
155
- flags: out.formatFlags(msg),
156
- };
157
- }
158
- catch (err) {
159
- const status = err?.code ?? err?.status ?? err?.response?.status;
160
- if (status === 404)
161
- return null; // message deleted between history fetch and hydration
162
- out.hint(`Failed to fetch message ${msgId}: ${err.message ?? err}`);
163
- return null;
164
- }
165
- });
166
- return hydrated.filter((item) => item !== null);
167
- }
168
- // ---------------------------------------------------------------------------
169
59
  // Helpers
170
60
  // ---------------------------------------------------------------------------
171
- function isHistoryExpired(err) {
172
- const status = err?.code ?? err?.status ?? err?.response?.status;
173
- if (status === 404)
174
- return true;
175
- // Google sometimes returns 400 with "Invalid historyId"
176
- if (status === 400) {
177
- const message = err?.message ?? err?.response?.data?.error?.message ?? '';
178
- if (message.includes('historyId'))
179
- return true;
180
- }
181
- return false;
182
- }
183
- // ---------------------------------------------------------------------------
184
- // Client-side Gmail query matching
185
- // ---------------------------------------------------------------------------
186
- // The History API doesn't support server-side query filtering, so we parse
187
- // common Gmail search operators and match against message metadata.
188
- //
189
- // Supported operators: from:, to:, cc:, subject:, is:unread/read/starred,
190
- // has:attachment, and plain text (matches subject + from).
191
- // Multiple terms are AND-ed together. Quoted phrases and negation supported.
192
- //
193
- // Limitations vs full Gmail search:
194
- // - label: not supported (labelIds are API IDs like Label_123, not names)
195
- // - has:attachment uses Content-Type heuristic (metadata format lacks parts)
196
- // - OR, {}, newer_than:, older_than:, etc. are server-only — warned & skipped
197
- //
198
- // See https://support.google.com/mail/answer/7190 for the full Gmail spec.
199
- // ---------------------------------------------------------------------------
200
- // Operators that only work server-side in Gmail search — we skip these
201
- // with a warning rather than silently treating them as plain text.
202
- const SERVER_ONLY_OPERATORS = new Set([
203
- 'in', 'label', 'after', 'before', 'newer_than', 'older_than',
204
- 'filename', 'size', 'larger', 'smaller', 'deliveredto', 'rfc822msgid',
205
- 'list', 'category',
206
- ]);
207
- // Set of operators we support client-side
208
- const SUPPORTED_OPERATORS = new Set([
209
- 'from', 'to', 'cc', 'subject', 'is', 'has',
210
- ]);
211
- let warnedOperators = new Set();
212
- function matchesQuery(msg, query) {
213
- const terms = parseQueryTerms(query);
214
- return terms.every((term) => matchesTerm(msg, term));
215
- }
216
- function parseQueryTerms(query) {
217
- const terms = [];
218
- // Match: optional -, optional operator:, then either "quoted phrase" or non-space word
219
- const regex = /(-?)(?:(\w+):)?(?:"([^"]*)"|([\S]+))/gi;
220
- let match;
221
- while ((match = regex.exec(query)) !== null) {
222
- const negated = match[1] === '-';
223
- const rawOperator = match[2]?.toLowerCase() ?? null;
224
- const value = (match[3] ?? match[4] ?? '').toLowerCase();
225
- if (!value)
226
- continue;
227
- // Skip OR keyword — it's a Gmail boolean operator, not a search term
228
- if (!rawOperator && value === 'or')
229
- continue;
230
- // Warn once and skip server-only operators
231
- if (rawOperator && SERVER_ONLY_OPERATORS.has(rawOperator)) {
232
- if (!warnedOperators.has(rawOperator)) {
233
- warnedOperators.add(rawOperator);
234
- out.hint(`--query: "${rawOperator}:" is a server-only operator (use "mail search" instead), skipping`);
235
- }
236
- continue;
237
- }
238
- // Warn once and skip completely unknown operators
239
- if (rawOperator && !SUPPORTED_OPERATORS.has(rawOperator)) {
240
- if (!warnedOperators.has(rawOperator)) {
241
- warnedOperators.add(rawOperator);
242
- out.hint(`--query: unknown operator "${rawOperator}:", skipping`);
243
- }
244
- continue;
245
- }
246
- terms.push({ operator: rawOperator, value, negated });
247
- }
248
- return terms;
249
- }
250
- function senderMatches(sender, value) {
251
- const full = `${sender.name ?? ''} ${sender.email}`.toLowerCase();
252
- return full.includes(value);
253
- }
254
- function matchesTerm(msg, term) {
255
- let result;
256
- switch (term.operator) {
257
- case 'from':
258
- result = senderMatches(msg.from, term.value);
259
- break;
260
- case 'to':
261
- result = msg.to.some((r) => senderMatches(r, term.value));
262
- break;
263
- case 'cc':
264
- result = (msg.cc ?? []).some((r) => senderMatches(r, term.value));
265
- break;
266
- case 'subject':
267
- result = msg.subject.toLowerCase().includes(term.value);
268
- break;
269
- case 'is':
270
- if (term.value === 'unread')
271
- result = msg.unread;
272
- else if (term.value === 'read')
273
- result = !msg.unread;
274
- else if (term.value === 'starred')
275
- result = msg.starred;
276
- else
277
- result = false;
278
- break;
279
- case 'has':
280
- // In metadata format, payload.parts is absent so we can't inspect
281
- // attachments directly. Use Content-Type heuristic: multipart/mixed
282
- // almost always indicates attachments.
283
- if (term.value === 'attachment')
284
- result = msg.mimeType.includes('multipart/mixed');
285
- else
286
- result = false;
287
- break;
288
- default: {
289
- // Plain text: match against subject + from
290
- const subject = msg.subject.toLowerCase();
291
- const from = `${msg.from.name ?? ''} ${msg.from.email}`.toLowerCase();
292
- result = subject.includes(term.value) || from.includes(term.value);
293
- break;
294
- }
295
- }
296
- return term.negated ? !result : result;
297
- }
298
- function sleep(ms) {
299
- return new Promise((resolve) => setTimeout(resolve, ms));
61
+ function formatWatchEvent(event) {
62
+ return {
63
+ account: event.account.email,
64
+ type: event.type,
65
+ from: out.formatSender(event.message.from),
66
+ subject: event.message.subject,
67
+ date: out.formatDate(event.message.date),
68
+ thread_id: event.threadId,
69
+ message_id: event.message.id,
70
+ flags: out.formatFlags(event.message),
71
+ };
300
72
  }
301
73
  //# sourceMappingURL=watch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
package/dist/db.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Prisma singleton for zele.
2
- // Manages a single SQLite database at ~/.zele/zele.db for all state:
2
+ // Manages a single SQLite database at ~/.zele/sqlite.db for all state:
3
3
  // accounts (OAuth tokens), cache (threads, labels, profiles), and sync state.
4
- // Runs idempotent schema migration on every startup using src/schema.sql.
4
+ // Runs idempotent schema setup on every startup using src/schema.sql.
5
5
  import fs from 'node:fs';
6
6
  import path from 'node:path';
7
7
  import os from 'node:os';
@@ -12,7 +12,7 @@ export { PrismaClient };
12
12
  const __filename = fileURLToPath(import.meta.url);
13
13
  const __dirname = path.dirname(__filename);
14
14
  const ZELE_DIR = path.join(os.homedir(), '.zele');
15
- const DB_PATH = path.join(ZELE_DIR, 'zele.db');
15
+ const DB_PATH = path.join(ZELE_DIR, 'sqlite.db');
16
16
  let prismaInstance = null;
17
17
  let initPromise = null;
18
18
  /**
@@ -35,12 +35,18 @@ async function initializePrisma() {
35
35
  }
36
36
  const adapter = new PrismaLibSql({ url: `file:${DB_PATH}` });
37
37
  const prisma = new PrismaClient({ adapter });
38
- // Always run migrations schema.sql uses IF NOT EXISTS so it's idempotent
39
- await migrateSchema(prisma);
38
+ // WAL mode: allows concurrent readers + single writer, persists on the DB file.
39
+ // busy_timeout: wait up to 5s for locks to clear instead of failing instantly.
40
+ // Prevents "database is locked" errors when multiple processes (TUI, watch, CLI)
41
+ // access the DB, or after macOS sleep/wake leaves stale locks.
42
+ await prisma.$executeRawUnsafe('PRAGMA journal_mode = WAL');
43
+ await prisma.$executeRawUnsafe('PRAGMA busy_timeout = 5000');
44
+ // Run schema.sql — uses CREATE TABLE IF NOT EXISTS so it's idempotent
45
+ await applySchema(prisma);
40
46
  prismaInstance = prisma;
41
47
  return prisma;
42
48
  }
43
- async function migrateSchema(prisma) {
49
+ async function applySchema(prisma) {
44
50
  // When running from source (tsx), __dirname is src/
45
51
  // When running from dist, __dirname is dist/ and schema.sql is at ../src/schema.sql
46
52
  let schemaPath = path.join(__dirname, 'schema.sql');
@@ -59,13 +65,6 @@ async function migrateSchema(prisma) {
59
65
  // Make CREATE INDEX idempotent
60
66
  .map((s) => s.replace(/^CREATE\s+UNIQUE\s+INDEX\b(?!\s+IF)/i, 'CREATE UNIQUE INDEX IF NOT EXISTS')
61
67
  .replace(/^CREATE\s+INDEX\b(?!\s+IF)/i, 'CREATE INDEX IF NOT EXISTS'));
62
- // Compatibility migration: older DBs may not have account_status yet.
63
- try {
64
- await prisma.$executeRawUnsafe("ALTER TABLE \"accounts\" ADD COLUMN \"account_status\" TEXT NOT NULL DEFAULT 'active'");
65
- }
66
- catch {
67
- // Column already exists.
68
- }
69
68
  for (const statement of statements) {
70
69
  await prisma.$executeRawUnsafe(statement);
71
70
  }
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,qEAAqE;AACrE,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;AACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAE9C,IAAI,cAAc,GAAwB,IAAI,CAAA;AAC9C,IAAI,WAAW,GAAiC,IAAI,CAAA;AAEpD;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,WAAW,GAAG,gBAAgB,EAAE,CAAA;IAChC,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,OAAO,EAAE,EAAE,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAE5C,2EAA2E;IAC3E,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IAE3B,cAAc,GAAG,MAAM,CAAA;IACvB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAoB;IAC/C,oDAAoD;IACpD,oFAAoF;IACpF,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,GAAG;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC;SACE,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;SACpD,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CACV;SACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5F,+BAA+B;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,sCAAsC,EAAE,mCAAmC,CAAC;SACpF,OAAO,CAAC,6BAA6B,EAAE,4BAA4B,CAAC,CAAC,CAAA;IAErF,sEAAsE;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,iBAAiB,CAC5B,uFAAuF,CACxF,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAGD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,cAAc,CAAC,WAAW,EAAE,CAAA;QAClC,cAAc,GAAG,IAAI,CAAA;QACrB,WAAW,GAAG,IAAI,CAAA;IACpB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -3,47 +3,32 @@ export { Prisma };
3
3
  export * as $Enums from './enums.js';
4
4
  export * from './enums.js';
5
5
  /**
6
- * Model accounts
6
+ * Model Account
7
7
  *
8
8
  */
9
- export type accounts = Prisma.accountsModel;
9
+ export type Account = Prisma.AccountModel;
10
10
  /**
11
- * Model thread_lists
11
+ * Model Thread
12
12
  *
13
13
  */
14
- export type thread_lists = Prisma.thread_listsModel;
14
+ export type Thread = Prisma.ThreadModel;
15
15
  /**
16
- * Model threads
16
+ * Model Label
17
17
  *
18
18
  */
19
- export type threads = Prisma.threadsModel;
19
+ export type Label = Prisma.LabelModel;
20
20
  /**
21
- * Model labels
21
+ * Model Profile
22
22
  *
23
23
  */
24
- export type labels = Prisma.labelsModel;
24
+ export type Profile = Prisma.ProfileModel;
25
25
  /**
26
- * Model label_counts
26
+ * Model CalendarList
27
27
  *
28
28
  */
29
- export type label_counts = Prisma.label_countsModel;
29
+ export type CalendarList = Prisma.CalendarListModel;
30
30
  /**
31
- * Model profiles
31
+ * Model SyncState
32
32
  *
33
33
  */
34
- export type profiles = Prisma.profilesModel;
35
- /**
36
- * Model calendar_lists
37
- *
38
- */
39
- export type calendar_lists = Prisma.calendar_listsModel;
40
- /**
41
- * Model calendar_events
42
- *
43
- */
44
- export type calendar_events = Prisma.calendar_eventsModel;
45
- /**
46
- * Model sync_states
47
- *
48
- */
49
- export type sync_states = Prisma.sync_statesModel;
34
+ export type SyncState = Prisma.SyncStateModel;
@@ -11,7 +11,7 @@ export * from "./enums.js";
11
11
  * ```
12
12
  * const prisma = new PrismaClient()
13
13
  * // Fetch zero or more Accounts
14
- * const accounts = await prisma.accounts.findMany()
14
+ * const accounts = await prisma.account.findMany()
15
15
  * ```
16
16
  *
17
17
  * Read more in our [docs](https://pris.ly/d/client).
@@ -20,47 +20,32 @@ export declare const PrismaClient: $Class.PrismaClientConstructor;
20
20
  export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>;
21
21
  export { Prisma };
22
22
  /**
23
- * Model accounts
23
+ * Model Account
24
24
  *
25
25
  */
26
- export type accounts = Prisma.accountsModel;
26
+ export type Account = Prisma.AccountModel;
27
27
  /**
28
- * Model thread_lists
28
+ * Model Thread
29
29
  *
30
30
  */
31
- export type thread_lists = Prisma.thread_listsModel;
31
+ export type Thread = Prisma.ThreadModel;
32
32
  /**
33
- * Model threads
33
+ * Model Label
34
34
  *
35
35
  */
36
- export type threads = Prisma.threadsModel;
36
+ export type Label = Prisma.LabelModel;
37
37
  /**
38
- * Model labels
38
+ * Model Profile
39
39
  *
40
40
  */
41
- export type labels = Prisma.labelsModel;
41
+ export type Profile = Prisma.ProfileModel;
42
42
  /**
43
- * Model label_counts
43
+ * Model CalendarList
44
44
  *
45
45
  */
46
- export type label_counts = Prisma.label_countsModel;
46
+ export type CalendarList = Prisma.CalendarListModel;
47
47
  /**
48
- * Model profiles
48
+ * Model SyncState
49
49
  *
50
50
  */
51
- export type profiles = Prisma.profilesModel;
52
- /**
53
- * Model calendar_lists
54
- *
55
- */
56
- export type calendar_lists = Prisma.calendar_listsModel;
57
- /**
58
- * Model calendar_events
59
- *
60
- */
61
- export type calendar_events = Prisma.calendar_eventsModel;
62
- /**
63
- * Model sync_states
64
- *
65
- */
66
- export type sync_states = Prisma.sync_statesModel;
51
+ export type SyncState = Prisma.SyncStateModel;
@@ -23,7 +23,7 @@ export * from "./enums.js";
23
23
  * ```
24
24
  * const prisma = new PrismaClient()
25
25
  * // Fetch zero or more Accounts
26
- * const accounts = await prisma.accounts.findMany()
26
+ * const accounts = await prisma.account.findMany()
27
27
  * ```
28
28
  *
29
29
  * Read more in our [docs](https://pris.ly/d/client).