@firela/billclaw-core 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/dist/billclaw.d.ts +8 -0
  3. package/dist/billclaw.d.ts.map +1 -1
  4. package/dist/billclaw.js +51 -1
  5. package/dist/billclaw.js.map +1 -1
  6. package/dist/config/config-manager.d.ts +127 -0
  7. package/dist/config/config-manager.d.ts.map +1 -0
  8. package/dist/config/config-manager.js +304 -0
  9. package/dist/config/config-manager.js.map +1 -0
  10. package/dist/config/env-loader.d.ts +33 -0
  11. package/dist/config/env-loader.d.ts.map +1 -0
  12. package/dist/config/env-loader.js +115 -0
  13. package/dist/config/env-loader.js.map +1 -0
  14. package/dist/config/index.d.ts +14 -0
  15. package/dist/config/index.d.ts.map +1 -0
  16. package/dist/config/index.js +14 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/index.d.ts +4 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +7 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/models/config.d.ts +147 -0
  23. package/dist/models/config.d.ts.map +1 -1
  24. package/dist/models/config.js +36 -0
  25. package/dist/models/config.js.map +1 -1
  26. package/dist/oauth/index.d.ts +12 -0
  27. package/dist/oauth/index.d.ts.map +1 -0
  28. package/dist/oauth/index.js +13 -0
  29. package/dist/oauth/index.js.map +1 -0
  30. package/dist/oauth/providers/gmail.d.ts +63 -0
  31. package/dist/oauth/providers/gmail.d.ts.map +1 -0
  32. package/dist/oauth/providers/gmail.js +213 -0
  33. package/dist/oauth/providers/gmail.js.map +1 -0
  34. package/dist/oauth/providers/plaid.d.ts +40 -0
  35. package/dist/oauth/providers/plaid.d.ts.map +1 -0
  36. package/dist/oauth/providers/plaid.js +90 -0
  37. package/dist/oauth/providers/plaid.js.map +1 -0
  38. package/dist/oauth/types.d.ts +102 -0
  39. package/dist/oauth/types.d.ts.map +1 -0
  40. package/dist/oauth/types.js +10 -0
  41. package/dist/oauth/types.js.map +1 -0
  42. package/dist/runtime/types.d.ts +2 -0
  43. package/dist/runtime/types.d.ts.map +1 -1
  44. package/dist/runtime/types.js.map +1 -1
  45. package/dist/storage/locking.d.ts +4 -0
  46. package/dist/storage/locking.d.ts.map +1 -1
  47. package/dist/storage/locking.js +4 -0
  48. package/dist/storage/locking.js.map +1 -1
  49. package/dist/test-fixtures.d.ts.map +1 -1
  50. package/dist/test-fixtures.js +5 -0
  51. package/dist/test-fixtures.js.map +1 -1
  52. package/dist/webhooks/deduplication.d.ts +117 -0
  53. package/dist/webhooks/deduplication.d.ts.map +1 -0
  54. package/dist/webhooks/deduplication.js +258 -0
  55. package/dist/webhooks/deduplication.js.map +1 -0
  56. package/dist/webhooks/handlers/gmail.d.ts +39 -0
  57. package/dist/webhooks/handlers/gmail.d.ts.map +1 -0
  58. package/dist/webhooks/handlers/gmail.js +56 -0
  59. package/dist/webhooks/handlers/gmail.js.map +1 -0
  60. package/dist/webhooks/handlers/gocardless.d.ts +39 -0
  61. package/dist/webhooks/handlers/gocardless.d.ts.map +1 -0
  62. package/dist/webhooks/handlers/gocardless.js +73 -0
  63. package/dist/webhooks/handlers/gocardless.js.map +1 -0
  64. package/dist/webhooks/handlers/index.d.ts +10 -0
  65. package/dist/webhooks/handlers/index.d.ts.map +1 -0
  66. package/dist/webhooks/handlers/index.js +10 -0
  67. package/dist/webhooks/handlers/index.js.map +1 -0
  68. package/dist/webhooks/handlers/plaid.d.ts +73 -0
  69. package/dist/webhooks/handlers/plaid.d.ts.map +1 -0
  70. package/dist/webhooks/handlers/plaid.js +169 -0
  71. package/dist/webhooks/handlers/plaid.js.map +1 -0
  72. package/dist/webhooks/index.d.ts +15 -0
  73. package/dist/webhooks/index.d.ts.map +1 -0
  74. package/dist/webhooks/index.js +17 -0
  75. package/dist/webhooks/index.js.map +1 -0
  76. package/dist/webhooks/processor.d.ts +76 -0
  77. package/dist/webhooks/processor.d.ts.map +1 -0
  78. package/dist/webhooks/processor.js +116 -0
  79. package/dist/webhooks/processor.js.map +1 -0
  80. package/dist/webhooks/router.d.ts +80 -0
  81. package/dist/webhooks/router.d.ts.map +1 -0
  82. package/dist/webhooks/router.js +107 -0
  83. package/dist/webhooks/router.js.map +1 -0
  84. package/dist/webhooks/security.d.ts +90 -0
  85. package/dist/webhooks/security.d.ts.map +1 -0
  86. package/dist/webhooks/security.js +138 -0
  87. package/dist/webhooks/security.js.map +1 -0
  88. package/dist/webhooks/sync-rate-limiter.d.ts +138 -0
  89. package/dist/webhooks/sync-rate-limiter.d.ts.map +1 -0
  90. package/dist/webhooks/sync-rate-limiter.js +228 -0
  91. package/dist/webhooks/sync-rate-limiter.js.map +1 -0
  92. package/dist/webhooks/types.d.ts +140 -0
  93. package/dist/webhooks/types.d.ts.map +1 -0
  94. package/dist/webhooks/types.js +18 -0
  95. package/dist/webhooks/types.js.map +1 -0
  96. package/package.json +12 -12
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 fire-la
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -10,6 +10,14 @@ import type { Transaction, SyncState } from "./storage/transaction-storage.js";
10
10
  import type { PlaidSyncResult } from "./sources/plaid/plaid-sync.js";
