brains-mcp 1.61.2

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 (350) hide show
  1. package/README.md +95 -0
  2. package/dist/access/projectShares.d.ts +48 -0
  3. package/dist/access/projectShares.d.ts.map +1 -0
  4. package/dist/access/projectShares.js +203 -0
  5. package/dist/access/projectShares.js.map +1 -0
  6. package/dist/access/sharedInstructionsNote.d.ts +37 -0
  7. package/dist/access/sharedInstructionsNote.d.ts.map +1 -0
  8. package/dist/access/sharedInstructionsNote.js +76 -0
  9. package/dist/access/sharedInstructionsNote.js.map +1 -0
  10. package/dist/admin/seedUsers.d.ts +23 -0
  11. package/dist/admin/seedUsers.d.ts.map +1 -0
  12. package/dist/admin/seedUsers.js +168 -0
  13. package/dist/admin/seedUsers.js.map +1 -0
  14. package/dist/api/openapi.d.ts +2 -0
  15. package/dist/api/openapi.d.ts.map +1 -0
  16. package/dist/api/openapi.js +942 -0
  17. package/dist/api/openapi.js.map +1 -0
  18. package/dist/auth/clientStore.d.ts +43 -0
  19. package/dist/auth/clientStore.d.ts.map +1 -0
  20. package/dist/auth/clientStore.js +168 -0
  21. package/dist/auth/clientStore.js.map +1 -0
  22. package/dist/auth/deleteAccount.d.ts +34 -0
  23. package/dist/auth/deleteAccount.d.ts.map +1 -0
  24. package/dist/auth/deleteAccount.js +203 -0
  25. package/dist/auth/deleteAccount.js.map +1 -0
  26. package/dist/auth/oauth.d.ts +118 -0
  27. package/dist/auth/oauth.d.ts.map +1 -0
  28. package/dist/auth/oauth.js +491 -0
  29. package/dist/auth/oauth.js.map +1 -0
  30. package/dist/auth/patStore.d.ts +87 -0
  31. package/dist/auth/patStore.d.ts.map +1 -0
  32. package/dist/auth/patStore.js +308 -0
  33. package/dist/auth/patStore.js.map +1 -0
  34. package/dist/auth/supabase.d.ts +15 -0
  35. package/dist/auth/supabase.d.ts.map +1 -0
  36. package/dist/auth/supabase.js +66 -0
  37. package/dist/auth/supabase.js.map +1 -0
  38. package/dist/auth/tokenStore.d.ts +73 -0
  39. package/dist/auth/tokenStore.d.ts.map +1 -0
  40. package/dist/auth/tokenStore.js +261 -0
  41. package/dist/auth/tokenStore.js.map +1 -0
  42. package/dist/backup/drive.d.ts +24 -0
  43. package/dist/backup/drive.d.ts.map +1 -0
  44. package/dist/backup/drive.js +70 -0
  45. package/dist/backup/drive.js.map +1 -0
  46. package/dist/billing/tierStore.d.ts +59 -0
  47. package/dist/billing/tierStore.d.ts.map +1 -0
  48. package/dist/billing/tierStore.js +152 -0
  49. package/dist/billing/tierStore.js.map +1 -0
  50. package/dist/digest/activityDigest.d.ts +32 -0
  51. package/dist/digest/activityDigest.d.ts.map +1 -0
  52. package/dist/digest/activityDigest.js +299 -0
  53. package/dist/digest/activityDigest.js.map +1 -0
  54. package/dist/digest/digestCron.d.ts +40 -0
  55. package/dist/digest/digestCron.d.ts.map +1 -0
  56. package/dist/digest/digestCron.js +146 -0
  57. package/dist/digest/digestCron.js.map +1 -0
  58. package/dist/digest/digestPreferences.d.ts +25 -0
  59. package/dist/digest/digestPreferences.d.ts.map +1 -0
  60. package/dist/digest/digestPreferences.js +79 -0
  61. package/dist/digest/digestPreferences.js.map +1 -0
  62. package/dist/digest/emailSender.d.ts +20 -0
  63. package/dist/digest/emailSender.d.ts.map +1 -0
  64. package/dist/digest/emailSender.js +35 -0
  65. package/dist/digest/emailSender.js.map +1 -0
  66. package/dist/drive/client.d.ts +43 -0
  67. package/dist/drive/client.d.ts.map +1 -0
  68. package/dist/drive/client.js +282 -0
  69. package/dist/drive/client.js.map +1 -0
  70. package/dist/drive/errors.d.ts +27 -0
  71. package/dist/drive/errors.d.ts.map +1 -0
  72. package/dist/drive/errors.js +51 -0
  73. package/dist/drive/errors.js.map +1 -0
  74. package/dist/drive/fileCache.d.ts +22 -0
  75. package/dist/drive/fileCache.d.ts.map +1 -0
  76. package/dist/drive/fileCache.js +57 -0
  77. package/dist/drive/fileCache.js.map +1 -0
  78. package/dist/governance/accessControl.d.ts +87 -0
  79. package/dist/governance/accessControl.d.ts.map +1 -0
  80. package/dist/governance/accessControl.js +179 -0
  81. package/dist/governance/accessControl.js.map +1 -0
  82. package/dist/html/components.d.ts +8 -0
  83. package/dist/html/components.d.ts.map +1 -0
  84. package/dist/html/components.js +19 -0
  85. package/dist/html/components.js.map +1 -0
  86. package/dist/html/layout.d.ts +7 -0
  87. package/dist/html/layout.d.ts.map +1 -0
  88. package/dist/html/layout.js +24 -0
  89. package/dist/html/layout.js.map +1 -0
  90. package/dist/html/metricsUi.d.ts +8 -0
  91. package/dist/html/metricsUi.d.ts.map +1 -0
  92. package/dist/html/metricsUi.js +271 -0
  93. package/dist/html/metricsUi.js.map +1 -0
  94. package/dist/httpServer.d.ts +19 -0
  95. package/dist/httpServer.d.ts.map +1 -0
  96. package/dist/httpServer.js +3913 -0
  97. package/dist/httpServer.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +40 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/jobs/asyncJobRegistry.d.ts +30 -0
  103. package/dist/jobs/asyncJobRegistry.d.ts.map +1 -0
  104. package/dist/jobs/asyncJobRegistry.js +70 -0
  105. package/dist/jobs/asyncJobRegistry.js.map +1 -0
  106. package/dist/observability/metricsQuery.d.ts +41 -0
  107. package/dist/observability/metricsQuery.d.ts.map +1 -0
  108. package/dist/observability/metricsQuery.js +106 -0
  109. package/dist/observability/metricsQuery.js.map +1 -0
  110. package/dist/observability/relevanceSignal.d.ts +26 -0
  111. package/dist/observability/relevanceSignal.d.ts.map +1 -0
  112. package/dist/observability/relevanceSignal.js +95 -0
  113. package/dist/observability/relevanceSignal.js.map +1 -0
  114. package/dist/observability/requestEvents.d.ts +31 -0
  115. package/dist/observability/requestEvents.d.ts.map +1 -0
  116. package/dist/observability/requestEvents.js +54 -0
  117. package/dist/observability/requestEvents.js.map +1 -0
  118. package/dist/observability/slowQueryAlert.d.ts +25 -0
  119. package/dist/observability/slowQueryAlert.d.ts.map +1 -0
  120. package/dist/observability/slowQueryAlert.js +67 -0
  121. package/dist/observability/slowQueryAlert.js.map +1 -0
  122. package/dist/observability/zeroResultTriage.d.ts +22 -0
  123. package/dist/observability/zeroResultTriage.d.ts.map +1 -0
  124. package/dist/observability/zeroResultTriage.js +116 -0
  125. package/dist/observability/zeroResultTriage.js.map +1 -0
  126. package/dist/search/embeddings.d.ts +31 -0
  127. package/dist/search/embeddings.d.ts.map +1 -0
  128. package/dist/search/embeddings.js +91 -0
  129. package/dist/search/embeddings.js.map +1 -0
  130. package/dist/search/fileWatcher.d.ts +28 -0
  131. package/dist/search/fileWatcher.d.ts.map +1 -0
  132. package/dist/search/fileWatcher.js +103 -0
  133. package/dist/search/fileWatcher.js.map +1 -0
  134. package/dist/search/hotQueryCache.d.ts +31 -0
  135. package/dist/search/hotQueryCache.d.ts.map +1 -0
  136. package/dist/search/hotQueryCache.js +103 -0
  137. package/dist/search/hotQueryCache.js.map +1 -0
  138. package/dist/search/postgresIndex.d.ts +439 -0
  139. package/dist/search/postgresIndex.d.ts.map +1 -0
  140. package/dist/search/postgresIndex.js +1610 -0
  141. package/dist/search/postgresIndex.js.map +1 -0
  142. package/dist/search/sqliteIndex.d.ts +66 -0
  143. package/dist/search/sqliteIndex.d.ts.map +1 -0
  144. package/dist/search/sqliteIndex.js +342 -0
  145. package/dist/search/sqliteIndex.js.map +1 -0
  146. package/dist/server.d.ts +43 -0
  147. package/dist/server.d.ts.map +1 -0
  148. package/dist/server.js +532 -0
  149. package/dist/server.js.map +1 -0
  150. package/dist/session/bundle.d.ts +53 -0
  151. package/dist/session/bundle.d.ts.map +1 -0
  152. package/dist/session/bundle.js +97 -0
  153. package/dist/session/bundle.js.map +1 -0
  154. package/dist/storage/client.d.ts +157 -0
  155. package/dist/storage/client.d.ts.map +1 -0
  156. package/dist/storage/client.js +825 -0
  157. package/dist/storage/client.js.map +1 -0
  158. package/dist/tools/addWebhookPattern.d.ts +15 -0
  159. package/dist/tools/addWebhookPattern.d.ts.map +1 -0
  160. package/dist/tools/addWebhookPattern.js +15 -0
  161. package/dist/tools/addWebhookPattern.js.map +1 -0
  162. package/dist/tools/appendLog.d.ts +18 -0
  163. package/dist/tools/appendLog.d.ts.map +1 -0
  164. package/dist/tools/appendLog.js +18 -0
  165. package/dist/tools/appendLog.js.map +1 -0
  166. package/dist/tools/auditIndex.d.ts +15 -0
  167. package/dist/tools/auditIndex.d.ts.map +1 -0
  168. package/dist/tools/auditIndex.js +165 -0
  169. package/dist/tools/auditIndex.js.map +1 -0
  170. package/dist/tools/batchDeletePages.d.ts +18 -0
  171. package/dist/tools/batchDeletePages.d.ts.map +1 -0
  172. package/dist/tools/batchDeletePages.js +143 -0
  173. package/dist/tools/batchDeletePages.js.map +1 -0
  174. package/dist/tools/coerce.d.ts +3 -0
  175. package/dist/tools/coerce.d.ts.map +1 -0
  176. package/dist/tools/coerce.js +12 -0
  177. package/dist/tools/coerce.js.map +1 -0
  178. package/dist/tools/createPage.d.ts +24 -0
  179. package/dist/tools/createPage.d.ts.map +1 -0
  180. package/dist/tools/createPage.js +99 -0
  181. package/dist/tools/createPage.js.map +1 -0
  182. package/dist/tools/createPages.d.ts +51 -0
  183. package/dist/tools/createPages.d.ts.map +1 -0
  184. package/dist/tools/createPages.js +91 -0
  185. package/dist/tools/createPages.js.map +1 -0
  186. package/dist/tools/deletePage.d.ts +19 -0
  187. package/dist/tools/deletePage.d.ts.map +1 -0
  188. package/dist/tools/deletePage.js +127 -0
  189. package/dist/tools/deletePage.js.map +1 -0
  190. package/dist/tools/exportWiki.d.ts +48 -0
  191. package/dist/tools/exportWiki.d.ts.map +1 -0
  192. package/dist/tools/exportWiki.js +233 -0
  193. package/dist/tools/exportWiki.js.map +1 -0
  194. package/dist/tools/extractLinks.d.ts +14 -0
  195. package/dist/tools/extractLinks.d.ts.map +1 -0
  196. package/dist/tools/extractLinks.js +25 -0
  197. package/dist/tools/extractLinks.js.map +1 -0
  198. package/dist/tools/generateClaudeInstructions.d.ts +27 -0
  199. package/dist/tools/generateClaudeInstructions.d.ts.map +1 -0
  200. package/dist/tools/generateClaudeInstructions.js +263 -0
  201. package/dist/tools/generateClaudeInstructions.js.map +1 -0
  202. package/dist/tools/generateGptInstructions.d.ts +27 -0
  203. package/dist/tools/generateGptInstructions.d.ts.map +1 -0
  204. package/dist/tools/generateGptInstructions.js +208 -0
  205. package/dist/tools/generateGptInstructions.js.map +1 -0
  206. package/dist/tools/getBacklinks.d.ts +12 -0
  207. package/dist/tools/getBacklinks.d.ts.map +1 -0
  208. package/dist/tools/getBacklinks.js +13 -0
  209. package/dist/tools/getBacklinks.js.map +1 -0
  210. package/dist/tools/getRelated.d.ts +12 -0
  211. package/dist/tools/getRelated.d.ts.map +1 -0
  212. package/dist/tools/getRelated.js +13 -0
  213. package/dist/tools/getRelated.js.map +1 -0
  214. package/dist/tools/healthCheck.d.ts +5 -0
  215. package/dist/tools/healthCheck.d.ts.map +1 -0
  216. package/dist/tools/healthCheck.js +167 -0
  217. package/dist/tools/healthCheck.js.map +1 -0
  218. package/dist/tools/importBrainSource.d.ts +36 -0
  219. package/dist/tools/importBrainSource.d.ts.map +1 -0
  220. package/dist/tools/importBrainSource.js +314 -0
  221. package/dist/tools/importBrainSource.js.map +1 -0
  222. package/dist/tools/importWikiZip.d.ts +60 -0
  223. package/dist/tools/importWikiZip.d.ts.map +1 -0
  224. package/dist/tools/importWikiZip.js +379 -0
  225. package/dist/tools/importWikiZip.js.map +1 -0
  226. package/dist/tools/initProject.d.ts +34 -0
  227. package/dist/tools/initProject.d.ts.map +1 -0
  228. package/dist/tools/initProject.js +443 -0
  229. package/dist/tools/initProject.js.map +1 -0
  230. package/dist/tools/instructionContext.d.ts +60 -0
  231. package/dist/tools/instructionContext.d.ts.map +1 -0
  232. package/dist/tools/instructionContext.js +210 -0
  233. package/dist/tools/instructionContext.js.map +1 -0
  234. package/dist/tools/listArchivedPages.d.ts +17 -0
  235. package/dist/tools/listArchivedPages.d.ts.map +1 -0
  236. package/dist/tools/listArchivedPages.js +51 -0
  237. package/dist/tools/listArchivedPages.js.map +1 -0
  238. package/dist/tools/listPages.d.ts +28 -0
  239. package/dist/tools/listPages.d.ts.map +1 -0
  240. package/dist/tools/listPages.js +166 -0
  241. package/dist/tools/listPages.js.map +1 -0
  242. package/dist/tools/listWebhooks.d.ts +7 -0
  243. package/dist/tools/listWebhooks.d.ts.map +1 -0
  244. package/dist/tools/listWebhooks.js +10 -0
  245. package/dist/tools/listWebhooks.js.map +1 -0
  246. package/dist/tools/movePage.d.ts +18 -0
  247. package/dist/tools/movePage.d.ts.map +1 -0
  248. package/dist/tools/movePage.js +182 -0
  249. package/dist/tools/movePage.js.map +1 -0
  250. package/dist/tools/pageHistory.d.ts +36 -0
  251. package/dist/tools/pageHistory.d.ts.map +1 -0
  252. package/dist/tools/pageHistory.js +60 -0
  253. package/dist/tools/pageHistory.js.map +1 -0
  254. package/dist/tools/patchPage.d.ts +141 -0
  255. package/dist/tools/patchPage.d.ts.map +1 -0
  256. package/dist/tools/patchPage.js +287 -0
  257. package/dist/tools/patchPage.js.map +1 -0
  258. package/dist/tools/pullSessionBundle.d.ts +34 -0
  259. package/dist/tools/pullSessionBundle.d.ts.map +1 -0
  260. package/dist/tools/pullSessionBundle.js +432 -0
  261. package/dist/tools/pullSessionBundle.js.map +1 -0
  262. package/dist/tools/purgeWiki.d.ts +23 -0
  263. package/dist/tools/purgeWiki.d.ts.map +1 -0
  264. package/dist/tools/purgeWiki.js +113 -0
  265. package/dist/tools/purgeWiki.js.map +1 -0
  266. package/dist/tools/pushSessionBundle.d.ts +139 -0
  267. package/dist/tools/pushSessionBundle.d.ts.map +1 -0
  268. package/dist/tools/pushSessionBundle.js +282 -0
  269. package/dist/tools/pushSessionBundle.js.map +1 -0
  270. package/dist/tools/readGovernanceAudit.d.ts +17 -0
  271. package/dist/tools/readGovernanceAudit.d.ts.map +1 -0
  272. package/dist/tools/readGovernanceAudit.js +21 -0
  273. package/dist/tools/readGovernanceAudit.js.map +1 -0
  274. package/dist/tools/readPage.d.ts +13 -0
  275. package/dist/tools/readPage.d.ts.map +1 -0
  276. package/dist/tools/readPage.js +46 -0
  277. package/dist/tools/readPage.js.map +1 -0
  278. package/dist/tools/removeWebhook.d.ts +14 -0
  279. package/dist/tools/removeWebhook.d.ts.map +1 -0
  280. package/dist/tools/removeWebhook.js +12 -0
  281. package/dist/tools/removeWebhook.js.map +1 -0
  282. package/dist/tools/resolveProject.d.ts +58 -0
  283. package/dist/tools/resolveProject.d.ts.map +1 -0
  284. package/dist/tools/resolveProject.js +175 -0
  285. package/dist/tools/resolveProject.js.map +1 -0
  286. package/dist/tools/restorePage.d.ts +47 -0
  287. package/dist/tools/restorePage.d.ts.map +1 -0
  288. package/dist/tools/restorePage.js +111 -0
  289. package/dist/tools/restorePage.js.map +1 -0
  290. package/dist/tools/searchPages.d.ts +28 -0
  291. package/dist/tools/searchPages.d.ts.map +1 -0
  292. package/dist/tools/searchPages.js +372 -0
  293. package/dist/tools/searchPages.js.map +1 -0
  294. package/dist/tools/setWebhook.d.ts +30 -0
  295. package/dist/tools/setWebhook.d.ts.map +1 -0
  296. package/dist/tools/setWebhook.js +30 -0
  297. package/dist/tools/setWebhook.js.map +1 -0
  298. package/dist/tools/shareProject.d.ts +25 -0
  299. package/dist/tools/shareProject.d.ts.map +1 -0
  300. package/dist/tools/shareProject.js +56 -0
  301. package/dist/tools/shareProject.js.map +1 -0
  302. package/dist/tools/suggestLinks.d.ts +29 -0
  303. package/dist/tools/suggestLinks.d.ts.map +1 -0
  304. package/dist/tools/suggestLinks.js +214 -0
  305. package/dist/tools/suggestLinks.js.map +1 -0
  306. package/dist/tools/updatePage.d.ts +27 -0
  307. package/dist/tools/updatePage.d.ts.map +1 -0
  308. package/dist/tools/updatePage.js +118 -0
  309. package/dist/tools/updatePage.js.map +1 -0
  310. package/dist/webhooks/dispatch.d.ts +49 -0
  311. package/dist/webhooks/dispatch.d.ts.map +1 -0
  312. package/dist/webhooks/dispatch.js +159 -0
  313. package/dist/webhooks/dispatch.js.map +1 -0
  314. package/dist/webhooks/webhookRules.d.ts +34 -0
  315. package/dist/webhooks/webhookRules.d.ts.map +1 -0
  316. package/dist/webhooks/webhookRules.js +129 -0
  317. package/dist/webhooks/webhookRules.js.map +1 -0
  318. package/dist/wiki/frontmatter.d.ts +45 -0
  319. package/dist/wiki/frontmatter.d.ts.map +1 -0
  320. package/dist/wiki/frontmatter.js +68 -0
  321. package/dist/wiki/frontmatter.js.map +1 -0
  322. package/dist/wiki/index.d.ts +22 -0
  323. package/dist/wiki/index.d.ts.map +1 -0
  324. package/dist/wiki/index.js +203 -0
  325. package/dist/wiki/index.js.map +1 -0
  326. package/dist/wiki/ingestPolicy.d.ts +18 -0
  327. package/dist/wiki/ingestPolicy.d.ts.map +1 -0
  328. package/dist/wiki/ingestPolicy.js +64 -0
  329. package/dist/wiki/ingestPolicy.js.map +1 -0
  330. package/dist/wiki/layoutLint.d.ts +51 -0
  331. package/dist/wiki/layoutLint.d.ts.map +1 -0
  332. package/dist/wiki/layoutLint.js +146 -0
  333. package/dist/wiki/layoutLint.js.map +1 -0
  334. package/dist/wiki/links.d.ts +6 -0
  335. package/dist/wiki/links.d.ts.map +1 -0
  336. package/dist/wiki/links.js +45 -0
  337. package/dist/wiki/links.js.map +1 -0
  338. package/dist/wiki/log.d.ts +58 -0
  339. package/dist/wiki/log.d.ts.map +1 -0
  340. package/dist/wiki/log.js +126 -0
  341. package/dist/wiki/log.js.map +1 -0
  342. package/dist/wiki/path.d.ts +8 -0
  343. package/dist/wiki/path.d.ts.map +1 -0
  344. package/dist/wiki/path.js +25 -0
  345. package/dist/wiki/path.js.map +1 -0
  346. package/dist/wiki/storageLimits.d.ts +163 -0
  347. package/dist/wiki/storageLimits.d.ts.map +1 -0
  348. package/dist/wiki/storageLimits.js +281 -0
  349. package/dist/wiki/storageLimits.js.map +1 -0
  350. package/package.json +81 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * emailSender.ts
