@agent-native/core 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +4 -4
  2. package/dist/a2a/caller-auth.d.ts +12 -0
  3. package/dist/a2a/caller-auth.d.ts.map +1 -0
  4. package/dist/a2a/caller-auth.js +54 -0
  5. package/dist/a2a/caller-auth.js.map +1 -0
  6. package/dist/action.d.ts +17 -0
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js +22 -0
  9. package/dist/action.js.map +1 -1
  10. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  11. package/dist/agent/engine/builder-engine.js +5 -4
  12. package/dist/agent/engine/builder-engine.js.map +1 -1
  13. package/dist/agent/engine/registry.d.ts +6 -3
  14. package/dist/agent/engine/registry.d.ts.map +1 -1
  15. package/dist/agent/engine/registry.js +8 -17
  16. package/dist/agent/engine/registry.js.map +1 -1
  17. package/dist/agent/production-agent.d.ts +1 -1
  18. package/dist/agent/production-agent.d.ts.map +1 -1
  19. package/dist/agent/production-agent.js +60 -30
  20. package/dist/agent/production-agent.js.map +1 -1
  21. package/dist/agent/run-manager.d.ts.map +1 -1
  22. package/dist/agent/run-manager.js +12 -3
  23. package/dist/agent/run-manager.js.map +1 -1
  24. package/dist/agent/thread-data-builder.d.ts +12 -0
  25. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  26. package/dist/agent/thread-data-builder.js +96 -0
  27. package/dist/agent/thread-data-builder.js.map +1 -1
  28. package/dist/cli/create.d.ts.map +1 -1
  29. package/dist/cli/create.js +16 -10
  30. package/dist/cli/create.js.map +1 -1
  31. package/dist/client/AgentPanel.d.ts.map +1 -1
  32. package/dist/client/AgentPanel.js +8 -22
  33. package/dist/client/AgentPanel.js.map +1 -1
  34. package/dist/client/AssistantChat.d.ts.map +1 -1
  35. package/dist/client/AssistantChat.js +130 -34
  36. package/dist/client/AssistantChat.js.map +1 -1
  37. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  38. package/dist/client/agent-chat-adapter.js +21 -7
  39. package/dist/client/agent-chat-adapter.js.map +1 -1
  40. package/dist/client/agent-sidebar-state.d.ts +3 -0
  41. package/dist/client/agent-sidebar-state.d.ts.map +1 -0
  42. package/dist/client/agent-sidebar-state.js +24 -0
  43. package/dist/client/agent-sidebar-state.js.map +1 -0
  44. package/dist/client/analytics.d.ts +25 -0
  45. package/dist/client/analytics.d.ts.map +1 -1
  46. package/dist/client/analytics.js +40 -0
  47. package/dist/client/analytics.js.map +1 -1
  48. package/dist/client/components/ui/dropdown-menu.d.ts +28 -0
  49. package/dist/client/components/ui/dropdown-menu.d.ts.map +1 -0
  50. package/dist/client/components/ui/dropdown-menu.js +34 -0
  51. package/dist/client/components/ui/dropdown-menu.js.map +1 -0
  52. package/dist/client/components/ui/tooltip.d.ts +2 -1
  53. package/dist/client/components/ui/tooltip.d.ts.map +1 -1
  54. package/dist/client/components/ui/tooltip.js +9 -2
  55. package/dist/client/components/ui/tooltip.js.map +1 -1
  56. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  57. package/dist/client/composer/ComposerPlusMenu.js +41 -8
  58. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  59. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  60. package/dist/client/composer/PromptComposer.js +30 -0
  61. package/dist/client/composer/PromptComposer.js.map +1 -1
  62. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  63. package/dist/client/composer/TiptapComposer.js +27 -2
  64. package/dist/client/composer/TiptapComposer.js.map +1 -1
  65. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  66. package/dist/client/dev-overlay/DevOverlay.js +4 -4
  67. package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
  68. package/dist/client/error-format.d.ts.map +1 -1
  69. package/dist/client/error-format.js +6 -0
  70. package/dist/client/error-format.js.map +1 -1
  71. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  72. package/dist/client/extensions/EmbeddedExtension.js +16 -4
  73. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  74. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  75. package/dist/client/extensions/ExtensionEditor.js +6 -6
  76. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  77. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  78. package/dist/client/extensions/ExtensionSlot.js +15 -2
  79. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  80. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  81. package/dist/client/extensions/ExtensionViewer.js +41 -19
  82. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  83. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  84. package/dist/client/extensions/ExtensionsListPage.js +2 -2
  85. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  86. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  87. package/dist/client/extensions/ExtensionsSidebarSection.js +52 -63
  88. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  89. package/dist/client/extensions/iframe-bridge.d.ts.map +1 -1
  90. package/dist/client/extensions/iframe-bridge.js +5 -8
  91. package/dist/client/extensions/iframe-bridge.js.map +1 -1
  92. package/dist/client/index.d.ts +1 -1
  93. package/dist/client/index.d.ts.map +1 -1
  94. package/dist/client/index.js +1 -1
  95. package/dist/client/index.js.map +1 -1
  96. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  97. package/dist/client/notifications/NotificationsBell.js +42 -6
  98. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  99. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  100. package/dist/client/org/InvitationBanner.js +5 -5
  101. package/dist/client/org/InvitationBanner.js.map +1 -1
  102. package/dist/client/org/OrgSwitcher.d.ts +7 -1
  103. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  104. package/dist/client/org/OrgSwitcher.js +8 -3
  105. package/dist/client/org/OrgSwitcher.js.map +1 -1
  106. package/dist/client/org/TeamPage.d.ts.map +1 -1
  107. package/dist/client/org/TeamPage.js +156 -22
  108. package/dist/client/org/TeamPage.js.map +1 -1
  109. package/dist/client/org/hooks.d.ts +29 -1
  110. package/dist/client/org/hooks.d.ts.map +1 -1
  111. package/dist/client/org/hooks.js +39 -2
  112. package/dist/client/org/hooks.js.map +1 -1
  113. package/dist/client/org/index.d.ts +2 -1
  114. package/dist/client/org/index.d.ts.map +1 -1
  115. package/dist/client/org/index.js +1 -1
  116. package/dist/client/org/index.js.map +1 -1
  117. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  118. package/dist/client/resources/ResourceTree.js +11 -3
  119. package/dist/client/resources/ResourceTree.js.map +1 -1
  120. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  121. package/dist/client/resources/ResourcesPanel.js +62 -12
  122. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  123. package/dist/client/resources/use-mcp-servers.d.ts +2 -0
  124. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  125. package/dist/client/resources/use-mcp-servers.js +59 -3
  126. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  127. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  128. package/dist/client/settings/SecretsSection.js +9 -0
  129. package/dist/client/settings/SecretsSection.js.map +1 -1
  130. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  131. package/dist/client/settings/SettingsPanel.js +50 -12
  132. package/dist/client/settings/SettingsPanel.js.map +1 -1
  133. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  134. package/dist/client/settings/VoiceTranscriptionSection.js +13 -30
  135. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  136. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  137. package/dist/client/settings/useBuilderStatus.js +27 -1
  138. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  139. package/dist/client/sharing/ShareButton.d.ts +4 -0
  140. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  141. package/dist/client/sharing/ShareButton.js +5 -1
  142. package/dist/client/sharing/ShareButton.js.map +1 -1
  143. package/dist/client/sse-event-processor.d.ts +1 -1
  144. package/dist/client/sse-event-processor.d.ts.map +1 -1
  145. package/dist/client/sse-event-processor.js +14 -7
  146. package/dist/client/sse-event-processor.js.map +1 -1
  147. package/dist/client/use-db-sync.d.ts.map +1 -1
  148. package/dist/client/use-db-sync.js +100 -19
  149. package/dist/client/use-db-sync.js.map +1 -1
  150. package/dist/deploy/build.d.ts.map +1 -1
  151. package/dist/deploy/build.js +25 -49
  152. package/dist/deploy/build.js.map +1 -1
  153. package/dist/deploy/route-discovery.d.ts.map +1 -1
  154. package/dist/deploy/route-discovery.js +1 -0
  155. package/dist/deploy/route-discovery.js.map +1 -1
  156. package/dist/deploy/workspace-core.d.ts +1 -1
  157. package/dist/deploy/workspace-core.d.ts.map +1 -1
  158. package/dist/deploy/workspace-core.js +1 -0
  159. package/dist/deploy/workspace-core.js.map +1 -1
  160. package/dist/extensions/actions.d.ts.map +1 -1
  161. package/dist/extensions/actions.js +17 -3
  162. package/dist/extensions/actions.js.map +1 -1
  163. package/dist/extensions/routes.js +1 -1
  164. package/dist/extensions/routes.js.map +1 -1
  165. package/dist/extensions/schema.d.ts +14 -14
  166. package/dist/extensions/schema.d.ts.map +1 -1
  167. package/dist/extensions/schema.js +4 -4
  168. package/dist/extensions/schema.js.map +1 -1
  169. package/dist/extensions/store.d.ts.map +1 -1
  170. package/dist/extensions/store.js +23 -0
  171. package/dist/extensions/store.js.map +1 -1
  172. package/dist/extensions/theme.d.ts +8 -1
  173. package/dist/extensions/theme.d.ts.map +1 -1
  174. package/dist/extensions/theme.js +43 -34
  175. package/dist/extensions/theme.js.map +1 -1
  176. package/dist/index.browser.d.ts +1 -1
  177. package/dist/index.browser.d.ts.map +1 -1
  178. package/dist/index.browser.js +1 -1
  179. package/dist/index.browser.js.map +1 -1
  180. package/dist/index.d.ts +1 -1
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +1 -1
  183. package/dist/index.js.map +1 -1
  184. package/dist/mcp-client/routes.d.ts +1 -0
  185. package/dist/mcp-client/routes.d.ts.map +1 -1
  186. package/dist/mcp-client/routes.js +28 -1
  187. package/dist/mcp-client/routes.js.map +1 -1
  188. package/dist/org/accept-pending.d.ts.map +1 -1
  189. package/dist/org/accept-pending.js +5 -3
  190. package/dist/org/accept-pending.js.map +1 -1
  191. package/dist/org/free-email-providers.d.ts +18 -0
  192. package/dist/org/free-email-providers.d.ts.map +1 -0
  193. package/dist/org/free-email-providers.js +124 -0
  194. package/dist/org/free-email-providers.js.map +1 -0
  195. package/dist/org/handlers.d.ts +29 -5
  196. package/dist/org/handlers.d.ts.map +1 -1
  197. package/dist/org/handlers.js +178 -37
  198. package/dist/org/handlers.js.map +1 -1
  199. package/dist/org/index.d.ts +2 -1
  200. package/dist/org/index.d.ts.map +1 -1
  201. package/dist/org/index.js +2 -1
  202. package/dist/org/index.js.map +1 -1
  203. package/dist/org/migrations.d.ts.map +1 -1
  204. package/dist/org/migrations.js +4 -0
  205. package/dist/org/migrations.js.map +1 -1
  206. package/dist/org/plugin.d.ts.map +1 -1
  207. package/dist/org/plugin.js +13 -4
  208. package/dist/org/plugin.js.map +1 -1
  209. package/dist/org/schema.d.ts +19 -0
  210. package/dist/org/schema.d.ts.map +1 -1
  211. package/dist/org/schema.js +1 -0
  212. package/dist/org/schema.js.map +1 -1
  213. package/dist/org/types.d.ts +1 -0
  214. package/dist/org/types.d.ts.map +1 -1
  215. package/dist/org/types.js.map +1 -1
  216. package/dist/resources/metadata.d.ts +1 -0
  217. package/dist/resources/metadata.d.ts.map +1 -1
  218. package/dist/resources/metadata.js +13 -3
  219. package/dist/resources/metadata.js.map +1 -1
  220. package/dist/resources/store.d.ts.map +1 -1
  221. package/dist/resources/store.js +44 -6
  222. package/dist/resources/store.js.map +1 -1
  223. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  224. package/dist/server/agent-chat-plugin.js +115 -113
  225. package/dist/server/agent-chat-plugin.js.map +1 -1
  226. package/dist/server/auth.d.ts.map +1 -1
  227. package/dist/server/auth.js +33 -0
  228. package/dist/server/auth.js.map +1 -1
  229. package/dist/server/builder-browser.d.ts.map +1 -1
  230. package/dist/server/builder-browser.js +169 -68
  231. package/dist/server/builder-browser.js.map +1 -1
  232. package/dist/server/credential-provider.d.ts +2 -2
  233. package/dist/server/credential-provider.d.ts.map +1 -1
  234. package/dist/server/credential-provider.js +31 -12
  235. package/dist/server/credential-provider.js.map +1 -1
  236. package/dist/server/framework-request-handler.d.ts.map +1 -1
  237. package/dist/server/framework-request-handler.js +31 -0
  238. package/dist/server/framework-request-handler.js.map +1 -1
  239. package/dist/server/google-oauth.d.ts.map +1 -1
  240. package/dist/server/google-oauth.js +10 -3
  241. package/dist/server/google-oauth.js.map +1 -1
  242. package/dist/server/google-realtime-session.d.ts.map +1 -1
  243. package/dist/server/google-realtime-session.js +19 -6
  244. package/dist/server/google-realtime-session.js.map +1 -1
  245. package/dist/server/index.d.ts +2 -0
  246. package/dist/server/index.d.ts.map +1 -1
  247. package/dist/server/index.js +2 -0
  248. package/dist/server/index.js.map +1 -1
  249. package/dist/server/onboarding-html.d.ts.map +1 -1
  250. package/dist/server/onboarding-html.js +45 -6
  251. package/dist/server/onboarding-html.js.map +1 -1
  252. package/dist/server/request-context.d.ts +17 -0
  253. package/dist/server/request-context.d.ts.map +1 -1
  254. package/dist/server/request-context.js +40 -1
  255. package/dist/server/request-context.js.map +1 -1
  256. package/dist/server/sentry-plugin.d.ts +11 -0
  257. package/dist/server/sentry-plugin.d.ts.map +1 -0
  258. package/dist/server/sentry-plugin.js +116 -0
  259. package/dist/server/sentry-plugin.js.map +1 -0
  260. package/dist/server/sentry.d.ts +92 -0
  261. package/dist/server/sentry.d.ts.map +1 -0
  262. package/dist/server/sentry.js +287 -0
  263. package/dist/server/sentry.js.map +1 -0
  264. package/dist/server/transcribe-voice.d.ts +2 -4
  265. package/dist/server/transcribe-voice.d.ts.map +1 -1
  266. package/dist/server/transcribe-voice.js +4 -16
  267. package/dist/server/transcribe-voice.js.map +1 -1
  268. package/dist/server/voice-providers-status.d.ts.map +1 -1
  269. package/dist/server/voice-providers-status.js +19 -35
  270. package/dist/server/voice-providers-status.js.map +1 -1
  271. package/dist/styles/agent-native.css +15 -0
  272. package/docs/content/cloneable-saas.md +7 -9
  273. package/docs/content/deployment.md +6 -2
  274. package/docs/content/dispatch.md +1 -1
  275. package/docs/content/extensions.md +177 -142
  276. package/docs/content/faq.md +2 -2
  277. package/docs/content/getting-started.md +13 -11
  278. package/docs/content/multi-app-workspace.md +2 -2
  279. package/docs/content/observability.md +47 -0
  280. package/docs/content/pure-agent-apps.md +1 -1
  281. package/docs/content/template-clips.md +3 -3
  282. package/docs/content/template-design.md +3 -3
  283. package/docs/content/template-dispatch.md +1 -1
  284. package/docs/content/template-forms.md +1 -1
  285. package/docs/content/template-mail.md +1 -1
  286. package/docs/content/what-is-agent-native.md +4 -4
  287. package/docs/content/workspace.md +1 -1
  288. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/mcp-client/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,sEAAsE;AACtE,SAAS,aAAa,CACpB,OAAgC;IAEhC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,GAAG,GAAkC,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA6B,EAC7B,KAAqB,EACrB,OAAe,EACf,MAAoB;IAEpB,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;QACjD,MAAM;KACP,CAAC;AACJ,CAAC;AAoBD,SAAS,SAAS,CAAC,OAAyB,EAAE,QAAgB;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,IAAI,GAAG,aAAa,EAAE,IAAI,mBAAmB,EAAE,CAAC;IACtD,MAAM,OAAO,GAAoC,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IAE9E,MAAM,GAAG,GAAG,MAAM,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,KAAK,GAA0B,IAAI,CAAC;QACxC,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,GAAG,MAAM,CAAC;YACf,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;YAAE,SAAS;QACjC,MAAM,IAAI,GAAI,KAA+C,CAAC,OAAO,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,SAAS;YACxE,oEAAoE;YACpE,gEAAgE;YAChE,sEAAsE;YACtE,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,oEAAoE;IACpE,uEAAuE;IACvE,2DAA2D;IAC3D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CACV,kCAAkC,GAAG,EAAE,OAAO,IAAI,GAAG,iCAAiC,CACvF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,KAAc;IAKpD,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACxC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IACD,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QAClB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,KAAK;YAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAyB;IACzD,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAa,EACb,OAAyB;IAEzB,MAAM,WAAW,GAAoB,CACnC,UACD,CAAC,kCAAkC,KAAK,IAAI,OAAO,EAAU,CAAC,CAAC;IAChE,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IACtC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE1B,IAAI,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CACpB,4BAA4B,EAC5B,kBAAkB,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,IAAI,EAAE,CAAC;iBACzC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElD,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAE7D,+DAA+D;YAC/D,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBACnE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YAED,kBAAkB;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,MAAM,KAAK,KAAK;oBAAE,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxD,IAAI,MAAM,KAAK,MAAM;oBAAE,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxD,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACzC,CAAC;YAED,qBAAqB;YACrB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACnE,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC9C,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YAED,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CACV,4DAA4D,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAc,EACd,OAAyB;IAOzB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1B,gBAAgB,CACd,CAAC,EACD,MAAM,EACN,KAAK,IAAI,EAAE,EACX,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAC5D,CACF;QACD,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,gBAAgB,CACd,CAAC,EACD,KAAK,EACL,KAAK,IAAI,EAAE,EACX,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAC3D,CACF;QACD,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAc,EAAE,OAAyB;IAChE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAMpD,CAAC;IACF,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAErE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO;gBACL,KAAK,EAAE,+DAA+D;aACvE,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE;QACnD,IAAI;QACJ,GAAG;QACH,OAAO;QACP,WAAW;KACZ,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACvB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,gBAAgB,CACtB,MAAM,CAAC,MAAM,EACb,KAAK,EACL,OAAO,EACP,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAC7B;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAc,EACd,OAAyB,EACzB,EAAU;IAEV,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;IACpC,MAAM,WAAW,GACf,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAErE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO;gBACL,KAAK,EAAE,yDAAyD;aACjE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAAc;IACzC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAGpD,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACvB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAc,EACd,OAAyB,EACzB,EAAU;IAEV,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;IACpC,MAAM,WAAW,GACf,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACvB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,OAAgC;IAKhC,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,6BAA6B,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxE,MAAM,CAAC,2CAA2C,CAAC;YACnD,MAAM,CAAC,oDAAoD,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QAChC,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;YAChE,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1D,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,KAAK,GAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAA6B,CAAC,GAAG,CAClE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd,CAAC;YACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,SAAS;QACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACpC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC","sourcesContent":["/**\n * HTTP routes for user- and org-scope remote MCP server management.\n *\n * Mounted under `/_agent-native/mcp/servers` by `agent-chat-plugin` —\n * requires a reference to the running `McpClientManager` so mutations can\n * hot-reload the configured server set.\n *\n * GET /_agent-native/mcp/servers list user + org servers\n * POST /_agent-native/mcp/servers add a server\n * DELETE /_agent-native/mcp/servers/:id remove a server (scope via ?scope=)\n * POST /_agent-native/mcp/servers/:id/test dry-run connect (no persist)\n * POST /_agent-native/mcp/servers/test dry-run a URL before persisting\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getQuery,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { getAllSettings } from \"../settings/store.js\";\nimport type { McpClientManager } from \"./manager.js\";\nimport type { McpConfig, McpServerConfig } from \"./config.js\";\nimport { loadMcpConfig, autoDetectMcpConfig } from \"./config.js\";\nimport {\n addRemoteServer,\n listRemoteServers,\n mergedConfigKey,\n removeRemoteServer,\n toHttpServerConfigAsync,\n validateRemoteUrl,\n type RemoteMcpScope,\n type StoredRemoteMcpServer,\n} from \"./remote-store.js\";\nimport { fetchHubServers } from \"./hub-client.js\";\n\n/** Redact obvious auth header values before sending to the client. */\nfunction redactHeaders(\n headers?: Record<string, string>,\n): Record<string, { set: true }> | undefined {\n if (!headers) return undefined;\n const out: Record<string, { set: true }> = {};\n for (const k of Object.keys(headers)) out[k] = { set: true };\n return out;\n}\n\nfunction projectForClient(\n stored: StoredRemoteMcpServer,\n scope: RemoteMcpScope,\n ownerId: string,\n status: ServerStatus,\n): ClientServer {\n return {\n id: stored.id,\n scope,\n name: stored.name,\n url: stored.url,\n headers: redactHeaders(stored.headers),\n description: stored.description,\n createdAt: stored.createdAt,\n mergedId: mergedConfigKey(scope, stored, ownerId),\n status,\n };\n}\n\nexport interface ClientServer {\n id: string;\n scope: RemoteMcpScope;\n name: string;\n url: string;\n headers?: Record<string, { set: true }>;\n description?: string;\n createdAt: number;\n /** The key under which this server is registered in the running MCP manager. */\n mergedId: string;\n status: ServerStatus;\n}\n\ntype ServerStatus =\n | { state: \"connected\"; toolCount: number }\n | { state: \"error\"; error: string }\n | { state: \"unknown\" };\n\nfunction statusFor(manager: McpClientManager, mergedId: string): ServerStatus {\n const snap = manager.getStatus();\n if (snap.connectedServers.includes(mergedId)) {\n const toolCount = snap.tools.filter((t) => t.source === mergedId).length;\n return { state: \"connected\", toolCount };\n }\n if (snap.errors[mergedId]) {\n return { state: \"error\", error: snap.errors[mergedId] };\n }\n if (snap.configuredServers.includes(mergedId)) {\n return { state: \"unknown\" };\n }\n return { state: \"unknown\" };\n}\n\n/**\n * Build the merged MCP config the manager should run with: file/env config\n * plus **every** user-scope and org-scope remote server persisted in the\n * settings store. Scanning all scopes means a mutation from one user's\n * session never drops another user's servers from the running manager.\n *\n * Each persisted server's merged key includes its owner discriminator\n * (`user_<emailhash>_<name>` or `org_<orgId>_<name>`) so two users' servers\n * with the same name coexist; the request-time gate in\n * `isMcpToolAllowedForRequest` then scopes tool visibility back down to the\n * calling user.\n */\nexport async function buildMergedConfig(): Promise<McpConfig | null> {\n const base = loadMcpConfig() ?? autoDetectMcpConfig();\n const servers: Record<string, McpServerConfig> = { ...(base?.servers ?? {}) };\n\n const all = await getAllSettings().catch(() => ({}));\n for (const [fullKey, value] of Object.entries(all)) {\n const userMatch = /^u:([^:]+):mcp-servers-remote$/.exec(fullKey);\n const orgMatch = /^o:([^:]+):mcp-servers-remote$/.exec(fullKey);\n let scope: RemoteMcpScope | null = null;\n let ownerId: string | null = null;\n if (userMatch) {\n scope = \"user\";\n ownerId = userMatch[1];\n } else if (orgMatch) {\n scope = \"org\";\n ownerId = orgMatch[1];\n }\n if (!scope || !ownerId) continue;\n const list = (value as { servers?: StoredRemoteMcpServer[] }).servers;\n if (!Array.isArray(list)) continue;\n for (const stored of list) {\n if (!stored || typeof stored.url !== \"string\" || !stored.name) continue;\n // Async resolve: decrypts `headerSecretKey` from app_secrets so the\n // running MCP client gets the cleartext bearer at request time.\n // Stored row contains only the secret-key reference, never the value.\n servers[mergedConfigKey(scope, stored, ownerId)] =\n await toHttpServerConfigAsync(scope, ownerId, stored);\n }\n }\n\n // Hub-consume: if this app is configured to consume from a remote hub\n // (AGENT_NATIVE_MCP_HUB_URL + AGENT_NATIVE_MCP_HUB_TOKEN), pull its\n // org-scope servers and merge. Hub entries use `hub_<orgId>_<name>` so\n // they never collide with local `org_<orgId>_<name>` rows.\n try {\n const hubServers = await fetchHubServers();\n for (const [mergedKey, cfg] of Object.entries(hubServers)) {\n servers[mergedKey] = cfg;\n }\n } catch (err: any) {\n console.warn(\n `[mcp-client] hub merge failed: ${err?.message ?? err}. Continuing with local config.`,\n );\n }\n\n if (Object.keys(servers).length === 0) return null;\n return { servers, source: base?.source ?? \"merged\" };\n}\n\nasync function resolveContextForRequest(event: H3Event): Promise<{\n email: string | null;\n orgId: string | null;\n role: string | null;\n}> {\n let email: string | null = null;\n try {\n const session = await getSession(event);\n email = session?.email ?? null;\n } catch {\n email = null;\n }\n let orgId: string | null = null;\n let role: string | null = null;\n try {\n const ctx = await getOrgContext(event);\n orgId = ctx.orgId;\n role = ctx.role;\n if (!email) email = ctx.email;\n } catch {\n // ignore — no org context\n }\n // No silent `local@localhost` fallback — if `getSession` returns nothing in\n // production (misconfigured deploy, expired token), the caller must reject\n // rather than silently pool every unauthenticated request under one identity.\n return { email, orgId, role };\n}\n\nasync function reconfigureManager(manager: McpClientManager): Promise<void> {\n const merged = await buildMergedConfig();\n await manager.reconfigure(merged);\n}\n\nexport function mountMcpServersRoutes(\n nitroApp: any,\n manager: McpClientManager,\n): void {\n const mountedApps: WeakSet<object> = ((\n globalThis as any\n ).__agentNativeMcpServersMountedApps ??= new WeakSet<object>());\n if (mountedApps.has(nitroApp)) return;\n mountedApps.add(nitroApp);\n\n try {\n getH3App(nitroApp).use(\n \"/_agent-native/mcp/servers\",\n defineEventHandler(async (event: H3Event) => {\n const method = getMethod(event);\n const pathname = (event.url?.pathname || \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n const parts = pathname ? pathname.split(\"/\") : [];\n\n setResponseHeader(event, \"Content-Type\", \"application/json\");\n\n // POST /servers/test — dry-run a URL+headers before persisting\n if (method === \"POST\" && parts.length === 1 && parts[0] === \"test\") {\n return handleTestUrl(event);\n }\n\n // Collection root\n if (parts.length === 0) {\n if (method === \"GET\") return handleList(event, manager);\n if (method === \"POST\") return handleAdd(event, manager);\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n // /:id / /:id/test\n if (parts.length === 1 || parts.length === 2) {\n const id = parts[0];\n if (parts.length === 2 && parts[1] === \"test\" && method === \"POST\") {\n return handleTestExisting(event, manager, id);\n }\n if (parts.length === 1 && method === \"DELETE\") {\n return handleDelete(event, manager, id);\n }\n }\n\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }),\n );\n } catch (err: any) {\n console.warn(\n `[mcp-client] Failed to mount /_agent-native/mcp/servers: ${err?.message ?? err}`,\n );\n }\n}\n\nasync function handleList(\n event: H3Event,\n manager: McpClientManager,\n): Promise<{\n user: ClientServer[];\n org: ClientServer[];\n orgId: string | null;\n role: string | null;\n}> {\n const { email, orgId, role } = await resolveContextForRequest(event);\n const userServers = email ? await listRemoteServers(\"user\", email) : [];\n const orgServers = orgId ? await listRemoteServers(\"org\", orgId) : [];\n return {\n user: userServers.map((s) =>\n projectForClient(\n s,\n \"user\",\n email ?? \"\",\n statusFor(manager, mergedConfigKey(\"user\", s, email ?? \"\")),\n ),\n ),\n org: orgServers.map((s) =>\n projectForClient(\n s,\n \"org\",\n orgId ?? \"\",\n statusFor(manager, mergedConfigKey(\"org\", s, orgId ?? \"\")),\n ),\n ),\n orgId,\n role,\n };\n}\n\nasync function handleAdd(event: H3Event, manager: McpClientManager) {\n const body = (await readBody(event).catch(() => ({}))) as {\n scope?: unknown;\n name?: unknown;\n url?: unknown;\n headers?: unknown;\n description?: unknown;\n };\n const scope =\n body.scope === \"org\" ? \"org\" : body.scope === \"user\" ? \"user\" : null;\n if (!scope) {\n setResponseStatus(event, 400);\n return { error: 'scope must be \"user\" or \"org\"' };\n }\n const name = typeof body.name === \"string\" ? body.name : \"\";\n const url = typeof body.url === \"string\" ? body.url : \"\";\n if (!name.trim() || !url.trim()) {\n setResponseStatus(event, 400);\n return { error: \"name and url are required\" };\n }\n const headers = normalizeHeaders(body.headers);\n const description =\n typeof body.description === \"string\" ? body.description : undefined;\n\n const { email, orgId, role } = await resolveContextForRequest(event);\n\n let scopeId: string | null = null;\n if (scope === \"user\") {\n scopeId = email;\n } else {\n if (!orgId) {\n setResponseStatus(event, 400);\n return {\n error: \"You must belong to an organization to add an org-scope server\",\n };\n }\n if (role !== \"owner\" && role !== \"admin\") {\n setResponseStatus(event, 403);\n return { error: \"Only owners and admins can add org-scope MCP servers\" };\n }\n scopeId = orgId;\n }\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const result = await addRemoteServer(scope, scopeId, {\n name,\n url,\n headers,\n description,\n });\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { error: result.error };\n }\n\n await reconfigureManager(manager);\n const mergedId = mergedConfigKey(scope, result.server, scopeId);\n return {\n ok: true,\n server: projectForClient(\n result.server,\n scope,\n scopeId,\n statusFor(manager, mergedId),\n ),\n };\n}\n\nasync function handleDelete(\n event: H3Event,\n manager: McpClientManager,\n id: string,\n) {\n const scope = getQuery(event).scope;\n const parsedScope =\n scope === \"org\" ? \"org\" : scope === \"user\" ? \"user\" : null;\n if (!parsedScope) {\n setResponseStatus(event, 400);\n return { error: 'scope query param must be \"user\" or \"org\"' };\n }\n const { email, orgId, role } = await resolveContextForRequest(event);\n\n let scopeId: string | null = null;\n if (parsedScope === \"user\") {\n scopeId = email;\n } else {\n if (!orgId) {\n setResponseStatus(event, 400);\n return { error: \"No active organization\" };\n }\n if (role !== \"owner\" && role !== \"admin\") {\n setResponseStatus(event, 403);\n return {\n error: \"Only owners and admins can remove org-scope MCP servers\",\n };\n }\n scopeId = orgId;\n }\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const removed = await removeRemoteServer(parsedScope, scopeId, id);\n if (!removed) {\n setResponseStatus(event, 404);\n return { error: \"Server not found\" };\n }\n await reconfigureManager(manager);\n return { ok: true };\n}\n\nasync function handleTestUrl(event: H3Event) {\n const body = (await readBody(event).catch(() => ({}))) as {\n url?: unknown;\n headers?: unknown;\n };\n const url = typeof body.url === \"string\" ? body.url : \"\";\n const check = validateRemoteUrl(url);\n if (!check.ok) {\n setResponseStatus(event, 400);\n return { ok: false, error: check.error };\n }\n const headers = normalizeHeaders(body.headers);\n const result = await tryConnect(check.url!.toString(), headers);\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { ok: false, error: result.error };\n }\n return { ok: true, toolCount: result.toolCount, tools: result.tools };\n}\n\nasync function handleTestExisting(\n event: H3Event,\n manager: McpClientManager,\n id: string,\n) {\n const scope = getQuery(event).scope;\n const parsedScope =\n scope === \"org\" ? \"org\" : scope === \"user\" ? \"user\" : null;\n if (!parsedScope) {\n setResponseStatus(event, 400);\n return { error: 'scope query param must be \"user\" or \"org\"' };\n }\n const { email, orgId } = await resolveContextForRequest(event);\n const scopeId = parsedScope === \"user\" ? email : orgId;\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n const list = await listRemoteServers(parsedScope, scopeId);\n const server = list.find((s) => s.id === id);\n if (!server) {\n setResponseStatus(event, 404);\n return { error: \"Server not found\" };\n }\n const result = await tryConnect(server.url, server.headers);\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { ok: false, error: result.error };\n }\n return { ok: true, toolCount: result.toolCount, tools: result.tools };\n}\n\nasync function tryConnect(\n url: string,\n headers?: Record<string, string>,\n): Promise<\n | { ok: true; toolCount: number; tools: string[] }\n | { ok: false; error: string }\n> {\n try {\n const [{ Client }, { StreamableHTTPClientTransport }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/client/index.js\"),\n import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n ]);\n const requestInit: Record<string, unknown> = {};\n if (headers && Object.keys(headers).length > 0) {\n requestInit.headers = headers;\n }\n const transport = new StreamableHTTPClientTransport(new URL(url), {\n requestInit,\n });\n const client = new Client(\n { name: \"agent-native-mcp-client-test\", version: \"1.0.0\" },\n { capabilities: {} },\n );\n try {\n await client.connect(transport);\n const listed = await client.listTools();\n const names = ((listed?.tools ?? []) as Array<{ name: string }>).map(\n (t) => t.name,\n );\n return { ok: true, toolCount: names.length, tools: names };\n } finally {\n try {\n await client.close();\n } catch {}\n try {\n await transport.close();\n } catch {}\n }\n } catch (err: any) {\n return { ok: false, error: err?.message ?? String(err) };\n }\n}\n\nfunction normalizeHeaders(input: unknown): Record<string, string> | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n if (typeof k !== \"string\" || !k.trim()) continue;\n if (typeof v !== \"string\") continue;\n out[k.trim()] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/mcp-client/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTTP routes for user- and org-scope remote MCP server management.\n *\n * Mounted under `/_agent-native/mcp/servers` by `agent-chat-plugin` —\n * requires a reference to the running `McpClientManager` so mutations can\n * hot-reload the configured server set.\n *\n * GET /_agent-native/mcp/servers list user + org servers\n * POST /_agent-native/mcp/servers add a server\n * DELETE /_agent-native/mcp/servers/:id remove a server (scope via ?scope=)\n * POST /_agent-native/mcp/servers/:id/test dry-run connect (no persist)\n * POST /_agent-native/mcp/servers/test dry-run a URL before persisting\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getQuery,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { getAllSettings } from \"../settings/store.js\";\nimport type { McpClientManager } from \"./manager.js\";\nimport type { McpConfig, McpServerConfig } from \"./config.js\";\nimport { loadMcpConfig, autoDetectMcpConfig } from \"./config.js\";\nimport {\n addRemoteServer,\n listRemoteServers,\n mergedConfigKey,\n removeRemoteServer,\n toHttpServerConfigAsync,\n validateRemoteUrl,\n type RemoteMcpScope,\n type StoredRemoteMcpServer,\n} from \"./remote-store.js\";\nimport { fetchHubServers } from \"./hub-client.js\";\n\n/** Redact obvious auth header values before sending to the client. */\nfunction redactHeaders(\n headers?: Record<string, string>,\n): Record<string, { set: true }> | undefined {\n if (!headers) return undefined;\n const out: Record<string, { set: true }> = {};\n for (const k of Object.keys(headers)) out[k] = { set: true };\n return out;\n}\n\nfunction projectForClient(\n stored: StoredRemoteMcpServer,\n scope: RemoteMcpScope,\n ownerId: string,\n status: ServerStatus,\n): ClientServer {\n return {\n id: stored.id,\n scope,\n name: stored.name,\n url: stored.url,\n headers: redactHeaders(stored.headers),\n description: stored.description,\n createdAt: stored.createdAt,\n mergedId: mergedConfigKey(scope, stored, ownerId),\n status,\n };\n}\n\nexport interface ClientServer {\n id: string;\n scope: RemoteMcpScope;\n name: string;\n url: string;\n headers?: Record<string, { set: true }>;\n description?: string;\n createdAt: number;\n /** The key under which this server is registered in the running MCP manager. */\n mergedId: string;\n status: ServerStatus;\n}\n\ntype ServerStatus =\n | { state: \"connected\"; toolCount: number }\n | { state: \"error\"; error: string }\n | { state: \"unknown\" };\n\nfunction statusFor(manager: McpClientManager, mergedId: string): ServerStatus {\n const snap = manager.getStatus();\n if (snap.connectedServers.includes(mergedId)) {\n const toolCount = snap.tools.filter((t) => t.source === mergedId).length;\n return { state: \"connected\", toolCount };\n }\n if (snap.errors[mergedId]) {\n return { state: \"error\", error: snap.errors[mergedId] };\n }\n if (snap.configuredServers.includes(mergedId)) {\n return { state: \"unknown\" };\n }\n return { state: \"unknown\" };\n}\n\nexport function formatMcpConnectError(error: unknown): string {\n const raw =\n typeof error === \"string\"\n ? error\n : error instanceof Error\n ? error.message\n : String(error ?? \"\");\n const text = raw.trim();\n if (!text) return \"Could not connect to that MCP server.\";\n if (\n /<!doctype|<html[\\s>]|<\\/html>|unexpected token '<'|is not valid json/i.test(\n text,\n )\n ) {\n return \"That URL returned a web page instead of an MCP response. Check that you pasted the Streamable HTTP endpoint, often ending in /mcp.\";\n }\n if (\n /streamable http/i.test(text) &&\n /error|failed|non-200|status/i.test(text)\n ) {\n return \"The server did not complete the Streamable HTTP MCP handshake. Check the URL and any required authorization headers.\";\n }\n if (\n /failed to fetch|fetch failed|networkerror|econnrefused|enotfound|timed out/i.test(\n text,\n )\n ) {\n return \"Could not reach that MCP server. Check the URL and make sure it is publicly reachable from this app.\";\n }\n if (/401|403|unauthorized|forbidden/i.test(text)) {\n return \"The MCP server rejected the request. Add or update the required Authorization header.\";\n }\n if (/404|not found|405|method not allowed/i.test(text)) {\n return \"That URL is reachable, but it does not look like the MCP endpoint. Check the server's Streamable HTTP path.\";\n }\n return text.length > 240 ? `${text.slice(0, 237).trimEnd()}...` : text;\n}\n\n/**\n * Build the merged MCP config the manager should run with: file/env config\n * plus **every** user-scope and org-scope remote server persisted in the\n * settings store. Scanning all scopes means a mutation from one user's\n * session never drops another user's servers from the running manager.\n *\n * Each persisted server's merged key includes its owner discriminator\n * (`user_<emailhash>_<name>` or `org_<orgId>_<name>`) so two users' servers\n * with the same name coexist; the request-time gate in\n * `isMcpToolAllowedForRequest` then scopes tool visibility back down to the\n * calling user.\n */\nexport async function buildMergedConfig(): Promise<McpConfig | null> {\n const base = loadMcpConfig() ?? autoDetectMcpConfig();\n const servers: Record<string, McpServerConfig> = { ...(base?.servers ?? {}) };\n\n const all = await getAllSettings().catch(() => ({}));\n for (const [fullKey, value] of Object.entries(all)) {\n const userMatch = /^u:([^:]+):mcp-servers-remote$/.exec(fullKey);\n const orgMatch = /^o:([^:]+):mcp-servers-remote$/.exec(fullKey);\n let scope: RemoteMcpScope | null = null;\n let ownerId: string | null = null;\n if (userMatch) {\n scope = \"user\";\n ownerId = userMatch[1];\n } else if (orgMatch) {\n scope = \"org\";\n ownerId = orgMatch[1];\n }\n if (!scope || !ownerId) continue;\n const list = (value as { servers?: StoredRemoteMcpServer[] }).servers;\n if (!Array.isArray(list)) continue;\n for (const stored of list) {\n if (!stored || typeof stored.url !== \"string\" || !stored.name) continue;\n // Async resolve: decrypts `headerSecretKey` from app_secrets so the\n // running MCP client gets the cleartext bearer at request time.\n // Stored row contains only the secret-key reference, never the value.\n servers[mergedConfigKey(scope, stored, ownerId)] =\n await toHttpServerConfigAsync(scope, ownerId, stored);\n }\n }\n\n // Hub-consume: if this app is configured to consume from a remote hub\n // (AGENT_NATIVE_MCP_HUB_URL + AGENT_NATIVE_MCP_HUB_TOKEN), pull its\n // org-scope servers and merge. Hub entries use `hub_<orgId>_<name>` so\n // they never collide with local `org_<orgId>_<name>` rows.\n try {\n const hubServers = await fetchHubServers();\n for (const [mergedKey, cfg] of Object.entries(hubServers)) {\n servers[mergedKey] = cfg;\n }\n } catch (err: any) {\n console.warn(\n `[mcp-client] hub merge failed: ${err?.message ?? err}. Continuing with local config.`,\n );\n }\n\n if (Object.keys(servers).length === 0) return null;\n return { servers, source: base?.source ?? \"merged\" };\n}\n\nasync function resolveContextForRequest(event: H3Event): Promise<{\n email: string | null;\n orgId: string | null;\n role: string | null;\n}> {\n let email: string | null = null;\n try {\n const session = await getSession(event);\n email = session?.email ?? null;\n } catch {\n email = null;\n }\n let orgId: string | null = null;\n let role: string | null = null;\n try {\n const ctx = await getOrgContext(event);\n orgId = ctx.orgId;\n role = ctx.role;\n if (!email) email = ctx.email;\n } catch {\n // ignore — no org context\n }\n // No silent `local@localhost` fallback — if `getSession` returns nothing in\n // production (misconfigured deploy, expired token), the caller must reject\n // rather than silently pool every unauthenticated request under one identity.\n return { email, orgId, role };\n}\n\nasync function reconfigureManager(manager: McpClientManager): Promise<void> {\n const merged = await buildMergedConfig();\n await manager.reconfigure(merged);\n}\n\nexport function mountMcpServersRoutes(\n nitroApp: any,\n manager: McpClientManager,\n): void {\n const mountedApps: WeakSet<object> = ((\n globalThis as any\n ).__agentNativeMcpServersMountedApps ??= new WeakSet<object>());\n if (mountedApps.has(nitroApp)) return;\n mountedApps.add(nitroApp);\n\n try {\n getH3App(nitroApp).use(\n \"/_agent-native/mcp/servers\",\n defineEventHandler(async (event: H3Event) => {\n const method = getMethod(event);\n const pathname = (event.url?.pathname || \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n const parts = pathname ? pathname.split(\"/\") : [];\n\n setResponseHeader(event, \"Content-Type\", \"application/json\");\n\n // POST /servers/test — dry-run a URL+headers before persisting\n if (method === \"POST\" && parts.length === 1 && parts[0] === \"test\") {\n return handleTestUrl(event);\n }\n\n // Collection root\n if (parts.length === 0) {\n if (method === \"GET\") return handleList(event, manager);\n if (method === \"POST\") return handleAdd(event, manager);\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n // /:id / /:id/test\n if (parts.length === 1 || parts.length === 2) {\n const id = parts[0];\n if (parts.length === 2 && parts[1] === \"test\" && method === \"POST\") {\n return handleTestExisting(event, manager, id);\n }\n if (parts.length === 1 && method === \"DELETE\") {\n return handleDelete(event, manager, id);\n }\n }\n\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }),\n );\n } catch (err: any) {\n console.warn(\n `[mcp-client] Failed to mount /_agent-native/mcp/servers: ${err?.message ?? err}`,\n );\n }\n}\n\nasync function handleList(\n event: H3Event,\n manager: McpClientManager,\n): Promise<{\n user: ClientServer[];\n org: ClientServer[];\n orgId: string | null;\n role: string | null;\n}> {\n const { email, orgId, role } = await resolveContextForRequest(event);\n const userServers = email ? await listRemoteServers(\"user\", email) : [];\n const orgServers = orgId ? await listRemoteServers(\"org\", orgId) : [];\n return {\n user: userServers.map((s) =>\n projectForClient(\n s,\n \"user\",\n email ?? \"\",\n statusFor(manager, mergedConfigKey(\"user\", s, email ?? \"\")),\n ),\n ),\n org: orgServers.map((s) =>\n projectForClient(\n s,\n \"org\",\n orgId ?? \"\",\n statusFor(manager, mergedConfigKey(\"org\", s, orgId ?? \"\")),\n ),\n ),\n orgId,\n role,\n };\n}\n\nasync function handleAdd(event: H3Event, manager: McpClientManager) {\n const body = (await readBody(event).catch(() => ({}))) as {\n scope?: unknown;\n name?: unknown;\n url?: unknown;\n headers?: unknown;\n description?: unknown;\n };\n const scope =\n body.scope === \"org\" ? \"org\" : body.scope === \"user\" ? \"user\" : null;\n if (!scope) {\n setResponseStatus(event, 400);\n return { error: 'scope must be \"user\" or \"org\"' };\n }\n const name = typeof body.name === \"string\" ? body.name : \"\";\n const url = typeof body.url === \"string\" ? body.url : \"\";\n if (!name.trim() || !url.trim()) {\n setResponseStatus(event, 400);\n return { error: \"name and url are required\" };\n }\n const headers = normalizeHeaders(body.headers);\n const description =\n typeof body.description === \"string\" ? body.description : undefined;\n\n const { email, orgId, role } = await resolveContextForRequest(event);\n\n let scopeId: string | null = null;\n if (scope === \"user\") {\n scopeId = email;\n } else {\n if (!orgId) {\n setResponseStatus(event, 400);\n return {\n error: \"You must belong to an organization to add an org-scope server\",\n };\n }\n if (role !== \"owner\" && role !== \"admin\") {\n setResponseStatus(event, 403);\n return { error: \"Only owners and admins can add org-scope MCP servers\" };\n }\n scopeId = orgId;\n }\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const result = await addRemoteServer(scope, scopeId, {\n name,\n url,\n headers,\n description,\n });\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { error: result.error };\n }\n\n await reconfigureManager(manager);\n const mergedId = mergedConfigKey(scope, result.server, scopeId);\n return {\n ok: true,\n server: projectForClient(\n result.server,\n scope,\n scopeId,\n statusFor(manager, mergedId),\n ),\n };\n}\n\nasync function handleDelete(\n event: H3Event,\n manager: McpClientManager,\n id: string,\n) {\n const scope = getQuery(event).scope;\n const parsedScope =\n scope === \"org\" ? \"org\" : scope === \"user\" ? \"user\" : null;\n if (!parsedScope) {\n setResponseStatus(event, 400);\n return { error: 'scope query param must be \"user\" or \"org\"' };\n }\n const { email, orgId, role } = await resolveContextForRequest(event);\n\n let scopeId: string | null = null;\n if (parsedScope === \"user\") {\n scopeId = email;\n } else {\n if (!orgId) {\n setResponseStatus(event, 400);\n return { error: \"No active organization\" };\n }\n if (role !== \"owner\" && role !== \"admin\") {\n setResponseStatus(event, 403);\n return {\n error: \"Only owners and admins can remove org-scope MCP servers\",\n };\n }\n scopeId = orgId;\n }\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const removed = await removeRemoteServer(parsedScope, scopeId, id);\n if (!removed) {\n setResponseStatus(event, 404);\n return { error: \"Server not found\" };\n }\n await reconfigureManager(manager);\n return { ok: true };\n}\n\nasync function handleTestUrl(event: H3Event) {\n const body = (await readBody(event).catch(() => ({}))) as {\n url?: unknown;\n headers?: unknown;\n };\n const url = typeof body.url === \"string\" ? body.url : \"\";\n const check = validateRemoteUrl(url);\n if (!check.ok) {\n setResponseStatus(event, 400);\n return { ok: false, error: check.error };\n }\n const headers = normalizeHeaders(body.headers);\n const result = await tryConnect(check.url!.toString(), headers);\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { ok: false, error: result.error };\n }\n return { ok: true, toolCount: result.toolCount, tools: result.tools };\n}\n\nasync function handleTestExisting(\n event: H3Event,\n manager: McpClientManager,\n id: string,\n) {\n const scope = getQuery(event).scope;\n const parsedScope =\n scope === \"org\" ? \"org\" : scope === \"user\" ? \"user\" : null;\n if (!parsedScope) {\n setResponseStatus(event, 400);\n return { error: 'scope query param must be \"user\" or \"org\"' };\n }\n const { email, orgId } = await resolveContextForRequest(event);\n const scopeId = parsedScope === \"user\" ? email : orgId;\n if (!scopeId) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n const list = await listRemoteServers(parsedScope, scopeId);\n const server = list.find((s) => s.id === id);\n if (!server) {\n setResponseStatus(event, 404);\n return { error: \"Server not found\" };\n }\n const result = await tryConnect(server.url, server.headers);\n if (result.ok !== true) {\n setResponseStatus(event, 400);\n return { ok: false, error: result.error };\n }\n return { ok: true, toolCount: result.toolCount, tools: result.tools };\n}\n\nasync function tryConnect(\n url: string,\n headers?: Record<string, string>,\n): Promise<\n | { ok: true; toolCount: number; tools: string[] }\n | { ok: false; error: string }\n> {\n try {\n const [{ Client }, { StreamableHTTPClientTransport }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/client/index.js\"),\n import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n ]);\n const requestInit: Record<string, unknown> = {};\n if (headers && Object.keys(headers).length > 0) {\n requestInit.headers = headers;\n }\n const transport = new StreamableHTTPClientTransport(new URL(url), {\n requestInit,\n });\n const client = new Client(\n { name: \"agent-native-mcp-client-test\", version: \"1.0.0\" },\n { capabilities: {} },\n );\n try {\n await client.connect(transport);\n const listed = await client.listTools();\n const names = ((listed?.tools ?? []) as Array<{ name: string }>).map(\n (t) => t.name,\n );\n return { ok: true, toolCount: names.length, tools: names };\n } finally {\n try {\n await client.close();\n } catch {}\n try {\n await transport.close();\n } catch {}\n }\n } catch (err: any) {\n return { ok: false, error: formatMcpConnectError(err) };\n }\n}\n\nfunction normalizeHeaders(input: unknown): Record<string, string> | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n if (typeof k !== \"string\" || !k.trim()) continue;\n if (typeof v !== \"string\") continue;\n out[k.trim()] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"accept-pending.d.ts","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CA4D9B"}
1
+ {"version":3,"file":"accept-pending.d.ts","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CA8D9B"}
@@ -24,7 +24,7 @@ export async function acceptPendingInvitationsForEmail(rawEmail) {
24
24
  let rows = [];
25
25
  try {
26
26
  const res = await db.execute({
27
- sql: `SELECT id, org_id AS "orgId" FROM org_invitations
27
+ sql: `SELECT id, org_id AS "orgId", role FROM org_invitations
28
28
  WHERE LOWER(email) = ? AND status = 'pending'
29
29
  ORDER BY created_at DESC`,
30
30
  args: [email],
@@ -32,6 +32,7 @@ export async function acceptPendingInvitationsForEmail(rawEmail) {
32
32
  rows = res.rows.map((r) => ({
33
33
  id: String(r.id),
34
34
  orgId: String(r.orgId ?? r.org_id),
35
+ role: r.role == null ? null : String(r.role),
35
36
  }));
36
37
  }
37
38
  catch (err) {
@@ -48,9 +49,10 @@ export async function acceptPendingInvitationsForEmail(rawEmail) {
48
49
  args: [inv.orgId, email],
49
50
  });
50
51
  if (existing.rows.length === 0) {
52
+ const role = inv.role === "admin" ? "admin" : "member";
51
53
  await db.execute({
52
- sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,
53
- args: [nanoid(), inv.orgId, email, Date.now()],
54
+ sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,
55
+ args: [nanoid(), inv.orgId, email, role, Date.now()],
54
56
  });
55
57
  }
56
58
  await db.execute({
@@ -1 +1 @@
1
- {"version":3,"file":"accept-pending.js","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { putUserSetting } from \"../settings/user-settings.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AcceptPendingResult {\n accepted: Array<{ invitationId: string; orgId: string }>;\n activeOrgId: string | null;\n}\n\n/**\n * Accept every pending `org_invitations` row for this email:\n * - insert a matching `org_members` row (role 'member') when one doesn't exist\n * - flip the invitation's status to 'accepted'\n * - set the user's `active-org-id` to the most-recently-created invite\n *\n * Called from the Better Auth `user.create.after` hook so that a user who signs\n * up with an email they were just invited to lands in the org immediately,\n * rather than seeing a blank-slate app until they navigate to /team.\n *\n * Safe to call when the org tables don't exist (some templates don't use the\n * org module) — it swallows the \"no such table\" error and returns empty.\n */\nexport async function acceptPendingInvitationsForEmail(\n rawEmail: string,\n): Promise<AcceptPendingResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) {\n return { accepted: [], activeOrgId: null };\n }\n\n const db = getDbExec();\n\n let rows: Array<{ id: string; orgId: string }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT id, org_id AS \"orgId\" FROM org_invitations\n WHERE LOWER(email) = ? AND status = 'pending'\n ORDER BY created_at DESC`,\n args: [email],\n });\n rows = res.rows.map((r: any) => ({\n id: String(r.id),\n orgId: String(r.orgId ?? r.org_id),\n }));\n } catch (err) {\n // Template doesn't use the org module / tables not migrated yet.\n return { accepted: [], activeOrgId: null };\n }\n\n if (rows.length === 0) {\n return { accepted: [], activeOrgId: null };\n }\n\n const accepted: AcceptPendingResult[\"accepted\"] = [];\n for (const inv of rows) {\n const existing = await db.execute({\n sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [inv.orgId, email],\n });\n if (existing.rows.length === 0) {\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,\n args: [nanoid(), inv.orgId, email, Date.now()],\n });\n }\n await db.execute({\n sql: `UPDATE org_invitations SET status = 'accepted' WHERE id = ?`,\n args: [inv.id],\n });\n accepted.push({ invitationId: inv.id, orgId: inv.orgId });\n }\n\n // Set active-org-id to the most recent invite so the user lands in a\n // populated workspace on first load.\n const activeOrgId = accepted[0]?.orgId ?? null;\n if (activeOrgId) {\n try {\n await putUserSetting(email, \"active-org-id\", { orgId: activeOrgId });\n } catch {\n // user_settings table might not exist in a minimal template — not fatal.\n }\n }\n\n return { accepted, activeOrgId };\n}\n"]}
1
+ {"version":3,"file":"accept-pending.js","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { putUserSetting } from \"../settings/user-settings.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AcceptPendingResult {\n accepted: Array<{ invitationId: string; orgId: string }>;\n activeOrgId: string | null;\n}\n\n/**\n * Accept every pending `org_invitations` row for this email:\n * - insert a matching `org_members` row (role 'member') when one doesn't exist\n * - flip the invitation's status to 'accepted'\n * - set the user's `active-org-id` to the most-recently-created invite\n *\n * Called from the Better Auth `user.create.after` hook so that a user who signs\n * up with an email they were just invited to lands in the org immediately,\n * rather than seeing a blank-slate app until they navigate to /team.\n *\n * Safe to call when the org tables don't exist (some templates don't use the\n * org module) — it swallows the \"no such table\" error and returns empty.\n */\nexport async function acceptPendingInvitationsForEmail(\n rawEmail: string,\n): Promise<AcceptPendingResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) {\n return { accepted: [], activeOrgId: null };\n }\n\n const db = getDbExec();\n\n let rows: Array<{ id: string; orgId: string; role: string | null }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT id, org_id AS \"orgId\", role FROM org_invitations\n WHERE LOWER(email) = ? AND status = 'pending'\n ORDER BY created_at DESC`,\n args: [email],\n });\n rows = res.rows.map((r: any) => ({\n id: String(r.id),\n orgId: String(r.orgId ?? r.org_id),\n role: r.role == null ? null : String(r.role),\n }));\n } catch (err) {\n // Template doesn't use the org module / tables not migrated yet.\n return { accepted: [], activeOrgId: null };\n }\n\n if (rows.length === 0) {\n return { accepted: [], activeOrgId: null };\n }\n\n const accepted: AcceptPendingResult[\"accepted\"] = [];\n for (const inv of rows) {\n const existing = await db.execute({\n sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [inv.orgId, email],\n });\n if (existing.rows.length === 0) {\n const role = inv.role === \"admin\" ? \"admin\" : \"member\";\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,\n args: [nanoid(), inv.orgId, email, role, Date.now()],\n });\n }\n await db.execute({\n sql: `UPDATE org_invitations SET status = 'accepted' WHERE id = ?`,\n args: [inv.id],\n });\n accepted.push({ invitationId: inv.id, orgId: inv.orgId });\n }\n\n // Set active-org-id to the most recent invite so the user lands in a\n // populated workspace on first load.\n const activeOrgId = accepted[0]?.orgId ?? null;\n if (activeOrgId) {\n try {\n await putUserSetting(email, \"active-org-id\", { orgId: activeOrgId });\n } catch {\n // user_settings table might not exist in a minimal template — not fatal.\n }\n }\n\n return { accepted, activeOrgId };\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Free / public mailbox providers that should NOT be allowed as an
3
+ * organization's auto-join domain.
4
+ *
5
+ * Why: the auto-join feature lets anyone who signs up with an email at the
6
+ * org's `allowed_domain` join the org without an invitation. That is safe
7
+ * for company-owned domains (`acme.com`) — the company controls who gets
8
+ * an `@acme.com` address. It is catastrophic for shared mailbox providers
9
+ * (`gmail.com`, `outlook.com`, etc.) — anyone in the world can create a
10
+ * matching address and would be auto-added to the org.
11
+ *
12
+ * The list intentionally errs on the side of well-known providers; if a
13
+ * future provider isn't here we'll learn from a bug report rather than
14
+ * pretend we have an exhaustive registry.
15
+ */
16
+ export declare const FREE_EMAIL_PROVIDER_DOMAINS: ReadonlySet<string>;
17
+ export declare function isFreeEmailProvider(domain: string): boolean;
18
+ //# sourceMappingURL=free-email-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-email-providers.d.ts","sourceRoot":"","sources":["../../src/org/free-email-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAwG1D,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Free / public mailbox providers that should NOT be allowed as an
3
+ * organization's auto-join domain.
4
+ *
5
+ * Why: the auto-join feature lets anyone who signs up with an email at the
6
+ * org's `allowed_domain` join the org without an invitation. That is safe
7
+ * for company-owned domains (`acme.com`) — the company controls who gets
8
+ * an `@acme.com` address. It is catastrophic for shared mailbox providers
9
+ * (`gmail.com`, `outlook.com`, etc.) — anyone in the world can create a
10
+ * matching address and would be auto-added to the org.
11
+ *
12
+ * The list intentionally errs on the side of well-known providers; if a
13
+ * future provider isn't here we'll learn from a bug report rather than
14
+ * pretend we have an exhaustive registry.
15
+ */
16
+ export const FREE_EMAIL_PROVIDER_DOMAINS = new Set([
17
+ // Google
18
+ "gmail.com",
19
+ "googlemail.com",
20
+ // Microsoft
21
+ "outlook.com",
22
+ "hotmail.com",
23
+ "live.com",
24
+ "msn.com",
25
+ "outlook.co.uk",
26
+ "hotmail.co.uk",
27
+ "live.co.uk",
28
+ "outlook.de",
29
+ "hotmail.de",
30
+ "live.de",
31
+ "outlook.fr",
32
+ "hotmail.fr",
33
+ "live.fr",
34
+ // Yahoo
35
+ "yahoo.com",
36
+ "yahoo.co.uk",
37
+ "yahoo.co.jp",
38
+ "yahoo.fr",
39
+ "yahoo.de",
40
+ "yahoo.it",
41
+ "yahoo.es",
42
+ "yahoo.ca",
43
+ "yahoo.com.au",
44
+ "yahoo.com.br",
45
+ "ymail.com",
46
+ "rocketmail.com",
47
+ // Apple
48
+ "icloud.com",
49
+ "me.com",
50
+ "mac.com",
51
+ // AOL / Verizon
52
+ "aol.com",
53
+ "aim.com",
54
+ // Privacy / disposable / forwarding
55
+ "proton.me",
56
+ "protonmail.com",
57
+ "pm.me",
58
+ "tutanota.com",
59
+ "tutanota.de",
60
+ "tuta.io",
61
+ "fastmail.com",
62
+ "fastmail.fm",
63
+ "duck.com",
64
+ "hey.com",
65
+ // Russian / Chinese majors
66
+ "yandex.com",
67
+ "yandex.ru",
68
+ "mail.ru",
69
+ "list.ru",
70
+ "bk.ru",
71
+ "inbox.ru",
72
+ "qq.com",
73
+ "163.com",
74
+ "126.com",
75
+ "sina.com",
76
+ "sina.cn",
77
+ "sohu.com",
78
+ // ISP / legacy / misc
79
+ "gmx.com",
80
+ "gmx.de",
81
+ "gmx.net",
82
+ "web.de",
83
+ "t-online.de",
84
+ "freenet.de",
85
+ "zoho.com",
86
+ "zohomail.com",
87
+ "rediffmail.com",
88
+ "mail.com",
89
+ "att.net",
90
+ "comcast.net",
91
+ "verizon.net",
92
+ "sbcglobal.net",
93
+ "bellsouth.net",
94
+ "cox.net",
95
+ "earthlink.net",
96
+ "btinternet.com",
97
+ "btopenworld.com",
98
+ "talktalk.net",
99
+ "sky.com",
100
+ "ntlworld.com",
101
+ "virginmedia.com",
102
+ "free.fr",
103
+ "orange.fr",
104
+ "wanadoo.fr",
105
+ "laposte.net",
106
+ "libero.it",
107
+ "tiscali.it",
108
+ "uol.com.br",
109
+ "bol.com.br",
110
+ "terra.com.br",
111
+ // Disposable
112
+ "mailinator.com",
113
+ "guerrillamail.com",
114
+ "10minutemail.com",
115
+ "trashmail.com",
116
+ "yopmail.com",
117
+ "tempmail.com",
118
+ "throwawaymail.com",
119
+ "sharklasers.com",
120
+ ]);
121
+ export function isFreeEmailProvider(domain) {
122
+ return FREE_EMAIL_PROVIDER_DOMAINS.has(domain.trim().toLowerCase());
123
+ }
124
+ //# sourceMappingURL=free-email-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-email-providers.js","sourceRoot":"","sources":["../../src/org/free-email-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAwB,IAAI,GAAG,CAAC;IACtE,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,aAAa;IACb,UAAU;IACV,SAAS;IACT,eAAe;IACf,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,WAAW;IACX,aAAa;IACb,aAAa;IACb,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,cAAc;IACd,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,oCAAoC;IACpC,WAAW;IACX,gBAAgB;IAChB,OAAO;IACP,cAAc;IACd,aAAa;IACb,SAAS;IACT,cAAc;IACd,aAAa;IACb,UAAU;IACV,SAAS;IACT,2BAA2B;IAC3B,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,sBAAsB;IACtB,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,UAAU;IACV,SAAS;IACT,aAAa;IACb,aAAa;IACb,eAAe;IACf,eAAe;IACf,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,SAAS;IACT,WAAW;IACX,YAAY;IACZ,aAAa;IACb,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC","sourcesContent":["/**\n * Free / public mailbox providers that should NOT be allowed as an\n * organization's auto-join domain.\n *\n * Why: the auto-join feature lets anyone who signs up with an email at the\n * org's `allowed_domain` join the org without an invitation. That is safe\n * for company-owned domains (`acme.com`) — the company controls who gets\n * an `@acme.com` address. It is catastrophic for shared mailbox providers\n * (`gmail.com`, `outlook.com`, etc.) — anyone in the world can create a\n * matching address and would be auto-added to the org.\n *\n * The list intentionally errs on the side of well-known providers; if a\n * future provider isn't here we'll learn from a bug report rather than\n * pretend we have an exhaustive registry.\n */\nexport const FREE_EMAIL_PROVIDER_DOMAINS: ReadonlySet<string> = new Set([\n // Google\n \"gmail.com\",\n \"googlemail.com\",\n // Microsoft\n \"outlook.com\",\n \"hotmail.com\",\n \"live.com\",\n \"msn.com\",\n \"outlook.co.uk\",\n \"hotmail.co.uk\",\n \"live.co.uk\",\n \"outlook.de\",\n \"hotmail.de\",\n \"live.de\",\n \"outlook.fr\",\n \"hotmail.fr\",\n \"live.fr\",\n // Yahoo\n \"yahoo.com\",\n \"yahoo.co.uk\",\n \"yahoo.co.jp\",\n \"yahoo.fr\",\n \"yahoo.de\",\n \"yahoo.it\",\n \"yahoo.es\",\n \"yahoo.ca\",\n \"yahoo.com.au\",\n \"yahoo.com.br\",\n \"ymail.com\",\n \"rocketmail.com\",\n // Apple\n \"icloud.com\",\n \"me.com\",\n \"mac.com\",\n // AOL / Verizon\n \"aol.com\",\n \"aim.com\",\n // Privacy / disposable / forwarding\n \"proton.me\",\n \"protonmail.com\",\n \"pm.me\",\n \"tutanota.com\",\n \"tutanota.de\",\n \"tuta.io\",\n \"fastmail.com\",\n \"fastmail.fm\",\n \"duck.com\",\n \"hey.com\",\n // Russian / Chinese majors\n \"yandex.com\",\n \"yandex.ru\",\n \"mail.ru\",\n \"list.ru\",\n \"bk.ru\",\n \"inbox.ru\",\n \"qq.com\",\n \"163.com\",\n \"126.com\",\n \"sina.com\",\n \"sina.cn\",\n \"sohu.com\",\n // ISP / legacy / misc\n \"gmx.com\",\n \"gmx.de\",\n \"gmx.net\",\n \"web.de\",\n \"t-online.de\",\n \"freenet.de\",\n \"zoho.com\",\n \"zohomail.com\",\n \"rediffmail.com\",\n \"mail.com\",\n \"att.net\",\n \"comcast.net\",\n \"verizon.net\",\n \"sbcglobal.net\",\n \"bellsouth.net\",\n \"cox.net\",\n \"earthlink.net\",\n \"btinternet.com\",\n \"btopenworld.com\",\n \"talktalk.net\",\n \"sky.com\",\n \"ntlworld.com\",\n \"virginmedia.com\",\n \"free.fr\",\n \"orange.fr\",\n \"wanadoo.fr\",\n \"laposte.net\",\n \"libero.it\",\n \"tiscali.it\",\n \"uol.com.br\",\n \"bol.com.br\",\n \"terra.com.br\",\n // Disposable\n \"mailinator.com\",\n \"guerrillamail.com\",\n \"10minutemail.com\",\n \"trashmail.com\",\n \"yopmail.com\",\n \"tempmail.com\",\n \"throwawaymail.com\",\n \"sharklasers.com\",\n]);\n\nexport function isFreeEmailProvider(domain: string): boolean {\n return FREE_EMAIL_PROVIDER_DOMAINS.has(domain.trim().toLowerCase());\n}\n"]}
@@ -37,13 +37,23 @@ export declare const listMembersHandler: import("h3").EventHandlerWithFetch<impo
37
37
  joinedAt: number;
38
38
  }[];
39
39
  }>>;
40
- /** POST /_agent-native/org/invitations — invite a user by email */
41
- export declare const createInvitationHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
40
+ interface SingleInviteResult {
42
41
  id: string;
43
- email: any;
44
- status: string;
42
+ email: string;
43
+ role: "member" | "admin";
44
+ status: "pending";
45
45
  emailSent: boolean;
46
- emailError: string;
46
+ emailError?: string;
47
+ }
48
+ interface SingleInviteFailure {
49
+ email: string;
50
+ error: string;
51
+ }
52
+ /** POST /_agent-native/org/invitations — invite one or many users by email */
53
+ export declare const createInvitationHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<SingleInviteResult | {
54
+ succeeded: SingleInviteResult[];
55
+ failed: SingleInviteFailure[];
56
+ total: number;
47
57
  }>>;
48
58
  /** GET /_agent-native/org/invitations — list pending invitations for the org */
49
59
  export declare const listInvitationsHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
@@ -53,6 +63,7 @@ export declare const listInvitationsHandler: import("h3").EventHandlerWithFetch<
53
63
  invitedBy: string;
54
64
  createdAt: number;
55
65
  status: string;
66
+ role: string;
56
67
  }[];
57
68
  }>>;
