@abtnode/blocklet-services 1.16.42-beta-20250412-084444-20b0cf19 → 1.16.42-beta-20250415-222652-04c5d2fe

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 (340) hide show
  1. package/api/index.js +36 -5
  2. package/api/libs/auth/index.js +5 -5
  3. package/api/libs/connect/session.js +29 -3
  4. package/api/libs/jwt.js +36 -1
  5. package/api/libs/push-kit/index.js +16 -11
  6. package/api/routes/federated.js +1 -1
  7. package/api/routes/mcp.js +26 -13
  8. package/api/routes/{oauth.js → oauth/client.js} +22 -21
  9. package/api/routes/oauth/server.js +95 -0
  10. package/api/routes/user-session.js +49 -40
  11. package/api/routes/user.js +21 -8
  12. package/api/services/auth/connect/gen-access-key.js +92 -0
  13. package/api/services/auth/index.js +8 -0
  14. package/api/services/auth/passkey.js +1 -1
  15. package/api/services/auth/session.js +39 -13
  16. package/api/services/dashboard/index.js +6 -0
  17. package/api/services/mcp/server.js +151 -32
  18. package/api/services/notification/queue.js +9 -6
  19. package/api/services/oauth/server.js +213 -0
  20. package/api/util/attach-shared-utils.js +12 -5
  21. package/api/util/index.js +1 -1
  22. package/api/util/user-util.js +1 -21
  23. package/dist/assets/AdapterDayjs-BLBXeg9J.js +3 -0
  24. package/dist/assets/{ArrowDropDown-C_E3qkPd.js → ArrowDropDown--dAaadP8.js} +1 -1
  25. package/dist/assets/{CheckCircle-D7Ntmb2o.js → CheckCircle-Av1UotA-.js} +1 -1
  26. package/dist/assets/{ChevronLeft-BIgT65EY.js → ChevronLeft-De8Da-PB.js} +1 -1
  27. package/dist/assets/{ChevronRight-foZmiP4J.js → ChevronRight-CQOI2CyK.js} +1 -1
  28. package/dist/assets/{Community-Ds1NG5Zj.js → Community-B_YqAP9P.js} +1 -1
  29. package/dist/assets/{DeleteOutline-CKVA3PXs.js → DeleteOutline-Cgoi-K0i.js} +1 -1
  30. package/dist/assets/{Done-BDrYSkZM.js → Done-BYuUlh_s.js} +1 -1
  31. package/dist/assets/{Download-BQiSNQBP.js → Download-DUKR_Wkm.js} +1 -1
  32. package/dist/assets/Edit-D2RQMivt.js +1 -0
  33. package/dist/assets/{EditIcon-Bt91o1l6.js → EditIcon-5ixNT5sW.js} +1 -1
  34. package/dist/assets/{Email-C7SKOpM8.js → Email-RGD-rKFl.js} +1 -1
  35. package/dist/assets/{Error-CK4gTMoT.js → Error-By0ZMWzh.js} +1 -1
  36. package/dist/assets/{ExpandLess-1B6PdCYC.js → ExpandLess-BNGLjxae.js} +1 -1
  37. package/dist/assets/{Google-DimUFzIe.js → Google-tZCjvU7D.js} +1 -1
  38. package/dist/assets/{Holiday-Dfj3kBBI.js → Holiday-C_1hMIGZ.js} +1 -1
  39. package/dist/assets/{InfoOutlined-CEHciuDy.js → InfoOutlined-DSoJjRQo.js} +1 -1
  40. package/dist/assets/{Launch-DX76v5dw.js → Launch-B161pSEw.js} +1 -1
  41. package/dist/assets/{LaunchOutlined-CnOQGhu-.js → LaunchOutlined-wehxIahb.js} +1 -1
  42. package/dist/assets/{Location--4ueDivQ.js → Location-B6FoL795.js} +1 -1
  43. package/dist/assets/{LockIcon-B84lMZao.js → LockIcon-D3vSMIOk.js} +1 -1
  44. package/dist/assets/{Meeting-CVVnP-bH.js → Meeting-BfKca-xn.js} +1 -1
  45. package/dist/assets/{MoreHoriz-THEF6D0C.js → MoreHoriz-Bo_R2nuS.js} +1 -1
  46. package/dist/assets/{OffSick-C_2x7yDI.js → OffSick-QPPyYyU6.js} +1 -1
  47. package/dist/assets/{Phone-CaKOX2Yu.js → Phone-_lRBpoVi.js} +1 -1
  48. package/dist/assets/{PlayArrow-DpcMtsY5.js → PlayArrow-D38lbyGo.js} +1 -1
  49. package/dist/assets/{QuestionMarkCircle-5K6WR8Pc.js → QuestionMarkCircle-B4EnwYju.js} +1 -1
  50. package/dist/assets/{ServerLogo-C4P-qXGV.js → ServerLogo-BW4PKwV0.js} +1 -1
  51. package/dist/assets/{Timezone-Bgwxnj29.js → Timezone-bYzGwn3x.js} +1 -1
  52. package/dist/assets/{TuneOutlined-DHqZ7jGz.js → TuneOutlined-DMMtKa6E.js} +1 -1
  53. package/dist/assets/{ViewList-DOu7Co_L.js → ViewList-CMIoKrN6.js} +1 -1
  54. package/dist/assets/{WorkingRemotely-Dm2BOs5c.js → WorkingRemotely-BK9_vlZ-.js} +1 -1
  55. package/dist/assets/{access-control-wqGz9JCo.js → access-control-DLD9n3S7.js} +1 -1
  56. package/dist/assets/actions-CMsM02NP.js +1 -0
  57. package/dist/assets/add-component-core-FnU4dwXM.js +763 -0
  58. package/dist/assets/{add-resource-DmN1IY_o.js → add-resource-CubCXHBS.js} +1 -1
  59. package/dist/assets/{addon-D1_etOjl.js → addon-5JaI2ctX.js} +1 -1
  60. package/dist/assets/advanced-D4wfoh0v.js +14 -0
  61. package/dist/assets/api-3sG9at7i.js +1 -0
  62. package/dist/assets/appearance-BUsj4DWC.js +1 -0
  63. package/dist/assets/{ar-DrRqcx2b.js → ar-BUQWR0Zu.js} +1 -1
  64. package/dist/assets/{ar-Cb5zQ0go.js → ar-CMzth4YC.js} +3 -3
  65. package/dist/assets/{audit-logs-DU66CSpw.js → audit-logs-rk_iUYcM.js} +3 -3
  66. package/dist/assets/authorize-CDJXjmiI.js +1 -0
  67. package/dist/assets/{base32-CLGITfm-.js → base32-BhlNgZPk.js} +1 -1
  68. package/dist/assets/{branding-C5rNAfwW.js → branding-BBbE2Klb.js} +1 -1
  69. package/dist/assets/branding-JQ1914RB.js +40 -0
  70. package/dist/assets/{bundle-avatar-vSofRY4G.js → bundle-avatar-woUZoGoi.js} +1 -1
  71. package/dist/assets/button-Rx3uHycr.js +1 -0
  72. package/dist/assets/click-to-copy-BxZJa7n5.js +1 -0
  73. package/dist/assets/cloneDeep-kMVNpUap.js +1 -0
  74. package/dist/assets/{complete-BeWyfTmK.js → complete-KnPBZq-P.js} +2 -2
  75. package/dist/assets/{component-CZ948vh4.js → component-fD-EGTLm.js} +80 -80
  76. package/dist/assets/{config-CFbM7U_5.js → config-8xeoVfWN.js} +2 -2
  77. package/dist/assets/{config-DzZULB-q.js → config-DbqQgRSU.js} +1 -1
  78. package/dist/assets/config-navigation-DrgPbe5I.js +26 -0
  79. package/dist/assets/{config-space-Drp9NI7a.js → config-space-DZ9w_4_9.js} +1 -1
  80. package/dist/assets/confirm-_RIb3OmR.js +7 -0
  81. package/dist/assets/{connect-0zFqdTRm.js → connect-CJOq1BXE.js} +1 -1
  82. package/dist/assets/{connect-CpUC5BAX.js → connect-CPIImVme.js} +1 -1
  83. package/dist/assets/{connect-to-BasQxweP.js → connect-to-BdhN0BHi.js} +1 -1
  84. package/dist/assets/{content-layout-Bs-vdQ_U.js → content-layout-BM34AwsG.js} +1 -1
  85. package/dist/assets/dashboard-vsk4QHJ1.js +275 -0
  86. package/dist/assets/de-BkBUnf4o.js +13 -0
  87. package/dist/assets/{de-BRPos3d1.js → de-_X0eQXZu.js} +1 -1
  88. package/dist/assets/delete-confirm-DaoAi4Gz.js +1 -0
  89. package/dist/assets/did-address-CGHn52xI.js +1 -0
  90. package/dist/assets/domain-BJUSWYGQ.js +9 -0
  91. package/dist/assets/domain-action-card-9r42-rWK.js +29 -0
  92. package/dist/assets/domains-BNDFk-7R.js +1 -0
  93. package/dist/assets/{email-C5iUsSjP.js → email-fp1LVcF6.js} +3 -3
  94. package/dist/assets/empty-spinner-Ict2ItjU.js +1 -0
  95. package/dist/assets/es-C47yMWlQ.js +14 -0
  96. package/dist/assets/{es-D2rCdMgt.js → es-yHIDSG5r.js} +1 -1
  97. package/dist/assets/{exchange-passport-CyGvLDal.js → exchange-passport-DIyhYtFS.js} +1 -1
  98. package/dist/assets/{format-error-BrmqJs5a.js → format-error-LAoTjvJe.js} +1 -1
  99. package/dist/assets/{fr-Chv_7X3-.js → fr-CXUB715N.js} +3 -3
  100. package/dist/assets/{fr-DAFx50ef.js → fr-D6i3bCqR.js} +1 -1
  101. package/dist/assets/{fuel-C5H_z1Ay.js → fuel-aGwI1uP2.js} +1 -1
  102. package/dist/assets/gen-access-key-DMS1kzry.js +2 -0
  103. package/dist/assets/{get-safe-url-BOY9UAaI.js → get-safe-url-DMordnyN.js} +1 -1
  104. package/dist/assets/{get-safe-url-D_Puq_oh.js → get-safe-url-DW2Z07ex.js} +1 -1
  105. package/dist/assets/{hi-CkD7b6N9.js → hi-ChVLDWm_.js} +1 -1
  106. package/dist/assets/hi-DCG5QxbH.js +11 -0
  107. package/dist/assets/{home-CjHQSa_8.js → home-B_gUzcjU.js} +1 -1
  108. package/dist/assets/id-BjbrrkXh.js +14 -0
  109. package/dist/assets/{id-BMWKdVei.js → id-D6XXuY_a.js} +1 -1
  110. package/dist/assets/{iframe-BhRKCdFb.js → iframe-BEanRyio.js} +1 -1
  111. package/dist/assets/index-4rY7Xp2W.js +14 -0
  112. package/dist/assets/{index-CjmXl7jW.js → index-AhbLOD9c.js} +1 -1
  113. package/dist/assets/{index-CYAgDp3G.js → index-BDNlzmD0.js} +4 -4
  114. package/dist/assets/{index-BjYech25.js → index-BPa_QtWl.js} +30 -30
  115. package/dist/assets/index-BjN8LAYh.js +224 -0
  116. package/dist/assets/index-BmexzVQt.js +1 -0
  117. package/dist/assets/{index-C1nvgBfF.js → index-C-7MyHbp.js} +1 -1
  118. package/dist/assets/index-C0hr4pkt.js +346 -0
  119. package/dist/assets/{index-d34Q6nXR.js → index-CFJtmMCn.js} +1 -1
  120. package/dist/assets/index-CFkRKsyT.js +290 -0
  121. package/dist/assets/{index-9aeq_G-H.js → index-CX4jvZnM.js} +1 -1
  122. package/dist/assets/{index-CVIeQOoE.js → index-CbW18ndN.js} +2 -2
  123. package/dist/assets/index-CcjD0qiY.js +93 -0
  124. package/dist/assets/{index-Cuoxr9xB.js → index-D1fVmwHN.js} +1 -1
  125. package/dist/assets/{index-Du2DtxVt.js → index-D22ZWGxu.js} +1 -1
  126. package/dist/assets/{index-C5lvlGzp.js → index-D22lazSG.js} +3 -3
  127. package/dist/assets/{index-B8FtPEFx.js → index-D2EAXstd.js} +2 -2
  128. package/dist/assets/index-DBZZ-U66.js +1 -0
  129. package/dist/assets/index-DUQK_NaI.js +113 -0
  130. package/dist/assets/{index-Ctl8J5Z5.js → index-D_gSWW1P.js} +1 -1
  131. package/dist/assets/index-DbpVrp8z.js +138 -0
  132. package/dist/assets/{index-BYsXlcQC.js → index-DkPKxdcu.js} +1 -1
  133. package/dist/assets/{index-DkZfhapD.js → index-DzDfEcNp.js} +1 -1
  134. package/dist/assets/{index-BTOIZL6e.js → index-O2l0NSUF.js} +1 -1
  135. package/dist/assets/{index-CPE8Apzb.js → index-pV_0wOyY.js} +1 -1
  136. package/dist/assets/{index-DVQCgvFb.js → index-tUQxVYYQ.js} +1 -1
  137. package/dist/assets/index-xa5W6ExD.js +1 -0
  138. package/dist/assets/{invitation-C9hFp_wD.js → invitation-D-l4US6a.js} +3 -3
  139. package/dist/assets/invite-DPswrm4J.js +1 -0
  140. package/dist/assets/{issue-passport-D3F63x7z.js → issue-passport-AJghkFHK.js} +1 -1
  141. package/dist/assets/item-zk7clNKz.js +2 -0
  142. package/dist/assets/{ja-D2jInSAT.js → ja-DKZCt8Yp.js} +1 -1
  143. package/dist/assets/ja-DmNZQIta.js +14 -0
  144. package/dist/assets/{ko-BGB5KJZq.js → ko-B0uE9AyQ.js} +1 -1
  145. package/dist/assets/ko-CfYwMwZz.js +14 -0
  146. package/dist/assets/{landing-page-B5nKEn_3.js → landing-page-D13wALfk.js} +1 -1
  147. package/dist/assets/{launch-result-message-C0Ao1hE-.js → launch-result-message-Bvdtucih.js} +1 -1
  148. package/dist/assets/{layout-D5ALyxXA.js → layout-aS-gjZH3.js} +1 -1
  149. package/dist/assets/list-CJt5nOcn.js +234 -0
  150. package/dist/assets/{list-header-BibBP5t1.js → list-header-Bm8u_Z_p.js} +1 -1
  151. package/dist/assets/localization-Us9buoy1.js +1 -0
  152. package/dist/assets/{log-Dg8IZoeo.js → log-DFaz-U9x.js} +7 -7
  153. package/dist/assets/{logger-Bd77RetM.js → logger-DXlQ8ejK.js} +1 -1
  154. package/dist/assets/{login-B9XiO8eS.js → login-DKSu0ge6.js} +1 -1
  155. package/dist/assets/login-oauth-callback-CP7cNspN.js +1 -0
  156. package/dist/assets/{logo-uploader-ChABQ_cS.js → logo-uploader-B7i5QemW.js} +5 -5
  157. package/dist/assets/{lost-passport-gGzRW--h.js → lost-passport-QRUn4RXe.js} +3 -3
  158. package/dist/assets/{lottie-react.esm-D2t-u0YU.js → lottie-react.esm-CPHH620R.js} +1 -1
  159. package/dist/assets/{lottie-web-jYmAQWuC.js → lottie-web-B6s7dDoL.js} +1 -1
  160. package/dist/assets/omit-MMUW2k9W.js +1 -0
  161. package/dist/assets/{open-window-CX_mRFPs.js → open-window-B6LZyZAW.js} +1 -1
  162. package/dist/assets/{overview-ClfPLbRa.js → overview-B3A_5sHO.js} +2 -2
  163. package/dist/assets/{page-header-DWf5vODI.js → page-header-DUh_2MUQ.js} +1 -1
  164. package/dist/assets/passport-item-BY6VS7Ot.js +1 -0
  165. package/dist/assets/{permission-CmHMB8NK.js → permission-DKFJEWNH.js} +1 -1
  166. package/dist/assets/preferences-CA76rfbp.js +1 -0
  167. package/dist/assets/profile-embed-DHFHXO1W.js +1 -0
  168. package/dist/assets/{pt-DY0Ku5W5.js → pt-DCzE4kPq.js} +1 -1
  169. package/dist/assets/pt-DD_rP5GH.js +12 -0
  170. package/dist/assets/publish-resource-rxvf6s83.js +1 -0
  171. package/dist/assets/{raf-schd.esm-B3j6BePR.js → raf-schd.esm-GV-XhwE0.js} +1 -1
  172. package/dist/assets/{react-beautiful-dnd.esm-B3HYEQUw.js → react-beautiful-dnd.esm-D0nBCaor.js} +1 -1
  173. package/dist/assets/{relative-time-CE47D6s7.js → relative-time-BK3hjJNN.js} +1 -1
  174. package/dist/assets/roboto-latin-400-normal-BVyCgWwA.woff +0 -0
  175. package/dist/assets/roboto-latin-400-normal-DXyFPIdK.woff2 +0 -0
  176. package/dist/assets/roboto-latin-500-normal-C6iW8rdg.woff2 +0 -0
  177. package/dist/assets/roboto-latin-500-normal-rpP1_v3s.woff +0 -0
  178. package/dist/assets/roboto-latin-700-normal-BWcFiwQV.woff +0 -0
  179. package/dist/assets/roboto-latin-700-normal-CbYYDfWS.woff2 +0 -0
  180. package/dist/assets/roboto-latin-ext-400-normal-BSFkPfbf.woff +0 -0
  181. package/dist/assets/roboto-latin-ext-400-normal-DgXbz5gU.woff2 +0 -0
  182. package/dist/assets/roboto-latin-ext-500-normal-DvHxAkTn.woff +0 -0
  183. package/dist/assets/roboto-latin-ext-500-normal-OQJhyaXd.woff2 +0 -0
  184. package/dist/assets/roboto-latin-ext-700-normal-Ba-CAIIA.woff +0 -0
  185. package/dist/assets/roboto-latin-ext-700-normal-DchBbzVz.woff2 +0 -0
  186. package/dist/assets/{ru-Cv5vRo7s.js → ru-B9yj9TuE.js} +1 -1
  187. package/dist/assets/ru-CwgUUzV8.js +11 -0
  188. package/dist/assets/runtime-D_bXZ0w0.js +1 -0
  189. package/dist/assets/sdk-Hg_BMu_u.js +1 -0
  190. package/dist/assets/{security-DmjkCoJ_.js → security-DEmFjZiu.js} +1 -1
  191. package/dist/assets/session-DB9Du-lc.js +1 -0
  192. package/dist/assets/{setup-DLCw2h80.js → setup-kkb6SvQ7.js} +4 -4
  193. package/dist/assets/{shorten-label-DDBwv81M.js → shorten-label-CwDvu4_S.js} +1 -1
  194. package/dist/assets/simple-select-DgqUhMvQ.js +1 -0
  195. package/dist/assets/{slicedToArray-Da5X2Yv5.js → slicedToArray-B8PdYes9.js} +1 -1
  196. package/dist/assets/{spaces-CyFGYf34.js → spaces-25E9GQ6_.js} +1 -1
  197. package/dist/assets/{start-CwSXw9Xs.js → start-DfEUlPuS.js} +1 -1
  198. package/dist/assets/{status-CgfGREVl.js → status-CUyAteC9.js} +1 -1
  199. package/dist/assets/{step-actions-BNW8I1sI.js → step-actions-CAgwlOEY.js} +1 -1
  200. package/dist/assets/{studio-cLKWVbyy.js → studio-2U2-FOOC.js} +1 -1
  201. package/dist/assets/{switch-control-DpvMHPLC.js → switch-control-DwTxPESj.js} +1 -1
  202. package/dist/assets/th-KqE3tuDR.js +12 -0
  203. package/dist/assets/{th-D6oDBVGi.js → th-et0IV3ES.js} +1 -1
  204. package/dist/assets/traffic-B94bYvtf.js +35 -0
  205. package/dist/assets/{transfer-BHifjdxl.js → transfer-DWjvJtPs.js} +1 -1
  206. package/dist/assets/{unsubscribe-CcyOqX8E.js → unsubscribe-CTZlUfqc.js} +1 -1
  207. package/dist/assets/use-mobile-BHPd3bDQ.js +1 -0
  208. package/dist/assets/use-mobile-CHMVa8_W.js +1 -0
  209. package/dist/assets/{useAsync-BENTIUEf.js → useAsync-DKE0K0bz.js} +1 -1
  210. package/dist/assets/{useAsyncRetry-DSYkC9r5.js → useAsyncRetry-BBomZj1z.js} +2 -2
  211. package/dist/assets/{useLocalStorage-Cq9THoCr.js → useLocalStorage-DKl7XFfI.js} +1 -1
  212. package/dist/assets/{useSetState-CWq0AVWn.js → useSetState-BL3ktMon.js} +1 -1
  213. package/dist/assets/user-center-Du6EtGgy.js +77 -0
  214. package/dist/assets/{util-BmbbisPE.js → util-BEvdQ5nP.js} +1 -1
  215. package/dist/assets/{util-1n1Ulk5w.js → util-DkIhTuT7.js} +1 -1
  216. package/dist/assets/{vendor-arcblock-V3HYELzG.js → vendor-arcblock-ACo-BN0q.js} +83 -83
  217. package/dist/assets/{vendor-hooks-DN4nZ7TU.js → vendor-hooks-BwVH-TAd.js} +2 -2
  218. package/dist/assets/{vendor-mui-core-1jJmAutq.js → vendor-mui-core-DxD1UA4o.js} +2 -2
  219. package/dist/assets/vendor-mui-x-Bit8yv3W.js +6 -0
  220. package/dist/assets/{vendor-react-DEoibe3W.js → vendor-react-DoD83n6N.js} +1 -1
  221. package/dist/assets/vendor-utils-CTIzdAFg.js +11 -0
  222. package/dist/assets/vendor-ux-did-connect-2GapMFC4.css +1 -0
  223. package/dist/assets/vendor-ux-did-connect-DOjsg91L.js +1832 -0
  224. package/dist/assets/vi-BSkiIyr-.js +12 -0
  225. package/dist/assets/{vi-BKKJMbW2.js → vi-LBvVt_pj.js} +1 -1
  226. package/dist/assets/wrap-locale-DjpRZNtr.js +1 -0
  227. package/dist/assets/{zh-nDA-W8Iz.js → zh-BYP8UvRZ.js} +4 -4
  228. package/dist/assets/{zh-tw-B9PQstHP.js → zh-tw-Dcs2VpLv.js} +3 -3
  229. package/dist/assets/{zh-tw-B08rjgK3.js → zh-tw-l3XXo5aT.js} +1 -1
  230. package/dist/assets/{zh-gJhiLbCP.js → zh-yJzqRkfw.js} +1 -1
  231. package/dist/index.html +9 -9
  232. package/dist/service-worker.js +2 -2
  233. package/package.json +45 -43
  234. package/dist/assets/actions-CAL1KFv7.js +0 -1
  235. package/dist/assets/add-component-core-DqvSoT6a.js +0 -762
  236. package/dist/assets/advanced-CzJgEcda.js +0 -14
  237. package/dist/assets/api-kwOW9mRz.js +0 -1
  238. package/dist/assets/appearance-Bn0kYJHu.js +0 -1
  239. package/dist/assets/branding-CiE421Dn.js +0 -40
  240. package/dist/assets/button-BSJ2z68-.js +0 -1
  241. package/dist/assets/click-to-copy-C9iEVQIO.js +0 -1
  242. package/dist/assets/cloneDeep-DHAAvuEH.js +0 -1
  243. package/dist/assets/config-navigation-hrdLDyFZ.js +0 -26
  244. package/dist/assets/confirm-B9OqaJpT.js +0 -7
  245. package/dist/assets/dashboard-BYUKOMAe.js +0 -262
  246. package/dist/assets/de-BOcpEFUQ.js +0 -13
  247. package/dist/assets/delete-confirm-CM4f-ajO.js +0 -1
  248. package/dist/assets/did-address-B_VfxEC5.js +0 -1
  249. package/dist/assets/domain-D0xqhxvZ.js +0 -9
  250. package/dist/assets/domain-action-card-pHkmKFE3.js +0 -29
  251. package/dist/assets/domains-BrNRyjCn.js +0 -1
  252. package/dist/assets/empty-spinner-Cia24BVr.js +0 -1
  253. package/dist/assets/es-DAe7HpzA.js +0 -14
  254. package/dist/assets/hi-BqgGDMzX.js +0 -11
  255. package/dist/assets/id-DbN1Ye4x.js +0 -14
  256. package/dist/assets/index-Bee_YcJC.js +0 -113
  257. package/dist/assets/index-Cp_gD4ZQ.js +0 -1
  258. package/dist/assets/index-D3YZfNxX.js +0 -5
  259. package/dist/assets/index-DFoYVoMG.js +0 -346
  260. package/dist/assets/index-DR9nQ2tJ.js +0 -1
  261. package/dist/assets/index-DUU3hQpo.js +0 -138
  262. package/dist/assets/index-Dzvf3kMf.js +0 -220
  263. package/dist/assets/index-Kaq7tC6c.js +0 -290
  264. package/dist/assets/invite-CzfqL5Tx.js +0 -1
  265. package/dist/assets/item-C_TigVeC.js +0 -2
  266. package/dist/assets/ja-Bv-A_sTl.js +0 -14
  267. package/dist/assets/ko-Bl3kd-sp.js +0 -14
  268. package/dist/assets/list-DuzdV0Wa.js +0 -221
  269. package/dist/assets/localization-WUgLuLwU.js +0 -1
  270. package/dist/assets/login-oauth-callback-5AlLzjZ2.js +0 -1
  271. package/dist/assets/omit-IjXSqbDA.js +0 -1
  272. package/dist/assets/preferences-COMN8FgJ.js +0 -1
  273. package/dist/assets/profile-embed-Crj1xM6Z.js +0 -1
  274. package/dist/assets/pt-B7_jgyK-.js +0 -12
  275. package/dist/assets/publish-resource-C6TOyrHC.js +0 -1
  276. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  277. package/dist/assets/roboto-cyrillic-400-normal-Dry59Hjn.woff +0 -0
  278. package/dist/assets/roboto-cyrillic-500-normal-CsCirF4J.woff +0 -0
  279. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  280. package/dist/assets/roboto-cyrillic-700-normal-CB1Rmiii.woff +0 -0
  281. package/dist/assets/roboto-cyrillic-700-normal-CzEIZVQR.woff2 +0 -0
  282. package/dist/assets/roboto-cyrillic-ext-400-normal-BxX1-eA_.woff +0 -0
  283. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  284. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  285. package/dist/assets/roboto-cyrillic-ext-500-normal-ElvJfk8V.woff +0 -0
  286. package/dist/assets/roboto-cyrillic-ext-700-normal-CIu0AXX2.woff +0 -0
  287. package/dist/assets/roboto-cyrillic-ext-700-normal-D_fA0fHY.woff2 +0 -0
  288. package/dist/assets/roboto-greek-400-normal-CAI06USH.woff +0 -0
  289. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  290. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  291. package/dist/assets/roboto-greek-500-normal-D8eQD5zT.woff +0 -0
  292. package/dist/assets/roboto-greek-700-normal-DCrt6r9F.woff +0 -0
  293. package/dist/assets/roboto-greek-700-normal-DpKAje7q.woff2 +0 -0
  294. package/dist/assets/roboto-latin-400-normal-551zQQ7R.woff +0 -0
  295. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  296. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  297. package/dist/assets/roboto-latin-500-normal-_8jDuD7w.woff +0 -0
  298. package/dist/assets/roboto-latin-700-normal-CTLkNcF_.woff +0 -0
  299. package/dist/assets/roboto-latin-700-normal-DZr4b_KL.woff2 +0 -0
  300. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  301. package/dist/assets/roboto-latin-ext-400-normal-uRIBRJt5.woff +0 -0
  302. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  303. package/dist/assets/roboto-latin-ext-500-normal-eJ10kk0m.woff +0 -0
  304. package/dist/assets/roboto-latin-ext-700-normal-BNPgmEQS.woff2 +0 -0
  305. package/dist/assets/roboto-latin-ext-700-normal-Cnx4FGpK.woff +0 -0
  306. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  307. package/dist/assets/roboto-math-400-normal-DHrwdhE6.woff +0 -0
  308. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  309. package/dist/assets/roboto-math-500-normal-CetgDdIa.woff +0 -0
  310. package/dist/assets/roboto-math-700-normal-CpTCM92H.woff +0 -0
  311. package/dist/assets/roboto-math-700-normal-xbpggnJp.woff2 +0 -0
  312. package/dist/assets/roboto-symbols-400-normal-bG5rsNFs.woff +0 -0
  313. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  314. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  315. package/dist/assets/roboto-symbols-500-normal-toKUCDph.woff +0 -0
  316. package/dist/assets/roboto-symbols-700-normal-B2QKVW64.woff +0 -0
  317. package/dist/assets/roboto-symbols-700-normal-DKkQdRpM.woff2 +0 -0
  318. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  319. package/dist/assets/roboto-vietnamese-400-normal-DgufTq8s.woff +0 -0
  320. package/dist/assets/roboto-vietnamese-500-normal-Dw5heWgq.woff +0 -0
  321. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  322. package/dist/assets/roboto-vietnamese-700-normal-BFWtvCOj.woff2 +0 -0
  323. package/dist/assets/roboto-vietnamese-700-normal-ChAl_rRV.woff +0 -0
  324. package/dist/assets/ru-CToatViJ.js +0 -11
  325. package/dist/assets/runtime-CdKbOwQM.js +0 -1
  326. package/dist/assets/sdk-j4w1A_X4.js +0 -1
  327. package/dist/assets/session-0rF5SuCk.js +0 -1
  328. package/dist/assets/simple-select-vCKkiHhG.js +0 -1
  329. package/dist/assets/th-23Hwasay.js +0 -12
  330. package/dist/assets/traffic-ChJb5Oyl.js +0 -37
  331. package/dist/assets/use-mobile-DjnNmGRG.js +0 -1
  332. package/dist/assets/use-mobile-DpXDDjat.js +0 -1
  333. package/dist/assets/user-center-DfDG_giT.js +0 -77
  334. package/dist/assets/vendor-mui-x-CPwlD3uT.js +0 -6
  335. package/dist/assets/vendor-utils-C3FZIS9A.js +0 -11
  336. package/dist/assets/vendor-ux-did-connect-BDmhBveY.css +0 -1
  337. package/dist/assets/vendor-ux-did-connect-DEbq97Xz.js +0 -1832
  338. package/dist/assets/vi-D-QGxDS1.js +0 -12
  339. package/dist/assets/wrap-locale-5LSB6OAr.js +0 -1
  340. /package/api/services/oauth/{index.js → client.js} +0 -0
