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 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,MAAM,CAAC;IAC/E,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAsID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;gBAEpD,KAAK,EAAE,UAAU,EAAE,WAAW,GAAE,WAAW,GAAG,IAAW;IAcrE,SAAS,IAAI,OAAO;IAIpB,cAAc,IAAI,OAAO;IAIzB,OAAO,CAAC,sBAAsB;IAI9B,WAAW,IAAI,iBAAiB,EAAE;IAIlC,2BAA2B,IAAI,KAAK,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;IAQlF,gBAAgB,IAAI,iBAAiB,EAAE;YAOzB,UAAU;IAgBlB,wBAAwB,CAAC,KAAK,EAAE;QACpC,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgCrE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4CvE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA8B3H,sBAAsB,CAAC,KAAK,EAAE;QAClC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACxC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBb,yBAAyB,CAAC,KAAK,EAAE;QACrC,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+CpB,kBAAkB,CAAC,KAAK,EAAE;QAC9B,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBpB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAoBhF,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,KAAK,EAAE;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;YAqCH,WAAW;IAgCnB,qBAAqB,CAAC,KAAK,EAAE;QACjC,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,uBAAuB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAwDzJ"}
@@ -0,0 +1,491 @@
1
+ import crypto from "crypto";
2
+ const AUTH_CODE_TTL_MS = 5 * 60 * 1000;
3
+ const ACCESS_TOKEN_TTL_MS = 8 * 60 * 60 * 1000;
4
+ const REFRESH_TOKEN_TTL_MS = 30 * 24 * 60 * 60 * 1000;
5
+ const AUTH_CACHE_TTL_MS = 60 * 1000;
6
+ function randomToken(prefix) {
7
+ return `${prefix}_${crypto.randomBytes(24).toString("base64url")}`;
8
+ }
9
+ function sha256Base64Url(input) {
10
+ return crypto.createHash("sha256").update(input, "utf8").digest("base64url");
11
+ }
12
+ function parseScopes(scope, fallback) {
13
+ if (!scope || !scope.trim())
14
+ return [...fallback];
15
+ return scope
16
+ .split(/\s+/)
17
+ .map((s) => s.trim())
18
+ .filter((s) => s.length > 0);
19
+ }
20
+ function parseClientConfig() {
21
+ const legacyClientId = process.env.BRAINS_OAUTH_CLIENT_ID;
22
+ const legacyClientSecret = process.env.BRAINS_OAUTH_CLIENT_SECRET;
23
+ const legacyRedirectUri = process.env.BRAINS_OAUTH_REDIRECT_URI;
24
+ if (legacyClientId && legacyClientSecret && legacyRedirectUri) {
25
+ return [
26
+ {
27
+ clientId: legacyClientId,
28
+ clientSecret: legacyClientSecret,
29
+ tokenEndpointAuthMethod: "client_secret_post",
30
+ redirectUris: legacyRedirectUri.split(",").map((s) => s.trim()).filter(Boolean),
31
+ scopes: ["wiki.read", "wiki.write"],
32
+ },
33
+ ];
34
+ }
35
+ const raw = process.env.BRAINS_OAUTH_CLIENTS;
36
+ if (!raw || !raw.trim())
37
+ return [];
38
+ try {
39
+ const parsed = JSON.parse(raw);
40
+ if (!Array.isArray(parsed))
41
+ return [];
42
+ return parsed
43
+ .map((entry) => {
44
+ const item = entry;
45
+ const clientId = typeof item.clientId === "string" ? item.clientId : "";
46
+ const clientSecret = typeof item.clientSecret === "string" ? item.clientSecret : "";
47
+ const isPublicClient = item.publicClient === true;
48
+ const redirectUris = Array.isArray(item.redirectUris)
49
+ ? item.redirectUris.filter((v) => typeof v === "string")
50
+ : [];
51
+ const scopes = Array.isArray(item.scopes)
52
+ ? item.scopes.filter((v) => typeof v === "string")
53
+ : ["wiki.read", "wiki.write"];
54
+ const tokenEndpointAuthMethod = isPublicClient
55
+ ? "none"
56
+ : "client_secret_post";
57
+ return {
58
+ clientId,
59
+ clientSecret: clientSecret || undefined,
60
+ tokenEndpointAuthMethod,
61
+ redirectUris,
62
+ scopes,
63
+ };
64
+ })
65
+ .filter((c) => c.clientId && c.redirectUris.length > 0)
66
+ .filter((c) => c.tokenEndpointAuthMethod === "none" || Boolean(c.clientSecret));
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ }
72
+ // Per RFC 8252 §7.3: loopback redirect URIs must match ignoring port.
73
+ // Registered URIs ending with /* allow path-prefix matching on the same HTTPS origin.
74
+ // This covers platforms (e.g. ChatGPT) that generate a unique callback path per integration
75
+ // while sharing a common host/path prefix.
76
+ function isRedirectUriAllowed(registered, requested) {
77
+ if (registered.includes(requested))
78
+ return true;
79
+ // Wildcard prefix matching for HTTPS URIs only.
80
+ // A registered value like "https://chat.openai.com/aip/*" matches any URI
81
+ // that begins with "https://chat.openai.com/aip/" on the same origin.
82
+ for (const r of registered) {
83
+ if (r.endsWith("/*")) {
84
+ const prefix = r.slice(0, -1); // drop trailing *
85
+ if (requested.startsWith(prefix)) {
86
+ try {
87
+ const regUrl = new URL(prefix);
88
+ const reqUrl = new URL(requested);
89
+ if (regUrl.protocol === "https:" && regUrl.origin === reqUrl.origin) {
90
+ return true;
91
+ }
92
+ }
93
+ catch {
94
+ // not a valid URL pair — continue
95
+ }
96
+ }
97
+ }
98
+ }
99
+ try {
100
+ const req = new URL(requested);
101
+ const isLoopback = req.protocol === "http:" &&
102
+ (req.hostname === "127.0.0.1" || req.hostname === "localhost");
103
+ if (!isLoopback)
104
+ return false;
105
+ return registered.some((r) => {
106
+ try {
107
+ const reg = new URL(r);
108
+ return (reg.protocol === "http:" &&
109
+ (reg.hostname === "127.0.0.1" || reg.hostname === "localhost") &&
110
+ reg.pathname === req.pathname);
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ });
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ }
121
+ export class OAuthManager {
122
+ clients = new Map();
123
+ loginUser;
124
+ loginPassword;
125
+ supabaseUrl;
126
+ supabaseAnonKey;
127
+ store;
128
+ clientStore;
129
+ authCache = new Map();
130
+ constructor(store, clientStore = null) {
131
+ this.store = store;
132
+ this.clientStore = clientStore;
133
+ for (const client of parseClientConfig()) {
134
+ this.clients.set(client.clientId, client);
135
+ }
136
+ this.loginUser = process.env.BRAINS_OAUTH_USER ?? "owner";
137
+ this.loginPassword = process.env.BRAINS_OAUTH_PASSWORD ?? "";
138
+ this.supabaseUrl = (process.env.SUPABASE_URL ?? "").trim().replace(/\/$/, "");
139
+ this.supabaseAnonKey = (process.env.SUPABASE_ANON_KEY ?? "").trim();
140
+ }
141
+ isEnabled() {
142
+ return this.clients.size > 0 && (this.loginPassword.length > 0 || this.hasSupabaseLoginConfig());
143
+ }
144
+ hasLoginConfig() {
145
+ return this.loginPassword.length > 0 || this.hasSupabaseLoginConfig();
146
+ }
147
+ hasSupabaseLoginConfig() {
148
+ return this.supabaseUrl.length > 0 && this.supabaseAnonKey.length > 0;
149
+ }
150
+ listClients() {
151
+ return Array.from(this.clients.values()).map((c) => ({ ...c }));
152
+ }
153
+ getTokenEndpointAuthMethods() {
154
+ const methods = new Set();
155
+ for (const client of this.clients.values()) {
156
+ methods.add(client.tokenEndpointAuthMethod);
157
+ }
158
+ return Array.from(methods);
159
+ }
160
+ getClientConfigs() {
161
+ return Array.from(this.clients.values());
162
+ }
163
+ // Lookup a client_id, falling back to the persisted DCR store when the
164
+ // in-memory Map doesn't have it (i.e. after a process restart). Hydrates
165
+ // back into the Map so subsequent lookups in the same process are O(1).
166
+ async findClient(clientId) {
167
+ const cached = this.clients.get(clientId);
168
+ if (cached)
169
+ return cached;
170
+ if (!this.clientStore)
171
+ return undefined;
172
+ const stored = await this.clientStore.find(clientId);
173
+ if (!stored)
174
+ return undefined;
175
+ const config = {
176
+ clientId: stored.clientId,
177
+ tokenEndpointAuthMethod: "none",
178
+ redirectUris: [...stored.redirectUris],
179
+ scopes: [...stored.scopes],
180
+ };
181
+ this.clients.set(clientId, config);
182
+ return config;
183
+ }
184
+ async validateAuthorizeRequest(input) {
185
+ if (input.responseType !== "code") {
186
+ throw new Error("Unsupported response_type. Only 'code' is allowed.");
187
+ }
188
+ const client = await this.findClient(input.clientId);
189
+ if (!client) {
190
+ throw new Error("Unknown client_id");
191
+ }
192
+ if (!isRedirectUriAllowed(client.redirectUris, input.redirectUri)) {
193
+ throw new Error("redirect_uri is not registered for this client");
194
+ }
195
+ const requestedScopes = parseScopes(input.scope, client.scopes);
196
+ for (const scope of requestedScopes) {
197
+ if (!client.scopes.includes(scope)) {
198
+ throw new Error(`Invalid scope requested: ${scope}`);
199
+ }
200
+ }
201
+ if (input.codeChallengeMethod && input.codeChallengeMethod !== "S256" && input.codeChallengeMethod !== "plain") {
202
+ throw new Error("Unsupported code_challenge_method");
203
+ }
204
+ if (input.codeChallenge && !input.codeChallengeMethod) {
205
+ throw new Error("code_challenge_method is required when code_challenge is provided");
206
+ }
207
+ return { client, scope: requestedScopes, state: input.state };
208
+ }
209
+ async verifyLogin(username, password) {
210
+ if (!this.isEnabled())
211
+ return null;
212
+ if (this.loginPassword.length > 0 && username === this.loginUser && password === this.loginPassword) {
213
+ return process.env.BRAINS_OAUTH_SUBJECT?.trim() || username;
214
+ }
215
+ if (!this.hasSupabaseLoginConfig()) {
216
+ console.error("[oauth] verifyLogin: no Supabase config (SUPABASE_URL/SUPABASE_ANON_KEY not set)");
217
+ return null;
218
+ }
219
+ const response = await fetch(`${this.supabaseUrl}/auth/v1/token?grant_type=password`, {
220
+ method: "POST",
221
+ headers: {
222
+ apikey: this.supabaseAnonKey,
223
+ "content-type": "application/json",
224
+ },
225
+ body: JSON.stringify({
226
+ email: username,
227
+ password,
228
+ }),
229
+ }).catch((err) => {
230
+ console.error("[oauth] Supabase auth fetch failed:", err instanceof Error ? err.message : String(err));
231
+ return null;
232
+ });
233
+ if (!response) {
234
+ return null;
235
+ }
236
+ if (!response.ok) {
237
+ const errBody = await response.json().catch(() => null);
238
+ const detail = errBody?.error_description ?? errBody?.msg ?? `HTTP ${response.status}`;
239
+ console.error(`[oauth] Supabase auth rejected: ${detail}`);
240
+ return null;
241
+ }
242
+ const payload = (await response.json().catch(() => null));
243
+ return payload?.user?.id ?? payload?.user?.email ?? username;
244
+ }
245
+ async signUpWithEmail(email, password, redirectTo) {
246
+ if (!this.hasSupabaseLoginConfig()) {
247
+ return { ok: false, error: "Email sign-up is not available (Supabase not configured)" };
248
+ }
249
+ const signupUrl = new URL(`${this.supabaseUrl}/auth/v1/signup`);
250
+ if (redirectTo)
251
+ signupUrl.searchParams.set("redirect_to", redirectTo);
252
+ const response = await fetch(signupUrl.toString(), {
253
+ method: "POST",
254
+ headers: {
255
+ apikey: this.supabaseAnonKey,
256
+ "content-type": "application/json",
257
+ },
258
+ body: JSON.stringify({ email, password }),
259
+ }).catch(() => null);
260
+ if (!response) {
261
+ return { ok: false, error: "Could not reach the auth service. Try again." };
262
+ }
263
+ if (!response.ok) {
264
+ const body = (await response.json().catch(() => null));
265
+ const msg = body?.msg ?? body?.message ?? "Sign-up failed. Check your email and password.";
266
+ return { ok: false, error: msg };
267
+ }
268
+ return { ok: true };
269
+ }
270
+ async issueAuthorizationCode(input) {
271
+ void this.store.pruneExpired().catch(() => { });
272
+ const code = randomToken("code");
273
+ await this.store.save({
274
+ type: "auth_code",
275
+ token: code,
276
+ clientId: input.clientId,
277
+ redirectUri: input.redirectUri,
278
+ scope: [...input.scope],
279
+ subject: input.subject,
280
+ codeChallenge: input.codeChallenge,
281
+ codeChallengeMethod: input.codeChallengeMethod,
282
+ expiresAt: Date.now() + AUTH_CODE_TTL_MS,
283
+ });
284
+ return code;
285
+ }
286
+ async exchangeAuthorizationCode(input) {
287
+ void this.store.pruneExpired().catch(() => { });
288
+ const record = await this.store.find("auth_code", input.code);
289
+ if (!record) {
290
+ throw new Error("Invalid or expired authorization code");
291
+ }
292
+ const client = await this.findClient(input.clientId);
293
+ if (!client) {
294
+ throw new Error("Unknown client_id");
295
+ }
296
+ if (client.tokenEndpointAuthMethod === "none") {
297
+ if (!record.codeChallenge) {
298
+ throw new Error("Public clients require PKCE-enabled authorization requests");
299
+ }
300
+ }
301
+ else if (client.clientSecret !== input.clientSecret) {
302
+ throw new Error("Invalid client credentials");
303
+ }
304
+ if (record.clientId !== input.clientId) {
305
+ throw new Error("authorization code was not issued to this client");
306
+ }
307
+ if (record.redirectUri !== input.redirectUri) {
308
+ throw new Error("redirect_uri mismatch");
309
+ }
310
+ if (record.codeChallenge) {
311
+ if (!input.codeVerifier) {
312
+ throw new Error("code_verifier required");
313
+ }
314
+ const expected = record.codeChallengeMethod === "plain"
315
+ ? input.codeVerifier
316
+ : sha256Base64Url(input.codeVerifier);
317
+ if (expected !== record.codeChallenge) {
318
+ throw new Error("Invalid code_verifier");
319
+ }
320
+ }
321
+ await this.store.delete("auth_code", input.code);
322
+ return await this.issueTokens(record.clientId, record.subject, record.scope);
323
+ }
324
+ async refreshAccessToken(input) {
325
+ void this.store.pruneExpired().catch(() => { });
326
+ const refresh = await this.store.find("refresh_token", input.refreshToken);
327
+ if (!refresh) {
328
+ throw new Error("Invalid or expired refresh_token");
329
+ }
330
+ if (refresh.clientId !== input.clientId) {
331
+ throw new Error("refresh_token client mismatch");
332
+ }
333
+ const client = await this.findClient(input.clientId);
334
+ if (!client) {
335
+ throw new Error("Unknown client_id");
336
+ }
337
+ if (client.tokenEndpointAuthMethod !== "none" && client.clientSecret !== input.clientSecret) {
338
+ throw new Error("Invalid client credentials");
339
+ }
340
+ await this.store.delete("refresh_token", input.refreshToken);
341
+ return await this.issueTokens(refresh.clientId, refresh.subject, refresh.scope);
342
+ }
343
+ async authenticateAccessToken(token) {
344
+ const now = Date.now();
345
+ const cached = this.authCache.get(token);
346
+ if (cached && cached.expiresAt > now)
347
+ return cached.result;
348
+ const record = await this.store.find("access_token", token);
349
+ if (!record) {
350
+ this.authCache.delete(token);
351
+ return null;
352
+ }
353
+ const result = {
354
+ subject: record.subject,
355
+ clientId: record.clientId,
356
+ scopes: [...record.scope],
357
+ };
358
+ this.authCache.set(token, { expiresAt: now + AUTH_CACHE_TTL_MS, result });
359
+ return result;
360
+ }
361
+ invalidateAuthCache(token) {
362
+ this.authCache.delete(token);
363
+ }
364
+ /**
365
+ * Revoke a token per RFC 7009.
366
+ *
367
+ * Accepts either an access_token or refresh_token. Uses `tokenTypeHint`
368
+ * to try the likely type first, then falls back to the other. Always
369
+ * returns `ok: true` — callers must not reveal whether a token existed.
370
+ *
371
+ * For confidential clients, `clientId` + `clientSecret` must match the
372
+ * registered client. For public clients (PKCE), only `clientId` is needed.
373
+ *
374
+ * Returns `{ ok: true }` on success.
375
+ * Throws if `clientId` is unknown or credentials are invalid.
376
+ */
377
+ async revokeToken(input) {
378
+ const client = await this.findClient(input.clientId);
379
+ if (!client) {
380
+ throw new Error("Unknown client_id");
381
+ }
382
+ if (client.tokenEndpointAuthMethod !== "none" && client.clientSecret !== input.clientSecret) {
383
+ throw new Error("Invalid client credentials");
384
+ }
385
+ // Determine lookup order based on hint (RFC 7009 §2.1)
386
+ const hint = input.tokenTypeHint;
387
+ const order = hint === "refresh_token"
388
+ ? ["refresh_token", "access_token"]
389
+ : ["access_token", "refresh_token"];
390
+ this.authCache.delete(input.token);
391
+ for (const tokenType of order) {
392
+ const record = await this.store.find(tokenType, input.token);
393
+ if (record) {
394
+ await this.store.delete(tokenType, input.token);
395
+ // RFC 7009 §2: revoking a refresh token also invalidates all derived access tokens
396
+ if (tokenType === "refresh_token") {
397
+ for (const [cachedToken, entry] of this.authCache) {
398
+ if (entry.result.subject === record.subject && entry.result.clientId === record.clientId) {
399
+ this.authCache.delete(cachedToken);
400
+ }
401
+ }
402
+ await this.store.deleteAllForSubject(record.subject, record.clientId, "access_token");
403
+ }
404
+ return;
405
+ }
406
+ }
407
+ // Token not found — silently succeed per RFC 7009 §2.2
408
+ }
409
+ async issueTokens(clientId, subject, scope) {
410
+ const accessToken = randomToken("atk");
411
+ const refreshToken = randomToken("rtk");
412
+ await Promise.all([
413
+ this.store.save({
414
+ type: "access_token",
415
+ token: accessToken,
416
+ clientId,
417
+ subject,
418
+ scope: [...scope],
419
+ expiresAt: Date.now() + ACCESS_TOKEN_TTL_MS,
420
+ }),
421
+ this.store.save({
422
+ type: "refresh_token",
423
+ token: refreshToken,
424
+ clientId,
425
+ subject,
426
+ scope: [...scope],
427
+ expiresAt: Date.now() + REFRESH_TOKEN_TTL_MS,
428
+ }),
429
+ ]);
430
+ return {
431
+ tokenType: "Bearer",
432
+ accessToken,
433
+ expiresIn: Math.floor(ACCESS_TOKEN_TTL_MS / 1000),
434
+ refreshToken,
435
+ scope: scope.join(" "),
436
+ };
437
+ }
438
+ async registerDynamicClient(input) {
439
+ if (!Array.isArray(input.redirectUris) || input.redirectUris.length === 0) {
440
+ throw new Error("redirect_uris is required and must be a non-empty array");
441
+ }
442
+ const ALLOWED_HTTPS_REDIRECT_HOSTS = new Set([
443
+ "vscode.dev",
444
+ "chatgpt.com",
445
+ "chat.openai.com",
446
+ "claude.ai",
447
+ ]);
448
+ for (const uri of input.redirectUris) {
449
+ try {
450
+ const u = new URL(uri);
451
+ const isLoopback = (u.protocol === "http:" || u.protocol === "https:") &&
452
+ (u.hostname === "127.0.0.1" || u.hostname === "localhost");
453
+ const isCustomScheme = u.protocol !== "http:" && u.protocol !== "https:";
454
+ const isAllowedHttpsHost = u.protocol === "https:" && ALLOWED_HTTPS_REDIRECT_HOSTS.has(u.hostname);
455
+ if (!isLoopback && !isCustomScheme && !isAllowedHttpsHost) {
456
+ throw new Error(`redirect_uri must be a loopback, custom-scheme, or approved redirect URI: ${uri}`);
457
+ }
458
+ }
459
+ catch (e) {
460
+ if (e instanceof Error && e.message.startsWith("redirect_uri"))
461
+ throw e;
462
+ throw new Error(`Invalid redirect_uri: ${uri}`);
463
+ }
464
+ }
465
+ const clientId = randomToken("mcpsrv");
466
+ const config = {
467
+ clientId,
468
+ tokenEndpointAuthMethod: "none",
469
+ redirectUris: [...input.redirectUris],
470
+ scopes: ["wiki.read", "wiki.write"],
471
+ };
472
+ this.clients.set(clientId, config);
473
+ if (this.clientStore) {
474
+ await this.clientStore.save({
475
+ clientId,
476
+ redirectUris: config.redirectUris,
477
+ scopes: config.scopes,
478
+ createdAt: Date.now(),
479
+ });
480
+ }
481
+ return {
482
+ clientId,
483
+ redirectUris: config.redirectUris,
484
+ tokenEndpointAuthMethod: "none",
485
+ grantTypes: ["authorization_code", "refresh_token"],
486
+ responseTypes: ["code"],
487
+ scope: config.scopes.join(" "),
488
+ };
489
+ }
490
+ }
491
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AA0B5B,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACvC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACtD,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAOpC,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,QAAkB;IAChE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClD,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC1D,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAClE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAEhE,IAAI,cAAc,IAAI,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;QAC9D,OAAO;YACL;gBACE,QAAQ,EAAE,cAAc;gBACxB,YAAY,EAAE,kBAAkB;gBAChC,uBAAuB,EAAE,oBAAoB;gBAC7C,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/E,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;aACpC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,KAAgC,CAAC;YAC9C,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC;YAClD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;gBACnD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBACrE,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBAC/D,CAAC,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAEhC,MAAM,uBAAuB,GAAiD,cAAc;gBAC1F,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,oBAAoB,CAAC;YAEzB,OAAO;gBACL,QAAQ;gBACR,YAAY,EAAE,YAAY,IAAI,SAAS;gBACvC,uBAAuB;gBACvB,YAAY;gBACZ,MAAM;aACP,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,sFAAsF;AACtF,4FAA4F;AAC5F,2CAA2C;AAC3C,SAAS,oBAAoB,CAAC,UAAoB,EAAE,SAAiB;IACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,gDAAgD;IAChD,0EAA0E;IAC1E,sEAAsE;IACtE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;YACjD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;oBAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;wBACpE,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,UAAU,GACd,GAAG,CAAC,QAAQ,KAAK,OAAO;YACxB,CAAC,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvB,OAAO,CACL,GAAG,CAAC,QAAQ,KAAK,OAAO;oBACxB,CAAC,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,CAAC;oBAC9D,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAC9B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,KAAK,CAAa;IAClB,WAAW,CAAqB;IAChC,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEhE,YAAY,KAAiB,EAAE,cAAkC,IAAI;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC;QAC1D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACxE,CAAC;IAEO,sBAAsB;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;QACzB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgD,CAAC;QACxE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IAChE,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,MAAM,GAAsB;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,uBAAuB,EAAE,MAAM;YAC/B,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;YACtC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;SAC3B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,KAQ9B;QACC,IAAI,KAAK,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,KAAK,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,OAAO,EAAE,CAAC;YAC/G,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,QAAgB;QAClD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YACpG,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;YAClG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,oCAAoC,EAAE;YACpF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI,CAAC,eAAe;gBAC5B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,QAAQ;gBACf,QAAQ;aACT,CAAC;SACH,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAwD,CAAC;YAC/G,MAAM,MAAM,GAAG,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,GAAG,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAEhD,CAAC;QAET,OAAO,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAmB;QACxE,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0DAA0D,EAAE,CAAC;QAC1F,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,iBAAiB,CAAC,CAAC;QAChE,IAAI,UAAU;YAAE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI,CAAC,eAAe;gBAC5B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;QAC9E,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA8C,CAAC;YACpG,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,gDAAgD,CAAC;YAC3F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACnC,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAO5B;QACC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACpB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB;SACzC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,KAM/B;QACC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,MAAM,CAAC,uBAAuB,KAAK,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,KAAK,OAAO;gBACrD,CAAC,CAAC,KAAK,CAAC,YAAY;gBACpB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAExC,IAAI,QAAQ,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAIxB;QACC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,MAAM,CAAC,uBAAuB,KAAK,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7D,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,KAAa;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QAE3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;SAC1B,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,WAAW,CAAC,KAKjB;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,MAAM,CAAC,uBAAuB,KAAK,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,uDAAuD;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;QACjC,MAAM,KAAK,GACT,IAAI,KAAK,eAAe;YACtB,CAAC,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC;YACnC,CAAC,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAExC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChD,mFAAmF;gBACnF,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;oBAClC,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBAClD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACzF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;wBACrC,CAAC;oBACH,CAAC;oBACD,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBACxF,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QACD,uDAAuD;IACzD,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAe,EAAE,KAAe;QAC1E,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,WAAW;gBAClB,QAAQ;gBACR,OAAO;gBACP,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB;aAC5C,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,YAAY;gBACnB,QAAQ;gBACR,OAAO;gBACP,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,oBAAoB;aAC7C,CAAC;SACH,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;YACjD,YAAY;YACZ,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAO3B;QACC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;YAC3C,YAAY;YACZ,aAAa;YACb,iBAAiB;YACjB,WAAW;SACZ,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,MAAM,UAAU,GACd,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;oBACnD,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;gBAC7D,MAAM,cAAc,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;gBACzE,MAAM,kBAAkB,GACtB,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC1E,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC1D,MAAM,IAAI,KAAK,CAAC,6EAA6E,GAAG,EAAE,CAAC,CAAC;gBACtG,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;oBAAE,MAAM,CAAC,CAAC;gBACxE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAsB;YAChC,QAAQ;YACR,uBAAuB,EAAE,MAAM;YAC/B,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;YACrC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;SACpC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBAC1B,QAAQ;gBACR,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,QAAQ;YACR,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,uBAAuB,EAAE,MAAM;YAC/B,UAAU,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;YACnD,aAAa,EAAE,CAAC,MAAM,CAAC;YACvB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SAC/B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Personal Access Token (PAT) store.
3
+ *
4
+ * PATs are long-lived, user-scoped bearer tokens meant for CLI / local-first
5
+ * workflows where re-authenticating every hour is impractical. They are
6
+ * distinct from the short-lived Supabase JWTs and the workspace-wide
7
+ * BRAINS_API_KEY — each PAT is tied to the Supabase/OAuth user who minted it
8
+ * and is stored alongside their wiki content under `users/<subject>/`.
9
+ *
10
+ * Two backends, auto-selected (mirrors createTokenStore):
11
+ * - LocalSQLitePATStore — adds a `pats` table to the existing oauth-tokens
12
+ * SQLite database. Good for single-instance / local runs.
13
+ * - PostgresPATStore — PostgREST-backed, stored in a `pats` table.
14
+ * Requires scripts/pats.sql to be applied once.
15
+ *
16
+ * expires_at is nullable — NULL means the token never expires.
17
+ */
18
+ export declare const PAT_EXPIRY_DAYS_DEFAULT = 30;
19
+ export declare const PAT_EXPIRY_DAYS_MAX = 365;
20
+ export interface PAT {
21
+ id: string;
22
+ subject: string;
23
+ label: string;
24
+ scopes: string[];
25
+ expiresAt: number | null;
26
+ createdAt: number;
27
+ }
28
+ export interface PATWithToken extends PAT {
29
+ token: string;
30
+ }
31
+ export interface PATStore {
32
+ /** Mint a new PAT; returns the record including the raw token (only time it's visible). */
33
+ create(subject: string, label: string, scopes: string[], expiresAt: number | null): Promise<PATWithToken>;
34
+ /** Validate a bearer token; returns the PAT metadata or null if invalid/expired. */
35
+ find(token: string): Promise<PAT | null>;
36
+ /** List all non-expired PATs for a subject (token value is never returned). */
37
+ list(subject: string): Promise<PAT[]>;
38
+ /** Revoke a PAT by id. Returns true if deleted, false if not found or subject mismatch. */
39
+ revoke(id: string, subject: string): Promise<boolean>;
40
+ /** Prune expired PATs (called periodically). Never-expiring tokens are not pruned. */
41
+ pruneExpired(): Promise<void>;
42
+ }
43
+ export declare class LocalSQLitePATStore implements PATStore {
44
+ private readonly db;
45
+ constructor(storageLocation: string);
46
+ private initSchema;
47
+ /** Migrate existing tables that have NOT NULL on expires_at to allow NULL. */
48
+ private migrateNullableExpiry;
49
+ create(subject: string, label: string, scopes: string[], expiresAt: number | null): Promise<PATWithToken>;
50
+ find(token: string): Promise<PAT | null>;
51
+ list(subject: string): Promise<PAT[]>;
52
+ revoke(id: string, subject: string): Promise<boolean>;
53
+ pruneExpired(): Promise<void>;
54
+ }
55
+ export declare class PostgresPATStore implements PATStore {
56
+ private readonly supabaseUrl;
57
+ private readonly serviceRoleKey;
58
+ /**
59
+ * Validation cache, keyed by raw token.
60
+ *
61
+ * find() runs on every bearer-authenticated request and was an uncached
62
+ * Supabase round trip — ~175ms, measured (GH #427). Worse, PATs are
63
+ * indistinguishable from OAuth tokens (both opaque hex), so PAT lookup runs
64
+ * first and every OAuth/MCP request paid that round trip for a query
65
+ * guaranteed to miss. Negative results are therefore cached too; that is
66
+ * where most of the saving is.
67
+ *
68
+ * Revocation stays immediate: revoke() and pruneExpired() clear the cache,
69
+ * and create() seeds it. Only out-of-band changes (direct SQL) wait out the
70
+ * TTL — the same tradeoff auth/supabase.ts already accepts.
71
+ */
72
+ private readonly cache;
73
+ constructor(supabaseUrl: string, serviceRoleKey: string);
74
+ private cacheTtlMs;
75
+ private cacheSet;
76
+ /** Drop all cached validations. Called whenever a PAT is revoked or pruned. */
77
+ invalidateCache(): void;
78
+ private get baseUrl();
79
+ private headers;
80
+ create(subject: string, label: string, scopes: string[], expiresAt: number | null): Promise<PATWithToken>;
81
+ find(token: string): Promise<PAT | null>;
82
+ list(subject: string): Promise<PAT[]>;
83
+ revoke(id: string, subject: string): Promise<boolean>;
84
+ pruneExpired(): Promise<void>;
85
+ }
86
+ export declare function createPATStore(storageLocation: string): PATStore;
87
+ //# sourceMappingURL=patStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patStore.d.ts","sourceRoot":"","sources":["../../src/auth/patStore.ts"],"names":[],"mappings":"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"}