@frontmcp/sdk 0.4.0 → 0.5.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 (558) hide show
  1. package/README.md +30 -18
  2. package/package.json +20 -5
  3. package/src/app/app.registry.d.ts +3 -2
  4. package/src/app/app.registry.js +3 -1
  5. package/src/app/app.registry.js.map +1 -1
  6. package/src/app/instances/app.local.instance.js +2 -2
  7. package/src/app/instances/app.local.instance.js.map +1 -1
  8. package/src/auth/auth.registry.d.ts +34 -2
  9. package/src/auth/auth.registry.js +162 -24
  10. package/src/auth/auth.registry.js.map +1 -1
  11. package/src/auth/auth.utils.js +8 -9
  12. package/src/auth/auth.utils.js.map +1 -1
  13. package/src/auth/authorization/authorization.class.d.ts +125 -0
  14. package/src/auth/authorization/authorization.class.js +224 -0
  15. package/src/auth/authorization/authorization.class.js.map +1 -0
  16. package/src/auth/authorization/authorization.types.d.ts +300 -0
  17. package/src/auth/authorization/authorization.types.js +79 -0
  18. package/src/auth/authorization/authorization.types.js.map +1 -0
  19. package/src/auth/authorization/index.d.ts +5 -0
  20. package/src/auth/authorization/index.js +19 -0
  21. package/src/auth/authorization/index.js.map +1 -0
  22. package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
  23. package/src/auth/authorization/orchestrated.authorization.js +306 -0
  24. package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
  25. package/src/auth/authorization/public.authorization.d.ts +91 -0
  26. package/src/auth/authorization/public.authorization.js +132 -0
  27. package/src/auth/authorization/public.authorization.js.map +1 -0
  28. package/src/auth/authorization/transparent.authorization.d.ts +130 -0
  29. package/src/auth/authorization/transparent.authorization.js +147 -0
  30. package/src/auth/authorization/transparent.authorization.js.map +1 -0
  31. package/src/auth/consent/consent.types.d.ts +111 -0
  32. package/src/auth/consent/consent.types.js +119 -0
  33. package/src/auth/consent/consent.types.js.map +1 -0
  34. package/src/auth/consent/index.d.ts +1 -0
  35. package/src/auth/consent/index.js +13 -0
  36. package/src/auth/consent/index.js.map +1 -0
  37. package/src/auth/detection/auth-provider-detection.d.ts +84 -0
  38. package/src/auth/detection/auth-provider-detection.js +230 -0
  39. package/src/auth/detection/auth-provider-detection.js.map +1 -0
  40. package/src/auth/detection/index.d.ts +1 -0
  41. package/src/auth/detection/index.js +15 -0
  42. package/src/auth/detection/index.js.map +1 -0
  43. package/src/auth/flows/auth.verify.flow.d.ts +110 -0
  44. package/src/auth/flows/auth.verify.flow.js +379 -0
  45. package/src/auth/flows/auth.verify.flow.js.map +1 -0
  46. package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
  47. package/src/auth/flows/oauth.authorize.flow.js +701 -33
  48. package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
  49. package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
  50. package/src/auth/flows/oauth.callback.flow.js +357 -0
  51. package/src/auth/flows/oauth.callback.flow.js.map +1 -0
  52. package/src/auth/flows/oauth.register.flow.d.ts +32 -125
  53. package/src/auth/flows/oauth.token.flow.d.ts +52 -154
  54. package/src/auth/flows/oauth.token.flow.js +193 -55
  55. package/src/auth/flows/oauth.token.flow.js.map +1 -1
  56. package/src/auth/flows/session.verify.flow.d.ts +66 -321
  57. package/src/auth/flows/session.verify.flow.js +107 -18
  58. package/src/auth/flows/session.verify.flow.js.map +1 -1
  59. package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
  60. package/src/auth/flows/well-known.jwks.flow.js +15 -8
  61. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  62. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
  63. package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
  64. package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
  65. package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
  66. package/src/auth/flows/well-known.prm.flow.js +3 -4
  67. package/src/auth/flows/well-known.prm.flow.js.map +1 -1
  68. package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
  69. package/src/auth/instances/instance.local-primary-auth.js +236 -6
  70. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  71. package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
  72. package/src/auth/instances/instance.remote-primary-auth.js +2 -2
  73. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  74. package/src/auth/session/authorization-vault.d.ts +611 -0
  75. package/src/auth/session/authorization-vault.js +817 -0
  76. package/src/auth/session/authorization-vault.js.map +1 -0
  77. package/src/auth/session/authorization.store.d.ts +301 -0
  78. package/src/auth/session/authorization.store.js +323 -0
  79. package/src/auth/session/authorization.store.js.map +1 -0
  80. package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
  81. package/src/auth/session/encrypted-authorization-vault.js +493 -0
  82. package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
  83. package/src/auth/session/index.d.ts +4 -4
  84. package/src/auth/session/index.js +11 -7
  85. package/src/auth/session/index.js.map +1 -1
  86. package/src/auth/session/session.schema.d.ts +1 -1
  87. package/src/auth/session/session.service.d.ts +1 -1
  88. package/src/auth/session/transport-session.manager.d.ts +101 -0
  89. package/src/auth/session/transport-session.manager.js +300 -0
  90. package/src/auth/session/transport-session.manager.js.map +1 -0
  91. package/src/auth/session/transport-session.types.d.ts +457 -0
  92. package/src/auth/session/transport-session.types.js +110 -0
  93. package/src/auth/session/transport-session.types.js.map +1 -0
  94. package/src/auth/session/utils/session-id.utils.d.ts +14 -2
  95. package/src/auth/session/utils/session-id.utils.js +68 -19
  96. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  97. package/src/auth/session/vault-encryption.d.ts +189 -0
  98. package/src/auth/session/vault-encryption.js +263 -0
  99. package/src/auth/session/vault-encryption.js.map +1 -0
  100. package/src/auth/ui/base-layout.d.ts +188 -0
  101. package/src/auth/ui/base-layout.js +292 -0
  102. package/src/auth/ui/base-layout.js.map +1 -0
  103. package/src/auth/ui/htmx-templates.d.ts +135 -0
  104. package/src/auth/ui/htmx-templates.js +433 -0
  105. package/src/auth/ui/htmx-templates.js.map +1 -0
  106. package/src/auth/ui/index.d.ts +11 -0
  107. package/src/auth/ui/index.js +35 -0
  108. package/src/auth/ui/index.js.map +1 -0
  109. package/src/auth/utils/audience.validator.d.ts +129 -0
  110. package/src/auth/utils/audience.validator.js +196 -0
  111. package/src/auth/utils/audience.validator.js.map +1 -0
  112. package/src/auth/utils/index.d.ts +2 -0
  113. package/src/auth/utils/index.js +7 -0
  114. package/src/auth/utils/index.js.map +1 -0
  115. package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
  116. package/src/auth/utils/www-authenticate.utils.js +183 -0
  117. package/src/auth/utils/www-authenticate.utils.js.map +1 -0
  118. package/src/common/common.schema.d.ts +2 -16
  119. package/src/common/constants.d.ts +3 -0
  120. package/src/common/constants.js +6 -1
  121. package/src/common/constants.js.map +1 -1
  122. package/src/common/decorators/decorator-utils.d.ts +131 -0
  123. package/src/common/decorators/decorator-utils.js +195 -0
  124. package/src/common/decorators/decorator-utils.js.map +1 -0
  125. package/src/common/decorators/front-mcp.decorator.js +3 -2
  126. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  127. package/src/common/decorators/hook.decorator.d.ts +58 -2
  128. package/src/common/decorators/hook.decorator.js +127 -17
  129. package/src/common/decorators/hook.decorator.js.map +1 -1
  130. package/src/common/decorators/plugin.decorator.d.ts +1 -1
  131. package/src/common/decorators/plugin.decorator.js +11 -10
  132. package/src/common/decorators/plugin.decorator.js.map +1 -1
  133. package/src/common/decorators/resource.decorator.d.ts +32 -3
  134. package/src/common/decorators/resource.decorator.js +46 -4
  135. package/src/common/decorators/resource.decorator.js.map +1 -1
  136. package/src/common/decorators/tool.decorator.d.ts +54 -5
  137. package/src/common/decorators/tool.decorator.js.map +1 -1
  138. package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
  139. package/src/common/dynamic/dynamic.plugin.js +7 -1
  140. package/src/common/dynamic/dynamic.plugin.js.map +1 -1
  141. package/src/common/entries/prompt.entry.d.ts +46 -2
  142. package/src/common/entries/prompt.entry.js +10 -0
  143. package/src/common/entries/prompt.entry.js.map +1 -1
  144. package/src/common/entries/resource.entry.d.ts +69 -6
  145. package/src/common/entries/resource.entry.js +27 -3
  146. package/src/common/entries/resource.entry.js.map +1 -1
  147. package/src/common/entries/scope.entry.d.ts +5 -1
  148. package/src/common/entries/scope.entry.js +3 -3
  149. package/src/common/entries/scope.entry.js.map +1 -1
  150. package/src/common/flow/flow.utils.d.ts +56 -0
  151. package/src/common/flow/flow.utils.js +96 -0
  152. package/src/common/flow/flow.utils.js.map +1 -0
  153. package/src/common/index.d.ts +2 -2
  154. package/src/common/index.js +2 -2
  155. package/src/common/index.js.map +1 -1
  156. package/src/common/interfaces/execution-context.interface.d.ts +59 -0
  157. package/src/common/interfaces/execution-context.interface.js +81 -0
  158. package/src/common/interfaces/execution-context.interface.js.map +1 -0
  159. package/src/common/interfaces/flow.interface.d.ts +1 -1
  160. package/src/common/interfaces/flow.interface.js.map +1 -1
  161. package/src/common/interfaces/index.d.ts +1 -0
  162. package/src/common/interfaces/index.js +1 -0
  163. package/src/common/interfaces/index.js.map +1 -1
  164. package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
  165. package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
  166. package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
  167. package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
  168. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  169. package/src/common/interfaces/plugin.interface.js.map +1 -1
  170. package/src/common/interfaces/prompt.interface.d.ts +53 -4
  171. package/src/common/interfaces/prompt.interface.js +78 -0
  172. package/src/common/interfaces/prompt.interface.js.map +1 -1
  173. package/src/common/interfaces/resource.interface.d.ts +47 -17
  174. package/src/common/interfaces/resource.interface.js +53 -0
  175. package/src/common/interfaces/resource.interface.js.map +1 -1
  176. package/src/common/interfaces/tool.interface.d.ts +39 -22
  177. package/src/common/interfaces/tool.interface.js +61 -34
  178. package/src/common/interfaces/tool.interface.js.map +1 -1
  179. package/src/common/metadata/adapter.metadata.d.ts +1 -9
  180. package/src/common/metadata/app.metadata.d.ts +425 -730
  181. package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
  182. package/src/common/metadata/flow.metadata.d.ts +10 -25
  183. package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
  184. package/src/common/metadata/front-mcp.metadata.js +6 -4
  185. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  186. package/src/common/metadata/hook.metadata.d.ts +1 -1
  187. package/src/common/metadata/hook.metadata.js.map +1 -1
  188. package/src/common/metadata/index.d.ts +1 -0
  189. package/src/common/metadata/index.js +1 -0
  190. package/src/common/metadata/index.js.map +1 -1
  191. package/src/common/metadata/logger.metadata.d.ts +1 -9
  192. package/src/common/metadata/plugin.metadata.d.ts +8 -30
  193. package/src/common/metadata/prompt.metadata.d.ts +4 -161
  194. package/src/common/metadata/provider.metadata.d.ts +2 -12
  195. package/src/common/metadata/resource.metadata.d.ts +6 -98
  196. package/src/common/metadata/resource.metadata.js +15 -6
  197. package/src/common/metadata/resource.metadata.js.map +1 -1
  198. package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
  199. package/src/common/metadata/tool-ui.metadata.js +12 -0
  200. package/src/common/metadata/tool-ui.metadata.js.map +1 -0
  201. package/src/common/metadata/tool.metadata.d.ts +78 -199
  202. package/src/common/metadata/tool.metadata.js +11 -14
  203. package/src/common/metadata/tool.metadata.js.map +1 -1
  204. package/src/common/providers/base-config.provider.d.ts +84 -0
  205. package/src/common/providers/base-config.provider.js +128 -0
  206. package/src/common/providers/base-config.provider.js.map +1 -0
  207. package/src/common/records/plugin.record.d.ts +5 -6
  208. package/src/common/records/plugin.record.js.map +1 -1
  209. package/src/common/records/prompt.record.js.map +1 -1
  210. package/src/common/records/resource.record.d.ts +17 -1
  211. package/src/common/records/resource.record.js +12 -6
  212. package/src/common/records/resource.record.js.map +1 -1
  213. package/src/common/records/tool.record.js.map +1 -1
  214. package/src/common/schemas/annotated-class.schema.d.ts +9 -9
  215. package/src/common/schemas/annotated-class.schema.js +92 -27
  216. package/src/common/schemas/annotated-class.schema.js.map +1 -1
  217. package/src/common/schemas/http-input.schema.d.ts +6 -30
  218. package/src/common/schemas/http-output.schema.d.ts +326 -1630
  219. package/src/common/schemas/http-output.schema.js +39 -1
  220. package/src/common/schemas/http-output.schema.js.map +1 -1
  221. package/src/common/tokens/front-mcp.tokens.js +4 -1
  222. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  223. package/src/common/tokens/resource.tokens.d.ts +2 -0
  224. package/src/common/tokens/resource.tokens.js +4 -1
  225. package/src/common/tokens/resource.tokens.js.map +1 -1
  226. package/src/common/tokens/tool.tokens.d.ts +2 -0
  227. package/src/common/tokens/tool.tokens.js +2 -0
  228. package/src/common/tokens/tool.tokens.js.map +1 -1
  229. package/src/common/types/auth/jwt.types.d.ts +5 -31
  230. package/src/common/types/auth/session.types.d.ts +97 -192
  231. package/src/common/types/auth/session.types.js +24 -11
  232. package/src/common/types/auth/session.types.js.map +1 -1
  233. package/src/common/types/options/auth.options.d.ts +1013 -490
  234. package/src/common/types/options/auth.options.js +554 -36
  235. package/src/common/types/options/auth.options.js.map +1 -1
  236. package/src/common/types/options/http.options.d.ts +1 -9
  237. package/src/common/types/options/logging.options.d.ts +7 -13
  238. package/src/common/types/options/logging.options.js +4 -0
  239. package/src/common/types/options/logging.options.js.map +1 -1
  240. package/src/common/types/options/server-info.options.d.ts +3 -31
  241. package/src/common/types/options/session.options.d.ts +90 -10
  242. package/src/common/types/options/session.options.js +26 -3
  243. package/src/common/types/options/session.options.js.map +1 -1
  244. package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
  245. package/src/common/utils/decide-request-intent.utils.js +88 -23
  246. package/src/common/utils/decide-request-intent.utils.js.map +1 -1
  247. package/src/completion/flows/complete.flow.d.ts +74 -0
  248. package/src/completion/flows/complete.flow.js +199 -0
  249. package/src/completion/flows/complete.flow.js.map +1 -0
  250. package/src/errors/authorization-required.error.d.ts +189 -0
  251. package/src/errors/authorization-required.error.js +274 -0
  252. package/src/errors/authorization-required.error.js.map +1 -0
  253. package/src/errors/index.d.ts +2 -1
  254. package/src/errors/index.js +17 -1
  255. package/src/errors/index.js.map +1 -1
  256. package/src/errors/mcp.error.d.ts +101 -1
  257. package/src/errors/mcp.error.js +147 -2
  258. package/src/errors/mcp.error.js.map +1 -1
  259. package/src/flows/flow.instance.js +4 -3
  260. package/src/flows/flow.instance.js.map +1 -1
  261. package/src/flows/flow.registry.js.map +1 -1
  262. package/src/flows/flow.stages.js +14 -11
  263. package/src/flows/flow.stages.js.map +1 -1
  264. package/src/front-mcp/front-mcp.providers.d.ts +464 -102
  265. package/src/front-mcp/front-mcp.providers.js +3 -5
  266. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  267. package/src/hooks/hook.instance.d.ts +1 -1
  268. package/src/hooks/hook.instance.js +5 -2
  269. package/src/hooks/hook.instance.js.map +1 -1
  270. package/src/hooks/hook.registry.js +7 -5
  271. package/src/hooks/hook.registry.js.map +1 -1
  272. package/src/index.d.ts +28 -9
  273. package/src/index.js +5 -1
  274. package/src/index.js.map +1 -1
  275. package/src/logger/instances/instance.logger.js +3 -2
  276. package/src/logger/instances/instance.logger.js.map +1 -1
  277. package/src/logger/logger.registry.js +7 -2
  278. package/src/logger/logger.registry.js.map +1 -1
  279. package/src/logging/flows/set-level.flow.d.ts +62 -0
  280. package/src/logging/flows/set-level.flow.js +108 -0
  281. package/src/logging/flows/set-level.flow.js.map +1 -0
  282. package/src/mcp-apps/csp.d.ts +111 -0
  283. package/src/mcp-apps/csp.js +267 -0
  284. package/src/mcp-apps/csp.js.map +1 -0
  285. package/src/mcp-apps/index.d.ts +23 -0
  286. package/src/mcp-apps/index.js +91 -0
  287. package/src/mcp-apps/index.js.map +1 -0
  288. package/src/mcp-apps/schemas.d.ts +403 -0
  289. package/src/mcp-apps/schemas.js +345 -0
  290. package/src/mcp-apps/schemas.js.map +1 -0
  291. package/src/mcp-apps/template.d.ts +94 -0
  292. package/src/mcp-apps/template.js +419 -0
  293. package/src/mcp-apps/template.js.map +1 -0
  294. package/src/mcp-apps/types.d.ts +323 -0
  295. package/src/mcp-apps/types.js +59 -0
  296. package/src/mcp-apps/types.js.map +1 -0
  297. package/src/notification/index.d.ts +1 -0
  298. package/src/notification/index.js +13 -0
  299. package/src/notification/index.js.map +1 -0
  300. package/src/notification/notification.service.d.ts +378 -0
  301. package/src/notification/notification.service.js +727 -0
  302. package/src/notification/notification.service.js.map +1 -0
  303. package/src/plugin/plugin.registry.js +12 -9
  304. package/src/plugin/plugin.registry.js.map +1 -1
  305. package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
  306. package/src/prompt/flows/get-prompt.flow.js +214 -0
  307. package/src/prompt/flows/get-prompt.flow.js.map +1 -0
  308. package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
  309. package/src/prompt/flows/prompts-list.flow.js +176 -0
  310. package/src/prompt/flows/prompts-list.flow.js.map +1 -0
  311. package/src/prompt/index.d.ts +7 -0
  312. package/src/prompt/index.js +17 -0
  313. package/src/prompt/index.js.map +1 -0
  314. package/src/prompt/prompt.events.d.ts +17 -0
  315. package/src/prompt/prompt.events.js +25 -0
  316. package/src/prompt/prompt.events.js.map +1 -0
  317. package/src/prompt/prompt.instance.d.ts +30 -0
  318. package/src/prompt/prompt.instance.js +120 -0
  319. package/src/prompt/prompt.instance.js.map +1 -0
  320. package/src/prompt/prompt.registry.d.ts +79 -12
  321. package/src/prompt/prompt.registry.js +360 -15
  322. package/src/prompt/prompt.registry.js.map +1 -1
  323. package/src/prompt/prompt.types.d.ts +26 -0
  324. package/src/prompt/prompt.types.js +11 -0
  325. package/src/prompt/prompt.types.js.map +1 -0
  326. package/src/prompt/prompt.utils.d.ts +26 -0
  327. package/src/prompt/prompt.utils.js +136 -0
  328. package/src/prompt/prompt.utils.js.map +1 -0
  329. package/src/provider/provider.registry.d.ts +12 -5
  330. package/src/provider/provider.registry.js +30 -138
  331. package/src/provider/provider.registry.js.map +1 -1
  332. package/src/regsitry/registry.base.d.ts +1 -1
  333. package/src/regsitry/registry.base.js.map +1 -1
  334. package/src/resource/flows/read-resource.flow.d.ts +91 -0
  335. package/src/resource/flows/read-resource.flow.js +270 -0
  336. package/src/resource/flows/read-resource.flow.js.map +1 -0
  337. package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
  338. package/src/resource/flows/resource-templates-list.flow.js +191 -0
  339. package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
  340. package/src/resource/flows/resources-list.flow.d.ts +64 -0
  341. package/src/resource/flows/resources-list.flow.js +196 -0
  342. package/src/resource/flows/resources-list.flow.js.map +1 -0
  343. package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
  344. package/src/resource/flows/subscribe-resource.flow.js +123 -0
  345. package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
  346. package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
  347. package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
  348. package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
  349. package/src/resource/index.d.ts +8 -0
  350. package/src/resource/index.js +20 -0
  351. package/src/resource/index.js.map +1 -0
  352. package/src/resource/resource.events.d.ts +24 -0
  353. package/src/resource/resource.events.js +17 -0
  354. package/src/resource/resource.events.js.map +1 -0
  355. package/src/resource/resource.instance.d.ts +35 -0
  356. package/src/resource/resource.instance.js +163 -0
  357. package/src/resource/resource.instance.js.map +1 -0
  358. package/src/resource/resource.registry.d.ts +106 -12
  359. package/src/resource/resource.registry.js +449 -13
  360. package/src/resource/resource.registry.js.map +1 -1
  361. package/src/resource/resource.types.d.ts +35 -0
  362. package/src/resource/resource.types.js +11 -0
  363. package/src/resource/resource.types.js.map +1 -0
  364. package/src/resource/resource.utils.d.ts +30 -0
  365. package/src/resource/resource.utils.js +151 -0
  366. package/src/resource/resource.utils.js.map +1 -0
  367. package/src/scope/flows/http.request.flow.d.ts +48 -330
  368. package/src/scope/flows/http.request.flow.js +306 -78
  369. package/src/scope/flows/http.request.flow.js.map +1 -1
  370. package/src/scope/scope.instance.d.ts +12 -0
  371. package/src/scope/scope.instance.js +145 -15
  372. package/src/scope/scope.instance.js.map +1 -1
  373. package/src/tool/flows/call-tool.flow.d.ts +64 -1110
  374. package/src/tool/flows/call-tool.flow.js +303 -15
  375. package/src/tool/flows/call-tool.flow.js.map +1 -1
  376. package/src/tool/flows/tools-list.flow.d.ts +32 -473
  377. package/src/tool/flows/tools-list.flow.js +111 -10
  378. package/src/tool/flows/tools-list.flow.js.map +1 -1
  379. package/src/tool/tool.events.d.ts +8 -1
  380. package/src/tool/tool.events.js.map +1 -1
  381. package/src/tool/tool.instance.d.ts +3 -1
  382. package/src/tool/tool.instance.js +17 -3
  383. package/src/tool/tool.instance.js.map +1 -1
  384. package/src/tool/tool.registry.d.ts +7 -1
  385. package/src/tool/tool.registry.js +26 -10
  386. package/src/tool/tool.registry.js.map +1 -1
  387. package/src/tool/tool.types.d.ts +4 -4
  388. package/src/tool/tool.types.js.map +1 -1
  389. package/src/tool/tool.utils.d.ts +3 -12
  390. package/src/tool/tool.utils.js +39 -193
  391. package/src/tool/tool.utils.js.map +1 -1
  392. package/src/tool/ui/index.d.ts +22 -0
  393. package/src/tool/ui/index.js +63 -0
  394. package/src/tool/ui/index.js.map +1 -0
  395. package/src/tool/ui/platform-adapters.d.ts +10 -0
  396. package/src/tool/ui/platform-adapters.js +18 -0
  397. package/src/tool/ui/platform-adapters.js.map +1 -0
  398. package/src/tool/ui/template-helpers.d.ts +46 -0
  399. package/src/tool/ui/template-helpers.js +112 -0
  400. package/src/tool/ui/template-helpers.js.map +1 -0
  401. package/src/tool/ui/ui-resource-template.d.ts +34 -0
  402. package/src/tool/ui/ui-resource-template.js +64 -0
  403. package/src/tool/ui/ui-resource-template.js.map +1 -0
  404. package/src/tool/ui/ui-resource.handler.d.ts +74 -0
  405. package/src/tool/ui/ui-resource.handler.js +129 -0
  406. package/src/tool/ui/ui-resource.handler.js.map +1 -0
  407. package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
  408. package/src/transport/adapters/transport.local.adapter.js +28 -7
  409. package/src/transport/adapters/transport.local.adapter.js.map +1 -1
  410. package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
  411. package/src/transport/adapters/transport.sse.adapter.js +4 -3
  412. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  413. package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
  414. package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
  415. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  416. package/src/transport/flows/handle.sse.flow.d.ts +29 -63
  417. package/src/transport/flows/handle.sse.flow.js +78 -10
  418. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  419. package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
  420. package/src/transport/flows/handle.stateless-http.flow.js +102 -0
  421. package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
  422. package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
  423. package/src/transport/flows/handle.streamable-http.flow.js +158 -26
  424. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  425. package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
  426. package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
  427. package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
  428. package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
  429. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  430. package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
  431. package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
  432. package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
  433. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
  434. package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
  435. package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
  436. package/src/transport/mcp-handlers/index.d.ts +517 -208
  437. package/src/transport/mcp-handlers/index.js +39 -2
  438. package/src/transport/mcp-handlers/index.js.map +1 -1
  439. package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
  440. package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
  441. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  442. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
  443. package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
  444. package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
  445. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
  446. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
  447. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
  448. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
  449. package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
  450. package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
  451. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
  452. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
  453. package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
  454. package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
  455. package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
  456. package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
  457. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
  458. package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
  459. package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
  460. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
  461. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
  462. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
  463. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
  464. package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
  465. package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
  466. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
  467. package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
  468. package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
  469. package/src/transport/transport.local.js +7 -2
  470. package/src/transport/transport.local.js.map +1 -1
  471. package/src/transport/transport.registry.d.ts +30 -0
  472. package/src/transport/transport.registry.js +84 -1
  473. package/src/transport/transport.registry.js.map +1 -1
  474. package/src/transport/transport.types.d.ts +3 -3
  475. package/src/transport/transport.types.js.map +1 -1
  476. package/src/utils/content.utils.d.ts +48 -0
  477. package/src/utils/content.utils.js +194 -0
  478. package/src/utils/content.utils.js.map +1 -0
  479. package/src/utils/index.d.ts +8 -0
  480. package/src/utils/index.js +55 -0
  481. package/src/utils/index.js.map +1 -0
  482. package/src/utils/lineage.utils.d.ts +40 -0
  483. package/src/utils/lineage.utils.js +82 -0
  484. package/src/utils/lineage.utils.js.map +1 -0
  485. package/src/utils/naming.utils.d.ts +46 -0
  486. package/src/utils/naming.utils.js +136 -0
  487. package/src/utils/naming.utils.js.map +1 -0
  488. package/src/utils/types.utils.d.ts +2 -2
  489. package/src/utils/types.utils.js.map +1 -1
  490. package/src/utils/uri-template.utils.d.ts +57 -0
  491. package/src/utils/uri-template.utils.js +113 -0
  492. package/src/utils/uri-template.utils.js.map +1 -0
  493. package/src/utils/uri-validation.utils.d.ts +40 -0
  494. package/src/utils/uri-validation.utils.js +76 -0
  495. package/src/utils/uri-validation.utils.js.map +1 -0
  496. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
  497. package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
  498. package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
  499. package/src/__test-utils__/fixtures/index.d.ts +0 -7
  500. package/src/__test-utils__/fixtures/index.js +0 -11
  501. package/src/__test-utils__/fixtures/index.js.map +0 -1
  502. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
  503. package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
  504. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
  505. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
  506. package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
  507. package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
  508. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
  509. package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
  510. package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
  511. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
  512. package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
  513. package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
  514. package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
  515. package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
  516. package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
  517. package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
  518. package/src/__test-utils__/helpers/async.helpers.js +0 -112
  519. package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
  520. package/src/__test-utils__/helpers/index.d.ts +0 -6
  521. package/src/__test-utils__/helpers/index.js +0 -10
  522. package/src/__test-utils__/helpers/index.js.map +0 -1
  523. package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
  524. package/src/__test-utils__/helpers/setup.helpers.js +0 -106
  525. package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
  526. package/src/__test-utils__/index.d.ts +0 -9
  527. package/src/__test-utils__/index.js +0 -14
  528. package/src/__test-utils__/index.js.map +0 -1
  529. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
  530. package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
  531. package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
  532. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
  533. package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
  534. package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
  535. package/src/__test-utils__/mocks/index.d.ts +0 -8
  536. package/src/__test-utils__/mocks/index.js +0 -12
  537. package/src/__test-utils__/mocks/index.js.map +0 -1
  538. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
  539. package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
  540. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
  541. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
  542. package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
  543. package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
  544. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
  545. package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
  546. package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
  547. package/src/auth/path.utils.d.ts +0 -20
  548. package/src/auth/path.utils.js +0 -71
  549. package/src/auth/path.utils.js.map +0 -1
  550. package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
  551. package/src/common/decorators-old/async-with.decorator.js +0 -24
  552. package/src/common/decorators-old/async-with.decorator.js.map +0 -1
  553. package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
  554. package/src/common/decorators-old/auth-hook.decorator.js +0 -27
  555. package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
  556. package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
  557. package/src/common/decorators-old/session-hook.decorator.js +0 -27
  558. package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Base Layout for Server-Rendered Pages