package/api/index.js CHANGED
@@ -12,7 +12,6 @@ const httpProxy = require('@arcblock/http-proxy');
12
12
  const { minimatch } = require('minimatch');
13
13
  const helmet = require('helmet');
14
14
  const isUrl = require('is-url');
15
-
16
15
  const { WELLKNOWN_SERVICE_PATH_PREFIX, EVENTS } = require('@abtnode/constant');
17
16
  const {
18
17
  BlockletEvents,
@@ -62,7 +61,8 @@ const StudioService = require('./services/studio');
62
61
  const AnalyticService = require('./services/analytics');
63
62
  const DidSpaceService = require('./services/did-space');
64
63
  const createEnvRoutes = require('./routes/env');
65
- const createOAuthRoutes = require('./routes/oauth');
64
+ const createOauthClientRoutes = require('./routes/oauth/client');
65
+ const createOAuthServerRoutes = require('./routes/oauth/server');
66
66
  const createFederatedRoutes = require('./routes/federated');
67
67
  const createUserRoutes = require('./routes/user');
68
68
  const createOcapRoutes = require('./routes/ocap');
@@ -234,6 +234,36 @@ module.exports = function createServer(node, serverOptions = {}) {
234
234
  }
235
235
  });
236
236
  });
237
+ [BlockletEvents.removed].forEach((name) => {
238
+ eventHub.on(name, (data) => {
239
+ const did = get(data, 'appDid') || get(data, 'meta.did');
240
+ if (did) {
241
+ node
242
+ .destroyTeamStates(did)
243
+ .then(() => {
244
+ logger.info('destroy team states on blocklet removed', { name, did });
245
+ })
246
+ .catch((error) => {
247
+ logger.error('Failed to destroy team states on blocklet removed', { name, did, error });
248
+ });
249
+ }
250
+ });
251
+ });
252
+ [BlockletEvents.installed, BlockletInternalEvents.componentInstalled].forEach((name) => {
253
+ eventHub.on(name, (data) => {
254
+ const did = get(data, 'appDid') || get(data, 'meta.did');
255
+ if (did) {
256
+ node
257
+ .createTeamStates(did)
258
+ .then(() => {
259
+ logger.info('create team states on blocklet installed', { name, did });
260
+ })
261
+ .catch((error) => {
262
+ logger.error('Failed to create team states on blocklet installed', { name, did, error });
263
+ });
264
+ }
265
+ });
266
+ });
237
267
  eventHub.on(BlockletEvents.securityConfigUpdated, ({ did }) => {
238
268
  // 检测到安全配置更新后,需要批量删除指定前缀的 cache(会包含整个 blocklet 所有的 security cache)
239
269
  logger.info('blocklet securityConfig update', { did, pid: process.pid });
@@ -362,8 +392,7 @@ module.exports = function createServer(node, serverOptions = {}) {
362
392
  ...whitelist.official,
363
393
  ...iconifyDomains,
364
394
  ].filter(Boolean),
365
- // 支持 google 字体
366
- fontSrc: ["'self'", 'https://fonts.gstatic.com'],
395
+ fontSrc: ["'self'", 'data:', 'https://fonts.gstatic.com'],
367
396
  connectSrc: uniq(
368
397
  [
369
398
  "'self'",
@@ -599,6 +628,7 @@ self.blocklet = {
599
628
 
600
629
  // Auth: login token and user info
601
630
  server.use(authMiddlewares.sessionBearerToken);
631
+ // FIXME: @zhanghan 这里的逻辑会导致对当前会话的校验是否强制注销失败,暂时先只在 req.ensureUser 进行增强处理。后续需要考虑完整的 auth 鉴权层
602
632
  server.use(authMiddlewares.userInfo);
603
633
 
604
634
  // API: gql
@@ -692,7 +722,8 @@ self.blocklet = {
692
722
  createMCPRoutes.init(server, node);
693
723
 
694
724
  // API: auth
695
- createOAuthRoutes.init(server, node, options);
725
+ createOauthClientRoutes.init(server, node, options);
726
+ createOAuthServerRoutes.init(server, node, options);
696
727
  createFederatedRoutes.init(server, node, options);
697
728
  createUserRoutes.init(server, node, options);
698
729
  createOcapRoutes.init(server);
@@ -1,6 +1,6 @@
1
1
  const { default: axios } = require('axios');
2
2
  const logger = require('../logger')('blocklet-services:oauth');
3
- const { verifyIdToken } = require('../../services/oauth');
3
+ const { verifyIdToken } = require('../../services/oauth/client');
4
4
 
5
5
  /**
6
6
  * @typedef {Object} Provider
@@ -53,7 +53,7 @@ function getUrl(urlLike, params) {
53
53
  return url.toString();
54
54
  }
55
55
 
56
- class OAuthClient {
56
+ class OauthClient {
57
57
  /**
58
58
  * Constructor for initializing providers.
59
59
  * @param {Object} options
@@ -120,7 +120,7 @@ class OAuthClient {
120
120
  async getUserInfo(tokens) {
121
121
  try {
122
122
  if (tokens.id_token) {
123
- const cliams = await verifyIdToken({
123
+ const claims = await verifyIdToken({
124
124
  clientId:
125
125
  this.provider?.getClientList?.() || this.provider?.getClientId?.() || this.provider.options.clientId,
126
126
  idToken: tokens.id_token,
@@ -128,7 +128,7 @@ class OAuthClient {
128
128
  jwksUri: this.provider.jwks_uri,
129
129
  nonce: tokens.nonce,
130
130
  });
131
- return cliams;
131
+ return claims;
132
132
  }
133
133
  if (this.provider.userinfo?.request) {
134
134
  return this.provider.userinfo.request({ tokens });
@@ -169,5 +169,5 @@ class OAuthClient {
169
169
  }
170
170
 
171
171
  module.exports = {
172
- OAuthClient,
172
+ OauthClient,
173
173
  };
@@ -48,11 +48,12 @@ const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abt
48
48
  const getRequestIP = require('@abtnode/util/lib/get-request-ip');
49
49
  const { PASSPORT_LOG_ACTION, PASSPORT_SOURCE, PASSPORT_STATUS } = require('@abtnode/constant');
50
50
  const { getDeviceData } = require('@abtnode/util/lib/device');
51
+ const { getVerifyAccessClaims } = require('@abtnode/auth/lib/server');
51
52
 
52
53
  const logger = require('../logger')('connect');
53
54
  const { createTokenFn, getDidConnectVersion } = require('../../util');
54
55
  const { transferPassport, PASSPORT_VC_TYPES } = require('../auth/utils');
55
- const { migrateAccount, declareAccount } = require('../../services/oauth');
56
+ const { migrateAccount, declareAccount } = require('../../services/oauth/client');
56
57
  const { getKycClaims, verifyKycClaims, getPassportVc, getProfileItems } = require('../kyc');
57
58
  const { getTrustedIssuers, getFederatedTrustedIssuers } = require('../../util/blocklet-utils');
58
59
  const {
@@ -64,6 +65,7 @@ const {
64
65
  syncFederatedUser,
65
66
  } = require('../../util/federated');
66
67
  const { Profile } = require('../../state/profile');
68
+ const { getDefaultPassport } = require('../../util/user-util');
67
69
 
68
70
  // do some check if the passport issued by the blocklet itself
69
71
  const validateLocalPassport = async ({ vc, node, locale, blocklet, teamDid, userDid }) => {
@@ -184,6 +186,29 @@ const checkAppOwner = async ({ node, role, blocklet, userDid, locale = 'en' }) =
184
186
  throw new Error(messages.notAppOwner[locale]);
185
187
  };
186
188
 
189
+ const checkUserRole = async ({ node, userDid, locale, request, roles }) => {
190
+ const blocklet = await request.getBlocklet();
191
+ const user = await node.getUser({ teamDid: blocklet.appPid, user: { did: userDid } });
192
+ if (!user) {
193
+ throw new Error(messages.notAllowed[locale]);
194
+ }
195
+ if (!user.approved) {
196
+ throw new Error(messages.notAuthorized[locale]);
197
+ }
198
+
199
+ const sourceAppPid = getSourceAppPid(request);
200
+ return {
201
+ verifiableCredential: getVerifyAccessClaims({
202
+ node,
203
+ passports: user.passports,
204
+ roles,
205
+ types: PASSPORT_VC_TYPES,
206
+ source: 'blocklet',
207
+ trustedIssuers: await getTrustedIssuers(blocklet, { sourceAppPid }),
208
+ }),
209
+ };
210
+ };
211
+
187
212
  /**
188
213
  * @description
189
214
  * @param {import('@abtnode/client').BlockletState} blocklet
@@ -519,7 +544,7 @@ module.exports = {
519
544
 
520
545
  let fullName = currentUser?.fullName;
521
546
  // Update profile
522
- const passportForLog = passport || { name: 'Guest', role: 'guest' };
547
+ const passportForLog = passport || getDefaultPassport();
523
548
 
524
549
  const connectAccount = { provider, did: userDid, pk: userPk };
525
550
 
@@ -1039,7 +1064,7 @@ module.exports = {
1039
1064
  });
1040
1065
 
1041
1066
  // Audit log
1042
- const passportForLog = passport || { name: 'Guest', role: 'guest' };
1067
+ const passportForLog = passport || getDefaultPassport();
1043
1068
  await node.createAuditLog(
1044
1069
  {
1045
1070
  action: 'switchPassport',
@@ -1390,5 +1415,6 @@ module.exports = {
1390
1415
 
1391
1416
  utils: {
1392
1417
  checkAppOwner,
1418
+ checkUserRole,
1393
1419
  },
1394
1420
  };
package/api/libs/jwt.js CHANGED
@@ -17,6 +17,24 @@ const initJwt = (node, options) => {
17
17
  // 保持默认有效期为 1 天
18
18
  const ttl = options.sessionTtl || '1d';
19
19
 
20
+ /**
21
+ * Creates a JWT session token for a user
22
+ * @param {string} did - The DID of the user
23
+ * @param {Object} options - Token creation options
24
+ * @param {string} options.role - User's role
25
+ * @param {string} options.secret - Secret key used to sign the token
26
+ * @param {Object} [options.passport] - User's passport information
27
+ * @param {string} [options.expiresIn] - Token expiration time, defaults to configured ttl
28
+ * @param {string} [options.tokenType] - Type of token being created
29
+ * @param {string} [options.fullName] - User's full name
30
+ * @param {string} [options.provider=LOGIN_PROVIDER.WALLET] - Authentication provider
31
+ * @param {string} [options.walletOS] - User's wallet operating system
32
+ * @param {boolean} [options.emailVerified=false] - Whether user's email is verified
33
+ * @param {boolean} [options.phoneVerified=false] - Whether user's phone is verified
34
+ * @param {boolean} [options.elevated=false] - Whether the session has elevated privileges
35
+ * @param {Object} [options.oauth=null] - OAuth related information
36
+ * @returns {Object} The created token object
37
+ */
20
38
  const createSessionToken = (
21
39
  did,
22
40
  {
@@ -31,6 +49,7 @@ const initJwt = (node, options) => {
31
49
  emailVerified = false,
32
50
  phoneVerified = false,
33
51
  elevated = false,
52
+ oauth = null,
34
53
  }
35
54
  ) =>
36
55
  createAuthToken({
@@ -45,8 +64,20 @@ const initJwt = (node, options) => {
45
64
  walletOS,
46
65
  kyc: encodeKycStatus(emailVerified, phoneVerified),
47
66
  elevated,
67
+ oauth,
48
68
  });
49
69
 
70
+ /**
71
+ * Verifies a JWT session token
72
+ * @param {string} token - The JWT token to verify
73
+ * @param {string} secret - Secret key used to verify the token
74
+ * @param {Object} [options={}] - Verification options
75
+ * @param {boolean|Function} options.checkFromDb - Whether to check user from database or a function that returns boolean
76
+ * @param {string} options.teamDid - The DID of the team/application
77
+ * @param {Function} options.checkToken - Optional function to perform additional token validation
78
+ * @param {string} [options.locale='en'] - Locale for error messages, defaults to 'en'
79
+ * @returns {Promise<Object>} - Resolves with decoded token data if valid
80
+ */
50
81
  const verifySessionToken = (token, secret, { checkFromDb, teamDid, checkToken, locale = 'en' } = {}) =>
51
82
  // eslint-disable-next-line implicit-arrow-linebreak
52
83
  new Promise((resolve, reject) => {
@@ -72,6 +103,8 @@ const initJwt = (node, options) => {
72
103
  walletOS,
73
104
  kyc = 0,
74
105
  elevated = false,
106
+ oauth = null,
107
+ exp,
75
108
  } = decoded;
76
109
  let user;
77
110
  if (!did) {
@@ -107,9 +140,11 @@ const initJwt = (node, options) => {
107
140
  user.walletOS = walletOS;
108
141
  user.kyc = encodeKycStatus(user.emailVerified, user.phoneVerified);
109
142
  user.elevated = elevated;
143
+ user.oauth = oauth;
144
+ user.exp = exp;
110
145
  } else {
111
146
  user = Object.assign(
112
- { did, role, passport, fullName, provider, walletOS, kyc, elevated },
147
+ { did, role, passport, fullName, provider, walletOS, kyc, elevated, oauth, exp },
113
148
  decodeKycStatus(kyc)
114
149
  );
115
150
  }
@@ -3,7 +3,7 @@ const { getSignData } = require('@blocklet/sdk/lib/util/verify-sign');
3
3
  const getBlockletInfo = require('@blocklet/meta/lib/info');
4
4
  const { joinURL } = require('ufo');
5
5
  const pRetry = require('p-retry');
6
-
6
+ const pMap = require('p-map');
7
7
  const { api } = require('../api');
8
8
  const logger = require('../logger')('blocklet-services:notification');
9
9
 
@@ -42,18 +42,23 @@ async function sendPush(receiver, notification, { node, teamDid }) {
42
42
  throw new Error(`Invalid push kit endpoint: ${config.endpoint}`);
43
43
  }
44
44
 
45
- const { users = [] } = await node.getUsers({
46
- teamDid,
47
- dids: receiver,
48
- query: {
49
- approved: true,
50
- includeUserSessions: true,
45
+ const userSessionList = await pMap(
46
+ receiver,
47
+ async (x) => {
48
+ const result = await node.getUserSessions({
49
+ teamDid,
50
+ query: {
51
+ userDid: x,
52
+ },
53
+ });
54
+ return result.list;
51
55
  },
52
- });
56
+ { concurrency: 10 }
57
+ );
53
58
 
54
- const targets = users.reduce((acc, user) => {
55
- if (user.userSessions?.length > 0) {
56
- user.userSessions.forEach((x) => {
59
+ const targets = userSessionList.reduce((acc, userSessions) => {
60
+ if (userSessions?.length > 0) {
61
+ userSessions.forEach((x) => {
57
62
  // NOTICE: 这里需要转为小写来判断
58
63
  const platform = x?.extra?.walletOS?.toLowerCase();
59
64
  // 兼容处理,支持读取 walletDeviceMessageToken
@@ -27,7 +27,7 @@ const {
27
27
  getUserWithinFederated,
28
28
  getTrustedDomains,
29
29
  } = require('../util/federated');
30
- const { declareAccount, migrateAccount } = require('../services/oauth');
30
+ const { declareAccount, migrateAccount } = require('../services/oauth/client');
31
31
  const { checkFederatedCall } = require('../middlewares/check-federated');
32
32
 
33
33
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
package/api/routes/mcp.js CHANGED
@@ -1,18 +1,20 @@
1
- /* eslint-disable no-console */
2
1
  const { WELLKNOWN_SERVICE_PATH_PREFIX, SECURITY_RULE_DEFAULT_ID } = require('@abtnode/constant');
3
2
  const { joinURL } = require('ufo');
4
3
  const get = require('lodash/get');
5
4
  const getBlockletInfo = require('@blocklet/meta/lib/info');
6
5
  const { checkPublicAccess } = require('@blocklet/meta/lib/util');
7
6
  // eslint-disable-next-line import/no-unresolved
8
- const { SSEServerTransport } = require('@modelcontextprotocol/sdk/server/sse.js');
7
+ const { SSEServerTransport } = require('@blocklet/mcp/server/sse.js');
9
8
 
10
- const { mcpServer } = require('../services/mcp/server');
9
+ const { initMcpServer } = require('../services/mcp/server');
10
+ const logger = require('../libs/logger')('mcp:server:routes');
11
11
 
12
12
  const isMCPSupported = (b) => get(b.meta, 'capabilities.mcp', false);
13
13
 
14
14
  module.exports = {
15
15
  init(server, node) {
16
+ const mcpServer = initMcpServer(node);
17
+
16
18
  // Return all MCP servers
17
19
  server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/servers'), async (req, res) => {
18
20
  const blocklet = await req.getBlocklet();
@@ -50,7 +52,7 @@ module.exports = {
50
52
  }
51
53
  });
52
54
 
53
- // TODO: should we include official services? such as chain, did-spaces, name-service, etc.
55
+ // TODO: @wangshijun should we include official services? such as chain, did-spaces, name-service, etc.
54
56
  res.json({
55
57
  version: info.version,
56
58
  servers: mcpServers,
@@ -61,27 +63,38 @@ module.exports = {
61
63
 
62
64
  // to support multiple simultaneous connections we have a lookup object from sessionId to transport
63
65
  const transports = {};
64
- server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/sse'), async (_, res) => {
66
+ server.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/sse'), async (req, res) => {
67
+ if (!req.user) {
68
+ res.status(401).json({ error: 'Unauthorized' });
69
+ return;
70
+ }
71
+
65
72
  // Set required headers for SSE
66
73
  res.header('X-Accel-Buffering', 'no');
67
74
 
68
75
  const transport = new SSEServerTransport(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), res);
69
- transports[transport.sessionId] = transport;
76
+ transport.authContext = Object.assign({ user: req.user || {} }, { blockletDid: req.getBlockletDid() });
77
+ const { sessionId } = transport;
78
+ transports[sessionId] = transport;
79
+ logger.debug('Client connected', sessionId);
70
80
  res.on('close', () => {
71
- delete transports[transport.sessionId];
81
+ logger.debug('Client Disconnected', sessionId);
82
+ delete transports[sessionId];
72
83
  });
73
84
  await mcpServer.connect(transport);
74
85
  });
75
86
 
76
87
  server.post(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), async (req, res) => {
77
88
  const { sessionId } = req.query;
78
- const transport = transports[sessionId];
79
- if (transport) {
80
- // Send the body to the transport since we have already parsed it
81
- await transport.handlePostMessage(req, res, req.body);
82
- } else {
83
- res.status(400).send('No transport found for sessionId');
89
+ logger.debug('Client Message', { sessionId, body: req.body });
90
+ let transport = transports[sessionId];
91
+ if (!transport) {
92
+ transport = new SSEServerTransport(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/mcp/messages'), res);
84
93
  }
94
+
95
+ // Send the body to the transport since we have already parsed it
96
+ transport.authContext = Object.assign({ user: req.user || {} }, { blockletDid: req.getBlockletDid() });
97
+ await transport.handlePostMessage(req, res, req.body);
85
98
  });
86
99
  },
87
100
  };
@@ -13,22 +13,23 @@ const createTranslator = require('@abtnode/util/lib/translate');
13
13
  const CustomError = require('@abtnode/util/lib/custom-error');
14
14
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
15
15
  const { withHttps, withTrailingSlash } = require('ufo');
16
-
17
- const logger = require('../libs/logger')('oauth');
18
- const { OAuthClient } = require('../libs/auth');
19
- const OAuthAuth0 = require('../libs/auth/adapters/auth0');
20
- const OAuthAuth0Legacy = require('../libs/auth/adapters/auth0-legacy');
21
- const OAuthGithub = require('../libs/auth/adapters/github');
22
- const OAuthGoogle = require('../libs/auth/adapters/google');
23
- const OAuthApple = require('../libs/auth/adapters/apple');
24
- const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../libs/auth/utils');
25
- const initJwt = require('../libs/jwt');
26
- const { sendToUser } = require('../libs/notification');
27
- const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../util');
28
- const federatedUtil = require('../util/federated');
29
- const userUtil = require('../util/user-util');
30
- const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../libs/kyc');
31
- const checkUser = require('../middlewares/check-user');
16
+ const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
17
+
18
+ const logger = require('../../libs/logger')('oauth:client');
19
+ const { OauthClient } = require('../../libs/auth');
20
+ const OAuthAuth0 = require('../../libs/auth/adapters/auth0');
21
+ const OAuthAuth0Legacy = require('../../libs/auth/adapters/auth0-legacy');
22
+ const OAuthGithub = require('../../libs/auth/adapters/github');
23
+ const OAuthGoogle = require('../../libs/auth/adapters/google');
24
+ const OAuthApple = require('../../libs/auth/adapters/apple');
25
+ const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../../libs/auth/utils');
26
+ const initJwt = require('../../libs/jwt');
27
+ const { sendToUser } = require('../../libs/notification');
28
+ const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../../util');
29
+ const federatedUtil = require('../../util/federated');
30
+ const userUtil = require('../../util/user-util');
31
+ const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../../libs/kyc');
32
+ const checkUser = require('../../middlewares/check-user');
32
33
 
33
34
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
34
35
 
@@ -143,7 +144,7 @@ function getAuthClient(blocklet, provider, { legacy = false, appPid } = {}) {
143
144
  if (!providerConfig.clientSecret) {
144
145
  throw new Error('missing client secret');
145
146
  }
146
- return new OAuthClient({
147
+ return new OauthClient({
147
148
  provider: OAuthAuth0({
148
149
  // HACK: auth0 比较奇葩,它的 issuer 有斜杠后缀
149
150
  issuer: withTrailingSlash(withHttps(providerConfig.domain)),
@@ -155,13 +156,13 @@ function getAuthClient(blocklet, provider, { legacy = false, appPid } = {}) {
155
156
  }
156
157
 
157
158
  if (provider === 'github') {
158
- return new OAuthClient({ provider: OAuthGithub(providerConfig) });
159
+ return new OauthClient({ provider: OAuthGithub(providerConfig) });
159
160
  }
160
161
  if (provider === 'google') {
161
- return new OAuthClient({ provider: OAuthGoogle(providerConfig) });
162
+ return new OauthClient({ provider: OAuthGoogle(providerConfig) });
162
163
  }
163
164
  if (provider === 'apple') {
164
- return new OAuthClient({ provider: OAuthApple(providerConfig) });
165
+ return new OauthClient({ provider: OAuthApple(providerConfig) });
165
166
  }
166
167
  return null;
167
168
  }
@@ -193,7 +194,7 @@ async function login(req, node, options) {
193
194
  userInfo: oauthInfo,
194
195
  };
195
196
  let profile;
196
- const lastUsedPassport = userUtil.getLastUsedPassport({ passports: currentUser?.passports });
197
+ const lastUsedPassport = getLastUsedPassport(currentUser?.passports, '', { useFallback: false });
197
198
  if (!currentUser) {
198
199
  currentUser = {
199
200
  did: userDid,
@@ -0,0 +1,95 @@
1
+ /* eslint-disable import/no-unresolved */
2
+ const { joinURL } = require('ufo');
3
+ const { OAUTH_ENDPOINTS, OAUTH_CLIENT_SECRET_TTL, WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
4
+ const { authorizationHandler } = require('@blocklet/mcp/server/auth/handlers/authorize.js');
5
+ const { tokenHandler } = require('@blocklet/mcp/server/auth/handlers/token.js');
6
+ const { revocationHandler } = require('@blocklet/mcp/server/auth/handlers/revoke.js');
7
+ const { clientRegistrationHandler } = require('@blocklet/mcp/server/auth/handlers/register.js');
8
+
9
+ const { createBlockletOAuthServerProvider } = require('../../services/oauth/server');
10
+ const { redirectWithoutCache, getRedirectUrl } = require('../../util');
11
+
12
+ const logger = require('../../libs/logger')('oauth:server:routes');
13
+
14
+ module.exports = {
15
+ init(router, node, options) {
16
+ const prefix = `${WELLKNOWN_SERVICE_PATH_PREFIX}/oauth`;
17
+
18
+ const ensureOAuthProvider = async (req, res, next) => {
19
+ const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getBlockletInfo()]);
20
+
21
+ if (!blocklet) {
22
+ return res.status(404).json({ error: 'Blocklet not found' });
23
+ }
24
+ // TODO: @wangshijun check if oauth server service is enabled, make it configurable
25
+ req.provider = createBlockletOAuthServerProvider(node, options, blocklet, info);
26
+
27
+ return next();
28
+ };
29
+
30
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.AUTHORIZATION), ensureOAuthProvider, (req, res, next) => {
31
+ if (req.method === 'GET') {
32
+ if (req.user) {
33
+ logger.debug('User already logged in, send to consent page');
34
+ // Send to oauth consent page
35
+ next();
36
+ } else {
37
+ logger.debug('User not logged in, send to login page');
38
+ // redirect to login page and redirect back once login success
39
+ redirectWithoutCache(
40
+ res,
41
+ getRedirectUrl({
42
+ req,
43
+ pagePath: '/login',
44
+ params: {
45
+ redirect: req.originalUrl,
46
+ },
47
+ })
48
+ );
49
+ }
50
+ } else if (req.method === 'POST') {
51
+ logger.debug('Handle oauth authorization request', req.body);
52
+
53
+ if (req.body.action === 'deny') {
54
+ logger.debug('User denied oauth authorization, redirect to redirect_uri');
55
+ const errorUrl = new URL(req.body.redirect_uri);
56
+ errorUrl.searchParams.set('error', 'access_denied');
57
+ errorUrl.searchParams.set('error_description', 'The user denied the request');
58
+ if (req.body.state) errorUrl.searchParams.set('state', req.body.state);
59
+ res.redirect(errorUrl.toString());
60
+ return;
61
+ }
62
+
63
+ authorizationHandler({ provider: req.provider, rateLimit: false })(req, res, next);
64
+ } else {
65
+ res.status(405).json({ error: 'Method not allowed' });
66
+ }
67
+ });
68
+
69
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.TOKEN), ensureOAuthProvider, (req, res, next) => {
70
+ tokenHandler({ provider: req.provider, rateLimit: false })(req, res, next);
71
+ });
72
+
73
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.REGISTRATION), ensureOAuthProvider, (req, res, next) => {
74
+ clientRegistrationHandler({
75
+ clientsStore: req.provider.clientsStore,
76
+ clientSecretExpirySeconds: OAUTH_CLIENT_SECRET_TTL,
77
+ rateLimit: false,
78
+ })(req, res, next);
79
+ });
80
+
81
+ router.use(joinURL(prefix, OAUTH_ENDPOINTS.REVOCATION), ensureOAuthProvider, (req, res, next) => {
82
+ revocationHandler({ provider: req.provider, rateLimit: false })(req, res, next);
83
+ });
84
+
85
+ router.get(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, '/api/oauth/client'), ensureOAuthProvider, async (req, res) => {
86
+ const { clientId } = req.query;
87
+ if (!clientId) {
88
+ res.status(400).json({ error: 'clientId is required' });
89
+ return;
90
+ }
91
+ const client = await req.provider.clientsStore.getClient(clientId);
92
+ res.json(client);
93
+ });
94
+ },
95
+ };