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.
- package/README.md +1 -1
- package/bin/zele +27 -0
- package/dist/api-utils.d.ts +51 -2
- package/dist/api-utils.js +89 -3
- package/dist/api-utils.js.map +1 -1
- package/dist/auth.d.ts +27 -6
- package/dist/auth.js +185 -129
- package/dist/auth.js.map +1 -1
- package/dist/calendar-client.d.ts +16 -9
- package/dist/calendar-client.js +163 -59
- package/dist/calendar-client.js.map +1 -1
- package/dist/cli.js +26 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/attachment.js +17 -15
- package/dist/commands/attachment.js.map +1 -1
- package/dist/commands/auth-cmd.js +20 -9
- package/dist/commands/auth-cmd.js.map +1 -1
- package/dist/commands/calendar.js +67 -78
- package/dist/commands/calendar.js.map +1 -1
- package/dist/commands/draft.js +25 -18
- package/dist/commands/draft.js.map +1 -1
- package/dist/commands/label.js +33 -45
- package/dist/commands/label.js.map +1 -1
- package/dist/commands/mail-actions.js +11 -13
- package/dist/commands/mail-actions.js.map +1 -1
- package/dist/commands/mail.js +112 -126
- package/dist/commands/mail.js.map +1 -1
- package/dist/commands/profile.js +18 -21
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/watch.js +33 -261
- package/dist/commands/watch.js.map +1 -1
- package/dist/db.js +12 -13
- package/dist/db.js.map +1 -1
- package/dist/generated/browser.d.ts +12 -27
- package/dist/generated/client.d.ts +13 -28
- package/dist/generated/client.js +1 -1
- package/dist/generated/commonInputTypes.d.ts +90 -26
- package/dist/generated/enums.d.ts +0 -4
- package/dist/generated/enums.js +0 -3
- package/dist/generated/enums.js.map +1 -1
- package/dist/generated/internal/class.d.ts +22 -55
- package/dist/generated/internal/class.js +12 -4
- package/dist/generated/internal/class.js.map +1 -1
- package/dist/generated/internal/prismaNamespace.d.ts +272 -511
- package/dist/generated/internal/prismaNamespace.js +54 -66
- package/dist/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +60 -74
- package/dist/generated/internal/prismaNamespaceBrowser.js +50 -62
- package/dist/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/generated/models/Account.d.ts +1637 -0
- package/dist/generated/models/Account.js +2 -0
- package/dist/generated/models/Account.js.map +1 -0
- package/dist/generated/models/CalendarList.d.ts +1161 -0
- package/dist/generated/models/CalendarList.js +2 -0
- package/dist/generated/models/CalendarList.js.map +1 -0
- package/dist/generated/models/Label.d.ts +1161 -0
- package/dist/generated/models/Label.js +2 -0
- package/dist/generated/models/Label.js.map +1 -0
- package/dist/generated/models/Profile.d.ts +1269 -0
- package/dist/generated/models/Profile.js +2 -0
- package/dist/generated/models/Profile.js.map +1 -0
- package/dist/generated/models/SyncState.d.ts +1130 -0
- package/dist/generated/models/SyncState.js +2 -0
- package/dist/generated/models/SyncState.js.map +1 -0
- package/dist/generated/models/Thread.d.ts +1608 -0
- package/dist/generated/models/Thread.js +2 -0
- package/dist/generated/models/Thread.js.map +1 -0
- package/dist/generated/models.d.ts +6 -9
- package/dist/gmail-client.d.ts +119 -94
- package/dist/gmail-client.js +862 -322
- package/dist/gmail-client.js.map +1 -1
- package/dist/mail-tui.d.ts +1 -0
- package/dist/mail-tui.js +517 -0
- package/dist/mail-tui.js.map +1 -0
- package/dist/output.d.ts +6 -0
- package/dist/output.js +124 -11
- package/dist/output.js.map +1 -1
- package/package.json +39 -11
- package/schema.prisma +81 -113
- package/src/api-utils.ts +103 -5
- package/src/auth.ts +224 -143
- package/src/calendar-client.ts +196 -89
- package/src/cli.ts +30 -1
- package/src/commands/attachment.ts +18 -19
- package/src/commands/auth-cmd.ts +19 -9
- package/src/commands/calendar.ts +42 -85
- package/src/commands/draft.ts +19 -22
- package/src/commands/label.ts +21 -57
- package/src/commands/mail-actions.ts +11 -19
- package/src/commands/mail.ts +102 -147
- package/src/commands/profile.ts +12 -28
- package/src/commands/watch.ts +37 -304
- package/src/db.ts +13 -16
- package/src/generated/browser.ts +49 -0
- package/src/generated/client.ts +71 -0
- package/src/generated/commonInputTypes.ts +332 -0
- package/src/generated/enums.ts +17 -0
- package/src/generated/internal/class.ts +250 -0
- package/src/generated/internal/prismaNamespace.ts +1198 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +169 -0
- package/src/generated/models/Account.ts +1848 -0
- package/src/generated/models/CalendarList.ts +1331 -0
- package/src/generated/models/Label.ts +1331 -0
- package/src/generated/models/Profile.ts +1439 -0
- package/src/generated/models/SyncState.ts +1300 -0
- package/src/generated/models/Thread.ts +1787 -0
- package/src/generated/models.ts +17 -0
- package/src/gmail-client.test.ts +59 -0
- package/src/gmail-client.ts +1034 -429
- package/src/mail-tui.tsx +1061 -0
- package/src/output.test.ts +1093 -0
- package/src/output.ts +128 -13
- package/src/schema.sql +58 -68
- package/src/test-fixtures/email-html/safe-claude-event.html +28 -0
- package/src/test-fixtures/email-html/safe-product-announcement.html +25 -0
- package/src/test-fixtures/email-html/safe-tracked-links.html +27 -0
- package/src/test-fixtures/email-html-snapshots/safe-claude-event.html.md +9 -0
- package/src/test-fixtures/email-html-snapshots/safe-product-announcement.html.md +13 -0
- package/src/test-fixtures/email-html-snapshots/safe-tracked-links.html.md +7 -0
- package/AGENTS.md +0 -26
- package/CHANGELOG.md +0 -43
- package/dist/generated/models/accounts.d.ts +0 -2000
- package/dist/generated/models/accounts.js +0 -2
- package/dist/generated/models/accounts.js.map +0 -1
- package/dist/generated/models/calendar_events.d.ts +0 -1433
- package/dist/generated/models/calendar_events.js +0 -2
- package/dist/generated/models/calendar_events.js.map +0 -1
- package/dist/generated/models/calendar_lists.d.ts +0 -1131
- package/dist/generated/models/calendar_lists.js +0 -2
- package/dist/generated/models/calendar_lists.js.map +0 -1
- package/dist/generated/models/label_counts.d.ts +0 -1131
- package/dist/generated/models/label_counts.js +0 -2
- package/dist/generated/models/label_counts.js.map +0 -1
- package/dist/generated/models/labels.d.ts +0 -1131
- package/dist/generated/models/labels.js +0 -2
- package/dist/generated/models/labels.js.map +0 -1
- package/dist/generated/models/profiles.d.ts +0 -1131
- package/dist/generated/models/profiles.js +0 -2
- package/dist/generated/models/profiles.js.map +0 -1
- package/dist/generated/models/sync_states.d.ts +0 -1107
- package/dist/generated/models/sync_states.js +0 -2
- package/dist/generated/models/sync_states.js.map +0 -1
- package/dist/generated/models/thread_lists.d.ts +0 -1404
- package/dist/generated/models/thread_lists.js +0 -2
- package/dist/generated/models/thread_lists.js.map +0 -1
- package/dist/generated/models/threads.d.ts +0 -1247
- package/dist/generated/models/threads.js +0 -2
- package/dist/generated/models/threads.js.map +0 -1
- package/dist/gmail-cache.d.ts +0 -60
- package/dist/gmail-cache.js +0 -264
- package/dist/gmail-cache.js.map +0 -1
- package/docs/gogcli-gmail-implementation.md +0 -599
- package/scripts/test-device-code-clients.ts +0 -186
- package/scripts/test-micropython-scopes.ts +0 -72
- package/scripts/test-oauth-clients.ts +0 -257
- package/src/gmail-cache.ts +0 -339
- package/tsconfig.json +0 -16
package/dist/commands/watch.js
CHANGED
|
@@ -1,25 +1,11 @@
|
|
|
1
1
|
// Mail watch command: poll for new emails using Gmail History API.
|
|
2
|
-
//
|
|
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 {
|
|
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
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
|
92
|
-
out.error(
|
|
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
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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/
|
|
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
|
|
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, '
|
|
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
|
-
//
|
|
39
|
-
|
|
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
|
|
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,
|
|
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
|
|
6
|
+
* Model Account
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
|
-
export type
|
|
9
|
+
export type Account = Prisma.AccountModel;
|
|
10
10
|
/**
|
|
11
|
-
* Model
|
|
11
|
+
* Model Thread
|
|
12
12
|
*
|
|
13
13
|
*/
|
|
14
|
-
export type
|
|
14
|
+
export type Thread = Prisma.ThreadModel;
|
|
15
15
|
/**
|
|
16
|
-
* Model
|
|
16
|
+
* Model Label
|
|
17
17
|
*
|
|
18
18
|
*/
|
|
19
|
-
export type
|
|
19
|
+
export type Label = Prisma.LabelModel;
|
|
20
20
|
/**
|
|
21
|
-
* Model
|
|
21
|
+
* Model Profile
|
|
22
22
|
*
|
|
23
23
|
*/
|
|
24
|
-
export type
|
|
24
|
+
export type Profile = Prisma.ProfileModel;
|
|
25
25
|
/**
|
|
26
|
-
* Model
|
|
26
|
+
* Model CalendarList
|
|
27
27
|
*
|
|
28
28
|
*/
|
|
29
|
-
export type
|
|
29
|
+
export type CalendarList = Prisma.CalendarListModel;
|
|
30
30
|
/**
|
|
31
|
-
* Model
|
|
31
|
+
* Model SyncState
|
|
32
32
|
*
|
|
33
33
|
*/
|
|
34
|
-
export type
|
|
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.
|
|
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
|
|
23
|
+
* Model Account
|
|
24
24
|
*
|
|
25
25
|
*/
|
|
26
|
-
export type
|
|
26
|
+
export type Account = Prisma.AccountModel;
|
|
27
27
|
/**
|
|
28
|
-
* Model
|
|
28
|
+
* Model Thread
|
|
29
29
|
*
|
|
30
30
|
*/
|
|
31
|
-
export type
|
|
31
|
+
export type Thread = Prisma.ThreadModel;
|
|
32
32
|
/**
|
|
33
|
-
* Model
|
|
33
|
+
* Model Label
|
|
34
34
|
*
|
|
35
35
|
*/
|
|
36
|
-
export type
|
|
36
|
+
export type Label = Prisma.LabelModel;
|
|
37
37
|
/**
|
|
38
|
-
* Model
|
|
38
|
+
* Model Profile
|
|
39
39
|
*
|
|
40
40
|
*/
|
|
41
|
-
export type
|
|
41
|
+
export type Profile = Prisma.ProfileModel;
|
|
42
42
|
/**
|
|
43
|
-
* Model
|
|
43
|
+
* Model CalendarList
|
|
44
44
|
*
|
|
45
45
|
*/
|
|
46
|
-
export type
|
|
46
|
+
export type CalendarList = Prisma.CalendarListModel;
|
|
47
47
|
/**
|
|
48
|
-
* Model
|
|
48
|
+
* Model SyncState
|
|
49
49
|
*
|
|
50
50
|
*/
|
|
51
|
-
export type
|
|
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;
|
package/dist/generated/client.js
CHANGED
|
@@ -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.
|
|
26
|
+
* const accounts = await prisma.account.findMany()
|
|
27
27
|
* ```
|
|
28
28
|
*
|
|
29
29
|
* Read more in our [docs](https://pris.ly/d/client).
|