58
69
  /** POST /_agent-native/org/invitations/:id/accept — accept an invitation */
@@ -65,6 +76,18 @@ export declare const acceptInvitationHandler: import("h3").EventHandlerWithFetch
65
76
  export declare const removeMemberHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
66
77
  success: boolean;
67
78
  }>>;
79
+ /**
80
+ * PUT /_agent-native/org/members/:email/role — change a member's role
81
+ * (owner/admin only). Body: { role: "admin" | "member" }.
82
+ *
83
+ * Only owners can promote/demote admins. (Admins can manage members but
84
+ * not other admins — otherwise an admin could escalate themselves to
85
+ * owner-equivalent control by promoting a confederate.)
86
+ */
87
+ export declare const changeMemberRoleHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
88
+ email: string;
89
+ role: string;
90
+ }>>;
68
91
  /** PATCH /_agent-native/org — rename the current organization (owner/admin only) */
69
92
  export declare const updateOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
70
93
  orgId: string;
@@ -141,4 +164,5 @@ export declare const receiveA2ASecretHandler: import("h3").EventHandlerWithFetch
141
164
  ok: boolean;
142
165
  orgId: string;
143
166
  }>>;
167
+ export {};
144
168
  //# sourceMappingURL=handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/org/handlers.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA2B1C,2FAA2F;AAC3F,eAAO,MAAM,eAAe;;;;;;;cAaA,OAAO;;;;;;;;;;eAIC,MAAM;iBAAW,MAAM;;;;GA0EzD,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;GAkC3B,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,kBAAkB;;;cAWH,OAAO;;;GAIjC,CAAC;AAEH,mEAAmE;AACnE,eAAO,MAAM,uBAAuB;;;;;;GA+EnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB;;;;;;;;GAqBlC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;UAmD8B,OAAO;GAkBxE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,mBAAmB;;GA2D/B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,gBAAgB;;;GA4B3B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;UAkCC,OAAO;GAEnC,CAAC;AAEH,mGAAmG;AACnG,eAAO,MAAM,mBAAmB;;;UAqDR,OAAO;GAG9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB;;GA2C3B,CAAC;AAEH,oGAAoG;AACpG,eAAO,MAAM,mBAAmB;;;GA0C/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB;;;;;YA2DvB,MAAM;cACJ,MAAM;aACP,MAAM;YACP,OAAO;iBACF,MAAM;gBACP,MAAM;;GAyDnB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB;;;GAgGnC,CAAC"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/org/handlers.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA2B1C,2FAA2F;AAC3F,eAAO,MAAM,eAAe;;;;;;;cAaA,OAAO;;;;;;;;;;eAIC,MAAM;iBAAW,MAAM;;;;GA0EzD,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;GAkC3B,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,kBAAkB;;;cAWH,OAAO;;;GAIjC,CAAC;AAMH,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAsED,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB;;;;GAuEnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB;;;;;;;;;GAyBlC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;UAoD8B,OAAO;GAkBxE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,mBAAmB;;GA2D/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;GAqEnC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,gBAAgB;;;GA4B3B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;UAkCC,OAAO;GAEnC,CAAC;AAEH,mGAAmG;AACnG,eAAO,MAAM,mBAAmB;;;UAqDR,OAAO;GAG9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB;;GAsE3B,CAAC;AAEH,oGAAoG;AACpG,eAAO,MAAM,mBAAmB;;;GA0C/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB;;;;;YA2DvB,MAAM;cACJ,MAAM;aACP,MAAM;YACP,OAAO;iBACF,MAAM;gBACP,MAAM;;GAyDnB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB;;;GAgGnC,CAAC"}