@redocly/realm 0.136.0-next.0 → 0.136.0-next.10

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 (535) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/build/analytics/collect-analytics.js +1 -1
  4. package/dist/cli/build/index.js +1 -1
  5. package/dist/cli/eject/ejectComponent.d.ts +1 -1
  6. package/dist/cli/eject/ejectTheme.d.ts +1 -1
  7. package/dist/cli/eject/resolveEjectParams.js +1 -1
  8. package/dist/cli/eject/themeOperations.d.ts +2 -2
  9. package/dist/cli/stats/collectors/openapi/index.js +1 -1
  10. package/dist/cli/stats/index.js +1 -1
  11. package/dist/client/App.js +1 -1
  12. package/dist/client/ErrorBoundary.js +1 -1
  13. package/dist/client/TestProvider.d.ts +1 -1
  14. package/dist/client/TestProvider.js +1 -1
  15. package/dist/client/api-docs-builder-entry.d.ts +3 -0
  16. package/dist/client/api-docs-builder-entry.js +1 -0
  17. package/dist/client/app/ConditionalLink.d.ts +1 -1
  18. package/dist/client/app/Feedback/useSubmitFeedback.js +1 -1
  19. package/dist/client/app/Sidebar/Sidebar.js +3 -3
  20. package/dist/client/app/Sidebar/helpers/hide-empty-separators.d.ts +13 -0
  21. package/dist/client/app/Sidebar/helpers/hide-empty-separators.js +1 -0
  22. package/dist/client/app/Sidebar/useActions.js +1 -1
  23. package/dist/client/app/Sidebar/utils.js +1 -1
  24. package/dist/client/app/hooks/catalog/useCatalogFilter.d.ts +1 -1
  25. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  26. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.d.ts +1 -1
  27. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  28. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.d.ts +2 -2
  29. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  30. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +1 -1
  31. package/dist/client/app/hooks/catalog/useSearchTracker.d.ts +2 -5
  32. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  33. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.d.ts +1 -6
  34. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.js +1 -1
  35. package/dist/client/app/hooks/index.d.ts +1 -0
  36. package/dist/client/app/hooks/index.js +1 -1
  37. package/dist/client/app/hooks/useAutoScroll.js +1 -1
  38. package/dist/client/app/hooks/useUserClaims.js +1 -1
  39. package/dist/client/app/l10n/hooks/index.d.ts +1 -0
  40. package/dist/client/app/l10n/hooks/index.js +1 -1
  41. package/dist/client/app/l10n/hooks/useTranslate.js +1 -1
  42. package/dist/client/app/l10n/hooks/useTranslationKeys.d.ts +2 -0
  43. package/dist/client/app/l10n/hooks/useTranslationKeys.js +1 -0
  44. package/dist/client/app/l10n/initL10n.js +1 -1
  45. package/dist/client/app/markdoc/custom-components/openapi/json-schema.d.ts +1 -1
  46. package/dist/client/app/markdoc/custom-components/openapi/json-schema.js +1 -1
  47. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.d.ts +1 -5
  48. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.js +1 -1
  49. package/dist/client/app/markdoc/custom-components/openapi/openapi-example.js +1 -1
  50. package/dist/client/app/markdoc/custom-components/openapi/openapi-response-sample.js +1 -1
  51. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.d.ts +8 -24
  52. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.js +1 -1
  53. package/dist/client/app/markdoc/hooks/use-store.d.ts +8 -6
  54. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.d.ts +20 -0
  55. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.js +1 -0
  56. package/dist/client/app/markdoc/utils/find-api-item.d.ts +15 -0
  57. package/dist/client/app/markdoc/utils/find-api-item.js +1 -0
  58. package/dist/client/app/markdoc/utils/find-code-sample-panel.d.ts +11 -0
  59. package/dist/client/app/markdoc/utils/find-code-sample-panel.js +1 -0
  60. package/dist/client/app/markdoc/utils/find-openapi-response-samples.d.ts +15 -0
  61. package/dist/client/app/markdoc/utils/find-openapi-response-samples.js +1 -0
  62. package/dist/client/app/markdoc/utils/openapi-panel-entry.d.ts +18 -0
  63. package/dist/client/app/markdoc/utils/openapi-panel-entry.js +1 -0
  64. package/dist/client/app/pages/DevLogin/DevLoginForm.d.ts +1 -1
  65. package/dist/client/app/useGlobalData.d.ts +1 -1
  66. package/dist/client/app/usePreloadHistory.d.ts +2 -2
  67. package/dist/client/app/usePreloadHistory.js +1 -1
  68. package/dist/client/app/utils/loadAndNavigate.d.ts +1 -1
  69. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  70. package/dist/client/app/utils/resolveRouteBySlug.js +1 -1
  71. package/dist/client/app/utils/same-resolved-route.d.ts +5 -0
  72. package/dist/client/app/utils/same-resolved-route.js +1 -0
  73. package/dist/client/browser-entry.js +2 -2
  74. package/dist/client/providers/page-data/hooks.d.ts +2 -2
  75. package/dist/client/providers/post-message/PostMessageProvider.js +1 -1
  76. package/dist/client/providers/post-message/use-post-message.d.ts +1 -1
  77. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  78. package/dist/client/runtime/loader.js +1 -1
  79. package/dist/client/templates/api-docs/helpers.d.ts +10 -0
  80. package/dist/client/templates/api-docs/helpers.js +1 -0
  81. package/dist/client/templates/api-docs/template.d.ts +17 -0
  82. package/dist/client/templates/api-docs/template.js +14 -0
  83. package/dist/client/templates/openapi-docs/helpers.d.ts +1 -1
  84. package/dist/client/templates/openapi-docs/helpers.js +2 -2
  85. package/dist/client/types/sidebar.d.ts +0 -1
  86. package/dist/client/utils/utils.d.ts +0 -2
  87. package/dist/client/utils/utils.js +1 -1
  88. package/dist/constants/common.d.ts +14 -1
  89. package/dist/constants/common.js +1 -1
  90. package/dist/constants/l10n/langs/ar.js +1 -1
  91. package/dist/constants/l10n/langs/de.js +1 -1
  92. package/dist/constants/l10n/langs/en.js +1 -1
  93. package/dist/constants/l10n/langs/es.js +1 -1
  94. package/dist/constants/l10n/langs/fr.js +1 -1
  95. package/dist/constants/l10n/langs/hi.js +1 -1
  96. package/dist/constants/l10n/langs/it.js +1 -1
  97. package/dist/constants/l10n/langs/ja.js +1 -1
  98. package/dist/constants/l10n/langs/ko.js +1 -1
  99. package/dist/constants/l10n/langs/pl.js +1 -1
  100. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  101. package/dist/constants/l10n/langs/pt.js +1 -1
  102. package/dist/constants/l10n/langs/ru.js +1 -1
  103. package/dist/constants/l10n/langs/uk.js +1 -1
  104. package/dist/constants/l10n/langs/zh.js +1 -1
  105. package/dist/markdoc/tags/index.d.ts +48 -2
  106. package/dist/server/api-routes/execute-api-route.js +1 -1
  107. package/dist/server/api-routes/helpers/enhance-context.d.ts +3 -1
  108. package/dist/server/api-routes/helpers/enhance-context.js +1 -1
  109. package/dist/server/api-routes/helpers/is-mock-server.d.ts +2 -0
  110. package/dist/server/api-routes/helpers/is-mock-server.js +1 -0
  111. package/dist/server/api-routes/helpers/read-stream-with-size-limit.d.ts +1 -1
  112. package/dist/server/api-routes/mock-server/kv-state-store.d.ts +3 -0
  113. package/dist/server/api-routes/mock-server/kv-state-store.js +1 -0
  114. package/dist/server/api-routes/mock-server/mock-js-executor.d.ts +3 -0
  115. package/dist/server/api-routes/mock-server/mock-js-executor.js +13 -0
  116. package/dist/server/api-routes/run-api-routes-worker.d.ts +1 -1
  117. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  118. package/dist/server/config/env-config.d.ts +4 -4
  119. package/dist/server/config/env-schema.d.ts +10 -10
  120. package/dist/server/config/env-schemas/catalog.d.ts +3 -0
  121. package/dist/server/config/env-schemas/catalog.js +1 -1
  122. package/dist/server/config/env-schemas/feature-flags.d.ts +4 -8
  123. package/dist/server/config/env-schemas/feature-flags.js +1 -1
  124. package/dist/server/constants/common.d.ts +2 -0
  125. package/dist/server/constants/common.js +1 -1
  126. package/dist/server/constants/entitlements.js +1 -1
  127. package/dist/server/constants/plugins/api-docs.d.ts +3 -0
  128. package/dist/server/constants/plugins/api-docs.js +1 -0
  129. package/dist/server/esbuild/esbuild-logger.js +3 -3
  130. package/dist/server/esbuild/esbuild.js +3 -3
  131. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.d.ts +9 -0
  132. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.js +1 -0
  133. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.d.ts +2 -0
  134. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.js +1 -0
  135. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.d.ts +6 -0
  136. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.js +1 -0
  137. package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
  138. package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
  139. package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
  140. package/dist/server/plugins/api-docs/get-server-props.d.ts +4 -0
  141. package/dist/server/plugins/api-docs/get-server-props.js +1 -0
  142. package/dist/server/plugins/api-docs/get-template-path.d.ts +2 -0
  143. package/dist/server/plugins/api-docs/get-template-path.js +1 -0
  144. package/dist/server/plugins/api-docs/import-api-docs-builder.d.ts +8 -0
  145. package/dist/server/plugins/api-docs/import-api-docs-builder.js +1 -0
  146. package/dist/server/plugins/api-docs/index.d.ts +19 -0
  147. package/dist/server/plugins/api-docs/index.js +1 -0
  148. package/dist/server/plugins/api-docs/loader.d.ts +35 -0
  149. package/dist/server/plugins/api-docs/loader.js +3 -0
  150. package/dist/server/plugins/api-docs/options.d.ts +14 -0
  151. package/dist/server/plugins/api-docs/options.js +1 -0
  152. package/dist/server/plugins/api-docs/search/get-ai-search-documents.d.ts +20 -0
  153. package/dist/server/plugins/api-docs/search/get-ai-search-documents.js +105 -0
  154. package/dist/server/plugins/api-docs/search/search-facets.d.ts +10 -0
  155. package/dist/server/plugins/api-docs/search/search-facets.js +1 -0
  156. package/dist/server/plugins/api-docs/search/search-indexer.d.ts +9 -0
  157. package/dist/server/plugins/api-docs/search/search-indexer.js +1 -0
  158. package/dist/server/plugins/api-docs/search/search-resolver.d.ts +5 -0
  159. package/dist/server/plugins/api-docs/search/search-resolver.js +1 -0
  160. package/dist/server/plugins/api-docs/spec-download.api.d.ts +4 -0
  161. package/dist/server/plugins/api-docs/spec-download.api.js +1 -0
  162. package/dist/server/plugins/api-docs/store-definition-bundles.d.ts +3 -0
  163. package/dist/server/plugins/api-docs/store-definition-bundles.js +1 -0
  164. package/dist/server/plugins/api-docs/utils/build-item-positions.d.ts +17 -0
  165. package/dist/server/plugins/api-docs/utils/build-item-positions.js +1 -0
  166. package/dist/server/plugins/api-docs/utils/build-routes-mapping.d.ts +3 -0
  167. package/dist/server/plugins/api-docs/utils/build-routes-mapping.js +1 -0
  168. package/dist/server/plugins/api-docs/utils/collect-item-routes.d.ts +12 -0
  169. package/dist/server/plugins/api-docs/utils/collect-item-routes.js +1 -0
  170. package/dist/server/plugins/api-docs/utils/decorators.d.ts +26 -0
  171. package/dist/server/plugins/api-docs/utils/decorators.js +1 -0
  172. package/dist/server/plugins/api-docs/utils/format-bundle-error.d.ts +6 -0
  173. package/dist/server/plugins/api-docs/utils/format-bundle-error.js +5 -0
  174. package/dist/server/plugins/api-docs/utils/normalize-api-version.d.ts +2 -0
  175. package/dist/server/plugins/api-docs/utils/normalize-api-version.js +1 -0
  176. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.d.ts +2 -0
  177. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.js +1 -0
  178. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.d.ts +20 -0
  179. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.js +1 -0
  180. package/dist/server/plugins/api-docs/utils/replace-file-extension.d.ts +2 -0
  181. package/dist/server/plugins/api-docs/utils/replace-file-extension.js +1 -0
  182. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.d.ts +3 -0
  183. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.js +1 -0
  184. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.d.ts +10 -0
  185. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.js +1 -0
  186. package/dist/server/plugins/api-docs/utils/to-relative-slug.d.ts +2 -0
  187. package/dist/server/plugins/api-docs/utils/to-relative-slug.js +1 -0
  188. package/dist/server/plugins/api-functions/index.js +1 -1
  189. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  190. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  191. package/dist/server/plugins/catalog-classic/index.js +1 -1
  192. package/dist/server/plugins/catalog-entities/database/catalog-entities-diff-publisher.d.ts +27 -0
  193. package/dist/server/plugins/catalog-entities/database/catalog-entities-diff-publisher.js +12 -0
  194. package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.js +1 -12
  195. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.d.ts +22 -0
  196. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.js +62 -0
  197. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +5 -5
  198. package/dist/server/plugins/catalog-entities/database/consts.d.ts +5 -0
  199. package/dist/server/plugins/catalog-entities/database/consts.js +1 -1
  200. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
  201. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
  202. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
  203. package/dist/server/plugins/catalog-entities/database/remote-publish-lock-service.d.ts +3 -3
  204. package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.d.ts +2 -2
  205. package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -1
  206. package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +1 -1
  207. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +1 -1
  208. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +1 -1
  209. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +2 -2
  210. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -1
  211. package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +1 -1
  212. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.d.ts +1 -1
  213. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  214. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +13 -5
  215. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  216. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +5 -2
  217. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  218. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +6 -5
  219. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  220. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +12 -5
  221. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  222. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.d.ts +1 -1
  223. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  224. package/dist/server/plugins/catalog-entities/template/index.js +1 -1
  225. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +1 -1
  226. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +1 -1
  227. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.d.ts +4 -4
  228. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.js +1 -1
  229. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.d.ts +4 -3
  230. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.js +1 -1
  231. package/dist/server/plugins/config-parser/index.js +1 -1
  232. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  233. package/dist/server/plugins/create-slugify.d.ts +17 -0
  234. package/dist/server/plugins/create-slugify.js +1 -0
  235. package/dist/server/plugins/default-theme/index.js +1 -1
  236. package/dist/server/plugins/dev-onboarding/index.d.ts +1 -1
  237. package/dist/server/plugins/dev-onboarding/index.js +1 -1
  238. package/dist/server/plugins/dev-onboarding/template/components/RevokeAPIKey.d.ts +1 -1
  239. package/dist/server/plugins/dev-onboarding/template/components/RollAPIKey.d.ts +1 -1
  240. package/dist/server/plugins/entitlements/index.js +1 -1
  241. package/dist/server/plugins/graphql-docs/index.js +1 -1
  242. package/dist/server/plugins/graphql-docs/search/ai/utils.d.ts +1 -1
  243. package/dist/server/plugins/helpers/parse-partials.d.ts +3 -0
  244. package/dist/server/plugins/helpers/parse-partials.js +1 -0
  245. package/dist/server/plugins/l10n/index.js +1 -1
  246. package/dist/server/plugins/lifecycle.js +2 -2
  247. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.d.ts +5 -3
  248. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.js +1 -1
  249. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -1
  250. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  251. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-code-samples.js +1 -1
  252. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-response-samples.js +1 -1
  253. package/dist/server/plugins/markdown/index.js +1 -1
  254. package/dist/server/plugins/markdown/markdoc/markdoc-options.d.ts +9 -9
  255. package/dist/server/plugins/markdown/markdoc/plugins/utils.d.ts +5 -0
  256. package/dist/server/plugins/markdown/markdoc/plugins/utils.js +1 -1
  257. package/dist/server/plugins/markdown/runtime-transform.js +1 -1
  258. package/dist/server/plugins/markdown/search/create-render-tag-fn.d.ts +2 -1
  259. package/dist/server/plugins/markdown/search/create-render-tag-fn.js +1 -1
  260. package/dist/server/plugins/markdown/search/get-ai-search-documents.js +9 -9
  261. package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
  262. package/dist/server/plugins/markdown/utils/resolve-markdown-template.d.ts +1 -1
  263. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +3 -0
  264. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  265. package/dist/server/plugins/mcp/codemode/capabilities/types.d.ts +1 -1
  266. package/dist/server/plugins/mcp/codemode/capabilities/utils.d.ts +1 -1
  267. package/dist/server/plugins/mcp/codemode/code-audit.d.ts +12 -0
  268. package/dist/server/plugins/mcp/codemode/code-audit.js +1 -0
  269. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.d.ts +11 -0
  270. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.js +1 -0
  271. package/dist/server/plugins/mcp/codemode/constants.d.ts +3 -0
  272. package/dist/server/plugins/mcp/codemode/constants.js +1 -1
  273. package/dist/server/plugins/mcp/codemode/prompts.js +1 -1
  274. package/dist/server/plugins/mcp/codemode/sandbox/create-sandbox-setup.d.ts +10 -0
  275. package/dist/server/plugins/mcp/codemode/sandbox/create-sandbox-setup.js +11 -0
  276. package/dist/server/plugins/mcp/codemode/sandbox/polyfills.d.ts +2 -0
  277. package/dist/server/plugins/mcp/codemode/sandbox/{sandbox-polyfills.js → polyfills.js} +7 -8
  278. package/dist/server/plugins/mcp/codemode/tools/describe-tools.d.ts +2 -3
  279. package/dist/server/plugins/mcp/codemode/tools/execute-schema.d.ts +1 -1
  280. package/dist/server/plugins/mcp/codemode/tools/execute-schema.js +1 -1
  281. package/dist/server/plugins/mcp/codemode/tools/execute.d.ts +1 -0
  282. package/dist/server/plugins/mcp/codemode/tools/execute.js +1 -1
  283. package/dist/server/plugins/mcp/codemode/types.d.ts +0 -8
  284. package/dist/server/plugins/mcp/constants.d.ts +2 -1
  285. package/dist/server/plugins/mcp/constants.js +1 -1
  286. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.d.ts +1 -0
  287. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
  288. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.d.ts +11 -0
  289. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.js +1 -0
  290. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.d.ts +4 -0
  291. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.js +1 -0
  292. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type-list.js +1 -1
  293. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type.js +7 -4
  294. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.d.ts +7 -1
  295. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.js +0 -1
  296. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.d.ts +5 -1
  297. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.js +4 -2
  298. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -0
  299. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  300. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.d.ts +2 -0
  301. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.js +1 -0
  302. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoint-info.js +1 -1
  303. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoints.js +1 -1
  304. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-full-api-description.js +1 -1
  305. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-security-schemes.js +1 -1
  306. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/list-apis.js +1 -1
  307. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.d.ts +6 -2
  308. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.js +1 -1
  309. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/types.d.ts +2 -0
  310. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.d.ts +2 -2
  311. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.js +1 -1
  312. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  313. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  314. package/dist/server/plugins/mcp/gateway-mcp/elicitation.d.ts +28 -0
  315. package/dist/server/plugins/mcp/gateway-mcp/elicitation.js +2 -0
  316. package/dist/server/plugins/mcp/gateway-mcp/eligibility.d.ts +5 -17
  317. package/dist/server/plugins/mcp/gateway-mcp/eligibility.js +1 -1
  318. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.d.ts +9 -9
  319. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.js +1 -1
  320. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.d.ts +17 -1
  321. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.js +1 -1
  322. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.d.ts +11 -0
  323. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.js +1 -0
  324. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.d.ts +14 -0
  325. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.js +1 -0
  326. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.d.ts +6 -0
  327. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.js +1 -0
  328. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.d.ts +4 -0
  329. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.js +1 -0
  330. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.d.ts +22 -0
  331. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.js +1 -0
  332. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.d.ts +1 -1
  333. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.js +1 -1
  334. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.d.ts +13 -0
  335. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.js +1 -0
  336. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.d.ts +8 -1
  337. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.js +1 -1
  338. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.d.ts +3 -0
  339. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.js +1 -0
  340. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.d.ts +16 -0
  341. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.js +1 -0
  342. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.d.ts +2 -0
  343. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.js +1 -0
  344. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.d.ts +7 -0
  345. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.js +1 -0
  346. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.d.ts +8 -0
  347. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.js +1 -0
  348. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.d.ts +15 -0
  349. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.js +1 -0
  350. package/dist/server/plugins/mcp/gateway-mcp/secret-store.d.ts +24 -0
  351. package/dist/server/plugins/mcp/gateway-mcp/secret-store.js +1 -0
  352. package/dist/server/plugins/mcp/gateway-mcp/subject.d.ts +20 -0
  353. package/dist/server/plugins/mcp/gateway-mcp/subject.js +1 -0
  354. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.d.ts +18 -0
  355. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.js +1 -0
  356. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.d.ts +10 -0
  357. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.js +1 -0
  358. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  359. package/dist/server/plugins/mcp/handlers/errors.d.ts +3 -3
  360. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  361. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  362. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.d.ts +5 -0
  363. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.js +101 -0
  364. package/dist/server/plugins/mcp/index.d.ts +1 -0
  365. package/dist/server/plugins/mcp/index.js +1 -1
  366. package/dist/server/plugins/mcp/servers/docs-server.d.ts +3 -1
  367. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  368. package/dist/server/plugins/mcp/servers/mcp-server.d.ts +15 -8
  369. package/dist/server/plugins/mcp/servers/mcp-server.js +1 -1
  370. package/dist/server/plugins/mcp/types.d.ts +16 -20
  371. package/dist/server/plugins/mcp/utils/json-schema-validator.d.ts +9 -0
  372. package/dist/server/plugins/mcp/utils/json-schema-validator.js +1 -0
  373. package/dist/server/plugins/mcp/utils/jwt.d.ts +0 -9
  374. package/dist/server/plugins/mcp/utils/jwt.js +1 -1
  375. package/dist/server/plugins/mcp/utils/mode.d.ts +12 -2
  376. package/dist/server/plugins/mcp/utils/mode.js +1 -1
  377. package/dist/server/plugins/mcp/utils/telemetry-attributes.d.ts +8 -0
  378. package/dist/server/plugins/mcp/utils/telemetry-attributes.js +1 -0
  379. package/dist/server/plugins/mcp/utils/xmcp-utils.d.ts +1 -1
  380. package/dist/server/plugins/mcp/utils.d.ts +17 -5
  381. package/dist/server/plugins/mcp/utils.js +1 -1
  382. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
  383. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.d.ts +10 -2
  384. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.js +1 -1
  385. package/dist/server/plugins/openapi-docs/index.js +1 -1
  386. package/dist/server/plugins/openapi-docs/search/get-ai-search-documents.js +16 -16
  387. package/dist/server/plugins/openapi-docs/utils.js +1 -1
  388. package/dist/server/plugins/pages/index.js +1 -1
  389. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +1 -1
  390. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  391. package/dist/server/plugins/scorecard-classic/index.d.ts +1 -1
  392. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  393. package/dist/server/plugins/scorecard-classic/template/components.d.ts +1 -1
  394. package/dist/server/plugins/scorecard-classic/template/useData.d.ts +1 -1
  395. package/dist/server/plugins/scorecards/plugin.js +1 -1
  396. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.d.ts +1 -1
  397. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +2 -2
  398. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  399. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  400. package/dist/server/plugins/search/engines/flexsearch/search-index.js +1 -1
  401. package/dist/server/plugins/search/engines/search-engine.d.ts +1 -1
  402. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  403. package/dist/server/plugins/search/index.js +1 -1
  404. package/dist/server/plugins/search/llmstxt/index.d.ts +1 -1
  405. package/dist/server/plugins/search/llmstxt/index.js +4 -4
  406. package/dist/server/plugins/sidebars/index.d.ts +1 -1
  407. package/dist/server/plugins/sidebars/index.js +1 -1
  408. package/dist/server/plugins/sitemap/index.js +1 -1
  409. package/dist/server/plugins/sso/index.js +1 -1
  410. package/dist/server/providers/database/database-path-generator.d.ts +2 -2
  411. package/dist/server/providers/database/utils/storage-limit-validator.d.ts +1 -1
  412. package/dist/server/sandbox/constants/host-functions.d.ts +3 -0
  413. package/dist/server/sandbox/constants/host-functions.js +1 -0
  414. package/dist/server/sandbox/constants/sandbox.d.ts +6 -0
  415. package/dist/server/sandbox/constants/sandbox.js +1 -0
  416. package/dist/server/sandbox/sandbox.d.ts +8 -0
  417. package/dist/server/sandbox/sandbox.js +3 -0
  418. package/dist/server/sandbox/types.d.ts +25 -0
  419. package/dist/server/sandbox/utils/eval-guest-code.d.ts +15 -0
  420. package/dist/server/sandbox/utils/eval-guest-code.js +1 -0
  421. package/dist/server/sandbox/utils/execution-budget.d.ts +12 -0
  422. package/dist/server/sandbox/utils/execution-budget.js +1 -0
  423. package/dist/server/sandbox/utils/setup-host-functions.d.ts +18 -0
  424. package/dist/server/sandbox/utils/setup-host-functions.js +5 -0
  425. package/dist/server/ssr/render.js +1 -1
  426. package/dist/server/ssr/server-side-props/get-default-static-props.d.ts +1 -1
  427. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.d.ts +1 -1
  428. package/dist/server/ssr/template.d.ts +1 -1
  429. package/dist/server/ssr/utils.d.ts +1 -0
  430. package/dist/server/ssr/utils.js +5 -5
  431. package/dist/server/store.d.ts +2 -6
  432. package/dist/server/store.js +1 -1
  433. package/dist/server/tools/notifiers/logger.js +1 -1
  434. package/dist/server/tools/notifiers/reporter.js +6 -6
  435. package/dist/server/types/plugins/common.d.ts +4 -6
  436. package/dist/server/types/plugins/markdown.d.ts +1 -3
  437. package/dist/server/types/plugins/search.d.ts +1 -0
  438. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.test.js +1 -1
  439. package/dist/server/utils/crypto/constants.d.ts +5 -0
  440. package/dist/server/utils/crypto/constants.js +1 -0
  441. package/dist/server/utils/crypto/decrypt-aes-gcm.d.ts +6 -0
  442. package/dist/server/utils/crypto/decrypt-aes-gcm.js +1 -0
  443. package/dist/server/utils/crypto/decrypt-claim-value.d.ts +6 -0
  444. package/dist/server/utils/crypto/decrypt-claim-value.js +1 -0
  445. package/dist/server/utils/crypto/derive-key.d.ts +5 -0
  446. package/dist/server/utils/crypto/derive-key.js +1 -0
  447. package/dist/server/utils/crypto/encrypt-aes-gcm.d.ts +6 -0
  448. package/dist/server/utils/crypto/encrypt-aes-gcm.js +1 -0
  449. package/dist/server/utils/crypto/encrypt-claim-value.d.ts +6 -0
  450. package/dist/server/utils/crypto/encrypt-claim-value.js +1 -0
  451. package/dist/server/utils/fetch-with-client.d.ts +10 -0
  452. package/dist/server/utils/fetch-with-client.js +1 -0
  453. package/dist/server/utils/l10n/get-build-translate-context.d.ts +7 -0
  454. package/dist/server/utils/l10n/get-build-translate-context.js +1 -0
  455. package/dist/server/utils/llmstxt/agent-feedback-llms-footer.js +1 -1
  456. package/dist/server/utils/rbac.d.ts +4 -0
  457. package/dist/server/utils/rbac.js +1 -1
  458. package/dist/server/utils/report-all-errors.js +1 -1
  459. package/dist/server/utils/sandbox-context.d.ts +18 -0
  460. package/dist/server/utils/sandbox-context.js +1 -0
  461. package/dist/server/utils/shared-data.js +1 -1
  462. package/dist/server/web-server/auth.d.ts +34 -4
  463. package/dist/server/web-server/auth.js +3 -3
  464. package/dist/server/web-server/handle-api-route-request.js +1 -1
  465. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  466. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +1 -1
  467. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  468. package/dist/server/web-server/middleware/telemetry-middleware.js +1 -1
  469. package/dist/server/web-server/routes/api-routes/api-routes.js +1 -1
  470. package/dist/server/web-server/routes/ask-ai.js +1 -1
  471. package/dist/server/web-server/routes/auth.js +1 -1
  472. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  473. package/dist/server/web-server/routes/catalog/bff-catalog-revisions.js +1 -1
  474. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  475. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  476. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  477. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +1 -1
  478. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.d.ts +1 -1
  479. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -1
  480. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  481. package/dist/server/web-server/routes/feedback.d.ts +1 -1
  482. package/dist/server/web-server/routes/feedback.js +1 -1
  483. package/dist/server/web-server/routes/helpers/process-redirects.d.ts +1 -1
  484. package/dist/server/web-server/routes/mcp-routes/a2a.js +1 -1
  485. package/dist/server/web-server/routes/mcp-routes/agent-card.js +1 -1
  486. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.d.ts +10 -6
  487. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.js +1 -1
  488. package/dist/server/web-server/routes/mcp-routes/mcp-routes.js +1 -1
  489. package/dist/server/web-server/routes/mcp-routes/mcp-server-card.js +1 -1
  490. package/dist/server/web-server/routes/mcp-routes/utils/build-agent-card.d.ts +1 -1
  491. package/dist/server/web-server/routes/page-data.js +1 -1
  492. package/dist/server/web-server/routes/resolve-route.js +1 -1
  493. package/dist/server/web-server/routes/search.js +1 -1
  494. package/dist/server/web-server/routes/semantic-search.js +1 -1
  495. package/dist/server/web-server/routes/skills/skill-markdown.js +1 -1
  496. package/dist/server/web-server/routes/skills/skills-index.js +1 -1
  497. package/dist/server/web-server/utils/prepare-list-response.d.ts +1 -1
  498. package/dist/server/workers/api-routes-worker-pool.js +1 -1
  499. package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
  500. package/dist/server/workers/worker-pool.d.ts +1 -0
  501. package/dist/server/workers/worker-pool.js +1 -1
  502. package/dist/types/entitlements.d.ts +6 -1
  503. package/dist/types/markdoc.d.ts +2 -1
  504. package/dist/utils/l10n/build-i18n-config.d.ts +24 -0
  505. package/dist/utils/l10n/build-i18n-config.js +1 -0
  506. package/dist/utils/l10n/create-translate.d.ts +19 -0
  507. package/dist/utils/l10n/create-translate.js +1 -0
  508. package/dist/utils/url/get-shared-data-fetch-url.d.ts +17 -0
  509. package/dist/utils/url/get-shared-data-fetch-url.js +1 -0
  510. package/dist/utils/url/parse-preview-url.d.ts +22 -0
  511. package/dist/utils/url/parse-preview-url.js +1 -0
  512. package/package.json +16 -15
  513. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.d.ts +0 -4
  514. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.js +0 -1
  515. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.d.ts +0 -4
  516. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.js +0 -1
  517. package/dist/markdoc/helpers/get-operation/get-operation.d.ts +0 -14
  518. package/dist/markdoc/helpers/get-operation/get-operation.js +0 -1
  519. package/dist/markdoc/helpers/get-operation/index.d.ts +0 -4
  520. package/dist/markdoc/helpers/get-operation/index.js +0 -1
  521. package/dist/markdoc/helpers/get-operation/types/index.d.ts +0 -4
  522. package/dist/markdoc/helpers/get-operation/types/operation-identifier.d.ts +0 -5
  523. package/dist/markdoc/helpers/get-operation/types/operation-identifier.js +0 -0
  524. package/dist/markdoc/helpers/get-operation/types/operation-info.d.ts +0 -6
  525. package/dist/markdoc/helpers/get-operation/types/operation-info.js +0 -0
  526. package/dist/markdoc/helpers/get-operation/types/operation-parameters.d.ts +0 -3
  527. package/dist/markdoc/helpers/get-operation/types/operation-parameters.js +0 -0
  528. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.d.ts +0 -4
  529. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.js +0 -1
  530. package/dist/server/plugins/mcp/codemode/sandbox/sandbox-polyfills.d.ts +0 -3
  531. package/dist/server/plugins/mcp/codemode/sandbox/sandbox.d.ts +0 -3
  532. package/dist/server/plugins/mcp/codemode/sandbox/sandbox.js +0 -15
  533. package/dist/server/plugins/mcp/handlers/sse-keepalive.d.ts +0 -15
  534. package/dist/server/plugins/mcp/handlers/sse-keepalive.js +0 -3
  535. /package/dist/{markdoc/helpers/get-operation/types/index.js → server/sandbox/types.js} +0 -0