11
11
  import type { GmailFetchResult } from "./sources/gmail/gmail-fetch.js";
12
12
  import type { SyncResult } from "./sync/sync-service.js";
13
+ /**
14
+ * Check if an OAuth token is expired or about to expire
15
+ *
16
+ * @param expiryIso - Token expiry time as ISO string
17
+ * @param bufferSeconds - Buffer time in seconds before expiry (default: 300 = 5 minutes)
18
+ * @returns true if token is expired or will expire within buffer time
19
+ */
20
+ export declare function isTokenExpired(expiryIso: string | undefined, bufferSeconds?: number): boolean;
13
21
  /**
14
22
  * BillClaw - Main class for financial data import
15
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"billclaw.d.ts","sourceRoot":"","sources":["../src/billclaw.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAsBxD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,EAAE,cAAc;IAInC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,CAE3B;IAID;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAKnC;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC;IAKzB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO5D;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCzD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAO9C;;OAEG;IACG,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgClE;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACG,SAAS,CACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAyC9B;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GACrB,OAAO,CAAC,MAAM,CAAC;IAWlB;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GACrB,OAAO,CAAC,MAAM,CAAC;CAInB"}
1
+ {"version":3,"file":"billclaw.d.ts","sourceRoot":"","sources":["../src/billclaw.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EACV,gBAAgB,EAGjB,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAsBxD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,GAAE,MAAY,GAC1B,OAAO,CAWT;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,EAAE,cAAc;IAInC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,CAE3B;IAID;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAKnC;;OAEG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC;IAKzB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO5D;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCzD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAO9C;;OAEG;IACG,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgClE;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACG,SAAS,CACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAkF9B;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GACrB,OAAO,CAAC,MAAM,CAAC;IAWlB;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GACrB,OAAO,CAAC,MAAM,CAAC;CAInB"}
package/dist/billclaw.js CHANGED
@@ -13,6 +13,23 @@ import { syncPlaidAccounts } from "./sources/plaid/plaid-sync.js";
13
13
  import { fetchGmailBills } from "./sources/gmail/gmail-fetch.js";
14
14
  // Exporters
15
15
  import { exportStorageToBeancount, exportStorageToLedger, } from "./exporters/index.js";
16
+ /**
17
+ * Check if an OAuth token is expired or about to expire
18
+ *
19
+ * @param expiryIso - Token expiry time as ISO string
20
+ * @param bufferSeconds - Buffer time in seconds before expiry (default: 300 = 5 minutes)
21
+ * @returns true if token is expired or will expire within buffer time
22
+ */
23
+ export function isTokenExpired(expiryIso, bufferSeconds = 300) {
24
+ if (!expiryIso) {
25
+ // No expiry time means token doesn't expire
26
+ return false;
27
+ }
28
+ const expiryTime = new Date(expiryIso).getTime();
29
+ const now = Date.now();
30
+ const bufferMs = bufferSeconds * 1000;
31
+ return now >= expiryTime - bufferMs;
32
+ }
16
33
  /**
17
34
  * BillClaw - Main class for financial data import
18
35
  */