3
+ *
4
+ * Sends transactional email via the Resend API using native fetch.
5
+ * No extra SDK dependency — uses the same fetch-everywhere pattern as the
6
+ * rest of the codebase.
7
+ *
8
+ * Required env var: RESEND_API_KEY
9
+ * Optional env vars:
10
+ * DIGEST_FROM_EMAIL (default: "digest@usebrains.app")
11
+ * DIGEST_FROM_NAME (default: "brains Weekly Digest")
12
+ */
13
+ export interface EmailPayload {
14
+ to: string;
15
+ subject: string;
16
+ html: string;
17
+ text: string;
18
+ }
19
+ export declare function sendDigestEmail(apiKey: string, fromEmail: string, fromName: string, payload: EmailPayload): Promise<void>;
20
+ //# sourceMappingURL=emailSender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailSender.d.ts","sourceRoot":"","sources":["../../src/digest/emailSender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * emailSender.ts
3
+ *
4
+ * Sends transactional email via the Resend API using native fetch.
5
+ * No extra SDK dependency — uses the same fetch-everywhere pattern as the
6
+ * rest of the codebase.
7
+ *
8
+ * Required env var: RESEND_API_KEY
9
+ * Optional env vars:
10
+ * DIGEST_FROM_EMAIL (default: "digest@usebrains.app")
11
+ * DIGEST_FROM_NAME (default: "brains Weekly Digest")
12
+ */
13
+ const RESEND_SEND_URL = "https://api.resend.com/emails";
14
+ export async function sendDigestEmail(apiKey, fromEmail, fromName, payload) {
15
+ const body = {
16
+ from: `${fromName} <${fromEmail}>`,
17
+ to: [payload.to],
18
+ subject: payload.subject,
19
+ html: payload.html,
20
+ text: payload.text,
21
+ };
22
+ const res = await fetch(RESEND_SEND_URL, {
23
+ method: "POST",
24
+ headers: {
25
+ "content-type": "application/json",
26
+ authorization: `Bearer ${apiKey}`,
27
+ },
28
+ body: JSON.stringify(body),
29
+ });
30
+ if (!res.ok) {
31
+ const text = await res.text().catch(() => "");
32
+ throw new Error(`Resend API error (${res.status}): ${text}`);
33
+ }
34
+ }
35
+ //# sourceMappingURL=emailSender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailSender.js","sourceRoot":"","sources":["../../src/digest/emailSender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,OAAqB;IAErB,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,GAAG,QAAQ,KAAK,SAAS,GAAG;QAClC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;QACvC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type FileCacheEntry } from "./fileCache.js";
2
+ export interface DriveFile {
3
+ fileId: string;
4
+ name: string;
5
+ content: string;
6
+ revision: string;
7
+ mimeType: string;
8
+ modifiedTime: string;
9
+ }
10
+ export interface WriteResult {
11
+ fileId: string;
12
+ revision: string;
13
+ modifiedTime: string;
14
+ }
15
+ export declare class DriveClient {
16
+ private readonly drive;
17
+ private readonly folderId;
18
+ constructor();
19
+ /** Verify auth and required folder are accessible. Called on server start. */
20
+ verifyAuth(): Promise<void>;
21
+ /** List all .md files in the wiki folder, returning cached metadata. */
22
+ listFiles(): Promise<FileCacheEntry[]>;
23
+ /** Read a file by name, using cache for metadata but always fetching content. */
24
+ readFile(name: string): Promise<DriveFile>;
25
+ /**
26
+ * Create a new file in the wiki folder.
27
+ * Throws DrivePermissionError if a file with this name already exists.
28
+ */
29
+ createFile(name: string, content: string): Promise<WriteResult>;
30
+ /**
31
+ * Update an existing file with optimistic concurrency.
32
+ * Caller must pass the revision they read; if it doesn't match current,
33
+ * throws DriveConflictError.
34
+ */
35
+ updateFile(fileId: string, content: string, seenRevision: string): Promise<WriteResult>;
36
+ /** Rename a file (used for move/archive). Does not delete. */
37
+ renameFile(fileId: string, newName: string): Promise<WriteResult>;
38
+ /** Ensure index.md and log.md exist; create them if missing. */
39
+ bootstrapWikiFiles(): Promise<void>;
40
+ getFolderId(): string;
41
+ }
42
+ export declare function getDriveClient(): DriveClient;
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/drive/client.ts"],"names":[],"mappings":"AASA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAShE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AA2ED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;;IAYlC,8EAA8E;IACxE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC,wEAAwE;IAClE,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IA6B5C,iFAAiF;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA6ChD;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA+CrE;;;;OAIG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC;IAiDvB,8DAA8D;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BvE,gEAAgE;IAC1D,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBzC,WAAW,IAAI,MAAM;CAGtB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
@@ -0,0 +1,282 @@
1
+ import { google } from "googleapis";
2
+ import { DriveAuthError, DriveConflictError, DriveNotFoundError, DrivePermissionError, DriveQuotaError, } from "./errors.js";
3
+ import { fileCache } from "./fileCache.js";
4
+ const REQUIRED_SCOPES = [
5
+ "https://www.googleapis.com/auth/drive.file",
6
+ ];
7
+ // Max markdown file size: 2 MB
8
+ const MAX_FILE_SIZE_BYTES = 2 * 1024 * 1024;
9
+ function buildOAuth2Client() {
10
+ const clientId = process.env.GOOGLE_CLIENT_ID;
11
+ const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
12
+ const refreshToken = process.env.GOOGLE_REFRESH_TOKEN;
13
+ if (!clientId || !clientSecret || !refreshToken) {
14
+ throw new DriveAuthError("Missing required env vars: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN");
15
+ }
16
+ const auth = new google.auth.OAuth2(clientId, clientSecret);
17
+ auth.setCredentials({ refresh_token: refreshToken });
18
+ return auth;
19
+ }
20
+ async function withRetry(fn, maxRetries = 3) {
21
+ let lastError;
22
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
23
+ try {
24
+ return await fn();
25
+ }
26
+ catch (err) {
27
+ lastError = err;
28
+ const gaxiosErr = err;
29
+ if (gaxiosErr.code === 429 || gaxiosErr.code === 403) {
30
+ const retryAfter = 1000 * Math.pow(2, attempt);
31
+ if (attempt < maxRetries - 1) {
32
+ await new Promise((r) => setTimeout(r, retryAfter));
33
+ continue;
34
+ }
35
+ throw new DriveQuotaError(retryAfter);
36
+ }
37
+ if (gaxiosErr.code === 401) {
38
+ throw new DriveAuthError("Google Drive auth failed — token may need re-authorization", err);
39
+ }
40
+ if (gaxiosErr.code === 404) {
41
+ throw new DriveNotFoundError("unknown");
42
+ }
43
+ if (!isRetryable(gaxiosErr.code)) {
44
+ throw err;
45
+ }
46
+ const delay = 500 * Math.pow(2, attempt);
47
+ await new Promise((r) => setTimeout(r, delay));
48
+ }
49
+ }
50
+ throw lastError;
51
+ }
52
+ function isRetryable(code) {
53
+ return code === 500 || code === 502 || code === 503 || code === 504;
54
+ }
55
+ function mapDriveError(err, context) {
56
+ const e = err;
57
+ if (e.code === 401)
58
+ throw new DriveAuthError(`Auth error during ${context}`, err);
59
+ if (e.code === 403)
60
+ throw new DrivePermissionError(`Permission denied during ${context}: ${e.message}`);
61
+ if (e.code === 404)
62
+ throw new DriveNotFoundError(context);
63
+ if (e.code === 429)
64
+ throw new DriveQuotaError(60000);
65
+ throw err;
66
+ }
67
+ export class DriveClient {
68
+ drive;
69
+ folderId;
70
+ constructor() {
71
+ const folderId = process.env.DRIVE_FOLDER_ID;
72
+ if (!folderId) {
73
+ throw new DriveAuthError("Missing required env var: DRIVE_FOLDER_ID");
74
+ }
75
+ this.folderId = folderId;
76
+ const auth = buildOAuth2Client();
77
+ this.drive = google.drive({ version: "v3", auth });
78
+ }
79
+ /** Verify auth and required folder are accessible. Called on server start. */
80
+ async verifyAuth() {
81
+ try {
82
+ await withRetry(() => this.drive.files.get({
83
+ fileId: this.folderId,
84
+ fields: "id, name, mimeType",
85
+ }));
86
+ }
87
+ catch (err) {
88
+ mapDriveError(err, "verifyAuth");
89
+ }
90
+ }
91
+ /** List all .md files in the wiki folder, returning cached metadata. */
92
+ async listFiles() {
93
+ const res = await withRetry(() => this.drive.files.list({
94
+ q: `'${this.folderId}' in parents and mimeType='text/plain' and trashed=false`,
95
+ fields: "files(id, name, size, modifiedTime, headRevisionId, mimeType)",
96
+ pageSize: 1000,
97
+ orderBy: "name",
98
+ })).catch((err) => mapDriveError(err, "listFiles"));
99
+ const entries = [];
100
+ for (const f of res.data.files ?? []) {
101
+ if (!f.id || !f.name)
102
+ continue;
103
+ const entry = {
104
+ fileId: f.id,
105
+ name: f.name,
106
+ mimeType: f.mimeType ?? "text/plain",
107
+ revision: f.headRevisionId ?? "",
108
+ size: Number(f.size ?? 0),
109
+ modifiedTime: f.modifiedTime ?? "",
110
+ cachedAt: Date.now(),
111
+ };
112
+ fileCache.set(f.name, entry);
113
+ entries.push(entry);
114
+ }
115
+ return entries;
116
+ }
117
+ /** Read a file by name, using cache for metadata but always fetching content. */
118
+ async readFile(name) {
119
+ let cached = fileCache.getByPath(name);
120
+ if (!cached) {
121
+ // Resolve name → fileId via a list call
122
+ const res = await withRetry(() => this.drive.files.list({
123
+ q: `'${this.folderId}' in parents and name='${name}' and trashed=false`,
124
+ fields: "files(id, name, size, modifiedTime, headRevisionId, mimeType)",
125
+ pageSize: 1,
126
+ })).catch((err) => mapDriveError(err, `readFile:lookup:${name}`));
127
+ const f = res.data.files?.[0];
128
+ if (!f?.id)
129
+ throw new DriveNotFoundError(name);
130
+ cached = {
131
+ fileId: f.id,
132
+ name: f.name ?? name,
133
+ mimeType: f.mimeType ?? "text/plain",
134
+ revision: f.headRevisionId ?? "",
135
+ size: Number(f.size ?? 0),
136
+ modifiedTime: f.modifiedTime ?? "",
137
+ cachedAt: Date.now(),
138
+ };
139
+ fileCache.set(name, cached);
140
+ }
141
+ const content = await withRetry(() => this.drive.files.get({ fileId: cached.fileId, alt: "media" }, { responseType: "text" })).catch((err) => mapDriveError(err, `readFile:content:${name}`));
142
+ return {
143
+ fileId: cached.fileId,
144
+ name,
145
+ content: content.data,
146
+ revision: cached.revision,
147
+ mimeType: cached.mimeType,
148
+ modifiedTime: cached.modifiedTime,
149
+ };
150
+ }
151
+ /**
152
+ * Create a new file in the wiki folder.
153
+ * Throws DrivePermissionError if a file with this name already exists.
154
+ */
155
+ async createFile(name, content) {
156
+ if (Buffer.byteLength(content, "utf8") > MAX_FILE_SIZE_BYTES) {
157
+ throw new Error(`File ${name} exceeds max size of ${MAX_FILE_SIZE_BYTES} bytes`);
158
+ }
159
+ // Guard against accidental overwrite
160
+ const existing = fileCache.getByPath(name);
161
+ if (existing) {
162
+ throw new DrivePermissionError(`File '${name}' already exists (fileId: ${existing.fileId}). Use update_page instead.`);
163
+ }
164
+ const res = await withRetry(() => this.drive.files.create({
165
+ requestBody: {
166
+ name,
167
+ parents: [this.folderId],
168
+ mimeType: "text/plain",
169
+ },
170
+ media: {
171
+ mimeType: "text/plain",
172
+ body: content,
173
+ },
174
+ fields: "id, headRevisionId, modifiedTime",
175
+ })).catch((err) => mapDriveError(err, `createFile:${name}`));
176
+ const result = {
177
+ fileId: res.data.id,
178
+ revision: res.data.headRevisionId ?? "",
179
+ modifiedTime: res.data.modifiedTime ?? "",
180
+ };
181
+ fileCache.set(name, {
182
+ fileId: result.fileId,
183
+ name,
184
+ mimeType: "text/plain",
185
+ revision: result.revision,
186
+ size: Buffer.byteLength(content, "utf8"),
187
+ modifiedTime: result.modifiedTime,
188
+ cachedAt: Date.now(),
189
+ });
190
+ return result;
191
+ }
192
+ /**
193
+ * Update an existing file with optimistic concurrency.
194
+ * Caller must pass the revision they read; if it doesn't match current,
195
+ * throws DriveConflictError.
196
+ */
197
+ async updateFile(fileId, content, seenRevision) {
198
+ if (Buffer.byteLength(content, "utf8") > MAX_FILE_SIZE_BYTES) {
199
+ throw new Error(`Content exceeds max size of ${MAX_FILE_SIZE_BYTES} bytes`);
200
+ }
201
+ // Fetch current revision to compare
202
+ const meta = await withRetry(() => this.drive.files.get({
203
+ fileId,
204
+ fields: "headRevisionId, name",
205
+ })).catch((err) => mapDriveError(err, `updateFile:meta:${fileId}`));
206
+ const currentRevision = meta.data.headRevisionId ?? "";
207
+ if (seenRevision && currentRevision && seenRevision !== currentRevision) {
208
+ throw new DriveConflictError(fileId, seenRevision, currentRevision);
209
+ }
210
+ const res = await withRetry(() => this.drive.files.update({
211
+ fileId,
212
+ media: {
213
+ mimeType: "text/plain",
214
+ body: content,
215
+ },
216
+ fields: "id, headRevisionId, modifiedTime, name",
217
+ })).catch((err) => mapDriveError(err, `updateFile:write:${fileId}`));
218
+ const result = {
219
+ fileId: res.data.id,
220
+ revision: res.data.headRevisionId ?? "",
221
+ modifiedTime: res.data.modifiedTime ?? "",
222
+ };
223
+ const name = meta.data.name ?? "";
224
+ fileCache.set(name, {
225
+ fileId: result.fileId,
226
+ name,
227
+ mimeType: "text/plain",
228
+ revision: result.revision,
229
+ size: Buffer.byteLength(content, "utf8"),
230
+ modifiedTime: result.modifiedTime,
231
+ cachedAt: Date.now(),
232
+ });
233
+ return result;
234
+ }
235
+ /** Rename a file (used for move/archive). Does not delete. */
236
+ async renameFile(fileId, newName) {
237
+ const res = await withRetry(() => this.drive.files.update({
238
+ fileId,
239
+ requestBody: { name: newName },
240
+ fields: "id, headRevisionId, modifiedTime, name",
241
+ })).catch((err) => mapDriveError(err, `renameFile:${fileId}`));
242
+ fileCache.invalidate(fileId);
243
+ const result = {
244
+ fileId: res.data.id,
245
+ revision: res.data.headRevisionId ?? "",
246
+ modifiedTime: res.data.modifiedTime ?? "",
247
+ };
248
+ fileCache.set(newName, {
249
+ fileId: result.fileId,
250
+ name: newName,
251
+ mimeType: "text/plain",
252
+ revision: result.revision,
253
+ size: 0,
254
+ modifiedTime: result.modifiedTime,
255
+ cachedAt: Date.now(),
256
+ });
257
+ return result;
258
+ }
259
+ /** Ensure index.md and log.md exist; create them if missing. */
260
+ async bootstrapWikiFiles() {
261
+ const files = await this.listFiles();
262
+ const names = new Set(files.map((f) => f.name));
263
+ if (!names.has("index.md")) {
264
+ await this.createFile("index.md", `---\ntitle: Index\nupdated: ${new Date().toISOString().slice(0, 10)}\n---\n\n# Wiki Index\n\n| Page | Summary | Updated |\n|---|---|---|\n`);
265
+ }
266
+ if (!names.has("log.md")) {
267
+ await this.createFile("log.md", `---\ntitle: Log\nupdated: ${new Date().toISOString().slice(0, 10)}\n---\n\n# Wiki Log\n\nAppend-only record of ingests, queries, and lint passes.\n\n`);
268
+ }
269
+ }
270
+ getFolderId() {
271
+ return this.folderId;
272
+ }
273
+ }
274
+ // Singleton instance — modules import this
275
+ let _client = null;
276
+ export function getDriveClient() {
277
+ if (!_client) {
278
+ _client = new DriveClient();
279
+ }
280
+ return _client;
281
+ }
282
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/drive/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare class DriveAuthError extends Error {
2
+ readonly cause?: unknown | undefined;
3
+ constructor(message: string, cause?: unknown | undefined);
4
+ }
5
+ export declare class DriveConflictError extends Error {
6
+ readonly fileId: string;
7
+ readonly seenRevision: string;
8
+ readonly currentRevision: string;
9
+ constructor(fileId: string, seenRevision: string, currentRevision: string);
10
+ }
11
+ export declare class DriveQuotaError extends Error {
12
+ readonly retryAfterMs: number;
13
+ constructor(retryAfterMs: number, message?: string);
14
+ }
15
+ export declare class DriveNotFoundError extends Error {
16
+ readonly fileId: string;
17
+ constructor(fileId: string);
18
+ }
19
+ export declare class DrivePermissionError extends Error {
20
+ constructor(message: string);
21
+ }
22
+ export declare class WikiValidationWarning {
23
+ readonly field: string;
24
+ readonly message: string;
25
+ constructor(field: string, message: string);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/drive/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;aACM,KAAK,CAAC,EAAE,OAAO;gBAAhD,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAI7D;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,MAAM,EAAE,MAAM;aACd,YAAY,EAAE,MAAM;aACpB,eAAe,EAAE,MAAM;gBAFvB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM;CAO1C;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM,EACpC,OAAO,SAAoC;CAK9C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACf,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAqB;aAEd,KAAK,EAAE,MAAM;aACb,OAAO,EAAE,MAAM;gBADf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM;CAElC"}
@@ -0,0 +1,51 @@
1
+ export class DriveAuthError extends Error {
2
+ cause;
3
+ constructor(message, cause) {
4
+ super(message);
5
+ this.cause = cause;
6
+ this.name = "DriveAuthError";
7
+ }
8
+ }
9
+ export class DriveConflictError extends Error {
10
+ fileId;
11
+ seenRevision;
12
+ currentRevision;
13
+ constructor(fileId, seenRevision, currentRevision) {
14
+ super(`Write conflict on file ${fileId}: your revision ${seenRevision} is behind current ${currentRevision}. Re-read the page and retry.`);
15
+ this.fileId = fileId;
16
+ this.seenRevision = seenRevision;
17
+ this.currentRevision = currentRevision;
18
+ this.name = "DriveConflictError";
19
+ }
20
+ }
21
+ export class DriveQuotaError extends Error {
22
+ retryAfterMs;
23
+ constructor(retryAfterMs, message = "Google Drive API quota exceeded") {
24
+ super(`${message}. Retry after ${retryAfterMs}ms.`);
25
+ this.retryAfterMs = retryAfterMs;
26
+ this.name = "DriveQuotaError";
27
+ }
28
+ }
29
+ export class DriveNotFoundError extends Error {
30
+ fileId;
31
+ constructor(fileId) {
32
+ super(`Drive file not found: ${fileId}`);
33
+ this.fileId = fileId;
34
+ this.name = "DriveNotFoundError";
35
+ }
36
+ }
37
+ export class DrivePermissionError extends Error {
38
+ constructor(message) {
39
+ super(message);
40
+ this.name = "DrivePermissionError";
41
+ }
42
+ }
43
+ export class WikiValidationWarning {
44
+ field;
45
+ message;
46
+ constructor(field, message) {
47
+ this.field = field;
48
+ this.message = message;
49
+ }
50
+ }
51
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/drive/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACM;IAA7C,YAAY,OAAe,EAAkB,KAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAU;QAE1D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IACA;IACA;IAHlB,YACkB,MAAc,EACd,YAAoB,EACpB,eAAuB;QAEvC,KAAK,CACH,0BAA0B,MAAM,mBAAmB,YAAY,sBAAsB,eAAe,+BAA+B,CACpI,CAAC;QANc,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAQ;QACpB,oBAAe,GAAf,eAAe,CAAQ;QAKvC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IADlB,YACkB,YAAoB,EACpC,OAAO,GAAG,iCAAiC;QAE3C,KAAK,CAAC,GAAG,OAAO,iBAAiB,YAAY,KAAK,CAAC,CAAC;QAHpC,iBAAY,GAAZ,YAAY,CAAQ;QAIpC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACf;IAA5B,YAA4B,MAAc;QACxC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QADf,WAAM,GAAN,MAAM,CAAQ;QAExC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,qBAAqB;IAEd;IACA;IAFlB,YACkB,KAAa,EACb,OAAe;QADf,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;IAC9B,CAAC;CACL"}
@@ -0,0 +1,22 @@
1
+ /** In-memory cache for Drive file IDs and metadata to reduce API round-trips. */
2
+ export interface FileCacheEntry {
3
+ fileId: string;
4
+ name: string;
5
+ mimeType: string;
6
+ revision: string;
7
+ size: number;
8
+ modifiedTime: string;
9
+ cachedAt: number;
10
+ }
11
+ export declare class FileCache {
12
+ private readonly byPath;
13
+ private readonly byId;
14
+ set(path: string, entry: FileCacheEntry): void;
15
+ getByPath(path: string): FileCacheEntry | undefined;
16
+ getById(fileId: string): FileCacheEntry | undefined;
17
+ invalidate(fileId: string): void;
18
+ invalidateAll(): void;
19
+ size(): number;
20
+ }
21
+ export declare const fileCache: FileCache;
22
+ //# sourceMappingURL=fileCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileCache.d.ts","sourceRoot":"","sources":["../../src/drive/fileCache.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;IAE1D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAK9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAWnD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAiBnD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUhC,aAAa,IAAI,IAAI;IAKrB,IAAI,IAAI,MAAM;CAGf;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /** In-memory cache for Drive file IDs and metadata to reduce API round-trips. */
2
+ const TTL_MS = 5 * 60 * 1000; // 5 minutes
3
+ export class FileCache {
4
+ byPath = new Map();
5
+ byId = new Map();
6
+ set(path, entry) {
7
+ this.byPath.set(path, entry);
8
+ this.byId.set(entry.fileId, entry);
9
+ }
10
+ getByPath(path) {
11
+ const entry = this.byPath.get(path);
12
+ if (!entry)
13
+ return undefined;
14
+ if (Date.now() - entry.cachedAt > TTL_MS) {
15
+ this.byPath.delete(path);
16
+ this.byId.delete(entry.fileId);
17
+ return undefined;
18
+ }
19
+ return entry;
20
+ }
21
+ getById(fileId) {
22
+ const entry = this.byId.get(fileId);
23
+ if (!entry)
24
+ return undefined;
25
+ if (Date.now() - entry.cachedAt > TTL_MS) {
26
+ this.byId.delete(fileId);
27
+ // Find and remove the path entry too
28
+ for (const [k, v] of this.byPath.entries()) {
29
+ if (v.fileId === fileId) {
30
+ this.byPath.delete(k);
31
+ break;
32
+ }
33
+ }
34
+ return undefined;
35
+ }
36
+ return entry;
37
+ }
38
+ invalidate(fileId) {
39
+ for (const [k, v] of this.byPath.entries()) {
40
+ if (v.fileId === fileId) {
41
+ this.byPath.delete(k);
42
+ break;
43
+ }
44
+ }
45
+ this.byId.delete(fileId);
46
+ }
47
+ invalidateAll() {
48
+ this.byPath.clear();
49
+ this.byId.clear();
50
+ }
51
+ size() {
52
+ return this.byId.size;
53
+ }
54
+ }
55
+ // Singleton shared across all Drive operations
56
+ export const fileCache = new FileCache();
57
+ //# sourceMappingURL=fileCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileCache.js","sourceRoot":"","sources":["../../src/drive/fileCache.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAYjF,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE1C,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE1D,GAAG,CAAC,IAAY,EAAE,KAAqB;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,qCAAqC;YACrC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}