3
+ *
4
+ * Provides a consistent HTML shell with all CDN resources pre-configured:
5
+ * - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support
6
+ * - HTMX (CDN) - Progressive enhancement for interactivity
7
+ * - Google Fonts (Inter) - Modern UI typography
8
+ *
9
+ * No build step required - all resources loaded from CDN at runtime.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic usage
14
+ * const html = baseLayout('<div>content</div>', { title: 'Page' });
15
+ *
16
+ * // With custom theme
17
+ * const html = baseLayout('<div>content</div>', {
18
+ * title: 'Page',
19
+ * theme: {
20
+ * colors: {
21
+ * primary: '#3b82f6',
22
+ * 'primary-dark': '#2563eb',
23
+ * },
24
+ * },
25
+ * });
26
+ * ```
27
+ */
28
+ /**
29
+ * CDN URLs and versions - centralized for easy updates
30
+ */
31
+ export declare const CDN: {
32
+ /** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */
33
+ readonly tailwind: "https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4";
34
+ /** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */
35
+ readonly htmx: {
36
+ readonly url: "https://unpkg.com/htmx.org@1.9.10";
37
+ readonly integrity: "sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC";
38
+ };
39
+ /** Google Fonts - Inter for modern UI */
40
+ readonly fonts: {
41
+ readonly preconnect: readonly ["https://fonts.googleapis.com", "https://fonts.gstatic.com"];
42
+ readonly stylesheet: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";
43
+ };
44
+ };
45
+ /**
46
+ * Theme color configuration
47
+ * Keys become CSS custom properties: --color-{key}
48
+ */
49
+ export interface ThemeColors {
50
+ /** Primary brand color */
51
+ primary?: string;
52
+ /** Darker primary for hover states */
53
+ 'primary-dark'?: string;
54
+ /** Secondary brand color */
55
+ secondary?: string;
56
+ /** Accent color for highlights */
57
+ accent?: string;
58
+ /** Success state color */
59
+ success?: string;
60
+ /** Warning state color */
61
+ warning?: string;
62
+ /** Error/danger state color */
63
+ danger?: string;
64
+ /** Custom colors (any additional colors) */
65
+ [key: string]: string | undefined;
66
+ }
67
+ /**
68
+ * Theme font configuration
69
+ * Keys become CSS custom properties: --font-{key}
70
+ */
71
+ export interface ThemeFonts {
72
+ /** Sans-serif font family */
73
+ sans?: string;
74
+ /** Serif font family */
75
+ serif?: string;
76
+ /** Monospace font family */
77
+ mono?: string;
78
+ /** Custom fonts */
79
+ [key: string]: string | undefined;
80
+ }
81
+ /**
82
+ * Complete theme configuration for FrontMCP UI
83
+ */
84
+ export interface ThemeConfig {
85
+ /** Custom colors */
86
+ colors?: ThemeColors;
87
+ /** Custom fonts */
88
+ fonts?: ThemeFonts;
89
+ /** Additional custom CSS variables (raw @theme content) */
90
+ customVars?: string;
91
+ /** Additional custom CSS (outside @theme) */
92
+ customCss?: string;
93
+ }
94
+ /**
95
+ * Default theme with FrontMCP branding
96
+ */
97
+ export declare const DEFAULT_THEME: ThemeConfig;
98
+ /**
99
+ * Options for the base layout
100
+ */
101
+ export interface BaseLayoutOptions {
102
+ /** Page title (will be suffixed with " - FrontMCP") */
103
+ title: string;
104
+ /** Optional description for meta tag */
105
+ description?: string;
106
+ /** Include HTMX script (default: true) */
107
+ includeHtmx?: boolean;
108
+ /** Include Tailwind CSS (default: true) */
109
+ includeTailwind?: boolean;
110
+ /** Include Google Fonts (default: true) */
111
+ includeFonts?: boolean;
112
+ /** Additional head content (scripts, styles, meta tags) */
113
+ headExtra?: string;
114
+ /** Body classes (default: 'bg-gray-50 min-h-screen font-sans antialiased') */
115
+ bodyClass?: string;
116
+ /** Theme configuration - colors, fonts, and custom CSS */
117
+ theme?: ThemeConfig;
118
+ }
119
+ /**
120
+ * Escape HTML special characters to prevent XSS
121
+ * Per OWASP guidelines, escapes: & < > " ' /
122
+ *
123
+ * @param str - The string to escape
124
+ * @returns The escaped string safe for HTML content and attributes
125
+ *
126
+ * @example
127
+ * escapeHtml('<script>alert("xss")</script>')
128
+ * // => '&lt;script&gt;alert(&quot;xss&quot;)&lt;&#x2F;script&gt;'
129
+ */
130
+ export declare function escapeHtml(str: string): string;
131
+ /**
132
+ * Build the complete HTML document with CDN resources
133
+ *
134
+ * @param content - The page content (HTML string)
135
+ * @param options - Layout configuration options
136
+ * @returns Complete HTML document string
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const html = baseLayout('<div>My content</div>', {
141
+ * title: 'Sign In',
142
+ * description: 'Sign in to your account',
143
+ * theme: {
144
+ * colors: {
145
+ * primary: '#ff6b6b',
146
+ * },
147
+ * },
148
+ * });
149
+ * ```
150
+ */
151
+ export declare function baseLayout(content: string, options: BaseLayoutOptions): string;
152
+ /**
153
+ * Create a layout wrapper function with preset options
154
+ *
155
+ * @param defaultOptions - Default options to apply to all pages
156
+ * @returns A function that wraps content with the layout
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * const brandedLayout = createLayout({
161
+ * theme: {
162
+ * colors: {
163
+ * primary: '#ff6b6b',
164
+ * 'primary-dark': '#ee5a5a',
165
+ * },
166
+ * },
167
+ * });
168
+ *
169
+ * const html = brandedLayout('<div>Content</div>', { title: 'Page' });
170
+ * ```
171
+ */
172
+ export declare function createLayout(defaultOptions: Partial<BaseLayoutOptions>): (content: string, options: BaseLayoutOptions) => string;
173
+ /**
174
+ * Default auth layout with standard styling
175
+ */
176
+ export declare const authLayout: (content: string, options: BaseLayoutOptions) => string;
177
+ /**
178
+ * Centered card layout for login/auth pages
179
+ */
180
+ export declare function centeredCardLayout(content: string, options: BaseLayoutOptions): string;
181
+ /**
182
+ * Wide layout for consent/selection pages
183
+ */
184
+ export declare function wideLayout(content: string, options: BaseLayoutOptions): string;
185
+ /**
186
+ * Extra wide layout for tool selection pages
187
+ */
188
+ export declare function extraWideLayout(content: string, options: BaseLayoutOptions): string;
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ /**
3
+ * Base Layout for Server-Rendered Pages
4
+ *
5
+ * Provides a consistent HTML shell with all CDN resources pre-configured:
6
+ * - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support
7
+ * - HTMX (CDN) - Progressive enhancement for interactivity
8
+ * - Google Fonts (Inter) - Modern UI typography
9
+ *
10
+ * No build step required - all resources loaded from CDN at runtime.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Basic usage
15
+ * const html = baseLayout('<div>content</div>', { title: 'Page' });
16
+ *
17
+ * // With custom theme
18
+ * const html = baseLayout('<div>content</div>', {
19
+ * title: 'Page',
20
+ * theme: {
21
+ * colors: {
22
+ * primary: '#3b82f6',
23
+ * 'primary-dark': '#2563eb',
24
+ * },
25
+ * },
26
+ * });
27
+ * ```
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.authLayout = exports.DEFAULT_THEME = exports.CDN = void 0;
31
+ exports.escapeHtml = escapeHtml;
32
+ exports.baseLayout = baseLayout;
33
+ exports.createLayout = createLayout;
34
+ exports.centeredCardLayout = centeredCardLayout;
35
+ exports.wideLayout = wideLayout;
36
+ exports.extraWideLayout = extraWideLayout;
37
+ // ============================================
38
+ // CDN Configuration
39
+ // ============================================
40
+ /**
41
+ * CDN URLs and versions - centralized for easy updates
42
+ */
43
+ exports.CDN = {
44
+ /** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */
45
+ tailwind: 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4',
46
+ /** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */
47
+ htmx: {
48
+ url: 'https://unpkg.com/htmx.org@1.9.10',
49
+ integrity: 'sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC',
50
+ },
51
+ /** Google Fonts - Inter for modern UI */
52
+ fonts: {
53
+ preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],
54
+ stylesheet: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',
55
+ },
56
+ };
57
+ /**
58
+ * Default theme with FrontMCP branding
59
+ */
60
+ exports.DEFAULT_THEME = {
61
+ colors: {
62
+ primary: '#3b82f6', // blue-500
63
+ 'primary-dark': '#2563eb', // blue-600
64
+ secondary: '#8b5cf6', // violet-500
65
+ accent: '#06b6d4', // cyan-500
66
+ success: '#22c55e', // green-500
67
+ warning: '#f59e0b', // amber-500
68
+ danger: '#ef4444', // red-500
69
+ },
70
+ fonts: {
71
+ sans: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
72
+ },
73
+ };
74
+ // ============================================
75
+ // Utility Functions
76
+ // ============================================
77
+ /**
78
+ * Escape HTML special characters to prevent XSS
79
+ * Per OWASP guidelines, escapes: & < > " ' /
80
+ *
81
+ * @param str - The string to escape
82
+ * @returns The escaped string safe for HTML content and attributes
83
+ *
84
+ * @example
85
+ * escapeHtml('<script>alert("xss")</script>')
86
+ * // => '&lt;script&gt;alert(&quot;xss&quot;)&lt;&#x2F;script&gt;'
87
+ */
88
+ function escapeHtml(str) {
89
+ return str
90
+ .replace(/&/g, '&amp;')
91
+ .replace(/</g, '&lt;')
92
+ .replace(/>/g, '&gt;')
93
+ .replace(/"/g, '&quot;')
94
+ .replace(/'/g, '&#39;')
95
+ .replace(/\//g, '&#x2F;');
96
+ }
97
+ /**
98
+ * Build the @theme CSS block from theme configuration
99
+ */
100
+ function buildThemeCss(theme) {
101
+ const lines = [];
102
+ // Add color variables
103
+ if (theme.colors) {
104
+ for (const [key, value] of Object.entries(theme.colors)) {
105
+ if (value) {
106
+ lines.push(`--color-${key}: ${value};`);
107
+ }
108
+ }
109
+ }
110
+ // Add font variables
111
+ if (theme.fonts) {
112
+ for (const [key, value] of Object.entries(theme.fonts)) {
113
+ if (value) {
114
+ lines.push(`--font-${key}: ${value};`);
115
+ }
116
+ }
117
+ }
118
+ // Add custom variables
119
+ if (theme.customVars) {
120
+ lines.push(theme.customVars);
121
+ }
122
+ return lines.join('\n ');
123
+ }
124
+ // ============================================
125
+ // Layout Builder
126
+ // ============================================
127
+ /**
128
+ * Build the complete HTML document with CDN resources
129
+ *
130
+ * @param content - The page content (HTML string)
131
+ * @param options - Layout configuration options
132
+ * @returns Complete HTML document string
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const html = baseLayout('<div>My content</div>', {
137
+ * title: 'Sign In',
138
+ * description: 'Sign in to your account',
139
+ * theme: {
140
+ * colors: {
141
+ * primary: '#ff6b6b',
142
+ * },
143
+ * },
144
+ * });
145
+ * ```
146
+ */
147
+ function baseLayout(content, options) {
148
+ const { title, description, includeHtmx = true, includeTailwind = true, includeFonts = true, headExtra = '', bodyClass = 'bg-gray-50 min-h-screen font-sans antialiased', theme, } = options;
149
+ // Merge theme with defaults
150
+ const mergedTheme = {
151
+ colors: { ...exports.DEFAULT_THEME.colors, ...theme?.colors },
152
+ fonts: { ...exports.DEFAULT_THEME.fonts, ...theme?.fonts },
153
+ customVars: theme?.customVars,
154
+ customCss: theme?.customCss,
155
+ };
156
+ // Build font preconnect links
157
+ const fontPreconnect = includeFonts
158
+ ? exports.CDN.fonts.preconnect
159
+ .map((url, i) => `<link rel="preconnect" href="${url}"${i > 0 ? ' crossorigin' : ''}>`)
160
+ .join('\n ')
161
+ : '';
162
+ // Build font stylesheet
163
+ const fontStylesheet = includeFonts ? `<link href="${exports.CDN.fonts.stylesheet}" rel="stylesheet">` : '';
164
+ // Build Tailwind v4 script and theme styles
165
+ const themeCss = buildThemeCss(mergedTheme);
166
+ const customCss = mergedTheme.customCss || '';
167
+ const tailwindBlock = includeTailwind
168
+ ? `<script src="${exports.CDN.tailwind}"></script>
169
+ <style type="text/tailwindcss">
170
+ @theme {
171
+ ${themeCss}
172
+ }
173
+ ${customCss}
174
+ </style>`
175
+ : '';
176
+ // Build HTMX script
177
+ const htmxScript = includeHtmx
178
+ ? `<script src="${exports.CDN.htmx.url}" integrity="${exports.CDN.htmx.integrity}" crossorigin="anonymous"></script>`
179
+ : '';
180
+ // Build meta description
181
+ const metaDescription = description ? `<meta name="description" content="${escapeHtml(description)}">` : '';
182
+ return `<!DOCTYPE html>
183
+ <html lang="en">
184
+ <head>
185
+ <meta charset="UTF-8">
186
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
187
+ <title>${escapeHtml(title)} - FrontMCP</title>
188
+ ${metaDescription}
189
+
190
+ <!-- Google Fonts CDN - Inter (modern UI font) -->
191
+ ${fontPreconnect}
192
+ ${fontStylesheet}
193
+
194
+ <!-- Tailwind CSS v4 Browser CDN with @theme support -->
195
+ ${tailwindBlock}
196
+
197
+ <!-- HTMX CDN - progressive enhancement (~14KB gzipped) -->
198
+ ${htmxScript}
199
+ ${headExtra}
200
+ </head>
201
+ <body class="${escapeHtml(bodyClass)}">
202
+ ${content}
203
+ </body>
204
+ </html>`;
205
+ }
206
+ /**
207
+ * Create a layout wrapper function with preset options
208
+ *
209
+ * @param defaultOptions - Default options to apply to all pages
210
+ * @returns A function that wraps content with the layout
211
+ *
212
+ * @example
213
+ * ```typescript
214
+ * const brandedLayout = createLayout({
215
+ * theme: {
216
+ * colors: {
217
+ * primary: '#ff6b6b',
218
+ * 'primary-dark': '#ee5a5a',
219
+ * },
220
+ * },
221
+ * });
222
+ *
223
+ * const html = brandedLayout('<div>Content</div>', { title: 'Page' });
224
+ * ```
225
+ */
226
+ function createLayout(defaultOptions) {
227
+ return (content, options) => {
228
+ // Deep merge themes
229
+ const mergedTheme = defaultOptions.theme || options.theme
230
+ ? {
231
+ colors: { ...defaultOptions.theme?.colors, ...options.theme?.colors },
232
+ fonts: { ...defaultOptions.theme?.fonts, ...options.theme?.fonts },
233
+ customVars: options.theme?.customVars ?? defaultOptions.theme?.customVars,
234
+ customCss: options.theme?.customCss ?? defaultOptions.theme?.customCss,
235
+ }
236
+ : undefined;
237
+ return baseLayout(content, {
238
+ ...defaultOptions,
239
+ ...options,
240
+ theme: mergedTheme,
241
+ });
242
+ };
243
+ }
244
+ // ============================================
245
+ // Pre-configured Layouts
246
+ // ============================================
247
+ /**
248
+ * Default auth layout with standard styling
249
+ */
250
+ exports.authLayout = createLayout({
251
+ bodyClass: 'bg-gray-50 min-h-screen font-sans antialiased',
252
+ });
253
+ /**
254
+ * Centered card layout for login/auth pages
255
+ */
256
+ function centeredCardLayout(content, options) {
257
+ const wrappedContent = `
258
+ <div class="min-h-screen flex items-center justify-center p-4">
259
+ <div class="w-full max-w-md">
260
+ ${content}
261
+ </div>
262
+ </div>`;
263
+ return baseLayout(wrappedContent, {
264
+ ...options,
265
+ bodyClass: 'bg-gradient-to-br from-primary to-secondary min-h-screen font-sans antialiased',
266
+ });
267
+ }
268
+ /**
269
+ * Wide layout for consent/selection pages
270
+ */
271
+ function wideLayout(content, options) {
272
+ const wrappedContent = `
273
+ <div class="min-h-screen py-8 px-4">
274
+ <div class="max-w-2xl mx-auto">
275
+ ${content}
276
+ </div>
277
+ </div>`;
278
+ return baseLayout(wrappedContent, options);
279
+ }
280
+ /**
281
+ * Extra wide layout for tool selection pages
282
+ */
283
+ function extraWideLayout(content, options) {
284
+ const wrappedContent = `
285
+ <div class="min-h-screen py-8 px-4">
286
+ <div class="max-w-3xl mx-auto">
287
+ ${content}
288
+ </div>
289
+ </div>`;
290
+ return baseLayout(wrappedContent, options);
291
+ }
292
+ //# sourceMappingURL=base-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-layout.js","sourceRoot":"","sources":["../../../../src/auth/ui/base-layout.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Base Layout for Server-Rendered Pages\n *\n * Provides a consistent HTML shell with all CDN resources pre-configured:\n * - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support\n * - HTMX (CDN) - Progressive enhancement for interactivity\n * - Google Fonts (Inter) - Modern UI typography\n *\n * No build step required - all resources loaded from CDN at runtime.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const html = baseLayout('<div>content</div>', { title: 'Page' });\n *\n * // With custom theme\n * const html = baseLayout('<div>content</div>', {\n * title: 'Page',\n * theme: {\n * colors: {\n * primary: '#3b82f6',\n * 'primary-dark': '#2563eb',\n * },\n * },\n * });\n * ```\n */\n\n// ============================================\n// CDN Configuration\n// ============================================\n\n/**\n * CDN URLs and versions - centralized for easy updates\n */\nexport const CDN = {\n /** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */\n tailwind: 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4',\n\n /** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */\n htmx: {\n url: 'https://unpkg.com/htmx.org@1.9.10',\n integrity: 'sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC',\n },\n\n /** Google Fonts - Inter for modern UI */\n fonts: {\n preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],\n stylesheet: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',\n },\n} as const;\n\n// ============================================\n// Theme Configuration\n// ============================================\n\n/**\n * Theme color configuration\n * Keys become CSS custom properties: --color-{key}\n */\nexport interface ThemeColors {\n /** Primary brand color */\n primary?: string;\n /** Darker primary for hover states */\n 'primary-dark'?: string;\n /** Secondary brand color */\n secondary?: string;\n /** Accent color for highlights */\n accent?: string;\n /** Success state color */\n success?: string;\n /** Warning state color */\n warning?: string;\n /** Error/danger state color */\n danger?: string;\n /** Custom colors (any additional colors) */\n [key: string]: string | undefined;\n}\n\n/**\n * Theme font configuration\n * Keys become CSS custom properties: --font-{key}\n */\nexport interface ThemeFonts {\n /** Sans-serif font family */\n sans?: string;\n /** Serif font family */\n serif?: string;\n /** Monospace font family */\n mono?: string;\n /** Custom fonts */\n [key: string]: string | undefined;\n}\n\n/**\n * Complete theme configuration for FrontMCP UI\n */\nexport interface ThemeConfig {\n /** Custom colors */\n colors?: ThemeColors;\n /** Custom fonts */\n fonts?: ThemeFonts;\n /** Additional custom CSS variables (raw @theme content) */\n customVars?: string;\n /** Additional custom CSS (outside @theme) */\n customCss?: string;\n}\n\n/**\n * Default theme with FrontMCP branding\n */\nexport const DEFAULT_THEME: ThemeConfig = {\n colors: {\n primary: '#3b82f6', // blue-500\n 'primary-dark': '#2563eb', // blue-600\n secondary: '#8b5cf6', // violet-500\n accent: '#06b6d4', // cyan-500\n success: '#22c55e', // green-500\n warning: '#f59e0b', // amber-500\n danger: '#ef4444', // red-500\n },\n fonts: {\n sans: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n },\n};\n\n// ============================================\n// Layout Options\n// ============================================\n\n/**\n * Options for the base layout\n */\nexport interface BaseLayoutOptions {\n /** Page title (will be suffixed with \" - FrontMCP\") */\n title: string;\n\n /** Optional description for meta tag */\n description?: string;\n\n /** Include HTMX script (default: true) */\n includeHtmx?: boolean;\n\n /** Include Tailwind CSS (default: true) */\n includeTailwind?: boolean;\n\n /** Include Google Fonts (default: true) */\n includeFonts?: boolean;\n\n /** Additional head content (scripts, styles, meta tags) */\n headExtra?: string;\n\n /** Body classes (default: 'bg-gray-50 min-h-screen font-sans antialiased') */\n bodyClass?: string;\n\n /** Theme configuration - colors, fonts, and custom CSS */\n theme?: ThemeConfig;\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Escape HTML special characters to prevent XSS\n * Per OWASP guidelines, escapes: & < > \" ' /\n *\n * @param str - The string to escape\n * @returns The escaped string safe for HTML content and attributes\n *\n * @example\n * escapeHtml('<script>alert(\"xss\")</script>')\n * // => '&lt;script&gt;alert(&quot;xss&quot;)&lt;&#x2F;script&gt;'\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n .replace(/\\//g, '&#x2F;');\n}\n\n/**\n * Build the @theme CSS block from theme configuration\n */\nfunction buildThemeCss(theme: ThemeConfig): string {\n const lines: string[] = [];\n\n // Add color variables\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value) {\n lines.push(`--color-${key}: ${value};`);\n }\n }\n }\n\n // Add font variables\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n if (value) {\n lines.push(`--font-${key}: ${value};`);\n }\n }\n }\n\n // Add custom variables\n if (theme.customVars) {\n lines.push(theme.customVars);\n }\n\n return lines.join('\\n ');\n}\n\n// ============================================\n// Layout Builder\n// ============================================\n\n/**\n * Build the complete HTML document with CDN resources\n *\n * @param content - The page content (HTML string)\n * @param options - Layout configuration options\n * @returns Complete HTML document string\n *\n * @example\n * ```typescript\n * const html = baseLayout('<div>My content</div>', {\n * title: 'Sign In',\n * description: 'Sign in to your account',\n * theme: {\n * colors: {\n * primary: '#ff6b6b',\n * },\n * },\n * });\n * ```\n */\nexport function baseLayout(content: string, options: BaseLayoutOptions): string {\n const {\n title,\n description,\n includeHtmx = true,\n includeTailwind = true,\n includeFonts = true,\n headExtra = '',\n bodyClass = 'bg-gray-50 min-h-screen font-sans antialiased',\n theme,\n } = options;\n\n // Merge theme with defaults\n const mergedTheme: ThemeConfig = {\n colors: { ...DEFAULT_THEME.colors, ...theme?.colors },\n fonts: { ...DEFAULT_THEME.fonts, ...theme?.fonts },\n customVars: theme?.customVars,\n customCss: theme?.customCss,\n };\n\n // Build font preconnect links\n const fontPreconnect = includeFonts\n ? CDN.fonts.preconnect\n .map((url, i) => `<link rel=\"preconnect\" href=\"${url}\"${i > 0 ? ' crossorigin' : ''}>`)\n .join('\\n ')\n : '';\n\n // Build font stylesheet\n const fontStylesheet = includeFonts ? `<link href=\"${CDN.fonts.stylesheet}\" rel=\"stylesheet\">` : '';\n\n // Build Tailwind v4 script and theme styles\n const themeCss = buildThemeCss(mergedTheme);\n const customCss = mergedTheme.customCss || '';\n\n const tailwindBlock = includeTailwind\n ? `<script src=\"${CDN.tailwind}\"></script>\n <style type=\"text/tailwindcss\">\n @theme {\n ${themeCss}\n }\n ${customCss}\n </style>`\n : '';\n\n // Build HTMX script\n const htmxScript = includeHtmx\n ? `<script src=\"${CDN.htmx.url}\" integrity=\"${CDN.htmx.integrity}\" crossorigin=\"anonymous\"></script>`\n : '';\n\n // Build meta description\n const metaDescription = description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : '';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(title)} - FrontMCP</title>\n ${metaDescription}\n\n <!-- Google Fonts CDN - Inter (modern UI font) -->\n ${fontPreconnect}\n ${fontStylesheet}\n\n <!-- Tailwind CSS v4 Browser CDN with @theme support -->\n ${tailwindBlock}\n\n <!-- HTMX CDN - progressive enhancement (~14KB gzipped) -->\n ${htmxScript}\n ${headExtra}\n</head>\n<body class=\"${escapeHtml(bodyClass)}\">\n ${content}\n</body>\n</html>`;\n}\n\n/**\n * Create a layout wrapper function with preset options\n *\n * @param defaultOptions - Default options to apply to all pages\n * @returns A function that wraps content with the layout\n *\n * @example\n * ```typescript\n * const brandedLayout = createLayout({\n * theme: {\n * colors: {\n * primary: '#ff6b6b',\n * 'primary-dark': '#ee5a5a',\n * },\n * },\n * });\n *\n * const html = brandedLayout('<div>Content</div>', { title: 'Page' });\n * ```\n */\nexport function createLayout(\n defaultOptions: Partial<BaseLayoutOptions>,\n): (content: string, options: BaseLayoutOptions) => string {\n return (content: string, options: BaseLayoutOptions) => {\n // Deep merge themes\n const mergedTheme: ThemeConfig | undefined =\n defaultOptions.theme || options.theme\n ? {\n colors: { ...defaultOptions.theme?.colors, ...options.theme?.colors },\n fonts: { ...defaultOptions.theme?.fonts, ...options.theme?.fonts },\n customVars: options.theme?.customVars ?? defaultOptions.theme?.customVars,\n customCss: options.theme?.customCss ?? defaultOptions.theme?.customCss,\n }\n : undefined;\n\n return baseLayout(content, {\n ...defaultOptions,\n ...options,\n theme: mergedTheme,\n });\n };\n}\n\n// ============================================\n// Pre-configured Layouts\n// ============================================\n\n/**\n * Default auth layout with standard styling\n */\nexport const authLayout = createLayout({\n bodyClass: 'bg-gray-50 min-h-screen font-sans antialiased',\n});\n\n/**\n * Centered card layout for login/auth pages\n */\nexport function centeredCardLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen flex items-center justify-center p-4\">\n <div class=\"w-full max-w-md\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, {\n ...options,\n bodyClass: 'bg-gradient-to-br from-primary to-secondary min-h-screen font-sans antialiased',\n });\n}\n\n/**\n * Wide layout for consent/selection pages\n */\nexport function wideLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen py-8 px-4\">\n <div class=\"max-w-2xl mx-auto\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, options);\n}\n\n/**\n * Extra wide layout for tool selection pages\n */\nexport function extraWideLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen py-8 px-4\">\n <div class=\"max-w-3xl mx-auto\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, options);\n}\n"]}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * HTMX Template Builders for OAuth UI
3
+ *
4
+ * Server-side HTML rendering with HTMX for interactivity.
5
+ * No build step required - pure runtime rendering with Tailwind CSS CDN.
6
+ *
7
+ * Features:
8
+ * - OAuth consent page with multiple apps
9
+ * - Incremental authorization page for single app
10
+ * - Federated login page for multi-provider selection
11
+ * - All pages use Tailwind CSS from CDN (no build required)
12
+ * - Google Fonts (Inter) for modern typography
13
+ * - HTMX for progressive enhancement (~14KB)
14
+ *
15
+ * Uses base-layout.ts for consistent HTML shell with CDN resources.
16
+ */
17
+ import { escapeHtml as baseEscapeHtml } from './base-layout';
18
+ /**
19
+ * App information for authorization cards
20
+ */
21
+ export interface AppAuthCard {
22
+ /** App identifier */
23
+ appId: string;
24
+ /** Display name */
25
+ appName: string;
26
+ /** App description */
27
+ description?: string;
28
+ /** Icon URL (optional, will use initials fallback) */
29
+ iconUrl?: string;
30
+ /** Scopes required by this app */
31
+ requiredScopes?: string[];
32
+ }
33
+ /**
34
+ * Provider information for federated login
35
+ */
36
+ export interface ProviderCard {
37
+ /** Provider identifier */
38
+ providerId: string;
39
+ /** Display name */
40
+ providerName: string;
41
+ /** Provider URL (for remote providers) */
42
+ providerUrl?: string;
43
+ /** Auth mode */
44
+ mode: string;
45
+ /** App IDs associated with this provider */
46
+ appIds: string[];
47
+ /** Whether this is the parent/primary provider */
48
+ isPrimary?: boolean;
49
+ }
50
+ /**
51
+ * Tool information for consent page
52
+ */
53
+ export interface ToolCard {
54
+ /** Tool identifier */
55
+ toolId: string;
56
+ /** Display name */
57
+ toolName: string;
58
+ /** Tool description */
59
+ description?: string;
60
+ /** Parent app ID */
61
+ appId: string;
62
+ /** Parent app name */
63
+ appName: string;
64
+ }
65
+ /**
66
+ * Escape HTML special characters
67
+ * Re-exported from base-layout for convenience
68
+ */
69
+ export declare const escapeHtml: typeof baseEscapeHtml;
70
+ /**
71
+ * Build OAuth consent page with HTMX + Tailwind
72
+ * Shows all apps at once with Authorize/Skip buttons
73
+ */
74
+ export declare function buildConsentPage(params: {
75
+ apps: AppAuthCard[];
76
+ clientName: string;
77
+ pendingAuthId: string;
78
+ csrfToken: string;
79
+ callbackPath: string;
80
+ }): string;
81
+ /**
82
+ * Build incremental auth page (single app) with HTMX + Tailwind
83
+ * Used when a tool requires authorization for a skipped app
84
+ */
85
+ export declare function buildIncrementalAuthPage(params: {
86
+ app: AppAuthCard;
87
+ toolId: string;
88
+ sessionHint: string;
89
+ callbackPath: string;
90
+ }): string;
91
+ /**
92
+ * Build federated login page for multi-provider selection
93
+ */
94
+ export declare function buildFederatedLoginPage(params: {
95
+ providers: ProviderCard[];
96
+ clientName: string;
97
+ pendingAuthId: string;
98
+ csrfToken: string;
99
+ callbackPath: string;
100
+ }): string;
101
+ /**
102
+ * Build consent page for tool selection
103
+ */
104
+ export declare function buildToolConsentPage(params: {
105
+ tools: ToolCard[];
106
+ clientName: string;
107
+ pendingAuthId: string;
108
+ csrfToken: string;
109
+ callbackPath: string;
110
+ userName?: string;
111
+ userEmail?: string;
112
+ }): string;
113
+ /**
114
+ * Build simple login page
115
+ */
116
+ export declare function buildLoginPage(params: {
117
+ clientName: string;
118
+ scope: string;
119
+ pendingAuthId: string;
120
+ callbackPath: string;
121
+ }): string;
122
+ /**
123
+ * Build error page
124
+ */
125
+ export declare function buildErrorPage(params: {
126
+ error: string;
127
+ description: string;
128
+ }): string;
129
+ /**
130
+ * Simple wrapper for compatibility - just returns the HTML string
131
+ * (HTMX templates are already complete HTML documents)
132
+ */
133
+ export declare function renderToHtml(html: string, _options?: {
134
+ title?: string;
135
+ }): string;