@firela/billclaw-core 0.1.3
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/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/billclaw.d.ts +76 -0
- package/dist/billclaw.d.ts.map +1 -0
- package/dist/billclaw.js +205 -0
- package/dist/billclaw.js.map +1 -0
- package/dist/credentials/index.d.ts +8 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +8 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/keychain.d.ts +92 -0
- package/dist/credentials/keychain.d.ts.map +1 -0
- package/dist/credentials/keychain.js +172 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/store.d.ts +76 -0
- package/dist/credentials/store.d.ts.map +1 -0
- package/dist/credentials/store.js +144 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/errors/errors.d.ts +92 -0
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/errors/errors.js +315 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/errors/index.d.ts +7 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/exporters/beancount.d.ts +42 -0
- package/dist/exporters/beancount.d.ts.map +1 -0
- package/dist/exporters/beancount.js +141 -0
- package/dist/exporters/beancount.js.map +1 -0
- package/dist/exporters/index.d.ts +8 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +8 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/ledger.d.ts +42 -0
- package/dist/exporters/ledger.d.ts.map +1 -0
- package/dist/exporters/ledger.js +139 -0
- package/dist/exporters/ledger.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/models/config.d.ts +552 -0
- package/dist/models/config.d.ts.map +1 -0
- package/dist/models/config.js +168 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +8 -0
- package/dist/models/index.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/types.d.ts +110 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +85 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/security/audit.d.ts +148 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +286 -0
- package/dist/security/audit.js.map +1 -0
- package/dist/security/index.d.ts +7 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +7 -0
- package/dist/security/index.js.map +1 -0
- package/dist/services/event-emitter.d.ts +171 -0
- package/dist/services/event-emitter.d.ts.map +1 -0
- package/dist/services/event-emitter.js +287 -0
- package/dist/services/event-emitter.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/sources/gmail/bill-recognizer.d.ts +71 -0
- package/dist/sources/gmail/bill-recognizer.d.ts.map +1 -0
- package/dist/sources/gmail/bill-recognizer.js +341 -0
- package/dist/sources/gmail/bill-recognizer.js.map +1 -0
- package/dist/sources/gmail/email-parser.d.ts +68 -0
- package/dist/sources/gmail/email-parser.d.ts.map +1 -0
- package/dist/sources/gmail/email-parser.js +238 -0
- package/dist/sources/gmail/email-parser.js.map +1 -0
- package/dist/sources/gmail/gmail-fetch.d.ts +54 -0
- package/dist/sources/gmail/gmail-fetch.d.ts.map +1 -0
- package/dist/sources/gmail/gmail-fetch.js +300 -0
- package/dist/sources/gmail/gmail-fetch.js.map +1 -0
- package/dist/sources/gmail/index.d.ts +7 -0
- package/dist/sources/gmail/index.d.ts.map +1 -0
- package/dist/sources/gmail/index.js +7 -0
- package/dist/sources/gmail/index.js.map +1 -0
- package/dist/sources/index.d.ts +8 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +8 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/plaid/index.d.ts +7 -0
- package/dist/sources/plaid/index.d.ts.map +1 -0
- package/dist/sources/plaid/index.js +7 -0
- package/dist/sources/plaid/index.js.map +1 -0
- package/dist/sources/plaid/plaid-sync.d.ts +42 -0
- package/dist/sources/plaid/plaid-sync.d.ts.map +1 -0
- package/dist/sources/plaid/plaid-sync.js +182 -0
- package/dist/sources/plaid/plaid-sync.js.map +1 -0
- package/dist/storage/cache.d.ts +134 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +239 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexes.d.ts +136 -0
- package/dist/storage/indexes.d.ts.map +1 -0
- package/dist/storage/indexes.js +294 -0
- package/dist/storage/indexes.js.map +1 -0
- package/dist/storage/locking.d.ts +103 -0
- package/dist/storage/locking.d.ts.map +1 -0
- package/dist/storage/locking.js +158 -0
- package/dist/storage/locking.js.map +1 -0
- package/dist/storage/streaming.d.ts +102 -0
- package/dist/storage/streaming.d.ts.map +1 -0
- package/dist/storage/streaming.js +245 -0
- package/dist/storage/streaming.js.map +1 -0
- package/dist/storage/transaction-storage.d.ts +101 -0
- package/dist/storage/transaction-storage.d.ts.map +1 -0
- package/dist/storage/transaction-storage.js +193 -0
- package/dist/storage/transaction-storage.js.map +1 -0
- package/dist/sync/index.d.ts +7 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +7 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/sync-service.d.ts +42 -0
- package/dist/sync/sync-service.d.ts.map +1 -0
- package/dist/sync/sync-service.js +112 -0
- package/dist/sync/sync-service.js.map +1 -0
- package/dist/test-fixtures.d.ts +38 -0
- package/dist/test-fixtures.d.ts.map +1 -0
- package/dist/test-fixtures.js +137 -0
- package/dist/test-fixtures.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gmail data source for BillClaw - Framework-agnostic Gmail integration
|
|
3
|
+
*
|
|
4
|
+
* Core business logic for fetching and processing bill emails from Gmail.
|
|
5
|
+
* OAuth token management is provided by the adapter layer.
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger } from "../../errors/errors.js";
|
|
8
|
+
import type { StorageConfig } from "../../models/config.js";
|
|
9
|
+
import { type EmailContent, type GmailConfig } from "./bill-recognizer.js";
|
|
10
|
+
export interface GmailAccount {
|
|
11
|
+
id: string;
|
|
12
|
+
gmailEmailAddress: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GmailFetchResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
accountId: string;
|
|
17
|
+
emailsProcessed: number;
|
|
18
|
+
billsExtracted: number;
|
|
19
|
+
transactionsAdded: number;
|
|
20
|
+
transactionsUpdated: number;
|
|
21
|
+
errors?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Gmail fetcher options
|
|
25
|
+
*/
|
|
26
|
+
export interface GmailFetcherOptions {
|
|
27
|
+
accessToken: string;
|
|
28
|
+
userId?: string;
|
|
29
|
+
query?: string;
|
|
30
|
+
maxResults?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch emails from Gmail API
|
|
34
|
+
*
|
|
35
|
+
* NOTE: This is a framework-agnostic function that requires OAuth tokens.
|
|
36
|
+
* The adapter layer (OpenClaw or CLI) provides the access token.
|
|
37
|
+
*
|
|
38
|
+
* This implementation uses a simple fetch-based approach. For production use,
|
|
39
|
+
* consider using the official Gmail API client library.
|
|
40
|
+
*/
|
|
41
|
+
export declare function fetchGmailEmails(options: GmailFetcherOptions, config: GmailConfig, logger: Logger): Promise<EmailContent[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Fetch bills from Gmail
|
|
44
|
+
*
|
|
45
|
+
* Main entry point for Gmail bill fetching workflow:
|
|
46
|
+
* 1. Fetch emails matching criteria
|
|
47
|
+
* 2. Recognize which emails are bills
|
|
48
|
+
* 3. Parse bill emails into transactions
|
|
49
|
+
* 4. Store transactions
|
|
50
|
+
*/
|
|
51
|
+
export declare function fetchGmailBills(account: GmailAccount, _days: number | undefined, gmailConfig: GmailConfig, storageConfig: StorageConfig, logger: Logger, accessToken?: string): Promise<GmailFetchResult>;
|
|
52
|
+
export * from "./bill-recognizer.js";
|
|
53
|
+
export * from "./email-parser.js";
|
|
54
|
+
//# sourceMappingURL=gmail-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-fetch.d.ts","sourceRoot":"","sources":["../../../src/sources/gmail/gmail-fetch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAG3D,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAM7B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAoBD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,EAAE,CAAC,CA8DzB;AA6KD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,YAAK,EAClB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA8G3B;AAGD,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gmail data source for BillClaw - Framework-agnostic Gmail integration
|
|
3
|
+
*
|
|
4
|
+
* Core business logic for fetching and processing bill emails from Gmail.
|
|
5
|
+
* OAuth token management is provided by the adapter layer.
|
|
6
|
+
*/
|
|
7
|
+
import { appendTransactions } from "../../storage/transaction-storage.js";
|
|
8
|
+
import { filterToBills, } from "./bill-recognizer.js";
|
|
9
|
+
import { parseBillToTransaction, } from "./email-parser.js";
|
|
10
|
+
/**
|
|
11
|
+
* Fetch emails from Gmail API
|
|
12
|
+
*
|
|
13
|
+
* NOTE: This is a framework-agnostic function that requires OAuth tokens.
|
|
14
|
+
* The adapter layer (OpenClaw or CLI) provides the access token.
|
|
15
|
+
*
|
|
16
|
+
* This implementation uses a simple fetch-based approach. For production use,
|
|
17
|
+
* consider using the official Gmail API client library.
|
|
18
|
+
*/
|
|
19
|
+
export async function fetchGmailEmails(options, config, logger) {
|
|
20
|
+
const { accessToken, userId = "me", query, maxResults = 50 } = options;
|
|
21
|
+
logger.info?.("Fetching emails from Gmail API...");
|
|
22
|
+
// Build Gmail search query
|
|
23
|
+
let searchQuery = query || buildGmailQuery(config);
|
|
24
|
+
try {
|
|
25
|
+
// Construct Gmail API URL
|
|
26
|
+
const apiUrl = new URL(`https://www.googleapis.com/gmail/v1/users/${userId}/messages`);
|
|
27
|
+
apiUrl.searchParams.set("q", searchQuery);
|
|
28
|
+
apiUrl.searchParams.set("maxResults", maxResults.toString());
|
|
29
|
+
// Fetch message list
|
|
30
|
+
const response = await fetch(apiUrl.toString(), {
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${accessToken}`,
|
|
33
|
+
Accept: "application/json",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const errorText = await response.text();
|
|
38
|
+
throw new Error(`Gmail API error: ${response.status} ${errorText}`);
|
|
39
|
+
}
|
|
40
|
+
const data = (await response.json());
|
|
41
|
+
const messages = data.messages || [];
|
|
42
|
+
logger.info?.(`Found ${messages.length} messages matching query`);
|
|
43
|
+
if (messages.length === 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
// Fetch full message details for each message
|
|
47
|
+
const emails = [];
|
|
48
|
+
for (const message of messages) {
|
|
49
|
+
try {
|
|
50
|
+
const email = await fetchGmailMessage(userId, message.id, accessToken);
|
|
51
|
+
if (email) {
|
|
52
|
+
emails.push(email);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMsg = error instanceof Error ? error.message : "Unknown error";
|
|
57
|
+
logger.warn?.(`Failed to fetch message ${message.id}: ${errorMsg}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return emails;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const errorMsg = error instanceof Error ? error.message : "Unknown error";
|
|
64
|
+
logger.error?.(`Gmail fetch failed: ${errorMsg}`);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Fetch a single Gmail message with full details
|
|
70
|
+
*/
|
|
71
|
+
async function fetchGmailMessage(userId, messageId, accessToken) {
|
|
72
|
+
const apiUrl = new URL(`https://www.googleapis.com/gmail/v1/users/${userId}/messages/${messageId}`);
|
|
73
|
+
apiUrl.searchParams.set("format", "full");
|
|
74
|
+
const response = await fetch(apiUrl.toString(), {
|
|
75
|
+
headers: {
|
|
76
|
+
Authorization: `Bearer ${accessToken}`,
|
|
77
|
+
Accept: "application/json",
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const message = (await response.json());
|
|
84
|
+
return parseGmailMessage(message);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse Gmail API message into EmailContent
|
|
88
|
+
*/
|
|
89
|
+
function parseGmailMessage(message) {
|
|
90
|
+
const headers = message.payload.headers || [];
|
|
91
|
+
const getHeader = (name) => {
|
|
92
|
+
const header = headers.find((h) => h.name.toLowerCase() === name.toLowerCase());
|
|
93
|
+
return header?.value || "";
|
|
94
|
+
};
|
|
95
|
+
const subject = getHeader("Subject");
|
|
96
|
+
const from = getHeader("From");
|
|
97
|
+
const to = getHeader("To");
|
|
98
|
+
const date = getHeader("Date");
|
|
99
|
+
// Extract body text
|
|
100
|
+
const body = extractMessageBody(message.payload);
|
|
101
|
+
return {
|
|
102
|
+
id: message.id,
|
|
103
|
+
subject,
|
|
104
|
+
from,
|
|
105
|
+
to,
|
|
106
|
+
date,
|
|
107
|
+
body,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Extract message body from Gmail payload
|
|
112
|
+
* Handles both plain text and HTML, traversing parts if needed
|
|
113
|
+
*/
|
|
114
|
+
function extractMessageBody(payload) {
|
|
115
|
+
// If body has data, decode it
|
|
116
|
+
if (payload.body?.data) {
|
|
117
|
+
return base64UrlDecode(payload.body.data);
|
|
118
|
+
}
|
|
119
|
+
// If there are parts, traverse them to find text content
|
|
120
|
+
if (payload.parts) {
|
|
121
|
+
for (const part of payload.parts) {
|
|
122
|
+
// Prefer plain text over HTML
|
|
123
|
+
if (part.mimeType === "text/plain" && part.body?.data) {
|
|
124
|
+
return base64UrlDecode(part.body.data);
|
|
125
|
+
}
|
|
126
|
+
if (part.mimeType === "text/html" && part.body?.data) {
|
|
127
|
+
// Strip HTML tags for plain text
|
|
128
|
+
const html = base64UrlDecode(part.body.data);
|
|
129
|
+
return html
|
|
130
|
+
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
|
|
131
|
+
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
|
|
132
|
+
.replace(/<[^>]+>/g, " ")
|
|
133
|
+
.replace(/\s+/g, " ")
|
|
134
|
+
.trim();
|
|
135
|
+
}
|
|
136
|
+
// Recurse into nested parts
|
|
137
|
+
const nestedBody = extractMessageBody(part);
|
|
138
|
+
if (nestedBody) {
|
|
139
|
+
return nestedBody;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return "";
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Decode base64url encoded string
|
|
147
|
+
*/
|
|
148
|
+
function base64UrlDecode(encoded) {
|
|
149
|
+
// Replace base64url characters with base64 standard
|
|
150
|
+
const base64 = encoded.replace(/-/g, "+").replace(/_/g, "/");
|
|
151
|
+
// Add padding if needed
|
|
152
|
+
const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, "=");
|
|
153
|
+
// Decode
|
|
154
|
+
try {
|
|
155
|
+
const binary = atob(padded);
|
|
156
|
+
const bytes = new Uint8Array(binary.length);
|
|
157
|
+
for (let i = 0; i < binary.length; i++) {
|
|
158
|
+
bytes[i] = binary.charCodeAt(i);
|
|
159
|
+
}
|
|
160
|
+
return new TextDecoder().decode(bytes);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Fallback for simple base64 without padding
|
|
164
|
+
return atob(base64);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Build Gmail search query from config
|
|
169
|
+
*/
|
|
170
|
+
function buildGmailQuery(config) {
|
|
171
|
+
const parts = [];
|
|
172
|
+
// Add keyword search
|
|
173
|
+
if (config.keywords.length > 0) {
|
|
174
|
+
const keywordQuery = config.keywords.map((k) => `"${k}"`).join(" OR ");
|
|
175
|
+
parts.push(`(${keywordQuery})`);
|
|
176
|
+
}
|
|
177
|
+
// Add sender whitelist
|
|
178
|
+
if (config.senderWhitelist.length > 0) {
|
|
179
|
+
const senderQuery = config.senderWhitelist
|
|
180
|
+
.map((s) => {
|
|
181
|
+
if (s.startsWith("@")) {
|
|
182
|
+
return `from:${s}`;
|
|
183
|
+
}
|
|
184
|
+
return `from:${s}`;
|
|
185
|
+
})
|
|
186
|
+
.join(" OR ");
|
|
187
|
+
parts.push(`(${senderQuery})`);
|
|
188
|
+
}
|
|
189
|
+
// Add time filter (emails from last 30 days)
|
|
190
|
+
parts.push("newer_than:30d");
|
|
191
|
+
return parts.join(" ");
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Parse ParsedTransaction to Transaction format for storage
|
|
195
|
+
*/
|
|
196
|
+
function parsedToStorageTransaction(parsed) {
|
|
197
|
+
return {
|
|
198
|
+
transactionId: parsed.transactionId,
|
|
199
|
+
plaidTransactionId: parsed.transactionId, // Gmail uses same field
|
|
200
|
+
accountId: parsed.accountId,
|
|
201
|
+
date: parsed.date,
|
|
202
|
+
amount: parsed.amount,
|
|
203
|
+
currency: parsed.currency,
|
|
204
|
+
category: parsed.category,
|
|
205
|
+
merchantName: parsed.merchantName,
|
|
206
|
+
paymentChannel: parsed.paymentChannel,
|
|
207
|
+
pending: parsed.pending,
|
|
208
|
+
createdAt: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Fetch bills from Gmail
|
|
213
|
+
*
|
|
214
|
+
* Main entry point for Gmail bill fetching workflow:
|
|
215
|
+
* 1. Fetch emails matching criteria
|
|
216
|
+
* 2. Recognize which emails are bills
|
|
217
|
+
* 3. Parse bill emails into transactions
|
|
218
|
+
* 4. Store transactions
|
|
219
|
+
*/
|
|
220
|
+
export async function fetchGmailBills(account, _days = 30, gmailConfig, storageConfig, logger, accessToken) {
|
|
221
|
+
if (!accessToken) {
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
accountId: account.id,
|
|
225
|
+
emailsProcessed: 0,
|
|
226
|
+
billsExtracted: 0,
|
|
227
|
+
transactionsAdded: 0,
|
|
228
|
+
transactionsUpdated: 0,
|
|
229
|
+
errors: ["No OAuth access token provided"],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
logger.info?.(`Fetching Gmail bills for account ${account.id}...`);
|
|
234
|
+
// Step 1: Fetch emails from Gmail
|
|
235
|
+
const emails = await fetchGmailEmails({
|
|
236
|
+
accessToken,
|
|
237
|
+
query: buildGmailQuery(gmailConfig),
|
|
238
|
+
maxResults: 50,
|
|
239
|
+
}, gmailConfig, logger);
|
|
240
|
+
logger.info?.(`Fetched ${emails.length} emails from Gmail`);
|
|
241
|
+
if (emails.length === 0) {
|
|
242
|
+
return {
|
|
243
|
+
success: true,
|
|
244
|
+
accountId: account.id,
|
|
245
|
+
emailsProcessed: 0,
|
|
246
|
+
billsExtracted: 0,
|
|
247
|
+
transactionsAdded: 0,
|
|
248
|
+
transactionsUpdated: 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// Step 2: Recognize bills from emails
|
|
252
|
+
const billEmails = filterToBills(emails, gmailConfig);
|
|
253
|
+
logger.info?.(`Identified ${billEmails.length} bill emails (threshold: ${gmailConfig.confidenceThreshold})`);
|
|
254
|
+
if (billEmails.length === 0) {
|
|
255
|
+
return {
|
|
256
|
+
success: true,
|
|
257
|
+
accountId: account.id,
|
|
258
|
+
emailsProcessed: emails.length,
|
|
259
|
+
billsExtracted: 0,
|
|
260
|
+
transactionsAdded: 0,
|
|
261
|
+
transactionsUpdated: 0,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Step 3: Parse bills into transactions
|
|
265
|
+
const transactions = [];
|
|
266
|
+
for (const { email, recognition } of billEmails) {
|
|
267
|
+
const parsed = parseBillToTransaction(account.id, email.id, email.subject, email.body, email.from, email.date, recognition);
|
|
268
|
+
transactions.push(parsedToStorageTransaction(parsed));
|
|
269
|
+
}
|
|
270
|
+
// Step 4: Store transactions
|
|
271
|
+
const now = new Date();
|
|
272
|
+
const storageResult = await appendTransactions(account.id, now.getFullYear(), now.getMonth() + 1, transactions, storageConfig);
|
|
273
|
+
logger.info?.(`Stored ${storageResult.added} new, ${storageResult.updated} updated transactions`);
|
|
274
|
+
return {
|
|
275
|
+
success: true,
|
|
276
|
+
accountId: account.id,
|
|
277
|
+
emailsProcessed: emails.length,
|
|
278
|
+
billsExtracted: billEmails.length,
|
|
279
|
+
transactionsAdded: storageResult.added,
|
|
280
|
+
transactionsUpdated: storageResult.updated,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
const errorMsg = error instanceof Error ? error.message : "Unknown error";
|
|
285
|
+
logger.error?.(`Gmail fetch failed: ${errorMsg}`);
|
|
286
|
+
return {
|
|
287
|
+
success: false,
|
|
288
|
+
accountId: account.id,
|
|
289
|
+
emailsProcessed: 0,
|
|
290
|
+
billsExtracted: 0,
|
|
291
|
+
transactionsAdded: 0,
|
|
292
|
+
transactionsUpdated: 0,
|
|
293
|
+
errors: [errorMsg],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Re-export types and functions from submodules
|
|
298
|
+
export * from "./bill-recognizer.js";
|
|
299
|
+
export * from "./email-parser.js";
|
|
300
|
+
//# sourceMappingURL=gmail-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-fetch.js","sourceRoot":"","sources":["../../../src/sources/gmail/gmail-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/gmail/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sources/gmail/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/plaid/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sources/plaid/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plaid data source for BillClaw - Framework-agnostic Plaid integration
|
|
3
|
+
*/
|
|
4
|
+
import { PlaidApi } from "plaid";
|
|
5
|
+
import type { StorageConfig, WebhookConfig } from "../../models/config.js";
|
|
6
|
+
import type { Transaction } from "../../storage/transaction-storage.js";
|
|
7
|
+
import type { Logger } from "../../errors/errors.js";
|
|
8
|
+
export interface PlaidConfig {
|
|
9
|
+
clientId: string;
|
|
10
|
+
secret: string;
|
|
11
|
+
environment: "sandbox" | "development" | "production";
|
|
12
|
+
}
|
|
13
|
+
export interface PlaidAccount {
|
|
14
|
+
id: string;
|
|
15
|
+
plaidAccessToken: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PlaidSyncResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
accountId: string;
|
|
20
|
+
transactionsAdded: number;
|
|
21
|
+
transactionsUpdated: number;
|
|
22
|
+
cursor: string;
|
|
23
|
+
errors?: string[];
|
|
24
|
+
requiresReauth?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create Plaid API client
|
|
28
|
+
*/
|
|
29
|
+
export declare function createPlaidClient(config: PlaidConfig): PlaidApi;
|
|
30
|
+
/**
|
|
31
|
+
* Convert Plaid transaction to internal format
|
|
32
|
+
*/
|
|
33
|
+
export declare function convertTransaction(plaidTxn: any, accountId: string): Transaction;
|
|
34
|
+
/**
|
|
35
|
+
* Sync transactions from a single Plaid account
|
|
36
|
+
*/
|
|
37
|
+
export declare function syncPlaidAccount(account: PlaidAccount, plaidClient: PlaidApi, storageConfig: StorageConfig, logger: Logger, webhooks?: WebhookConfig[]): Promise<PlaidSyncResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Sync multiple Plaid accounts
|
|
40
|
+
*/
|
|
41
|
+
export declare function syncPlaidAccounts(accounts: PlaidAccount[], plaidConfig: PlaidConfig, storageConfig: StorageConfig, logger: Logger, webhooks?: WebhookConfig[]): Promise<PlaidSyncResult[]>;
|
|
42
|
+
//# sourceMappingURL=plaid-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plaid-sync.d.ts","sourceRoot":"","sources":["../../../src/sources/plaid/plaid-sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAiB,QAAQ,EAAqB,MAAM,OAAO,CAAA;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAUpD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,CAAA;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAqB/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,GAChB,WAAW,CAcb;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,QAAQ,EACrB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,aAAa,EAAO,GAC7B,OAAO,CAAC,eAAe,CAAC,CAmJ1B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,aAAa,EAAO,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CA0B5B"}
|