@@ -167,7 +184,40 @@ export class Billclaw {
167
184
  }
168
185
  const results = [];
169
186
  for (const account of accounts) {
170
- const result = await fetchGmailBills(account, days, gmailConfig, storageConfig, this.logger);
187
+ // Get access token from account config
188
+ const accountConfig = config.accounts.find((a) => a.id === account.id);
189
+ const accessToken = accountConfig?.gmailAccessToken;
190
+ const tokenExpiry = accountConfig?.gmailTokenExpiry;
191
+ if (!accessToken) {
192
+ this.logger.warn?.(`No access token found for Gmail account ${account.id}. Please run OAuth setup first.`);
193
+ results.push({
194
+ accountId: account.id,
195
+ success: false,
196
+ emailsProcessed: 0,
197
+ billsExtracted: 0,
198
+ transactionsAdded: 0,
199
+ transactionsUpdated: 0,
200
+ errors: ["No OAuth access token found. Please run OAuth setup first."],
201
+ });
202
+ continue;
203
+ }
204
+ // Check if token is expired (with 5 minute buffer)
205
+ if (isTokenExpired(tokenExpiry, 300)) {
206
+ this.logger.warn?.(`Access token expired for Gmail account ${account.id}. Please refresh the token.`);
207
+ results.push({
208
+ accountId: account.id,
209
+ success: false,
210
+ emailsProcessed: 0,
211
+ billsExtracted: 0,
212
+ transactionsAdded: 0,
213
+ transactionsUpdated: 0,
214
+ errors: [
215
+ "Access token expired. Please refresh the token using OAuth refresh flow.",
216
+ ],
217
+ });
218
+ continue;
219
+ }
220
+ const result = await fetchGmailBills(account, days, gmailConfig, storageConfig, this.logger, accessToken);
171
221
  results.push(result);
172
222
  }