@@ -0,0 +1 @@
1
+ const s=["queries","mutations","subscriptions","objects","interfaces","unions","enums","inputs","scalars","directives"],e=["members","fields"],t=["objects","interfaces","inputs"];export{t as FIELD_SCOPE_KINDS,e as GRAPHQL_LIST_SCOPES,s as GRAPHQL_TYPE_KINDS};
@@ -1 +1 @@
1
- import{GRAPHQL_TYPE_KINDS as g}from"./types.js";import{respondWithGraphqlSchema as d,paginate as u}from"./tool-helpers.js";import{groupSchemaTypes as y,filterMembersReferencingType as h}from"./utils.js";const T=(i,a)=>d(i.name,a,({name:f,schema:o})=>{const{kind:p,filter:n,referencesType:l,page:s=1,limit:m=300}=i,c=y(o);let e=(p?[p]:g).flatMap(t=>c[t].map(r=>({kind:t,...r})));if(l&&(e=h(o,e,l)),n){const t=n.toLowerCase();e=e.filter(r=>r.name.toLowerCase().includes(t))}return JSON.stringify({name:f,...u(e,s,m)},null,2)});var G={"get-graphql-type-list":T};export{G as default};
1
+ import{FIELD_SCOPE_KINDS as n,GRAPHQL_TYPE_KINDS as u}from"./constants.js";import{respondWithGraphqlSchema as g,paginate as d}from"./tool-helpers.js";import{groupSchemaTypes as h,fieldMembers as y,filterMembersReferencingType as S,matchesFilter as b}from"./utils.js";function T(r,p,t){if(p==="fields"){if(t&&!n.some(e=>e===t))throw new Error(`scope "fields" lists the fields of object, interface, and input types; kind must be ${n.map(e=>`"${e}"`).join(", ")}, or omitted.`);return y(r,t)}const o=h(r);return(t?[t]:u).flatMap(e=>o[e].map(s=>({kind:e,...s})))}const E=(r,p)=>g(r.name,p,({name:t,schema:o})=>{const{kind:e,scope:s="members",filter:f,referencesType:l,page:m=1,limit:a=300}=r;let i=T(o,s,e);return l&&(i=S(o,i,l)),f&&(i=i.filter(c=>b(c,f))),JSON.stringify({name:t,...d(i,m,a)},null,2)});var D={"get-graphql-type-list":E};export{D as default};
@@ -1,7 +1,10 @@
1
- import{respondWithGraphqlSchema as d}from"./tool-helpers.js";import{printTypeOrField as y,printTypeOrFieldWithReferences as f}from"./utils.js";const l=(n,p)=>d(n.name,p,({name:r,schema:t})=>{const{type:e,includeReferencedTypes:i}=n;if(i){const{sdl:o,referencedCount:c}=f(t,e);return`# Schema: ${r}
2
- # Type: ${e} (+ ${c} referenced types)
1
+ import{respondWithGraphqlSchema as d}from"./tool-helpers.js";import{printTypeOrField as y,printTypeOrFieldWithReferences as a,referencedTypeManifest as $}from"./utils.js";const m=(r,c)=>d(r.name,c,({name:p,schema:n})=>{const{type:e,includeReferencedTypes:l}=r;if(l){const{sdl:t,referencedCount:s}=a(n,e);return`# Schema: ${p}
2
+ # Type: ${e} (+ ${s} referenced types)
3
3
 
4
- ${o}`}return`# Schema: ${r}
4
+ ${t}`}const o=`# Schema: ${p}
5
5
  # Type: ${e}
6
6
 
7
- ${y(t,e)}`});var m={"get-graphql-type":l};export{m as default};
7
+ ${y(n,e)}`,f=$(n,e);if(f.length===0)return o;const i=["# Referenced types (one level, names only; fetch a type or set includeReferencedTypes for full SDL):",...f.map(t=>`# ${t}`)].join(`
8
+ `);return`${o}
9
+
10
+ ${i}`});var h={"get-graphql-type":m};export{h as default};
@@ -1,10 +1,15 @@
1
- export declare const GRAPHQL_TYPE_KINDS: readonly ['queries', 'mutations', 'subscriptions', 'objects', 'interfaces', 'unions', 'enums', 'inputs', 'scalars', 'directives'];
1
+ import type { GRAPHQL_LIST_SCOPES, GRAPHQL_TYPE_KINDS } from './constants.js';
2
2
  export type GraphqlTypeKind = (typeof GRAPHQL_TYPE_KINDS)[number];
3
+ export type GraphqlListScope = (typeof GRAPHQL_LIST_SCOPES)[number];
3
4
  export type SchemaMember = {
4
5
  name: string;
5
6
  description?: string;
6
7
  type?: string;
7
8
  args?: string;
9
+ directives?: string;
10
+ };
11
+ export type SchemaMemberWithKind = SchemaMember & {
12
+ kind: GraphqlTypeKind;
8
13
  };
9
14
  export type GroupedSchemaTypes = Record<GraphqlTypeKind, SchemaMember[]>;
10
15
  export type ListGraphqlApisArgs = {
@@ -15,6 +20,7 @@ export type ListGraphqlApisArgs = {
15
20
  export type GetGraphqlTypeListArgs = {
16
21
  name: string;
17
22
  kind?: GraphqlTypeKind;
23
+ scope?: GraphqlListScope;
18
24
  filter?: string;
19
25
  referencesType?: string;
20
26
  page?: number;
@@ -1 +0,0 @@
1
- const s=["queries","mutations","subscriptions","objects","interfaces","unions","enums","inputs","scalars","directives"];export{s as GRAPHQL_TYPE_KINDS};
@@ -1,14 +1,18 @@
1
1
  import type { GraphQLSchema } from 'graphql';
2
2
  import type { GraphqlDescriptionInfo } from '../../../types.js';
3
- import type { GraphqlTypeKind, GroupedSchemaTypes } from './types.js';
3
+ import type { GraphqlTypeKind, GroupedSchemaTypes, SchemaMember, SchemaMemberWithKind } from './types.js';
4
4
  export declare function findGraphqlSchemaByName(graphqlDescriptions: GraphqlDescriptionInfo[], name: string): GraphqlDescriptionInfo | undefined;
5
5
  export declare function groupSchemaTypes(schema: GraphQLSchema): GroupedSchemaTypes;
6
+ export declare function fieldMembers(schema: GraphQLSchema, kind?: GraphqlTypeKind): SchemaMemberWithKind[];
7
+ /** Case-insensitive substring match against the member's name or description. */
8
+ export declare function matchesFilter(member: SchemaMember, filter: string): boolean;
6
9
  export declare function filterMembersReferencingType<T extends {
7
10
  kind: GraphqlTypeKind;
8
11
  name: string;
9
12
  }>(schema: GraphQLSchema, members: T[], targetName: string): T[];
10
13
  export declare function referencedTypeClosure(schema: GraphQLSchema, name: string): string[];
11
14
  export declare function printTypeOrField(schema: GraphQLSchema, name: string): string;
15
+ export declare function referencedTypeManifest(schema: GraphQLSchema, name: string): string[];
12
16
  export declare function printTypeOrFieldWithReferences(schema: GraphQLSchema, name: string): {
13
17
  sdl: string;
14
18
  referencedCount: number;
@@ -1,3 +1,5 @@
1
- import{getNamedType as p,isEnumType as v,isInputObjectType as y,isInterfaceType as g,isIntrospectionType as u,isObjectType as T,isScalarType as m,isSpecifiedScalarType as S,isUnionType as b,print as c,printType as N,specifiedDirectives as O}from"graphql";const j=new Set(["queries","mutations","subscriptions"]);function C(e,r){const t=r.toLowerCase();return e.find(i=>i.name.toLowerCase().includes(t))}function a(e,r){return e.getQueryType()?.getFields()[r]??e.getMutationType()?.getFields()[r]??e.getSubscriptionType()?.getFields()[r]}function w(e){return[p(e.type).name,...e.args.map(r=>p(r.type).name)]}function d(e){const r=new Set;if(T(e)||g(e)){for(const t of Object.values(e.getFields())){r.add(p(t.type).name);for(const i of t.args)r.add(p(i.type).name)}for(const t of e.getInterfaces())r.add(t.name)}else if(b(e))for(const t of e.getTypes())r.add(t.name);else if(y(e))for(const t of Object.values(e.getFields()))r.add(p(t.type).name);return r}function $(e){const r=new Set([e.getQueryType(),e.getMutationType(),e.getSubscriptionType()].filter(n=>!!n).map(n=>n.name)),t={queries:l(e.getQueryType()),mutations:l(e.getMutationType()),subscriptions:l(e.getSubscriptionType()),objects:[],interfaces:[],unions:[],enums:[],inputs:[],scalars:[],directives:[]};for(const n of Object.values(e.getTypeMap())){if(u(n)||r.has(n.name))continue;const o={name:n.name,description:n.description??void 0};m(n)?S(n)||t.scalars.push(o):T(n)?t.objects.push(o):g(n)?t.interfaces.push(o):b(n)?t.unions.push(o):v(n)?t.enums.push(o):y(n)&&t.inputs.push(o)}const i=new Set(O.map(n=>n.name));return t.directives=e.getDirectives().filter(n=>!i.has(n.name)).map(n=>({name:n.name,description:n.description??void 0})),t}function l(e){return e?Object.values(e.getFields()).map(r=>({name:r.name,description:r.description??void 0,type:r.type.toString(),args:r.args.length?`(${r.args.map(t=>{const i=t.astNode?.defaultValue?` = ${c(t.astNode.defaultValue)}`:"";return`${t.name}: ${t.type}${i}`}).join(", ")})`:void 0})):[]}function q(e,r,t){const i=h(e,t);if(!i)return[];const n=new Set([i,...x(e,i)]);return r.filter(o=>{if(!j.has(o.kind))return n.has(o.name);const s=a(e,o.name);return s?w(s).some(f=>n.has(f)):!1})}function F(e,r){const t=new Set,i=[...M(e,r)];for(let n=0;n<i.length;n+=1){const o=i[n];if(t.has(o))continue;t.add(o);const s=e.getType(o);if(s)for(const f of d(s))t.has(f)||i.push(f)}return[...t].filter(n=>n!==r&&D(e,n))}function M(e,r){const t=e.getType(r);if(t)return d(t);const i=a(e,r);if(i)return new Set(w(i));const n=e.getDirective(r);return n?new Set(n.args.map(o=>p(o.type).name)):new Set}function x(e,r){const t=new Map;for(const o of Object.values(e.getTypeMap()))if(!u(o))for(const s of d(o)){let f=t.get(s);f||(f=new Set,t.set(s,f)),f.add(o.name)}const i=new Set,n=[r];for(let o=0;o<n.length;o+=1)for(const s of t.get(n[o])??[])i.has(s)||(i.add(s),n.push(s));return i}function h(e,r){const t=r.toLowerCase();return Object.keys(e.getTypeMap()).find(i=>i.toLowerCase()===t)}function D(e,r){const t=e.getType(r);return!t||u(t)?!1:!(m(t)&&S(t))}function I(e,r){const t=e.getType(r);if(t)return N(t);const i=a(e,r);if(i?.astNode)return c(i.astNode);const n=e.getDirective(r);if(n?.astNode)return c(n.astNode);throw new Error(`No GraphQL type, operation, or directive named "${r}" found.`)}function L(e,r){const t=I(e,r),i=F(e,r).map(n=>e.getType(n)).filter(n=>!!n).map(n=>N(n));return{sdl:[t,...i].join(`
1
+ import{getNamedType as u,isEnumType as j,isInputObjectType as d,isInterfaceType as p,isIntrospectionType as l,isObjectType as g,isScalarType as y,isSpecifiedScalarType as v,isUnionType as T,print as a,printType as L,specifiedDirectives as I}from"graphql";const D=new Set(["queries","mutations","subscriptions"]);function w(e){return e.toLowerCase().split(/[^a-z0-9_]+/).filter(Boolean)}function V(e,n){const t=n.toLowerCase(),r=e.find(s=>s.name.toLowerCase().includes(t));if(r)return r;const i=new Set(w(t));let o,f=0;for(const s of e){const c=w(s.name);c.length>f&&c.every(k=>i.has(k))&&(o=s,f=c.length)}return o}function m(e,n){return e.getQueryType()?.getFields()[n]??e.getMutationType()?.getFields()[n]??e.getSubscriptionType()?.getFields()[n]}function N(e){return[u(e.type).name,...(e.args??[]).map(n=>u(n.type).name)]}function S(e){const n=new Set;if(g(e)||p(e)){for(const t of Object.values(e.getFields())){n.add(u(t.type).name);for(const r of t.args)n.add(u(r.type).name)}for(const t of e.getInterfaces())n.add(t.name)}else if(T(e))for(const t of e.getTypes())n.add(t.name);else if(d(e))for(const t of Object.values(e.getFields()))n.add(u(t.type).name);return n}function O(e){return new Set([e.getQueryType(),e.getMutationType(),e.getSubscriptionType()].filter(n=>!!n).map(n=>n.name))}function A(e){const n=O(e),t={queries:b(e.getQueryType()),mutations:b(e.getMutationType()),subscriptions:b(e.getSubscriptionType()),objects:[],interfaces:[],unions:[],enums:[],inputs:[],scalars:[],directives:[]};for(const i of Object.values(e.getTypeMap())){if(l(i)||n.has(i.name))continue;const o=$(i);o&&t[o].push({name:i.name,description:i.description??void 0})}const r=new Set(I.map(i=>i.name));return t.directives=e.getDirectives().filter(i=>!r.has(i.name)).map(i=>({name:i.name,description:i.description??void 0})),t}function $(e){if(y(e))return v(e)?void 0:"scalars";if(g(e))return"objects";if(p(e))return"interfaces";if(T(e))return"unions";if(j(e))return"enums";if(d(e))return"inputs"}function F(e){return g(e)||p(e)||d(e)?e:void 0}function x(e){const n=e.astNode?.directives;return n?.length?n.map(t=>a(t)).join(" "):void 0}function b(e){return e?Object.values(e.getFields()).map(n=>({name:n.name,description:n.description??void 0,type:n.type.toString(),args:n.args.length?`(${n.args.map(t=>{const r=t.astNode?.defaultValue?` = ${a(t.astNode.defaultValue)}`:"";return`${t.name}: ${t.type}${r}`}).join(", ")})`:void 0,directives:x(n)})):[]}function G(e,n){const t=O(e),r=[];for(const i of Object.values(e.getTypeMap())){if(l(i)||t.has(i.name))continue;const o=F(i);if(!o)continue;const f=$(o);if(!(!f||n&&n!==f))for(const s of Object.values(o.getFields()))r.push({kind:f,name:`${o.name}.${s.name}`,description:s.description??void 0,type:s.type.toString(),directives:x(s)})}return r}function K(e,n){const t=n.toLowerCase();return e.name.toLowerCase().includes(t)||(e.description?.toLowerCase().includes(t)??!1)}function R(e,n){const t=n.indexOf(".");return t===-1?void 0:F(e.getType(n.slice(0,t)))?.getFields()[n.slice(t+1)]}function _(e,n,t){const r=B(e,t);if(!r)return[];const i=new Set([r,...q(e,r)]);return n.filter(o=>{if(o.name.includes(".")){const s=R(e,o.name);return s?N(s).some(c=>i.has(c)):!1}if(!D.has(o.kind))return i.has(o.name);const f=m(e,o.name);return f?N(f).some(s=>i.has(s)):!1})}function z(e,n){const t=new Set,r=[...M(e,n)];for(let i=0;i<r.length;i+=1){const o=r[i];if(t.has(o))continue;t.add(o);const f=e.getType(o);if(f)for(const s of S(f))t.has(s)||r.push(s)}return[...t].filter(i=>i!==n&&h(e,i))}function M(e,n){const t=e.getType(n);if(t)return S(t);const r=m(e,n);if(r)return new Set(N(r));const i=e.getDirective(n);return i?new Set(i.args.map(o=>u(o.type).name)):new Set}function q(e,n){const t=new Map;for(const o of Object.values(e.getTypeMap()))if(!l(o))for(const f of S(o)){let s=t.get(f);s||(s=new Set,t.set(f,s)),s.add(o.name)}const r=new Set,i=[n];for(let o=0;o<i.length;o+=1)for(const f of t.get(i[o])??[])r.has(f)||(r.add(f),i.push(f));return r}function B(e,n){const t=n.toLowerCase();return Object.keys(e.getTypeMap()).find(r=>r.toLowerCase()===t)}function h(e,n){const t=e.getType(n);return!t||l(t)?!1:!(y(t)&&v(t))}function C(e){return e.astNode?[e.astNode,...e.extensionASTNodes??[]].map(n=>a(n)).join(`
2
2
 
3
- `),referencedCount:i.length}}export{q as filterMembersReferencingType,C as findGraphqlSchemaByName,$ as groupSchemaTypes,I as printTypeOrField,L as printTypeOrFieldWithReferences,F as referencedTypeClosure};
3
+ `):L(e)}function Q(e,n){const t=e.getType(n);if(t)return C(t);const r=m(e,n);if(r?.astNode)return a(r.astNode);const i=e.getDirective(n);if(i?.astNode)return a(i.astNode);throw new Error(`No GraphQL type, operation, or directive named "${n}" found.`)}function P(e,n){const t=[];for(const r of M(e,n)){if(r===n||!h(e,r))continue;const i=e.getType(r);g(i)?t.push(`type ${r} { ${Object.keys(i.getFields()).join(", ")} }`):p(i)?t.push(`interface ${r} { ${Object.keys(i.getFields()).join(", ")} }`):d(i)?t.push(`input ${r} { ${Object.keys(i.getFields()).join(", ")} }`):j(i)?t.push(`enum ${r} { ${i.getValues().map(o=>o.name).join(", ")} }`):T(i)?t.push(`union ${r} = ${i.getTypes().map(o=>o.name).join(" | ")}`):y(i)&&t.push(`scalar ${r}`)}return t}function U(e,n){const t=Q(e,n),r=z(e,n).map(i=>e.getType(i)).filter(i=>!!i).map(i=>C(i));return{sdl:[t,...r].join(`
4
+
5
+ `),referencedCount:r.length}}export{G as fieldMembers,_ as filterMembersReferencingType,V as findGraphqlSchemaByName,A as groupSchemaTypes,K as matchesFilter,Q as printTypeOrField,U as printTypeOrFieldWithReferences,z as referencedTypeClosure,P as referencedTypeManifest};
@@ -1,4 +1,8 @@
1
1
  declare const _default: {
2
+ createAnonymousSession: {
3
+ execute: import("../../types.js").McpToolHandler<import("./core/create-anonymous-session.js").CreateAnonymousSessionArgs>;
4
+ isAvailable: typeof import("./core/create-anonymous-session.js").isAnonymousSessionToolAvailable;
5
+ };
2
6
  'list-apis': import("../../types.js").McpToolHandler<import("./openapi/types.js").ListApisArgs>;
3
7
  'get-endpoints': import("../../types.js").McpToolHandler<import("./openapi/types.js").ApiNameVersionArgs>;
4
8
  'get-endpoint-info': import("../../types.js").McpToolHandler<import("./openapi/types.js").GetEndpointInfoArgs>;
@@ -1 +1 @@
1
- import r from"./openapi/list-apis.js";import o from"./openapi/get-endpoints.js";import t from"./openapi/get-endpoint-info.js";import m from"./openapi/get-security-schemes.js";import p from"./openapi/get-full-api-description.js";import i from"./core/search.js";import e from"./core/whoami.js";import f from"./graphql/list-graphql-apis.js";import l from"./graphql/get-graphql-type-list.js";import s from"./graphql/get-graphql-type.js";import a from"./graphql/get-graphql-schema.js";var E={...r,...o,...t,...m,...p,...i,...e,...f,...l,...s,...a};export{E as default};
1
+ import o from"./openapi/list-apis.js";import r from"./openapi/get-endpoints.js";import t from"./openapi/get-endpoint-info.js";import m from"./openapi/get-security-schemes.js";import i from"./openapi/get-full-api-description.js";import p from"./core/search.js";import e from"./core/whoami.js";import f from"./core/create-anonymous-session.js";import s from"./graphql/list-graphql-apis.js";import a from"./graphql/get-graphql-type-list.js";import l from"./graphql/get-graphql-type.js";import n from"./graphql/get-graphql-schema.js";var w={...o,...r,...t,...m,...i,...p,...e,...f,...s,...a,...l,...n};export{w as default};
@@ -0,0 +1,2 @@
1
+ export declare const OPERATION_METHODS: readonly ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace', 'query', 'x-query'];
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ const e=["get","put","post","delete","options","head","patch","trace","query","x-query"];export{e as OPERATION_METHODS};
@@ -1 +1 @@
1
- import{resolveParameters as h,resolveRequestBody as v,resolveResponses as x}from"../../utils.js";import{isMcpEndpoint as E}from"./utils.js";import{loadApiDescription as g}from"./load-api-description.js";import{checkEndpointAndDeleteXMcp as P}from"../../../utils/xmcp-utils.js";const S=async(s,i)=>{const{name:p,path:o,method:n,version:a}=s;let t;try{t=await g(p,i,a)}catch(y){return{content:[{type:"text",text:y.message}],isError:!0}}const c=o.startsWith("/")?o:`/${o}`,{title:d=""}=t.info||{},r=t.paths?.[c],m=n.toLowerCase();if(!r)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const e=r[m];if(!E(e)||!P(e,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const u=r?.parameters||[],l=e.parameters||[],f={...e,parameters:h({pathParams:u,opParams:l,definition:t}),requestBody:v(e.requestBody,t),responses:x(e.responses,t)};return{content:[{type:"text",text:JSON.stringify({api:d,version:t.info?.version||"",servers:t.servers||[],endpoint:{path:o,method:n.toUpperCase(),...f},globalSecurity:t.security||[],securitySchemes:t.components?.securitySchemes||[]},null,2)}]}};var M={"get-endpoint-info":S};export{M as default};
1
+ import{resolveParameters as f,resolveRequestBody as y,resolveResponses as h}from"../../utils.js";import{isMcpEndpoint as x}from"./utils.js";import{loadApiDescription as E}from"./load-api-description.js";import{checkEndpointAndDeleteXMcp as v}from"../../../utils/xmcp-utils.js";const g=async(n,i)=>{const{path:o,method:s}=n;let t;try{t=await E(n,i)}catch(l){return{content:[{type:"text",text:l.message}],isError:!0}}const p=o.startsWith("/")?o:`/${o}`,{title:a=""}=t.info||{},r=t.paths?.[p],c=s.toLowerCase();if(!r)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const e=r[c];if(!x(e)||!v(e,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const d=r?.parameters||[],m=e.parameters||[],u={...e,parameters:f({pathParams:d,opParams:m,definition:t}),requestBody:y(e.requestBody,t),responses:h(e.responses,t)};return{content:[{type:"text",text:JSON.stringify({api:a,version:t.info?.version||"",servers:t.servers||[],endpoint:{path:o,method:s.toUpperCase(),...u},globalSecurity:t.security||[],securitySchemes:t.components?.securitySchemes||{}},null,2)}]}};var B={"get-endpoint-info":g};export{B as default};
@@ -1 +1 @@
1
- import{loadApiDescription as p}from"./load-api-description.js";import{getEndpointsFromPaths as c}from"./utils.js";const a=async(n,r)=>{const{name:o,version:i}=n;let t;try{t=await p(o,r,i)}catch(s){return{content:[{type:"text",text:s.message}],isError:!0}}const e=c(t);return e.length===0?{content:[{type:"text",text:"No endpoints found"}]}:{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",servers:t.servers||[],endpoints:e},null,2)}]}};var l={"get-endpoints":a};export{l as default};
1
+ import{loadApiDescription as i}from"./load-api-description.js";import{getEndpointsFromPaths as s}from"./utils.js";const p=async(n,r)=>{let t;try{t=await i(n,r)}catch(o){return{content:[{type:"text",text:o.message}],isError:!0}}const e=s(t);return e.length===0?{content:[{type:"text",text:"No endpoints found"}]}:{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",servers:t.servers||[],endpoints:e},null,2)}]}};var d={"get-endpoints":p};export{d as default};
@@ -1 +1 @@
1
- import{loadApiDescription as s}from"./load-api-description.js";const p=async(e,i)=>{const{name:n,version:r}=e;let t;try{t=await s(n,i,r)}catch(o){return{content:[{type:"text",text:o.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",definition:t},null,2)}]}};var a={"get-full-api-description":p};export{a as default};
1
+ import{loadApiDescription as n}from"./load-api-description.js";const o=async(e,i)=>{let t;try{t=await n(e,i)}catch(r){return{content:[{type:"text",text:r.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",definition:t},null,2)}]}};var s={"get-full-api-description":o};export{s as default};
@@ -1 +1 @@
1
- import{loadApiDescription as c}from"./load-api-description.js";const o=async(t,r)=>{const{name:s,version:i}=t;let e;try{e=await c(s,r,i)}catch(n){return{content:[{type:"text",text:n.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}};var y={"get-security-schemes":o};export{y as default};
1
+ import{loadApiDescription as s}from"./load-api-description.js";const c=async(t,r)=>{let e;try{e=await s(t,r)}catch(i){return{content:[{type:"text",text:i.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||{},security:e.security||[]},null,2)}]}};var o={"get-security-schemes":c};export{o as default};
@@ -1 +1 @@
1
- import{filterApiDescriptionsByName as f}from"../../utils.js";const g=async(l,a)=>{const{filter:i,page:n=1,limit:e=300}=l;let t=Object.values(a.apiDescriptionsMap);i&&(t=f(t,i));const s=(n-1)*e,o=s+e,c=Math.ceil(t.length/e),r=t.length;return t=t.slice(s,o),t.length===0?{content:[{type:"text",text:"No APIs available"}]}:{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:h,fetchEligible:x,...p})=>p),limit:e,total:r,page:n,totalPages:c})}]}};var u={"list-apis":g};export{u as default};
1
+ import{filterApiDescriptionsByName as g}from"../../utils.js";const h=async(l,a)=>{const{filter:i,page:n=1,limit:e=300}=l;let t=Object.values(a.apiDescriptionsMap);i&&(t=g(t,i));const s=(n-1)*e,o=s+e,c=Math.ceil(t.length/e),p=t.length;return t=t.slice(s,o),t.length===0?{content:[{type:"text",text:"No APIs available"}]}:{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:r,fetchEligible:x,...f})=>({filePath:r,...f})),limit:e,total:p,page:n,totalPages:c})}]}};var u={"list-apis":h};export{u as default};
@@ -1,4 +1,8 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
1
+ import type { OpenAPIDefinition } from '@redocly/api-docs';
2
2
  import type { McpToolContext } from '../../../types.js';
3
- export declare function loadApiDescription(name: string, context: McpToolContext, version?: string): Promise<OpenAPIDefinition>;
3
+ export declare function loadApiDescription({ name, version, filePath }: {
4
+ name: string;
5
+ version?: string;
6
+ filePath?: string;
7
+ }, context: McpToolContext): Promise<OpenAPIDefinition>;
4
8
  //# sourceMappingURL=load-api-description.d.ts.map
@@ -1 +1 @@
1
- import{findApiDescriptionByNameAndVersion as t}from"../../utils.js";import{getApiDescriptionFromFs as a}from"./utils.js";async function u(r,i,s){const o=t(i.apiDescriptionsMap,r,s);if(!o)throw new Error(`No API found matching "${r}".`);const e=!!i?.config?.access?.requiresLogin,c=i?.config?.access?.rbac||{},n=await a({relativePath:o.relativePath||"",outdir:i.outdir||"",user:i.user,rbac:c,requiresLogin:e});if(!n)throw new Error(`No API found matching "${r}".`);return n}export{u as loadApiDescription};
1
+ import{findApiDescriptionByNameAndVersion as p}from"../../utils.js";import{getApiDescriptionFromFs as u}from"./utils.js";async function g({name:o,version:n,filePath:r},i){const s=r?Object.values(i.apiDescriptionsMap).find(c=>c.relativePath===r):p(i.apiDescriptionsMap,o,n);if(!s)throw new Error(r?`No API found with filePath "${r}". File paths are returned by the list-apis tool.`:`No API found matching "${o}".`);const t=!!i?.config?.access?.requiresLogin,a=i?.config?.access?.rbac||{},e=await u({relativePath:s.relativePath||"",outdir:i.outdir||"",user:i.user,rbac:a,requiresLogin:t});if(!e)throw new Error(`No API found matching "${r||o}".`);return e}export{g as loadApiDescription};
@@ -6,11 +6,13 @@ export type ListApisArgs = {
6
6
  export type ApiNameVersionArgs = {
7
7
  name: string;
8
8
  version?: string;
9
+ filePath?: string;
9
10
  };
10
11
  export type GetEndpointInfoArgs = {
11
12
  name: string;
12
13
  path: string;
13
14
  method: string;
14
15
  version?: string;
16
+ filePath?: string;
15
17
  };
16
18
  //# sourceMappingURL=types.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/openapi-docs';
1
+ import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/api-docs';
2
2
  import type { ApiFunctionsUser, RbacConfig } from '@redocly/config';
3
3
  import type { McpEndpoint } from '../../../types';
4
4
  export declare function isMcpEndpoint(value: unknown): value is McpEndpoint;
@@ -7,7 +7,7 @@ type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security
7
7
  path: string;
8
8
  };
9
9
  export declare function getEndpointsFromPaths(def: OpenAPIDefinition): EndpointInfo[];
10
- export declare function getApiDescriptionFromFs({ relativePath, outdir, user, rbac, requiresLogin }: {
10
+ export declare function getApiDescriptionFromFs({ relativePath, outdir, user, rbac, requiresLogin, }: {
11
11
  relativePath: string;
12
12
  outdir: string;
13
13
  user: ApiFunctionsUser;
@@ -1 +1 @@
1
- import a from"node:path";import{existsSync as f}from"node:fs";import{readFile as d}from"node:fs/promises";import{replaceFileExtension as h}from"../../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as l}from"../../../../../constants/common";import{filterDataByAccessDeep as u}from"../../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as c}from"../../../utils/xmcp-utils.js";function I(t){return typeof t=="object"&&t!==null&&"responses"in t&&typeof t.responses=="object"}function O(t){const{paths:n={}}=t,e=[];for(const[r,i]of Object.entries(n)){const s=!c(i,"docs");for(const[p,o]of Object.entries(i))s||!c(o,"docs")||e.push({path:r,method:p.toUpperCase(),summary:o.summary,description:o.description,security:o.security})}return e}async function P({relativePath:t,outdir:n,user:e,rbac:r={},requiresLogin:i=!1}){const s=a.join(n||"",l,h(t,".json"));if(!f(s))return;const o=await d(s,"utf-8"),m=JSON.parse(o);return u(m,{isAuthenticated:e?.isAuthenticated,email:e?.email,teams:e?.teams},r,i)}export{P as getApiDescriptionFromFs,O as getEndpointsFromPaths,I as isMcpEndpoint};
1
+ import a from"node:path";import{existsSync as f}from"node:fs";import{readFile as d}from"node:fs/promises";import{replaceFileExtension as h}from"../../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as u}from"../../../../../constants/common";import{filterDataByAccessDeep as l}from"../../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as c}from"../../../utils/xmcp-utils.js";import{OPERATION_METHODS as E}from"./constants.js";function T(t){return typeof t=="object"&&t!==null&&"responses"in t&&typeof t.responses=="object"}const D=new Set(E);function b(t){const{paths:n={}}=t,e=[];for(const[r,i]of Object.entries(n)){const s=!c(i,"docs");for(const[p,o]of Object.entries(i))D.has(p.toLowerCase())&&(s||!c(o,"docs")||e.push({path:r,method:p.toUpperCase(),summary:o.summary,description:o.description,security:o.security}))}return e}async function _({relativePath:t,outdir:n,user:e,rbac:r={},requiresLogin:i=!1}){const s=a.join(n||"",u,h(t,".json"));if(!f(s))return;const o=await d(s,"utf-8"),m=JSON.parse(o);return l(m,{isAuthenticated:e?.isAuthenticated,email:e?.email,teams:e?.teams},r,i)}export{_ as getApiDescriptionFromFs,b as getEndpointsFromPaths,T as isMcpEndpoint};
@@ -1,4 +1,4 @@
1
- import type { OpenAPISchema, OpenAPIParameter, OpenAPIResponse, OpenAPIRequestBody, Referenced, OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
1
+ import type { OpenAPISchema, OpenAPIParameter, OpenAPIResponse, OpenAPIRequestBody, Referenced, OpenAPIDefinition } from '@redocly/api-docs';
2
2
  import type { ApiDescriptionInfo } from '../types.js';
3
3
  export declare function findApiDescriptionByNameAndVersion(apiDescriptionsMap: Record<string, ApiDescriptionInfo>, name: string, version?: string): ApiDescriptionInfo | undefined;
4
4
  export declare function filterApiDescriptionsByName(apiDescriptionsMap: ApiDescriptionInfo[], filter: string): ApiDescriptionInfo[];
@@ -10,13 +10,13 @@ type ResolveSchemaRefsParams = {
10
10
  maxDepth?: number;
11
11
  currentDepth?: number;
12
12
  };
13
- export declare function resolveSchemaRefs({ schema, definition, visitedRefs, maxDepth, currentDepth }: ResolveSchemaRefsParams): OpenAPISchema | undefined;
13
+ export declare function resolveSchemaRefs({ schema, definition, visitedRefs, maxDepth, currentDepth, }: ResolveSchemaRefsParams): OpenAPISchema | undefined;
14
14
  type ResolveParametersParams = {
15
15
  pathParams: Referenced<OpenAPIParameter>[];
16
16
  opParams: Referenced<OpenAPIParameter>[];
17
17
  definition: OpenAPIDefinition;
18
18
  };
19
- export declare function resolveParameters({ pathParams, opParams, definition }: ResolveParametersParams): OpenAPIParameter[];
19
+ export declare function resolveParameters({ pathParams, opParams, definition, }: ResolveParametersParams): OpenAPIParameter[];
20
20
  export declare function resolveRequestBody(requestBody: Referenced<OpenAPIRequestBody> | undefined, definition: OpenAPIDefinition): OpenAPIRequestBody | undefined;
21
21
  export declare function resolveResponses(responses: Record<string, Referenced<OpenAPIResponse>>, definition: OpenAPIDefinition): Record<string, OpenAPIResponse>;
22
22
  export {};
@@ -1 +1 @@
1
- function v(t,o,n){if(!o)return;const s=o.toLowerCase(),r=Object.values(t).filter(({name:i})=>i.toLowerCase()===s);if(r.length===0)return;const e=n?r.filter(i=>i.version===n):r;if(e.length===0)return;if(e.length===1)return e[0];if(new Set(e.map(({version:i})=>i||"")).size>1){const i=e.map(({version:d})=>d||"(no version)").join(", ");throw new Error(`Multiple versions of "${o}" found: ${i}. Specify a version to disambiguate.`)}const c=e.map(({relativePath:i})=>i||"(unknown path)").join(", "),u=e[0].version?` at version "${e[0].version}"`:"";throw new Error(`Multiple APIs are titled "${o}"${u} (${c}). Give them a distinct info.title or info.version so they can be addressed individually.`)}function $(t,o){return Object.values(t).filter(({name:n})=>n.toLowerCase().includes(o.toLowerCase()))}function a(t,o){if(!o||!t?.startsWith("#/"))return;const n=t.slice(2).split("/");let s=o;for(const r of n)if(typeof s=="object"&&s!==null&&r in s)s=s[r];else return;return s}function l({schema:t,definition:o,visitedRefs:n=new Set,maxDepth:s=50,currentDepth:r=0}){if(!t)return;if(r>=s)return{type:"object",description:`Maximum resolution depth exceeded (${s})`};if("$ref"in t&&t.$ref){if(n.has(t.$ref))return{type:"object",description:`Circular reference detected: ${t.$ref}`,"x-circular-ref":t.$ref};const c=new Set(n);c.add(t.$ref);const u=a(t.$ref,o);return u?l({schema:u,definition:o,visitedRefs:c,maxDepth:s,currentDepth:r+1}):{type:"object",description:`Could not resolve reference: ${t.$ref}`,"x-unresolved-ref":t.$ref}}const e={...t};if(e.properties){const c={};for(const[u,i]of Object.entries(e.properties)){const d=l({schema:i,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});c[u]=d||i}e.properties=c}if(e.items&&typeof e.items=="object")if(Array.isArray(e.items))e.items=e.items.map(c=>l({schema:c,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1})||c);else{const c=l({schema:e.items,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});c&&(e.items=c)}return["allOf","anyOf","oneOf"].forEach(c=>{const u=e[c];Array.isArray(u)&&(e[c]=u.reduce((i,d)=>{const p=l({schema:d,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});return p&&i.push(p),i},[]))}),e}function h({pathParams:t,opParams:o,definition:n}){return[...t,...o].reduce((s,r)=>{if(!r)return s;if("$ref"in r&&r.$ref){const e=a(r.$ref,n);return e&&s.push({...e,schema:"schema"in e&&e.schema?l({schema:e.schema,definition:n}):void 0}),s}return s.push({...r,schema:"schema"in r&&r.schema?l({schema:r.schema,definition:n}):void 0}),s},[])}function m(t,o){const n={...t};if(t.example!==void 0&&(n.example=t.example),!t.examples)return n;const s={};for(const[r,e]of Object.entries(t.examples))if("$ref"in e){const f=a(e.$ref,o);f&&(s[r]=f)}else s[r]=e;return n.examples=s,n}function w(t,o){if(!t)return;const n="$ref"in t&&t.$ref?a(t.$ref,o):t;if(!n)return;const s={...n};if("content"in n&&n.content){const r={};for(const[e,f]of Object.entries(n.content))r[e]={...m(f,o),schema:f.schema?l({schema:f.schema,definition:o}):void 0};s.content=r}return s}function b(t,o){return Object.entries(t).reduce((n,[s,r])=>{const e="$ref"in r&&r.$ref?a(r.$ref,o):r;if(!e)return n;const f={...e};if("content"in e&&e.content){const c={};for(const[u,i]of Object.entries(e.content))c[u]={...m(i,o),schema:i.schema?l({schema:i.schema,definition:o}):void 0};f.content=c}return n[s]=f,n},{})}export{$ as filterApiDescriptionsByName,v as findApiDescriptionByNameAndVersion,h as resolveParameters,a as resolveRef,w as resolveRequestBody,b as resolveResponses,l as resolveSchemaRefs};
1
+ function $(t,o,n){if(!o)return;const s=o.toLowerCase(),r=Object.values(t).filter(({name:i})=>i.toLowerCase()===s);if(r.length===0)return;const e=n?r.filter(i=>i.version===n):r;if(e.length===0)return;if(e.length===1)return e[0];if(new Set(e.map(({version:i})=>i||"")).size>1){const i=e.map(({version:a})=>a||"(no version)").join(", ");throw new Error(`Multiple versions of "${o}" found: ${i}. Specify a version to disambiguate.`)}const f=e.map(({relativePath:i})=>`"${i||"(unknown path)"}"`).join(", "),u=e[0].version?` at version "${e[0].version}"`:"";throw new Error(`Multiple APIs are titled "${o}"${u}. Pass the "filePath" parameter to select one of: ${f}.`)}function v(t,o){return Object.values(t).filter(({name:n})=>n.toLowerCase().includes(o.toLowerCase()))}function d(t,o){if(!o||!t?.startsWith("#/"))return;const n=t.slice(2).split("/");let s=o;for(const r of n)if(typeof s=="object"&&s!==null&&r in s)s=s[r];else return;return s}function l({schema:t,definition:o,visitedRefs:n=new Set,maxDepth:s=50,currentDepth:r=0}){if(!t)return;if(r>=s)return{type:"object",description:`Maximum resolution depth exceeded (${s})`};if("$ref"in t&&t.$ref){if(n.has(t.$ref))return{type:"object",description:`Circular reference detected: ${t.$ref}`,"x-circular-ref":t.$ref};const f=new Set(n);f.add(t.$ref);const u=d(t.$ref,o);return u?l({schema:u,definition:o,visitedRefs:f,maxDepth:s,currentDepth:r+1}):{type:"object",description:`Could not resolve reference: ${t.$ref}`,"x-unresolved-ref":t.$ref}}const e={...t};if(e.properties){const f={};for(const[u,i]of Object.entries(e.properties)){const a=l({schema:i,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});f[u]=a||i}e.properties=f}if(e.items&&typeof e.items=="object")if(Array.isArray(e.items))e.items=e.items.map(f=>l({schema:f,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1})||f);else{const f=l({schema:e.items,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});f&&(e.items=f)}return["allOf","anyOf","oneOf"].forEach(f=>{const u=e[f];Array.isArray(u)&&(e[f]=u.reduce((i,a)=>{const p=l({schema:a,definition:o,visitedRefs:new Set(n),maxDepth:s,currentDepth:r+1});return p&&i.push(p),i},[]))}),e}function h({pathParams:t,opParams:o,definition:n}){return[...t,...o].reduce((s,r)=>{if(!r)return s;if("$ref"in r&&r.$ref){const e=d(r.$ref,n);return e&&s.push({...e,schema:"schema"in e&&e.schema?l({schema:e.schema,definition:n}):void 0}),s}return s.push({...r,schema:"schema"in r&&r.schema?l({schema:r.schema,definition:n}):void 0}),s},[])}function m(t,o){const n={...t};if(t.example!==void 0&&(n.example=t.example),!t.examples)return n;const s={};for(const[r,e]of Object.entries(t.examples))if("$ref"in e){const c=d(e.$ref,o);c&&(s[r]=c)}else s[r]=e;return n.examples=s,n}function w(t,o){if(!t)return;const n="$ref"in t&&t.$ref?d(t.$ref,o):t;if(!n)return;const s={...n};if("content"in n&&n.content){const r={};for(const[e,c]of Object.entries(n.content))r[e]={...m(c,o),schema:c.schema?l({schema:c.schema,definition:o}):void 0};s.content=r}return s}function x(t,o){return Object.entries(t).reduce((n,[s,r])=>{const e="$ref"in r&&r.$ref?d(r.$ref,o):r;if(!e)return n;const c={...e};if("content"in e&&e.content){const f={};for(const[u,i]of Object.entries(e.content))f[u]={...m(i,o),schema:i.schema?l({schema:i.schema,definition:o}):void 0};c.content=f}return n[s]=c,n},{})}export{v as filterApiDescriptionsByName,$ as findApiDescriptionByNameAndVersion,h as resolveParameters,d as resolveRef,w as resolveRequestBody,x as resolveResponses,l as resolveSchemaRefs};
@@ -0,0 +1,28 @@
1
+ import type { InputRequiredResult } from '@modelcontextprotocol/server';
2
+ import type { UpstreamAuthRequiredEvent } from './upstream-auth.js';
3
+ import type { UpstreamAuthScheme } from './upstream-auth-scheme.js';
4
+ import type { KvService } from '@redocly/config';
5
+ export declare const CREDENTIALS_INPUT_REQUEST_KEY = "credentials";
6
+ export declare function isCredentialElicitationDeclined(inputResponses: Record<string, unknown> | undefined): boolean;
7
+ /**
8
+ * The 2026-07-28-era credentials prompt: the tool call returns an input-required result the
9
+ * client fulfils and retries, with no push `elicitation/create` and no session behind it.
10
+ * Nothing has to survive the round trip - the secrets are keyed by `subject`, which is
11
+ * recomputed from the caller's identity on every request.
12
+ */
13
+ export declare function buildUpstreamCredentialInputRequired({ subject, baseUrl, events, auth, kv, }: {
14
+ subject: string;
15
+ baseUrl: string;
16
+ events: UpstreamAuthRequiredEvent[];
17
+ auth: UpstreamAuthScheme;
18
+ kv: KvService;
19
+ }): Promise<InputRequiredResult>;
20
+ /** Fallback text for a 2026-07-28-era client without URL-elicitation support. */
21
+ export declare function buildUpstreamCredentialFallback({ subject, baseUrl, events, auth, kv, }: {
22
+ subject: string;
23
+ baseUrl: string;
24
+ events: UpstreamAuthRequiredEvent[];
25
+ auth: UpstreamAuthScheme;
26
+ kv: KvService;
27
+ }): Promise<string>;
28
+ //# sourceMappingURL=elicitation.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{inputRequired as s,inputResponse as p}from"@modelcontextprotocol/server";import{secretStore as h,ELICITATION_TTL_MS as m}from"./secret-store.js";import{ANONYMOUS_SUBJECT_PREFIX as c}from"./subject.js";const l="credentials";function k(e){const t=p(e,l);return t.kind==="elicit"&&(t.action==="decline"||t.action==="cancel")}async function v({subject:e,baseUrl:t,events:n,auth:a,kv:r}){const{url:i}=await u(r,e,t,n,a);return s({inputRequests:{[l]:s.elicitUrl({message:T(n[0].name),url:i})}})}async function A({subject:e,baseUrl:t,events:n,auth:a,kv:r}){const{url:i}=await u(r,e,t,n,a);return E(n,i,f(e))}async function u(e,t,n,a,r){const i=a[0],o=await h.createElicitation(e,{subject:t,api:i.api,name:i.name,auth:r});return{token:o,url:g(n,o)}}function f(e){return e.startsWith(c)?e.slice(c.length):void 0}function T(e){return`The "${e}" API requires credentials. Open the link to provide them securely; they never pass through the chat.`}function g(e,t){if(!e)return`/mcp/credentials?token=${t}`;try{const n=new URL("/mcp/credentials",e);return n.searchParams.set("token",t),n.toString()}catch{return`${e}/mcp/credentials?token=${t}`}}function E(e,t,n){const[a,...r]=e,i=[`The upstream API "${a.name}" returned 401 Unauthorized.`,"",`**Action required: show the user the link below and ask them to open it in a browser to provide the API credentials (valid ${Math.round(m/6e4)} minutes):**`,"",t,"",n?`Then call this tool again with sessionHandle: "${n}" - the credentials are stored against that handle, applied server-side, and never appear in the conversation.`:"Then call this tool again - the credentials are applied server-side and never appear in the conversation."];if(r.length>0){const o=r.map(d=>`"${d.name}"`).join(", ");i.push("",`The remaining APIs (${o}) will prompt for credentials on subsequent calls.`)}return i.join(`
2
+ `)}export{l as CREDENTIALS_INPUT_REQUEST_KEY,A as buildUpstreamCredentialFallback,v as buildUpstreamCredentialInputRequired,k as isCredentialElicitationDeclined};
@@ -1,18 +1,7 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
- import type { OpenAPIMcp } from '@redocly/openapi-docs/lib/types/open-api.js';
3
- import type { RbacConfig } from '@redocly/config';
4
- type GatewayVisibility = {
5
- hide?: boolean;
6
- docs?: {
7
- hide?: boolean;
8
- ignore?: readonly string[];
9
- };
10
- gateway?: {
11
- hide?: boolean;
12
- };
13
- };
14
- /** Whether the gateway fetch capability is on: the feature flag plus none of mcp/docs/gateway hidden. */
15
- export declare function isGatewayCapabilityEnabled(mcp: GatewayVisibility | undefined): boolean;
1
+ import type { OpenAPIDefinition, OpenAPIMcp } from '@redocly/api-docs';
2
+ import type { RbacConfig, RedoclyConfig } from '@redocly/config';
3
+ /** Whether the gateway fetch capability is on: the feature flag plus none of mcp/docs hidden. */
4
+ export declare function isGatewayCapabilityEnabled(mcp?: RedoclyConfig['mcp']): boolean;
16
5
  /** Whether an API is eligible for the gateway (fetch-capable `execute` + `/mcp` advertisement). */
17
6
  export declare function isGatewayEligible(info: OpenAPIDefinition['info'] | undefined, relativePath: string, rbacConfig: RbacConfig): boolean;
18
7
  /**
@@ -24,7 +13,6 @@ export declare function shouldAdvertiseGatewayXMcp(definition: (OpenAPIDefinitio
24
13
  'x-mcp'?: {
25
14
  servers?: unknown[];
26
15
  };
27
- }) | undefined, relativePath: string, rbacConfig: RbacConfig, mcpConfig: GatewayVisibility | undefined): boolean;
16
+ }) | undefined, relativePath: string, rbacConfig: RbacConfig, mcpConfig?: RedoclyConfig['mcp']): boolean;
28
17
  export declare function buildGatewayXMcp(url: string): OpenAPIMcp;
29
- export {};
30
18
  //# sourceMappingURL=eligibility.d.ts.map
@@ -1 +1 @@
1
- import{join as r}from"node:path";import{PUBLIC_API_DEFINITIONS_FOLDER as s}from"../../../constants/common.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as a}from"../../../../constants/common.js";import{canDownloadApiDefinition as n}from"../../../utils/rbac.js";import{MCP_PROTOCOL_VERSION as p}from"../constants.js";import{isApiIncludedInDocsMcp as l}from"../utils.js";import{isMcpGatewayEnabled as c}from"../utils/mode.js";import{isDefinitionHidden as f,hasGatewayConfig as m}from"../utils/xmcp-utils.js";function u(o){return c()&&!o?.hide&&!o?.docs?.hide&&!o?.gateway?.hide}function d(o,e,i){return f(o,"gateway")?!1:n(r(s,e),i,!1,{isAuthenticated:!1,teams:[a]})||m(o)}function D(o,e,i,t){return u(t)&&!o?.["x-mcp"]?.servers?.length&&d(o?.info,e,i)&&l(e,o,t)}function M(o){return{protocolVersion:p,capabilities:{tools:{}},servers:[{url:o}],tools:[],resources:[],prompts:[]}}export{M as buildGatewayXMcp,u as isGatewayCapabilityEnabled,d as isGatewayEligible,D as shouldAdvertiseGatewayXMcp};
1
+ import{join as e}from"node:path";import{PUBLIC_API_DEFINITIONS_FOLDER as s}from"../../../constants/common.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as a}from"../../../../constants/common.js";import{canDownloadApiDefinition as n}from"../../../utils/rbac.js";import{MCP_PROTOCOL_VERSION as p}from"../constants.js";import{isApiIncludedInDocsMcp as c}from"../utils.js";import{isMcpGatewayEnabled as l}from"../utils/mode.js";import{isDefinitionHidden as m,hasGatewayConfig as f}from"../utils/xmcp-utils.js";function u(o){return l()&&!o?.hide&&!o?.docs?.hide}function d(o,i,r){return m(o,"gateway")?!1:n(e(s,i),r,!1,{isAuthenticated:!1,teams:[a]})||f(o)}function D(o,i,r,t){return u(t)&&!o?.["x-mcp"]?.servers?.length&&d(o?.info,i,r)&&c(i,o,t)}function M(o){return{protocolVersion:p,capabilities:{tools:{}},servers:[{url:o}],tools:[],resources:[],prompts:[]}}export{M as buildGatewayXMcp,u as isGatewayCapabilityEnabled,d as isGatewayEligible,D as shouldAdvertiseGatewayXMcp};
@@ -1,13 +1,13 @@
1
- import type { OpenAPIServer } from '@redocly/openapi-docs/lib/types/open-api.js';
1
+ import type { OpenAPIServer } from '@redocly/api-docs';
2
2
  /**
3
- * Build case-insensitive host matchers from an API's server URL templates (plus any
4
- * configured extra hosts). A server URL host may contain server-variable placeholders
5
- * (e.g. a tenant `{subdomain}`); each placeholder expands to its `enum` values, or - when
6
- * free-form - to one DNS label plus any fixed parent domain carried by the variable's
7
- * `default`. So `{subdomain}.dealpos.com` matches `acme.dealpos.com`, and a whole-host
8
- * `{subdomain}` defaulting to `acme.dealpos.net` matches `<tenant>.dealpos.net`, but neither
9
- * matches `a.b.dealpos.com`, the bare parent domain, or an unrelated host.
3
+ * Build case-insensitive host matchers from an API's server URL templates. A server URL host
4
+ * may contain server-variable placeholders (e.g. a tenant `{subdomain}`); each placeholder
5
+ * expands to its `enum` values, or - when free-form - to one DNS label plus any fixed parent
6
+ * domain carried by the variable's `default`. So `{subdomain}.dealpos.com` matches
7
+ * `acme.dealpos.com`, and a whole-host `{subdomain}` defaulting to `acme.dealpos.net` matches
8
+ * `<tenant>.dealpos.net`, but neither matches `a.b.dealpos.com`, the bare parent domain, or an
9
+ * unrelated host.
10
10
  */
11
- export declare function buildAllowedHostMatchers(servers?: readonly OpenAPIServer[], extraHosts?: readonly string[]): RegExp[];
11
+ export declare function buildAllowedHostMatchers(servers?: readonly OpenAPIServer[]): RegExp[];
12
12
  export declare function isHostAllowed(host: string, matchers: readonly RegExp[]): boolean;
13
13
  //# sourceMappingURL=allowed-hosts.d.ts.map
@@ -1 +1 @@
1
- const i=/\{([^}]+)\}/g;function m(n=[],e=[]){const t=[];for(const r of n){const o=u(r);o&&t.push(o)}for(const r of e){const o=h(r);o&&t.push(o)}return t}function p(n,e){return e.some(t=>t.test(n))}function u(n){const e=f(n.url);if(!e)return null;let t="",r=0;for(const o of e.matchAll(i)){const[c,l]=o;t+=s(e.slice(r,o.index)),t+=a(n.variables?.[l]),r=o.index+c.length}return t+=s(e.slice(r)),t.includes("\\.")?new RegExp(`^${t}$`,"i"):null}function a(n){const e=n?.enum?.filter(Boolean);if(e&&e.length>0)return`(?:${e.map(s).join("|")})`;const t=n?.default?.split(".").slice(1).join(".");return t?`[^.]+\\.${s(t)}`:"[^.]+"}function h(n){const e=n.trim().toLowerCase();return e?e.startsWith("*.")?new RegExp(`^[^.]+\\.${s(e.slice(2))}$`,"i"):new RegExp(`^${s(e)}$`,"i"):null}function f(n){if(!n)return null;const t=n.replace(/^[a-z][a-z0-9+.-]*:\/\//i,"").split(/[/?#]/,1)[0];return t&&(t.includes("@")?t.slice(t.lastIndexOf("@")+1):t).replace(/:(?:\d+|\{[^}]+\})$/,"")||null}function s(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{m as buildAllowedHostMatchers,p as isHostAllowed};
1
+ const h=/\{([^}]+)\}/g;function g(n=[]){const e=[];for(const t of n){const r=p(t);r&&e.push(r)}return e}function x(n,e){return e.some(t=>t.test(n))}function p(n){const e=m(n.url);if(!e)return null;let t="",r=0,o=!1;for(const l of e.matchAll(h)){const[i,f]=l,c=e.slice(r,l.index);c.includes(".")&&(o=!0),t+=s(c);const u=d(n.variables?.[f]);u.guaranteesDot&&(o=!0),t+=u.pattern,r=l.index+i.length}const a=e.slice(r);return a.includes(".")&&(o=!0),t+=s(a),o?new RegExp(`^${t}$`,"i"):null}function d(n){const e=n?.enum?.filter(Boolean);if(e&&e.length>0)return{pattern:`(?:${e.map(s).join("|")})`,guaranteesDot:e.every(r=>r.includes("."))};const t=n?.default?.split(".").slice(1).join(".");return t?{pattern:`[^.]+\\.${s(t)}`,guaranteesDot:!0}:{pattern:"[^.]+",guaranteesDot:!1}}function m(n){if(!n)return null;const t=n.replace(/^[a-z][a-z0-9+.-]*:\/\//i,"").split(/[/?#]/,1)[0];return t&&(t.includes("@")?t.slice(t.lastIndexOf("@")+1):t).replace(/:(?:\d+|\{[^}]+\})$/,"")||null}function s(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{g as buildAllowedHostMatchers,x as isHostAllowed};
@@ -1,12 +1,28 @@
1
+ import { Agent, type Dispatcher } from 'undici';
1
2
  import type { SandboxFetch } from '../../codemode/types.js';
3
+ import type { UpstreamAuthRequiredEvent } from '../upstream-auth.js';
4
+ import type { StoredSecret } from '../secret-store.js';
5
+ export declare function getDefaultAgent(): Agent;
6
+ export type FetchBridgeApi = {
7
+ slug: string;
8
+ name: string;
9
+ matchers: readonly RegExp[];
10
+ secret?: StoredSecret;
11
+ };
2
12
  type FetchBridgeOptions = {
3
13
  allowedHosts: readonly RegExp[];
14
+ apis?: readonly FetchBridgeApi[];
4
15
  authorization?: string;
16
+ onAuthRequired?: (event: UpstreamAuthRequiredEvent) => void;
5
17
  fetchImpl?: typeof fetch;
18
+ dispatcher?: Dispatcher;
6
19
  timeoutMs?: number;
7
20
  maxResponseBytes?: number;
21
+ maxFetchesPerExec?: number;
22
+ clientIp?: string;
8
23
  };
9
24
  /** Build the host-side `fetch` the gateway sandbox calls. */
10
- export declare function buildFetchBridge({ allowedHosts, authorization, fetchImpl, timeoutMs, maxResponseBytes }: FetchBridgeOptions): SandboxFetch;
25
+ export declare function buildFetchBridge({ allowedHosts, apis, authorization, onAuthRequired, fetchImpl, dispatcher, timeoutMs, maxResponseBytes, maxFetchesPerExec, clientIp, }: FetchBridgeOptions): SandboxFetch;
26
+ export declare function readCappedBody(response: Response, maxBytes: number): Promise<string>;
11
27
  export {};
12
28
  //# sourceMappingURL=fetch-bridge.d.ts.map
@@ -1 +1 @@
1
- import{assertUrlAllowed as f}from"./ssrf-guard.js";const b=3e4,w=1024*1024;function m({allowedHosts:t,authorization:e,fetchImpl:o=fetch,timeoutMs:n=b,maxResponseBytes:s=w}){return async r=>{const a=f(r.url,t),d=g(r.headers,e),c=new AbortController,u=setTimeout(()=>c.abort(),n);try{const i=await o(a,{method:r.method??"GET",headers:d,body:r.body,redirect:"manual",signal:c.signal}),h=await y(i,s);return{status:i.status,statusText:i.statusText,ok:i.ok,headers:T(i.headers),bodyText:h}}finally{clearTimeout(u)}}}async function y(t,e){const o=Number(t.headers.get("content-length"));if(Number.isFinite(o)&&o>e)throw l(e,o);if(!t.body)return"";const n=t.body.getReader(),s=new TextDecoder;let r=0,a="";try{for(;;){const{done:d,value:c}=await n.read();if(d)break;if(r+=c.byteLength,r>e)throw l(e,r);a+=s.decode(c,{stream:!0})}return a+s.decode()}finally{await n.cancel().catch(()=>{})}}function l(t,e){return new Error(`Response is too large (over ${t} bytes, got ${e}); request less data`)}function g(t,e){const o={};let n=!1;for(const[s,r]of Object.entries(t??{})){const a=s.toLowerCase();a==="host"||a==="content-length"||(a==="authorization"&&(n=!0),o[s]=r)}return e&&!n&&(o.Authorization=e),o}function T(t){const e={};return t.forEach((o,n)=>{e[n.toLowerCase()]=o}),e}export{m as buildFetchBridge};
1
+ import{Agent as P}from"undici";import{envConfig as W}from"../../../../config/env-config.js";import{logger as C}from"../../../../tools/notifiers/logger.js";import{assertUrlAllowed as H}from"./ssrf-guard.js";import{createSsrfSafeLookup as J}from"./ssrf-safe-lookup.js";import{SsrfBlockedError as U}from"./ssrf-blocklist.js";import{GatewayFetchBlockedError as $,GatewayFetchSystemError as K,GatewayFetchUserError as A}from"./fetch-errors.js";import{redactHeaders as x,redactSecretsFromString as V}from"./redact.js";import{normalizeFetchPath as X}from"./normalize-path.js";import{reportGatewayFetch as O}from"./fetch-telemetry.js";const G="x-forwarded-for",Y=3e4,z=1024*1024;let k;function I(){if(!k){const t=W.isDevelopMode;t&&C.warn("Gateway MCP SSRF guard: loopback upstreams are ALLOWED (develop mode only, never in runtime)."),k=new P({connect:{lookup:J({allowLoopback:t})}})}return k}function we({allowedHosts:t,apis:e=[],authorization:r,onAuthRequired:n,fetchImpl:s=fetch,dispatcher:u=I(),timeoutMs:c=Y,maxResponseBytes:h=z,maxFetchesPerExec:f,clientIp:m}){const v=[...t,...e.flatMap(o=>o.matchers)],N=[r,...e.map(o=>o.secret?.value)].filter(o=>!!o),D=e.map(o=>o.secret?.header).filter(o=>!!o);let F=0;return async o=>{const g=o.method??"GET",T=Date.now();let M,b,E,S={},R,L;try{if(f!==void 0){const l=Math.max(0,f);if(F+=1,F>l)throw new A(`Outbound fetch budget exceeded (max ${l} fetches per execute); split the work across calls`)}const i=H(o.url,v);M=i.hostname,b=X(i.pathname);const y=e.filter(l=>l.matchers.some(j=>j.test(i.hostname))),a=y.length===1?y[0]:void 0;E=a?.slug,S=ne(o.headers,a?.secret,r,m);const p=new AbortController;L=setTimeout(()=>p.abort(),c);const d=await s(i,{method:g,headers:S,body:o.body,redirect:"manual",signal:p.signal,dispatcher:u});R=d.status,d.status===401&&a&&n&&n({api:a.slug,name:a.name});const _=await oe(d,h);let w=ae(d.headers);if(ee(d.status)){w=x(w,D);const{location:l}=w;l&&!te(l,i,v)&&delete w.location}return O({host:i.hostname,method:g,outcome:"success",durationMs:Date.now()-T,path:b,api:E,status:d.status,bytes:Buffer.byteLength(_,"utf8")}),{status:d.status,statusText:d.statusText,ok:d.ok,headers:w,bodyText:_}}catch(i){const{outcome:y,userSafe:a}=Z(i),p=M??(a instanceof $?a.host:void 0)??q(o.url)??"invalid-url";throw O({host:p,method:g,outcome:y,durationMs:Date.now()-T,path:b,api:E,status:R}),a||(C.error(`Gateway MCP fetch failed [${g} ${p}]: ${V(re(i),N)} headers=${JSON.stringify(x(S,D))}`),new K("Upstream fetch failed due to an internal error"))}finally{L!==void 0&&clearTimeout(L)}}}function Q(t){let e=t;for(let r=0;r<5&&e instanceof Error;r++){if(e instanceof A||e instanceof U)return e;e=e.cause}}function Z(t){const e=Q(t);return{outcome:e instanceof $||e instanceof U?"blocked":e?"user_error":"system_error",userSafe:e}}function q(t){try{return new URL(t).hostname||void 0}catch{return}}function ee(t){return t>=300&&t<400}function te(t,e,r){try{return!!H(new URL(t,e).href,r)}catch{return!1}}function re(t){if(!(t instanceof Error))return String(t);const e=t.cause;return e instanceof Error?`${t.message}: ${e.message}`:t.message}async function oe(t,e){const r=Number(t.headers.get("content-length"));if(Number.isFinite(r)&&r>e)throw B(e,r);if(!t.body)return"";const n=t.body.getReader(),s=new TextDecoder;let u=0,c="";try{for(;;){const{done:h,value:f}=await n.read();if(h)break;if(u+=f.byteLength,u>e)throw B(e,u);c+=s.decode(f,{stream:!0})}return c+s.decode()}finally{await n.cancel().catch(()=>{})}}function B(t,e){return new A(`Response is too large (over ${t} bytes, got ${e}); request less data`)}function ne(t,e,r,n){const s={},u=new Set;for(const[h,f]of Object.entries(t??{})){const m=h.toLowerCase();m==="host"||m==="content-length"||m!==G&&(u.add(m),s[h]=f)}n&&(s[G]=n);const c=e??(r?{header:"Authorization",value:r}:void 0);return c&&!u.has(c.header.toLowerCase())&&(s[c.header]=c.value),s}function ae(t){const e={};return t.forEach((r,n)=>{e[n.toLowerCase()]=r}),e}export{we as buildFetchBridge,I as getDefaultAgent,oe as readCappedBody};
@@ -0,0 +1,11 @@
1
+ export declare class GatewayFetchUserError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class GatewayFetchBlockedError extends GatewayFetchUserError {
5
+ readonly host?: string;
6
+ constructor(message: string, host?: string);
7
+ }
8
+ export declare class GatewayFetchSystemError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ //# sourceMappingURL=fetch-errors.d.ts.map
@@ -0,0 +1 @@
1
+ class s extends Error{constructor(r){super(r),this.name="GatewayFetchUserError"}}class o extends s{host;constructor(r,t){super(r),this.name="GatewayFetchBlockedError",this.host=t}}class a extends Error{constructor(r){super(r),this.name="GatewayFetchSystemError"}}export{o as GatewayFetchBlockedError,a as GatewayFetchSystemError,s as GatewayFetchUserError};
@@ -0,0 +1,14 @@
1
+ export type GatewayFetchOutcome = 'success' | 'blocked' | 'user_error' | 'system_error';
2
+ type GatewayFetchEvent = {
3
+ host: string;
4
+ method: string;
5
+ outcome: GatewayFetchOutcome;
6
+ durationMs: number;
7
+ path?: string;
8
+ api?: string;
9
+ status?: number;
10
+ bytes?: number;
11
+ };
12
+ export declare function reportGatewayFetch({ host, method, outcome, durationMs, path, api, status, bytes, }: GatewayFetchEvent): void;
13
+ export {};
14
+ //# sourceMappingURL=fetch-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ import{telemetry as m}from"../../../../telemetry/index.js";import{logger as c}from"../../../../tools/notifiers/logger.js";import{McpServerType as u}from"../../constants.js";import{serverAttributes as $}from"../../utils/telemetry-attributes.js";function g({host:f,method:i,outcome:o,durationMs:t,path:e,api:r,status:n,bytes:d}){try{m.sendMcpGatewayFetchPerformedMessage([{...$(u.Docs),host:f,method:i,outcome:o,...e!==void 0&&{path:e},...r!==void 0&&{api:r},...n!==void 0&&{status:n},...d!==void 0&&{bytes:d},duration_ms:t}])}catch{}c.info(`Gateway MCP fetch [${i} ${f}] outcome=${o}`+(e!==void 0?` path=${e}`:"")+(r!==void 0?` api=${r}`:"")+(n!==void 0?` status=${n}`:"")+(d!==void 0?` bytes=${d}`:"")+` durationMs=${t}`)}export{g as reportGatewayFetch};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reduce a request path to something safe to report: no query string (it carries tokens), no
3
+ * identifiers (they explode cardinality and can be customer data), bounded length.
4
+ */
5
+ export declare function normalizeFetchPath(pathname: string): string;
6
+ //# sourceMappingURL=normalize-path.d.ts.map
@@ -0,0 +1 @@
1
+ const A=200,a=12,c=/^\d+$/,i=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,E=/^[0-9a-f]{16,}$/i,_=/^[a-z]{2,6}_[A-Za-z0-9]{8,}$/,f=/^(?=.*\d)[A-Za-z0-9._~-]{20,}$/;function r(t){return t&&(c.test(t)||i.test(t)||E.test(t)||_.test(t)||f.test(t)?"{id}":t)}function M(t){if(!t||t==="/")return"/";const o=t.split("/"),s=o.slice(0,13).map(r);o.length>13&&s.push("...");const n=s.join("/")||"/";return n.length>200?`${n.slice(0,200)}...`:n}export{M as normalizeFetchPath};
@@ -0,0 +1,4 @@
1
+ export declare const REDACTED = "\u00AB[redacted]\u00BB";
2
+ export declare function redactSecretsFromString(text: string, secretValues: readonly string[]): string;
3
+ export declare function redactHeaders(headers: Record<string, string>, extraSensitiveNames?: readonly string[]): Record<string, string>;
4
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ const s="\xAB[redacted]\xBB",c=["authorization","proxy-authorization","cookie","set-cookie"];function a(r,n){let t=r;for(const e of n)e.trim()&&(t=t.split(e).join(s));return t}function u(r,n=[]){const t=new Set([...c,...n].map(o=>o.toLowerCase())),e={};for(const[o,i]of Object.entries(r))e[o]=t.has(o.toLowerCase())?s:i;return e}export{s as REDACTED,u as redactHeaders,a as redactSecretsFromString};
@@ -0,0 +1,22 @@
1
+ export declare class SsrfBlockedError extends Error {
2
+ code: string;
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * If `ip` is an IPv4-mapped IPv6 address (`::ffff:0:0/96`), returns the
7
+ * embedded IPv4 in dotted form. Otherwise returns undefined.
8
+ *
9
+ * Examples:
10
+ * - `::ffff:1.2.3.4` -> `'1.2.3.4'`
11
+ * - `::ffff:a9fe:a9fe` -> `'169.254.169.254'`
12
+ * - `::1` -> `undefined`
13
+ */
14
+ export declare function extractMappedIpv4(ip: string): string | undefined;
15
+ /**
16
+ * True if `ip` (a literal IPv4/IPv6 string) is in a range unsafe to reach. Non-IP input is
17
+ * treated as blocked (fail closed). Handles IPv4-mapped IPv6 by checking the embedded IPv4.
18
+ */
19
+ export declare function isBlockedIp(ip: string): boolean;
20
+ /** True if `ip` (a literal IPv4/IPv6 string) is a loopback address. Non-IP input returns false. */
21
+ export declare function isLoopback(ip: string): boolean;
22
+ //# sourceMappingURL=ssrf-blocklist.d.ts.map
@@ -0,0 +1 @@
1
+ import{BlockList as c,isIP as o}from"node:net";class g extends Error{code="SSRF_BLOCKED";constructor(t){super(t),this.name="SsrfBlockedError"}}const m=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.0.0.0",24],["192.0.2.0",24],["192.168.0.0",16],["198.18.0.0",15],["198.51.100.0",24],["203.0.113.0",24],["224.0.0.0",4],["240.0.0.0",4],["255.255.255.255",32]],S=[["::",128],["::1",128],["64:ff9b::",96],["64:ff9b:1::",48],["100::",64],["2001::",32],["2001:db8::",32],["2002::",16],["fc00::",7],["fe80::",10],["fec0::",10],["ff00::",8]],d=(()=>{const r=new c;for(const[t,e]of m)r.addSubnet(t,e,"ipv4");for(const[t,e]of S)r.addSubnet(t,e,"ipv6");return r})(),p=(()=>{const r=new c;return r.addSubnet("127.0.0.0",8,"ipv4"),r.addAddress("::1","ipv6"),r})();function u(r){if(o(r)!==6)return;const t=v(r);if(!(t.length===8&&t[0]===0&&t[1]===0&&t[2]===0&&t[3]===0&&t[4]===0&&t[5]===65535))return;const n=t[6]??0,f=t[7]??0;return[n>>8&255,n&255,f>>8&255,f&255].join(".")}function v(r){const e=r.replace(/:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/,(i,a,l,x,h)=>`:${((+a&255)<<8|+l&255).toString(16)}:${((+x&255)<<8|+h&255).toString(16)}`).split("::");if(e.length>2)return[];const n=e[0]?e[0].split(":"):[],f=e[1]?e[1].split(":"):[],s=e.length===2?8-n.length-f.length:0;return s<0?[]:[...n,...Array(s).fill("0"),...f].map(i=>Number.parseInt(i,16))}function B(r){const t=o(r);if(t===0||d.check(r,t===4?"ipv4":"ipv6"))return!0;if(t===6){const e=u(r);if(e&&d.check(e,"ipv4"))return!0}return!1}function _(r){const t=o(r);if(t===0)return!1;if(p.check(r,t===4?"ipv4":"ipv6"))return!0;if(t===6){const e=u(r);if(e&&p.check(e,"ipv4"))return!0}return!1}export{g as SsrfBlockedError,u as extractMappedIpv4,B as isBlockedIp,_ as isLoopback};
@@ -4,6 +4,6 @@
4
4
  * Returns the parsed URL on success; throws with a clear message otherwise.
5
5
  */
6
6
  export declare function assertUrlAllowed(rawUrl: string, matchers: readonly RegExp[]): URL;
7
- /** True for loopback, private, link-local, unspecified, or otherwise internal addresses. */
7
+ /** True for localhost or any literal IP in a blocked (private/reserved/loopback/link-local/…) range. */
8
8
  export declare function isBlockedAddress(host: string): boolean;
9
9
  //# sourceMappingURL=ssrf-guard.d.ts.map
@@ -1 +1 @@
1
- import{isHostAllowed as f}from"./allowed-hosts.js";function c(e,r){let t;try{t=new URL(e)}catch{throw new Error(`Invalid URL: ${e}`)}if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error(`Only http(s) URLs are allowed, got ${t.protocol}`);const n=o(t.hostname);if(u(n)||!f(n,r))throw new Error(`Host "${n}" is not allowed`);return t}function u(e){const r=o(e.toLowerCase());return r==="localhost"||r.endsWith(".localhost")?!0:i(r)?s(r):r.includes(":")?l(r):!1}function o(e){return e.replace(/^\[|\]$/g,"")}function i(e){return/^\d{1,3}(\.\d{1,3}){3}$/.test(e)}function s(e){const[r,t]=e.split(".").map(Number);return r===0||r===10||r===127||r===169&&t===254||r===172&&t>=16&&t<=31||r===192&&t===168||r===100&&t>=64&&t<=127}function l(e){if(e==="::1"||e==="::")return!0;const r=e.match(/::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);if(r)return s(r[1]);const t=parseInt(e.split(":")[0],16);return Number.isNaN(t)?!1:t>=65152&&t<=65215||t>=64512&&t<=65023}export{c as assertUrlAllowed,u as isBlockedAddress};
1
+ import{isIP as l}from"node:net";import{isHostAllowed as i}from"./allowed-hosts.js";import{isBlockedIp as a}from"./ssrf-blocklist.js";import{GatewayFetchBlockedError as c,GatewayFetchUserError as s}from"./fetch-errors.js";function m(o,r){let t;try{t=new URL(o)}catch{throw new s(`Invalid URL: ${o}`)}if(t.protocol!=="http:"&&t.protocol!=="https:")throw new s(`Only http(s) URLs are allowed, got ${t.protocol}`);if(t.username||t.password)throw new s("URLs must not contain embedded credentials");const e=n(t.hostname);if(d(e)||!i(e,r))throw new c(`Host "${e}" is not allowed`,e);return t}function d(o){const r=n(o.toLowerCase()).split("%")[0];return r==="localhost"||r.endsWith(".localhost")?!0:l(r)!==0?a(r):!1}function n(o){return o.replace(/^\[|\]$/g,"")}export{m as assertUrlAllowed,d as isBlockedAddress};
@@ -0,0 +1,13 @@
1
+ import { type LookupFunction } from 'node:net';
2
+ /**
3
+ * Returns a drop-in replacement for `dns.lookup` that errors with
4
+ * {@link SsrfBlockedError} if any resolved address is in the blocklist.
5
+ *
6
+ * Install on an http/https agent (`connect.lookup` for undici, or `lookup` for a node:https Agent)
7
+ * so that every socket connection — including those made while following redirects — is re-validated
8
+ * against the blocklist at connect time.
9
+ */
10
+ export declare function createSsrfSafeLookup({ allowLoopback, }?: {
11
+ allowLoopback?: boolean;
12
+ }): LookupFunction;
13
+ //# sourceMappingURL=ssrf-safe-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ import{lookup as c}from"node:dns";import{isIP as k}from"node:net";import{isBlockedIp as v,isLoopback as w,SsrfBlockedError as n}from"./ssrf-blocklist.js";function L({allowLoopback:p=!1}={}){const f=o=>v(o)&&!(p&&w(o));return(o,m,r)=>{const s=m,l=t=>{if(s.all){r(null,t);return}const[e]=t;if(!e){r(new n(`Hostname "${o}" did not resolve`),"",0);return}r(null,e.address,e.family)},u=k(o);if(u!==0){if(f(o)){r(new n(`Hostname "${o}" is a blocked address`),"",0);return}l([{address:o,family:u}]);return}c(o,{...s,all:!0},(t,e)=>{if(t){r(t,"",0);return}const d=e.filter(({address:i})=>f(i));if(d.length>0){const i=d.map(({address:$})=>$).join(", ");r(new n(`Hostname "${o}" resolves to a blocked address: ${i}`),"",0);return}if(!e.length){r(new n(`Hostname "${o}" did not resolve`),"",0);return}l(e)})}}export{L as createSsrfSafeLookup};