173
223
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"billclaw.js","sourceRoot":"","sources":["../src/billclaw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billclaw.js","sourceRoot":"","sources":["../src/billclaw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Unified configuration manager for BillClaw
3
+ *
4
+ * Provides thread-safe configuration management with:
5
+ * - Singleton pattern
6
+ * - File locking for concurrent access
7
+ * - Hybrid caching (TTL + mtime validation)
8
+ * - Environment variable overrides
9
+ * - Schema validation
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import type { Logger } from "../errors/errors.js";
14
+ import { type BillclawConfig } from "../models/config.js";
15
+ import type { ConfigProvider, StorageConfig } from "../runtime/types.js";
16
+ /**
17
+ * ConfigManager options
18
+ */
19
+ export interface ConfigManagerOptions {
20
+ /**
21
+ * Config file path (defaults to ~/.billclaw/config.json)
22
+ */
23
+ configPath?: string;
24
+ /**
25
+ * Cache TTL in milliseconds (defaults to 5 minutes)
26
+ */
27
+ cacheTtl?: number;
28
+ /**
29
+ * Logger for debug output
30
+ */
31
+ logger?: Logger;
32
+ /**
33
+ * Whether to enable environment variable overrides
34
+ */
35
+ enableEnvOverrides?: boolean;
36
+ }
37
+ /**
38
+ * Unified configuration manager
39
+ *
40
+ * Implements the ConfigProvider interface with additional functionality
41
+ * for environment variable overrides and cache management.
42
+ */
43
+ export declare class ConfigManager implements ConfigProvider {
44
+ private static instance;
45
+ private configPath;
46
+ private cache;
47
+ private cacheKey;
48
+ private cacheTtl;
49
+ private logger?;
50
+ private enableEnvOverrides;
51
+ private constructor();
52
+ /**
53
+ * Get the singleton ConfigManager instance
54
+ *
55
+ * @param options - Options (only applied on first call)
56
+ * @returns The singleton instance
57
+ */
58
+ static getInstance(options?: ConfigManagerOptions): ConfigManager;
59
+ /**
60
+ * Reset the singleton instance (primarily for testing)
61
+ */
62
+ static resetInstance(): void;
63
+ /**
64
+ * Get the full configuration
65
+ *
66
+ * Implements ConfigProvider interface with caching and mtime validation.
67
+ */
68
+ getConfig(): Promise<BillclawConfig>;
69
+ /**
70
+ * Get effective configuration with environment variable overrides
71
+ *
72
+ * Returns config with env vars merged in (env vars take precedence).
73
+ */
74
+ getEffectiveConfig(): Promise<BillclawConfig>;
75
+ /**
76
+ * Get storage configuration
77
+ */
78
+ getStorageConfig(): Promise<StorageConfig>;
79
+ /**
80
+ * Update an account configuration
81
+ */
82
+ updateAccount(accountId: string, updates: Partial<any>): Promise<void>;
83
+ /**
84
+ * Get an account by ID
85
+ */
86
+ getAccount(accountId: string): Promise<any | null>;
87
+ /**
88
+ * Update configuration
89
+ *
90
+ * Merges updates with existing config and saves atomically with file locking.
91
+ */
92
+ updateConfig(updates: Partial<BillclawConfig>): Promise<void>;
93
+ /**
94
+ * Get service-specific configuration
95
+ *
96
+ * @param service - Service name ('plaid' | 'gmail' | 'connect')
97
+ * @returns Service configuration with env overrides applied
98
+ */
99
+ getServiceConfig(service: "plaid" | "gmail" | "connect"): Promise<any>;
100
+ /**
101
+ * Force reload configuration from disk
102
+ *
103
+ * Invalidates cache and reloads from file.
104
+ */
105
+ reloadConfig(): Promise<void>;
106
+ /**
107
+ * Load configuration from file with validation
108
+ *
109
+ * Creates default config if file doesn't exist.
110
+ */
111
+ private loadConfigFromFile;
112
+ /**
113
+ * Save configuration to file atomically with file locking
114
+ */
115
+ private saveConfig;
116
+ /**
117
+ * Get default configuration
118
+ */
119
+ private getDefaultConfig;
120
+ /**
121
+ * Deep merge two objects
122
+ *
123
+ * Source values override base values.
124
+ */
125
+ private deepMerge;
126
+ }
127
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAkBD;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IAEtC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,kBAAkB,CAAS;IAEnC,OAAO;IAiBP;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa;IAOjE;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IA6B1C;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC;IAkCnD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAKhD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5E;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAKxD;;;;OAIG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GACrC,OAAO,CAAC,GAAG,CAAC;IAYf;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC;;;;OAIG;YACW,kBAAkB;IAwBhC;;OAEG;YACW,UAAU;IA+BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;;OAIG;IACH,OAAO,CAAC,SAAS;CAqBlB"}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Unified configuration manager for BillClaw
3
+ *
4
+ * Provides thread-safe configuration management with:
5
+ * - Singleton pattern
6
+ * - File locking for concurrent access
7
+ * - Hybrid caching (TTL + mtime validation)
8
+ * - Environment variable overrides
9
+ * - Schema validation
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import * as fs from "node:fs/promises";
14
+ import * as path from "node:path";
15
+ import * as os from "node:os";
16
+ import { z } from "zod";
17
+ import { BillclawConfigSchema } from "../models/config.js";
18
+ import { withLock } from "../storage/locking.js";
19
+ import { MemoryCache } from "../storage/cache.js";
20
+ import { loadEnvOverrides } from "./env-loader.js";
21
+ /**
22
+ * Default config path
23
+ */
24
+ function getDefaultConfigPath() {
25
+ return path.join(os.homedir(), ".billclaw", "config.json");
26
+ }
27
+ /**
28
+ * Unified configuration manager
29
+ *
30
+ * Implements the ConfigProvider interface with additional functionality
31
+ * for environment variable overrides and cache management.
32
+ */
33
+ export class ConfigManager {
34
+ static instance;
35
+ configPath;
36
+ cache;
37
+ cacheKey;
38
+ cacheTtl;
39
+ logger;
40
+ enableEnvOverrides;
41
+ constructor(options = {}) {
42
+ this.configPath = options.configPath ?? getDefaultConfigPath();
43
+ this.cacheTtl = options.cacheTtl ?? 5 * 60 * 1000; // 5 minutes
44
+ this.logger = options.logger;
45
+ this.enableEnvOverrides = options.enableEnvOverrides ?? true;
46
+ // Create cache with configured TTL
47
+ this.cache = new MemoryCache({
48
+ defaultTtl: this.cacheTtl,
49
+ maxSize: 100,
50
+ logger: this.logger,
51
+ });
52
+ // Use config file path as cache key
53
+ this.cacheKey = `config:${this.configPath}`;
54
+ }
55
+ /**
56
+ * Get the singleton ConfigManager instance
57
+ *
58
+ * @param options - Options (only applied on first call)
59
+ * @returns The singleton instance
60
+ */
61
+ static getInstance(options) {
62
+ if (!ConfigManager.instance) {
63
+ ConfigManager.instance = new ConfigManager(options);
64
+ }
65
+ return ConfigManager.instance;
66
+ }
67
+ /**
68
+ * Reset the singleton instance (primarily for testing)
69
+ */
70
+ static resetInstance() {
71
+ if (ConfigManager.instance) {
72
+ ConfigManager.instance["cache"]?.destroy();
73
+ ConfigManager.instance = undefined;
74
+ }
75
+ }
76
+ /**
77
+ * Get the full configuration
78
+ *
79
+ * Implements ConfigProvider interface with caching and mtime validation.
80
+ */
81
+ async getConfig() {
82
+ const cached = this.cache.get(this.cacheKey);
83
+ // Get current file mtime
84
+ let currentMtime = 0;
85
+ try {
86
+ const stats = await fs.stat(this.configPath);
87
+ currentMtime = stats.mtimeMs;
88
+ }
89
+ catch {
90
+ // File doesn't exist yet, will use default config
91
+ }
92
+ // Check if cache is valid (mtime matches)
93
+ if (cached && cached.mtime === currentMtime) {
94
+ this.logger?.debug("ConfigManager: using cached config");
95
+ return cached.config;
96
+ }
97
+ // Cache miss or invalidated, reload from file
98
+ this.logger?.debug("ConfigManager: reloading config from file");
99
+ const config = await this.loadConfigFromFile();
100
+ const envOverrides = this.enableEnvOverrides ? loadEnvOverrides() : {};
101
+ // Update cache with mtime
102
+ this.cache.set(this.cacheKey, { config, mtime: currentMtime, envOverrides }, this.cacheTtl);
103
+ return config;
104
+ }
105
+ /**
106
+ * Get effective configuration with environment variable overrides
107
+ *
108
+ * Returns config with env vars merged in (env vars take precedence).
109
+ */
110
+ async getEffectiveConfig() {
111
+ const cached = this.cache.get(this.cacheKey);
112
+ // Get current file mtime
113
+ let currentMtime = 0;
114
+ try {
115
+ const stats = await fs.stat(this.configPath);
116
+ currentMtime = stats.mtimeMs;
117
+ }
118
+ catch {
119
+ // File doesn't exist yet
120
+ }
121
+ // Check if cache is valid
122
+ if (cached && cached.mtime === currentMtime) {
123
+ // Merge env overrides
124
+ if (this.enableEnvOverrides && Object.keys(cached.envOverrides).length > 0) {
125
+ return this.deepMerge(cached.config, cached.envOverrides);
126
+ }
127
+ return cached.config;
128
+ }
129
+ // Reload
130
+ const config = await this.loadConfigFromFile();
131
+ const envOverrides = this.enableEnvOverrides ? loadEnvOverrides() : {};
132
+ this.cache.set(this.cacheKey, { config, mtime: currentMtime, envOverrides }, this.cacheTtl);
133
+ // Return merged config
134
+ if (Object.keys(envOverrides).length > 0) {
135
+ return this.deepMerge(config, envOverrides);
136
+ }
137
+ return config;
138
+ }
139
+ /**
140
+ * Get storage configuration
141
+ */
142
+ async getStorageConfig() {
143
+ const config = await this.getConfig();
144
+ return config.storage;
145
+ }
146
+ /**
147
+ * Update an account configuration
148
+ */
149
+ async updateAccount(accountId, updates) {
150
+ const config = await this.getConfig();
151
+ const accountIndex = config.accounts.findIndex((a) => a.id === accountId);
152
+ if (accountIndex === -1) {
153
+ throw new Error(`Account ${accountId} not found`);
154
+ }
155
+ config.accounts[accountIndex] = {
156
+ ...config.accounts[accountIndex],
157
+ ...updates,
158
+ };
159
+ await this.saveConfig(config);
160
+ }
161
+ /**
162
+ * Get an account by ID
163
+ */
164
+ async getAccount(accountId) {
165
+ const config = await this.getConfig();
166
+ return config.accounts.find((a) => a.id === accountId) || null;
167
+ }
168
+ /**
169
+ * Update configuration
170
+ *
171
+ * Merges updates with existing config and saves atomically with file locking.
172
+ */
173
+ async updateConfig(updates) {
174
+ const config = await this.getConfig();
175
+ const merged = this.deepMerge(config, updates);
176
+ await this.saveConfig(merged);
177
+ }
178
+ /**
179
+ * Get service-specific configuration
180
+ *
181
+ * @param service - Service name ('plaid' | 'gmail' | 'connect')
182
+ * @returns Service configuration with env overrides applied
183
+ */
184
+ async getServiceConfig(service) {
185
+ const effectiveConfig = await this.getEffectiveConfig();
186
+ const serviceConfig = effectiveConfig[service];
187
+ // For optional services, provide empty object if not configured
188
+ if (serviceConfig === undefined) {
189
+ return {};
190
+ }
191
+ return serviceConfig;
192
+ }
193
+ /**
194
+ * Force reload configuration from disk
195
+ *
196
+ * Invalidates cache and reloads from file.
197
+ */
198
+ async reloadConfig() {
199
+ this.cache.delete(this.cacheKey);
200
+ await this.getConfig();
201
+ }
202
+ /**
203
+ * Load configuration from file with validation
204
+ *
205
+ * Creates default config if file doesn't exist.
206
+ */
207
+ async loadConfigFromFile() {
208
+ try {
209
+ const content = await fs.readFile(this.configPath, "utf-8");
210
+ const parsed = JSON.parse(content);
211
+ // Validate with Zod schema
212
+ const validated = BillclawConfigSchema.parse(parsed);
213
+ return validated;
214
+ }
215
+ catch (error) {
216
+ if (error.code === "ENOENT") {
217
+ // File doesn't exist, return default config
218
+ this.logger?.info("Config file not found, using defaults");
219
+ return this.getDefaultConfig();
220
+ }
221
+ if (error instanceof z.ZodError) {
222
+ this.logger?.error("Config validation failed:", error.errors);
223
+ throw new Error(`Invalid configuration: ${error.errors.map((e) => e.message).join(", ")}`);
224
+ }
225
+ throw error;
226
+ }
227
+ }
228
+ /**
229
+ * Save configuration to file atomically with file locking
230
+ */
231
+ async saveConfig(config) {
232
+ const configDir = path.dirname(this.configPath);
233
+ // Ensure config directory exists
234
+ await fs.mkdir(configDir, { recursive: true });
235
+ // Ensure config file exists (required by proper-lockfile)
236
+ try {
237
+ await fs.access(this.configPath);
238
+ }
239
+ catch {
240
+ // File doesn't exist, create empty file
241
+ await fs.writeFile(this.configPath, JSON.stringify({}, null, 2), "utf-8");
242
+ }
243
+ await withLock(this.configPath, async () => {
244
+ // Atomic write: temp file + rename
245
+ const tmpPath = `${this.configPath}.tmp`;
246
+ await fs.writeFile(tmpPath, JSON.stringify(config, null, 2), "utf-8");
247
+ await fs.rename(tmpPath, this.configPath);
248
+ // Invalidate cache
249
+ this.cache.delete(this.cacheKey);
250
+ this.logger?.info(`Configuration saved to ${this.configPath}`);
251
+ }, { logger: this.logger });
252
+ }
253
+ /**
254
+ * Get default configuration
255
+ */
256
+ getDefaultConfig() {
257
+ return BillclawConfigSchema.parse({
258
+ version: 1,
259
+ connect: {
260
+ port: 4456,
261
+ host: "localhost",
262
+ },
263
+ plaid: {
264
+ environment: "sandbox",
265
+ },
266
+ storage: {
267
+ path: path.join(os.homedir(), ".billclaw"),
268
+ format: "json",
269
+ encryption: { enabled: false },
270
+ },
271
+ sync: {
272
+ defaultFrequency: "daily",
273
+ retryOnFailure: true,
274
+ maxRetries: 3,
275
+ },
276
+ accounts: [],
277
+ webhooks: [],
278
+ });
279
+ }
280
+ /**
281
+ * Deep merge two objects
282
+ *
283
+ * Source values override base values.
284
+ */
285
+ deepMerge(base, source) {
286
+ const result = { ...base };
287
+ for (const key of Object.keys(source)) {
288
+ if (source[key] !== null &&
289
+ typeof source[key] === "object" &&
290
+ !Array.isArray(source[key]) &&
291
+ key in result &&
292
+ result[key] !== null &&
293
+ typeof result[key] === "object" &&
294
+ !Array.isArray(result[key])) {
295
+ result[key] = this.deepMerge(result[key], source[key]);
296
+ }
297
+ else {
298
+ result[key] = source[key];
299
+ }
300
+ }
301
+ return result;
302
+ }
303
+ }
304
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Environment variable loader for BillClaw configuration
3
+ *
4
+ * Maps environment variables to configuration paths with type conversion.
5
+ */
6
+ /**
7
+ * Get configuration overrides from environment variables
8
+ *
9
+ * Returns a partial config object with values from environment variables.
10
+ * These values take precedence over config file values.
11
+ */
12
+ export declare function loadEnvOverrides(): Record<string, unknown>;
13
+ /**
14
+ * Get a specific environment variable value with type conversion
15
+ *
16
+ * @param envVar - Environment variable name
17
+ * @param configPath - Config path for type inference
18
+ * @returns The converted value or undefined if not set
19
+ */
20
+ export declare function getEnvValue(envVar: string, configPath?: string): unknown | undefined;
21
+ /**
22
+ * Check if any BillClaw-related environment variables are set
23
+ *
24
+ * Useful for determining if env var overrides are active.
25
+ */
26
+ export declare function hasEnvOverrides(): boolean;
27
+ /**
28
+ * Get all environment variable mappings
29
+ *
30
+ * Returns the mapping of env var names to config paths.
31
+ */
32
+ export declare function getEnvMappings(): Record<string, string>;
33
+ //# sourceMappingURL=env-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.d.ts","sourceRoot":"","sources":["../../src/config/env-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuDH;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwB1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,GAAG,SAAS,CAMrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvD"}