@redocly/redoc 0.140.0-next.1 → 0.140.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 (242) hide show
  1. package/CHANGELOG.md +409 -201
  2. package/dist/api-schemas/mcp-fetch-count.d.ts +2 -18
  3. package/dist/api-schemas/otel-traces.d.ts +7 -1345
  4. package/dist/api-schemas/otel-traces.js +1 -1
  5. package/dist/api-schemas/search-facets.d.ts +3 -31
  6. package/dist/api-schemas/search.d.ts +6 -52
  7. package/dist/cli/build/index.js +1 -1
  8. package/dist/cli/eject/resolveEjectParams.js +1 -1
  9. package/dist/cli/generate/get-schema-template.js +1 -1
  10. package/dist/client/app/hooks/markdown/useMarkdocRenderer.js +1 -1
  11. package/dist/client/app/hooks/markdown/useMarkdownText.js +1 -1
  12. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.d.ts +2 -0
  13. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.js +1 -1
  14. package/dist/client/app/markdoc/custom-components/openapi/use-markdown-adapter.d.ts +1 -33
  15. package/dist/client/app/useGlobalData.d.ts +1 -1
  16. package/dist/client/providers/post-message/use-post-message.d.ts +1 -1
  17. package/dist/compiled/@redocly/pii/index.mjs +1 -0
  18. package/dist/compiled/@redocly/pii/package.json +1 -0
  19. package/dist/compiled/svgo/svgo-node.js +1 -1
  20. package/dist/constants/l10n/langs/ar.js +1 -1
  21. package/dist/constants/l10n/langs/de.js +1 -1
  22. package/dist/constants/l10n/langs/en.js +1 -1
  23. package/dist/constants/l10n/langs/es.js +1 -1
  24. package/dist/constants/l10n/langs/fr.js +1 -1
  25. package/dist/constants/l10n/langs/hi.js +1 -1
  26. package/dist/constants/l10n/langs/it.js +1 -1
  27. package/dist/constants/l10n/langs/ja.js +1 -1
  28. package/dist/constants/l10n/langs/ko.js +1 -1
  29. package/dist/constants/l10n/langs/pl.js +1 -1
  30. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  31. package/dist/constants/l10n/langs/pt.js +1 -1
  32. package/dist/constants/l10n/langs/ru.js +1 -1
  33. package/dist/constants/l10n/langs/uk.js +1 -1
  34. package/dist/constants/l10n/langs/zh.js +1 -1
  35. package/dist/markdoc/attributes/definition-path.d.ts +1 -1
  36. package/dist/markdoc/attributes/json-example-ref.d.ts +1 -1
  37. package/dist/markdoc/attributes/json-schema-ref.d.ts +1 -1
  38. package/dist/markdoc/attributes/parsed-yaml.d.ts +1 -1
  39. package/dist/markdoc/attributes/raw-content.d.ts +1 -1
  40. package/dist/markdoc/attributes/sample-from-json-schema.d.ts +1 -1
  41. package/dist/markdoc/helpers/extract-rbac-from-condition-node.d.ts +1 -1
  42. package/dist/markdoc/helpers/get-inner-text.d.ts +1 -1
  43. package/dist/markdoc/helpers/get-node-attribute.d.ts +1 -1
  44. package/dist/markdoc/helpers/get-variable.d.ts +1 -1
  45. package/dist/markdoc/helpers/guards/is-conditional-node.d.ts +1 -1
  46. package/dist/markdoc/helpers/guards/is-function.d.ts +1 -1
  47. package/dist/markdoc/helpers/guards/is-node.d.ts +1 -1
  48. package/dist/markdoc/helpers/guards/is-prompt-node.d.ts +1 -1
  49. package/dist/markdoc/helpers/guards/is-tag.d.ts +1 -1
  50. package/dist/markdoc/helpers/guards/is-variable.d.ts +1 -1
  51. package/dist/markdoc/helpers/parse-partials.d.ts +1 -1
  52. package/dist/markdoc/helpers/parse-partials.js +1 -1
  53. package/dist/markdoc/helpers/remove-markdoc-tags.js +1 -1
  54. package/dist/markdoc/helpers/set-node-attribute-value.d.ts +1 -1
  55. package/dist/markdoc/nodes/fence/index.d.ts +1 -1
  56. package/dist/markdoc/nodes/fence/index.js +1 -1
  57. package/dist/markdoc/nodes/gfm-list-item.d.ts +1 -1
  58. package/dist/markdoc/nodes/gfm-list-item.js +1 -1
  59. package/dist/markdoc/nodes/heading.d.ts +1 -1
  60. package/dist/markdoc/nodes/heading.js +1 -1
  61. package/dist/markdoc/nodes/index.d.ts +6 -165
  62. package/dist/markdoc/nodes/index.js +1 -1
  63. package/dist/markdoc/nodes/table.d.ts +1 -1
  64. package/dist/markdoc/nodes/table.js +1 -1
  65. package/dist/markdoc/nodes/text.d.ts +1 -1
  66. package/dist/markdoc/tags/json-example.js +1 -1
  67. package/dist/markdoc/tags/openapi-code-sample.js +1 -1
  68. package/dist/server/api-routes/execute-api-route.js +1 -1
  69. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  70. package/dist/server/config/env-config.d.ts +26 -24
  71. package/dist/server/config/env-schema.d.ts +87 -326
  72. package/dist/server/config/env-schemas/api-urls.d.ts +2 -14
  73. package/dist/server/config/env-schemas/auth.d.ts +10 -32
  74. package/dist/server/config/env-schemas/catalog.d.ts +6 -9
  75. package/dist/server/config/env-schemas/database.d.ts +2 -8
  76. package/dist/server/config/env-schemas/environment-detection.d.ts +20 -18
  77. package/dist/server/config/env-schemas/feature-flags.d.ts +29 -33
  78. package/dist/server/config/env-schemas/feature-flags.js +1 -1
  79. package/dist/server/config/env-schemas/organization-project.d.ts +3 -21
  80. package/dist/server/config/env-schemas/scorecards.d.ts +2 -6
  81. package/dist/server/config/env-schemas/search.d.ts +9 -15
  82. package/dist/server/config/env-schemas/server-config.d.ts +6 -31
  83. package/dist/server/config/env-schemas/site.d.ts +1 -5
  84. package/dist/server/config/env-schemas/ssr.d.ts +7 -12
  85. package/dist/server/config/env-schemas/telemetry.d.ts +1 -7
  86. package/dist/server/constants/common.d.ts +3 -0
  87. package/dist/server/constants/common.js +1 -1
  88. package/dist/server/esbuild/plugins/dependency-resolver.js +1 -1
  89. package/dist/server/esbuild/plugins/themes-resolver.js +3 -3
  90. package/dist/server/external-plugins/resolve-external-plugins.js +1 -1
  91. package/dist/server/node-bundle-entry.js +1 -1
  92. package/dist/server/plugins/api-docs/definition-access.d.ts +22 -0
  93. package/dist/server/plugins/api-docs/definition-access.js +1 -0
  94. package/dist/server/plugins/api-docs/index.js +1 -1
  95. package/dist/server/plugins/api-docs/loader.d.ts +1 -1
  96. package/dist/server/plugins/api-docs/options.js +1 -1
  97. package/dist/server/plugins/api-docs/spec-download.api.js +1 -1
  98. package/dist/server/plugins/config-parser/index.js +1 -1
  99. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  100. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.d.ts +1 -1
  101. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.d.ts +1 -1
  102. package/dist/server/plugins/markdown/attribute-resolvers/index.d.ts +1 -1
  103. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.d.ts +1 -1
  104. package/dist/server/plugins/markdown/attribute-resolvers/resolve-diagram-from-file.d.ts +1 -1
  105. package/dist/server/plugins/markdown/attribute-resolvers/resolve-html-href.d.ts +1 -1
  106. package/dist/server/plugins/markdown/attribute-resolvers/resolve-html-source-attribute.d.ts +1 -1
  107. package/dist/server/plugins/markdown/attribute-resolvers/resolve-image-gallery.d.ts +1 -1
  108. package/dist/server/plugins/markdown/attribute-resolvers/resolve-image-src-set.d.ts +1 -1
  109. package/dist/server/plugins/markdown/attribute-resolvers/resolve-image-src.d.ts +1 -1
  110. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.d.ts +1 -1
  111. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-schema-ref.d.ts +1 -1
  112. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.d.ts +1 -1
  113. package/dist/server/plugins/markdown/attribute-resolvers/resolve-native-md-link.d.ts +1 -1
  114. package/dist/server/plugins/markdown/attribute-resolvers/resolve-nav-links.d.ts +1 -1
  115. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.d.ts +1 -1
  116. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-code-samples.d.ts +1 -1
  117. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-code-samples.js +1 -1
  118. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-response-samples.d.ts +1 -1
  119. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.d.ts +1 -1
  120. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.d.ts +1 -1
  121. package/dist/server/plugins/markdown/attribute-resolvers/resolve-relative-or-cdn-icon.d.ts +1 -1
  122. package/dist/server/plugins/markdown/attribute-resolvers/resolve-relative-path.d.ts +1 -1
  123. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.d.ts +1 -1
  124. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.d.ts +1 -1
  125. package/dist/server/plugins/markdown/attribute-resolvers/resolve-tag-raw-content.d.ts +1 -1
  126. package/dist/server/plugins/markdown/attribute-resolvers/resolve-tag-raw-content.js +2 -2
  127. package/dist/server/plugins/markdown/attribute-resolvers/utils.d.ts +1 -1
  128. package/dist/server/plugins/markdown/compiler.d.ts +1 -1
  129. package/dist/server/plugins/markdown/compiler.js +1 -1
  130. package/dist/server/plugins/markdown/errors.d.ts +1 -1
  131. package/dist/server/plugins/markdown/get-server-props.js +1 -1
  132. package/dist/server/plugins/markdown/html/normalize-html-headings.d.ts +1 -1
  133. package/dist/server/plugins/markdown/html/normalize-html-headings.js +1 -1
  134. package/dist/server/plugins/markdown/markdoc/functions/concat.d.ts +1 -1
  135. package/dist/server/plugins/markdown/markdoc/markdoc-options.d.ts +5 -165
  136. package/dist/server/plugins/markdown/markdoc/markdoc-options.js +1 -1
  137. package/dist/server/plugins/markdown/markdoc/partials.d.ts +1 -1
  138. package/dist/server/plugins/markdown/markdoc/plugins/headings.d.ts +1 -1
  139. package/dist/server/plugins/markdown/markdoc/plugins/utils.d.ts +1 -1
  140. package/dist/server/plugins/markdown/markdoc/reparse-example-fences.d.ts +1 -1
  141. package/dist/server/plugins/markdown/markdoc/reparse-example-fences.js +1 -1
  142. package/dist/server/plugins/markdown/runtime-transform.d.ts +2 -2
  143. package/dist/server/plugins/markdown/runtime-transform.js +1 -1
  144. package/dist/server/plugins/markdown/search/get-ai-search-documents.js +1 -1
  145. package/dist/server/plugins/markdown/search/nodes/section-node.d.ts +1 -1
  146. package/dist/server/plugins/markdown/search/search-resolver.js +1 -1
  147. package/dist/server/plugins/markdown/search/to-markdown.d.ts +1 -1
  148. package/dist/server/plugins/markdown/search/walk-sections.d.ts +1 -1
  149. package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
  150. package/dist/server/plugins/markdown/utils/stringify-tag-children-objects.d.ts +1 -1
  151. package/dist/server/plugins/mcp/codemode/tools/describe-tools.d.ts +1 -1
  152. package/dist/server/plugins/mcp/codemode/tools/describe-tools.js +1 -3
  153. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type-list.js +1 -1
  154. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/list-graphql-apis.js +1 -1
  155. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.d.ts +4 -4
  156. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/list-apis.js +1 -1
  157. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/types.d.ts +2 -2
  158. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  159. package/dist/server/plugins/mcp/handlers/errors.d.ts +0 -5
  160. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  161. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  162. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.js +1 -1
  163. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  164. package/dist/server/plugins/mcp/servers/mcp-server.js +2 -2
  165. package/dist/server/plugins/mcp/types.d.ts +10 -0
  166. package/dist/server/plugins/mcp/utils/available-tools.d.ts +5 -0
  167. package/dist/server/plugins/mcp/utils/available-tools.js +1 -0
  168. package/dist/server/plugins/mcp/workers/worker-context.d.ts +4 -0
  169. package/dist/server/plugins/mcp/workers/worker-context.js +1 -0
  170. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +2 -2
  171. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +1 -1
  172. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  173. package/dist/server/plugins/scorecard-classic/shared-utils.js +1 -1
  174. package/dist/server/plugins/scorecard-classic/template/Grid/GridHeader.js +3 -3
  175. package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
  176. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  177. package/dist/server/store-config.d.ts +33 -0
  178. package/dist/server/store-config.js +1 -0
  179. package/dist/server/store.d.ts +11 -16
  180. package/dist/server/store.js +1 -1
  181. package/dist/server/tools/notifiers/formatter.js +3 -3
  182. package/dist/server/tools/notifiers/helpers/colors.d.ts +1 -1
  183. package/dist/server/types/plugins/api-routes.d.ts +4 -1
  184. package/dist/server/types/plugins/common.d.ts +1 -1
  185. package/dist/server/utils/codeframes/codeframes.d.ts +1 -1
  186. package/dist/server/utils/codeframes/yaml-ast.d.ts +1 -1
  187. package/dist/server/utils/decode-request-path.d.ts +2 -0
  188. package/dist/server/utils/decode-request-path.js +1 -0
  189. package/dist/server/utils/envs/env-boolean-string.d.ts +9 -3
  190. package/dist/server/utils/envs/get-api-route-allowed-env-variables.d.ts +2 -0
  191. package/dist/server/utils/envs/get-api-route-allowed-env-variables.js +1 -1
  192. package/dist/server/utils/envs/interpolate-env-variables.d.ts +5 -1
  193. package/dist/server/utils/envs/interpolate-env-variables.js +1 -1
  194. package/dist/server/utils/envs/load-env-variables.js +1 -1
  195. package/dist/server/utils/envs/replace-env-variables-deep.d.ts +17 -9
  196. package/dist/server/utils/envs/replace-env-variables-deep.js +1 -1
  197. package/dist/server/utils/errors.d.ts +3 -0
  198. package/dist/server/utils/errors.js +1 -1
  199. package/dist/server/utils/llmstxt/resolve-llms-txt-md.js +1 -1
  200. package/dist/server/utils/rbac-expand.js +1 -1
  201. package/dist/server/utils/rbac.d.ts +5 -1
  202. package/dist/server/utils/rbac.js +1 -1
  203. package/dist/server/utils/report-all-errors.js +1 -1
  204. package/dist/server/web-server/auth.d.ts +2 -0
  205. package/dist/server/web-server/auth.js +2 -2
  206. package/dist/server/web-server/middleware/jsonValidatorMiddleware.d.ts +5 -325
  207. package/dist/server/web-server/routes/auth.js +1 -1
  208. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  209. package/dist/server/web-server/routes/error.js +1 -1
  210. package/dist/server/web-server/routes/helpers/process-redirects.js +1 -1
  211. package/dist/server/web-server/routes/mcp-routes/mcp-consent-page.d.ts +2 -2
  212. package/dist/server/web-server/routes/mcp-routes/mcp-consent-page.js +18 -18
  213. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.js +1 -1
  214. package/dist/server/web-server/utils/ssrf-safe-lookup.d.ts +2 -1
  215. package/dist/server/web-server/utils/ssrf-safe-lookup.js +1 -1
  216. package/dist/server/workers/mcp-tool-worker-methods.d.ts +7 -0
  217. package/dist/server/workers/mcp-tool-worker-methods.js +1 -0
  218. package/dist/server/workers/mcp-tool-worker-pool.d.ts +0 -1
  219. package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
  220. package/dist/server/workers/mcp-tool-worker.js +1 -1
  221. package/dist/server/workers/types.d.ts +4 -8
  222. package/dist/server/workers/worker-config.d.ts +33 -0
  223. package/dist/server/workers/worker-config.js +1 -0
  224. package/dist/types/errors.d.ts +1 -1
  225. package/dist/types/markdoc.d.ts +1 -1
  226. package/package.json +11 -11
  227. package/dist/server/plugins/markdown/html/html-jsx-attribute-mapping.d.ts +0 -6
  228. package/dist/server/plugins/markdown/html/html-jsx-attribute-mapping.js +0 -1
  229. package/dist/server/plugins/markdown/html/process-html-tokens.d.ts +0 -2
  230. package/dist/server/plugins/markdown/html/process-html-tokens.js +0 -1
  231. package/dist/server/plugins/markdown/source.d.ts +0 -4
  232. package/dist/server/plugins/markdown/source.js +0 -1
  233. package/dist/server/plugins/mcp/utils/available-sandbox-tools.d.ts +0 -4
  234. package/dist/server/plugins/mcp/utils/available-sandbox-tools.js +0 -1
  235. package/dist/server/tools/notifiers/helpers/privacy/mask-email.d.ts +0 -25
  236. package/dist/server/tools/notifiers/helpers/privacy/mask-email.js +0 -1
  237. package/dist/server/tools/notifiers/helpers/privacy/mask-subject.d.ts +0 -13
  238. package/dist/server/tools/notifiers/helpers/privacy/mask-subject.js +0 -1
  239. package/dist/server/tools/notifiers/helpers/privacy/remove-pii-from-url.d.ts +0 -25
  240. package/dist/server/tools/notifiers/helpers/privacy/remove-pii-from-url.js +0 -1
  241. package/dist/server/tools/notifiers/helpers/privacy/remove-pii.d.ts +0 -36
  242. package/dist/server/tools/notifiers/helpers/privacy/remove-pii.js +0 -1
@@ -7,171 +7,11 @@ export declare function getMarkdocOptions(serverOutDir?: string, _templateId?: s
7
7
  td: import("@markdoc/markdoc").Schema;
8
8
  th: import("@markdoc/markdoc").Schema;
9
9
  text: import("@markdoc/markdoc").Schema;
10
- strong: {
11
- render?: string | undefined;
12
- attributes?: Record<string, import("@markdoc/markdoc").SchemaAttribute>;
13
- slots?: Record<string, import("@markdoc/markdoc").SchemaSlot>;
14
- selfClosing?: boolean;
15
- inline?: boolean;
16
- transform?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
17
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial</*elided*/ any>, string>>>;
18
- tags: Record<string, import("@markdoc/markdoc").Schema>;
19
- variables: Record<string, any>;
20
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
21
- partials: Record<string, any>;
22
- validation?: {
23
- parents?: import("@markdoc/markdoc").Node[];
24
- validateFunctions?: boolean;
25
- environment?: string;
26
- };
27
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").RenderableTreeNodes>;
28
- validate?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
29
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
30
- tags: Record<string, import("@markdoc/markdoc").Schema>;
31
- variables: Record<string, any>;
32
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
33
- partials: Record<string, any>;
34
- validation?: {
35
- parents?: import("@markdoc/markdoc").Node[];
36
- validateFunctions?: boolean;
37
- environment?: string;
38
- };
39
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").ValidationError[]>;
40
- description?: string;
41
- children: string[];
42
- };
43
- em: {
44
- render?: string | undefined;
45
- attributes?: Record<string, import("@markdoc/markdoc").SchemaAttribute>;
46
- slots?: Record<string, import("@markdoc/markdoc").SchemaSlot>;
47
- selfClosing?: boolean;
48
- inline?: boolean;
49
- transform?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
50
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
51
- tags: Record<string, import("@markdoc/markdoc").Schema>;
52
- variables: Record<string, any>;
53
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
54
- partials: Record<string, any>;
55
- validation?: {
56
- parents?: import("@markdoc/markdoc").Node[];
57
- validateFunctions?: boolean;
58
- environment?: string;
59
- };
60
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").RenderableTreeNodes>;
61
- validate?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
62
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
63
- tags: Record<string, import("@markdoc/markdoc").Schema>;
64
- variables: Record<string, any>;
65
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
66
- partials: Record<string, any>;
67
- validation?: {
68
- parents?: import("@markdoc/markdoc").Node[];
69
- validateFunctions?: boolean;
70
- environment?: string;
71
- };
72
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").ValidationError[]>;
73
- description?: string;
74
- children: string[];
75
- };
76
- s: {
77
- render?: string | undefined;
78
- attributes?: Record<string, import("@markdoc/markdoc").SchemaAttribute>;
79
- slots?: Record<string, import("@markdoc/markdoc").SchemaSlot>;
80
- selfClosing?: boolean;
81
- inline?: boolean;
82
- transform?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
83
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
84
- tags: Record<string, import("@markdoc/markdoc").Schema>;
85
- variables: Record<string, any>;
86
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
87
- partials: Record<string, any>;
88
- validation?: {
89
- parents?: import("@markdoc/markdoc").Node[];
90
- validateFunctions?: boolean;
91
- environment?: string;
92
- };
93
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").RenderableTreeNodes>;
94
- validate?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
95
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
96
- tags: Record<string, import("@markdoc/markdoc").Schema>;
97
- variables: Record<string, any>;
98
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
99
- partials: Record<string, any>;
100
- validation?: {
101
- parents?: import("@markdoc/markdoc").Node[];
102
- validateFunctions?: boolean;
103
- environment?: string;
104
- };
105
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").ValidationError[]>;
106
- description?: string;
107
- children: string[];
108
- };
109
- link: {
110
- attributes?: Record<string, import("@markdoc/markdoc").SchemaAttribute>;
111
- slots?: Record<string, import("@markdoc/markdoc").SchemaSlot>;
112
- selfClosing?: boolean;
113
- inline?: boolean;
114
- transform?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
115
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
116
- tags: Record<string, import("@markdoc/markdoc").Schema>;
117
- variables: Record<string, any>;
118
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
119
- partials: Record<string, any>;
120
- validation?: {
121
- parents?: import("@markdoc/markdoc").Node[];
122
- validateFunctions?: boolean;
123
- environment?: string;
124
- };
125
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").RenderableTreeNodes>;
126
- validate?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
127
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
128
- tags: Record<string, import("@markdoc/markdoc").Schema>;
129
- variables: Record<string, any>;
130
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
131
- partials: Record<string, any>;
132
- validation?: {
133
- parents?: import("@markdoc/markdoc").Node[];
134
- validateFunctions?: boolean;
135
- environment?: string;
136
- };
137
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").ValidationError[]>;
138
- description?: string;
139
- render: string;
140
- children: string[];
141
- };
142
- document: {
143
- render?: string | undefined;
144
- attributes?: Record<string, import("@markdoc/markdoc").SchemaAttribute>;
145
- slots?: Record<string, import("@markdoc/markdoc").SchemaSlot>;
146
- selfClosing?: boolean;
147
- inline?: boolean;
148
- transform?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
149
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
150
- tags: Record<string, import("@markdoc/markdoc").Schema>;
151
- variables: Record<string, any>;
152
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
153
- partials: Record<string, any>;
154
- validation?: {
155
- parents?: import("@markdoc/markdoc").Node[];
156
- validateFunctions?: boolean;
157
- environment?: string;
158
- };
159
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").RenderableTreeNodes>;
160
- validate?(node: import("@markdoc/markdoc").Node, config: Readonly<Partial<{
161
- nodes: Partial<Record<import("@markdoc/markdoc").NodeType, import("@markdoc/markdoc").Schema<Partial<any>, string>>>;
162
- tags: Record<string, import("@markdoc/markdoc").Schema>;
163
- variables: Record<string, any>;
164
- functions: Record<string, import("@markdoc/markdoc").ConfigFunction>;
165
- partials: Record<string, any>;
166
- validation?: {
167
- parents?: import("@markdoc/markdoc").Node[];
168
- validateFunctions?: boolean;
169
- environment?: string;
170
- };
171
- }>>): import("@markdoc/markdoc").MaybePromise<import("@markdoc/markdoc").ValidationError[]>;
172
- description?: string;
173
- children: string[];
174
- };
10
+ strong: import("@markdoc/markdoc").Schema;
11
+ em: import("@markdoc/markdoc").Schema;
12
+ s: import("@markdoc/markdoc").Schema;
13
+ link: import("@markdoc/markdoc").Schema;
14
+ document: import("@markdoc/markdoc").Schema;
175
15
  };
176
16
  tags: {
177
17
  schemaDefinition: {
@@ -1 +1 @@
1
- import f from"@markdoc/markdoc";import*as p from"@redocly/theme/markdoc/default";import{reporter as g}from"../../../tools/notifiers/reporter.js";import*as u from"../../../../markdoc/nodes/index.js";import d from"../../../../markdoc/tags/index.js";import{normalizeCustomTags as l}from"../../../../markdoc/helpers/normalize-custom-tags.js";import{includes as h}from"./functions/includes.js";import{importUserTags as O}from"./import-user-tags.js";import{concat as y}from"./functions/concat.js";const T=p.tags;function b(s){const{tags:c,functions:e={},...r}=s,n={...c,...r},a=Object.entries(n),o=[],t=[];for(const[i,m]of a)i in f.nodes?o.push([i,m]):t.push([i,m]);return{nodes:Object.fromEntries(o),tags:Object.fromEntries(t),functions:e}}async function _(s="../../../esbuild/cache/server/",c=""){let e;try{e=(await O(s)).schema}catch(t){throw t.code==="ERR_MODULE_NOT_FOUND"?(g.printErrors(),new Error("Please fix the errors above and try again.")):t}const{tags:r={},nodes:n={},functions:a={}}=b(e),o={tags:{schemaDefinition:{render:"SchemaDefinition",attributes:{schemaRef:{type:String},exampleRef:{type:String},showReadOnly:{type:Boolean},showWriteOnly:{type:Boolean}}}}};return{nodes:{...u,...n},tags:{...d,...T,...l(r),...o.tags},functions:{...f.functions,...a,includes:h,concat:y}}}export{_ as getMarkdocOptions};
1
+ import f from"@redocly/markdoc";import*as p from"@redocly/theme/markdoc/default";import{reporter as g}from"../../../tools/notifiers/reporter.js";import*as u from"../../../../markdoc/nodes/index.js";import d from"../../../../markdoc/tags/index.js";import{normalizeCustomTags as l}from"../../../../markdoc/helpers/normalize-custom-tags.js";import{includes as h}from"./functions/includes.js";import{importUserTags as O}from"./import-user-tags.js";import{concat as y}from"./functions/concat.js";const T=p.tags;function b(s){const{tags:c,functions:e={},...r}=s,n={...c,...r},a=Object.entries(n),o=[],t=[];for(const[i,m]of a)i in f.nodes?o.push([i,m]):t.push([i,m]);return{nodes:Object.fromEntries(o),tags:Object.fromEntries(t),functions:e}}async function _(s="../../../esbuild/cache/server/",c=""){let e;try{e=(await O(s)).schema}catch(t){throw t.code==="ERR_MODULE_NOT_FOUND"?(g.printErrors(),new Error("Please fix the errors above and try again.")):t}const{tags:r={},nodes:n={},functions:a={}}=b(e),o={tags:{schemaDefinition:{render:"SchemaDefinition",attributes:{schemaRef:{type:String},exampleRef:{type:String},showReadOnly:{type:Boolean},showWriteOnly:{type:Boolean}}}}};return{nodes:{...u,...n},tags:{...d,...T,...l(r),...o.tags},functions:{...f.functions,...a,includes:h,concat:y}}}export{_ as getMarkdocOptions};
@@ -1,4 +1,4 @@
1
- import type { Node } from '@markdoc/markdoc';
1
+ import type { Node } from '@redocly/markdoc';
2
2
  import type { LifecycleContext, AfterRoutesCreatedActions } from '../../../types';
3
3
  export declare function prepareMarkdocPartials(context: LifecycleContext, actions: AfterRoutesCreatedActions): Promise<Record<string, Node>>;
4
4
  //# sourceMappingURL=partials.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { Tag, Node } from '@markdoc/markdoc';
1
+ import type { Tag, Node } from '@redocly/markdoc';
2
2
  export declare function getHeadingData(node: Tag | Node): {
3
3
  value: string;
4
4
  id: any;
@@ -1,4 +1,4 @@
1
- import type { Node, Tag } from '@markdoc/markdoc';
1
+ import type { Node, Tag } from '@redocly/markdoc';
2
2
  export declare function getHeadingData(node: Tag | Node): {
3
3
  value: string;
4
4
  id: any;
@@ -1,4 +1,4 @@
1
- import type { Node } from '@markdoc/markdoc';
1
+ import type { Node } from '@redocly/markdoc';
2
2
  type ParseMarkdownFn = (content: string) => Node;
3
3
  /** Parse each `{% markdoc-example %}` fence body onto the fence, out of the page tree. */
4
4
  export declare function reparseExampleFences(ast: Node, parseMarkdown: ParseMarkdownFn): void;
@@ -1 +1 @@
1
- import{EXAMPLE_CONTENT_ATTRIBUTE as s}from"@redocly/theme/core/constants";import{isExampleNode as l}from"../../../../markdoc/helpers/guards/is-example-node.js";import{isFenceNode as a}from"../../../../markdoc/helpers/guards/is-fence-node.js";const u="no-inline-annotations";function p(o,n){for(const e of c(o)){if(!e.children.length)continue;const{content:t}=e.attributes;if(typeof t!="string")continue;const i=n(t),f=(e.lines[0]??0)+1;for(const r of i.children)m(r,f);e.children=[],e.slots={},e.errors=e.errors.filter(r=>r.id!==u),e.attributes[s]=i,p(i,n)}}function d(o){const n=[];for(const e of c(o)){const t=e.attributes[s];t&&n.push(t,...d(t))}return n}function*c(o){for(const n of o.walk()){if(!l(n))continue;const[e]=n.children;a(e)&&(yield e)}}function m(o,n){for(const e of[o,...o.walk()]){e.lines=e.lines.map(i=>i+n);const{location:t}=e;t&&(typeof t.start?.line=="number"&&(t.start.line+=n),typeof t.end?.line=="number"&&(t.end.line+=n))}}export{d as exampleContentTrees,p as reparseExampleFences};
1
+ import{EXAMPLE_CONTENT_ATTRIBUTE as c}from"@redocly/theme/core/constants";import{isExampleNode as l}from"../../../../markdoc/helpers/guards/is-example-node.js";import{isFenceNode as a}from"../../../../markdoc/helpers/guards/is-fence-node.js";const u="no-inline-annotations";function d(o,t){for(const e of s(o)){if(!e.children.length)continue;const{content:n}=e.attributes;if(typeof n!="string")continue;const i=t(n),f=(e.location?.start.line??0)+1;for(const r of i.children)m(r,f);e.children=[],e.slots={},e.errors=e.errors.filter(r=>r.id!==u),e.attributes[c]=i,d(i,t)}}function p(o){const t=[];for(const e of s(o)){const n=e.attributes[c];n&&t.push(n,...p(n))}return t}function*s(o){for(const t of o.walk()){if(!l(t))continue;const[e]=t.children;a(e)&&(yield e)}}function m(o,t){for(const e of[o,...o.walk()]){const{location:n}=e;n&&(typeof n.start?.line=="number"&&(n.start.line+=t),typeof n.end?.line=="number"&&(n.end.line+=t))}}export{p as exampleContentTrees,d as reparseExampleFences};
@@ -1,4 +1,4 @@
1
- import type { Node } from '@markdoc/markdoc';
1
+ import type { Node } from '@redocly/markdoc';
2
2
  import type { MdOptions } from '@redocly/config';
3
3
  export declare function transformMdAst(ast: Node, config: MdOptions, serverOutDir: string): Promise<{
4
4
  headings: {
@@ -6,7 +6,7 @@ export declare function transformMdAst(ast: Node, config: MdOptions, serverOutDi
6
6
  id: string;
7
7
  depth: number;
8
8
  }[];
9
- renderableAst: import("@markdoc/markdoc").RenderableTreeNode;
9
+ renderableAst: import("@markdoc/markdoc").RenderableTreeNodes;
10
10
  pageProps: any;
11
11
  }>;
12
12
  //# sourceMappingURL=runtime-transform.d.ts.map
@@ -1 +1 @@
1
- import c from"@markdoc/markdoc";import{isTag as b}from"../../../markdoc/helpers/guards/is-tag.js";import{slugger as f}from"../../utils/index.js";import{getMarkdocOptions as l}from"./markdoc/markdoc-options.js";import{visit as h,getHeadingData as k,getNumberedItemHeadingData as D}from"./markdoc/plugins/utils.js";import{renderDiagramsWithVariants as H}from"./markdoc/plugins/render-diagrams.js";import{deepStringify as v}from"./markdoc/utils/deep-stringify.js";import{stringifyTagChildrenObjects as y}from"./utils/stringify-tag-children-objects.js";async function S(d,e,p){const g=await l(p),i=[],a=[],o=v(e.variables?.pageProps),{headers:T,...u}=e.variables||{};f.reset();const m=c.transform(d,{...g,...e,variables:{...u,pageProps:o}});let n=0;h(m,r=>{if(b(r)){switch(r.name){case"Heading":{r.attributes.__idx=n,n++;const t=k(r);t&&i.push(t);break}case"NumberedItem":{const t=D(r);t&&i.push(t);break}case"Diagram":a.push({tag:r,input:{type:r.attributes.diagramType,source:r.attributes.diagramSource}});break}y(r)}});const s=await H(a.map(r=>r.input));for(let r=0;r<a.length;r++)a[r].tag.attributes.diagramError=s[r].error,a[r].tag.attributes.diagramHtml=s[r].light,a[r].tag.attributes.diagramHtmlDark=s[r].dark;return{headings:i,renderableAst:m,pageProps:o}}export{S as transformMdAst};
1
+ import c from"@redocly/markdoc";import{isTag as b}from"../../../markdoc/helpers/guards/is-tag.js";import{slugger as f}from"../../utils/index.js";import{getMarkdocOptions as l}from"./markdoc/markdoc-options.js";import{visit as h,getHeadingData as k,getNumberedItemHeadingData as D}from"./markdoc/plugins/utils.js";import{renderDiagramsWithVariants as H}from"./markdoc/plugins/render-diagrams.js";import{deepStringify as v}from"./markdoc/utils/deep-stringify.js";import{stringifyTagChildrenObjects as y}from"./utils/stringify-tag-children-objects.js";async function S(d,e,p){const g=await l(p),i=[],a=[],o=v(e.variables?.pageProps),{headers:T,...u}=e.variables||{};f.reset();const m=c.transform(d,{...g,...e,variables:{...u,pageProps:o}});let n=0;h(m,r=>{if(b(r)){switch(r.name){case"Heading":{r.attributes.__idx=n,n++;const t=k(r);t&&i.push(t);break}case"NumberedItem":{const t=D(r);t&&i.push(t);break}case"Diagram":a.push({tag:r,input:{type:r.attributes.diagramType,source:r.attributes.diagramSource}});break}y(r)}});const s=await H(a.map(r=>r.input));for(let r=0;r<a.length;r++)a[r].tag.attributes.diagramError=s[r].error,a[r].tag.attributes.diagramHtml=s[r].light,a[r].tag.attributes.diagramHtmlDark=s[r].dark;return{headings:i,renderableAst:m,pageProps:o}}export{S as transformMdAst};
@@ -1,4 +1,4 @@
1
- import M from"@markdoc/markdoc";import D from"node:path";import{AI_SEARCH_CHUNK_SIZE as R,AI_SEARCH_DOCUMENT_CHUNK_SIZE as v}from"../../../constants/plugins/search.js";import{slugger as I}from"../../../../utils/slugger.js";import{joinSectionContent as N}from"./join-section-content.js";import{toMarkdown as P}from"./to-markdown.js";import{AstToSearchNodeTransformer as w}from"./walk-sections.js";import{createRenderTagFn as x}from"./create-render-tag-fn.js";import{getBuildTranslateContext as K}from"../../../utils/l10n/get-build-translate-context.js";import{getLocaleFromRelativePath as L}from"../../../fs/utils/get-locale-from-relative-path.js";import{HeadingNode as b}from"./nodes/heading-node.js";import{extractDocumentSearchFacets as U}from"./search-facets.js";import{formatDocumentMetadata as y}from"../../search/utils.js";import{TagNode as H}from"./nodes/tag-node.js";import{MARKDOC_PARTIALS_DATA_KEY as O}from"../../../constants/common.js";const j=Symbol(),at=(n,o)=>async(e,r,i,c)=>{if(o?.excludeFromSearch)return;I.reset();const l=await e.getNavText?.()||D.basename(e.fsPath),f=M.Ast.fromJSON(r.ast),{locale:g,translate:A}=await K(e.slug,c.getGlobalData?.().l10n),s=new w({partials:c.getGlobalConfig(O)||{},renderTag:x(c.markdocOptions.tags,g,A),getInnerContent:P,ast:f,skipConditionals:!0}),d=Array.from(s.transform());return{async getLLMsTxts(){const u=o?.seo,t=u&&typeof u=="object"&&"description"in u?String(u.description):void 0,a=N(d);return[{title:l,description:t,slug:e.slug,fsPath:e.fsPath,content:a,includeInLLMsTxt:!0}]},async getSearchDocuments(){return F(e,d,n,l)}}};function F(n,o,e,r){const i=n.slug,c=new Map,l=n.metadata||{},f=U(l,e),g=y(l),A=g?`Metadata:
1
+ import M from"@redocly/markdoc";import D from"node:path";import{AI_SEARCH_CHUNK_SIZE as R,AI_SEARCH_DOCUMENT_CHUNK_SIZE as v}from"../../../constants/plugins/search.js";import{slugger as I}from"../../../../utils/slugger.js";import{joinSectionContent as N}from"./join-section-content.js";import{toMarkdown as P}from"./to-markdown.js";import{AstToSearchNodeTransformer as w}from"./walk-sections.js";import{createRenderTagFn as x}from"./create-render-tag-fn.js";import{getBuildTranslateContext as K}from"../../../utils/l10n/get-build-translate-context.js";import{getLocaleFromRelativePath as L}from"../../../fs/utils/get-locale-from-relative-path.js";import{HeadingNode as b}from"./nodes/heading-node.js";import{extractDocumentSearchFacets as U}from"./search-facets.js";import{formatDocumentMetadata as y}from"../../search/utils.js";import{TagNode as H}from"./nodes/tag-node.js";import{MARKDOC_PARTIALS_DATA_KEY as O}from"../../../constants/common.js";const j=Symbol(),at=(n,o)=>async(e,r,i,c)=>{if(o?.excludeFromSearch)return;I.reset();const l=await e.getNavText?.()||D.basename(e.fsPath),f=M.Ast.fromJSON(r.ast),{locale:g,translate:A}=await K(e.slug,c.getGlobalData?.().l10n),s=new w({partials:c.getGlobalConfig(O)||{},renderTag:x(c.markdocOptions.tags,g,A),getInnerContent:P,ast:f,skipConditionals:!0}),d=Array.from(s.transform());return{async getLLMsTxts(){const u=o?.seo,t=u&&typeof u=="object"&&"description"in u?String(u.description):void 0,a=N(d);return[{title:l,description:t,slug:e.slug,fsPath:e.fsPath,content:a,includeInLLMsTxt:!0}]},async getSearchDocuments(){return F(e,d,n,l)}}};function F(n,o,e,r){const i=n.slug,c=new Map,l=n.metadata||{},f=U(l,e),g=y(l),A=g?`Metadata:
2
2
  ${g}
3
3
  `:"",s=[];for(const t of o)if(t instanceof b){s.splice(t.attributes.level-1,6);const a=t.attributes.level>2,m=s[s.length-1]?.title,T=s[s.length-1]?.url,C=a&&m?m:W(r,t),S=a&&T?T:t.getUrl(i),p={title:C,content:"",url:S,level:t.attributes.level,toc:s.map(E=>h(E.section)).join(`
4
4
  `)};(t.attributes.level>1||h(t)!==r)&&(p.content+=p.content?`
@@ -1,4 +1,4 @@
1
- import type { Node } from '@markdoc/markdoc';
1
+ import type { Node } from '@redocly/markdoc';
2
2
  import type { SearchParentNode } from './types.js';
3
3
  export type SectionNodeParams = {
4
4
  node: Node;
@@ -1 +1 @@
1
- import d from"@markdoc/markdoc";import{REDOCLY_ROUTE_RBAC as l,REDOCLY_TEAMS_RBAC as A}from"@redocly/config";import{getInnerText as T}from"../../../../markdoc/helpers/get-inner-text.js";import{skipAgentsOnlyContent as h}from"@redocly/theme/markdoc/tags/visibility";import{getSearchDocuments as g}from"./get-search-documents.js";import{AstToSearchNodeTransformer as C}from"./walk-sections.js";import{setDocumentSearchFacets as R,extractDocumentSearchFacets as S}from"./search-facets.js";import{MARKDOC_PARTIALS_DATA_KEY as D}from"../../../constants/common.js";import{normalizeFrontmatterKeywords as _}from"../../helpers/normalize-frontmatter-keywords.js";function Y(e,m,o,c){return async(t,r,a)=>{if(e?.excludeFromSearch)return[];const i=d.Ast.fromJSON(r.ast),f=new C({ast:i,getInnerContent:T,partials:a.getGlobalConfig(D)||{},renderTag:h,indexPromptTitles:!0}),p=t.metadata||{},n=S(p,o);R(n,o,c);const u=e?.seo?.title||m,{result:s}=_(e?.keywords);return g(f,t.slug,u,r[A],r[l],n,s||void 0)}}export{Y as searchResolver};
1
+ import d from"@redocly/markdoc";import{REDOCLY_ROUTE_RBAC as l,REDOCLY_TEAMS_RBAC as A}from"@redocly/config";import{getInnerText as T}from"../../../../markdoc/helpers/get-inner-text.js";import{skipAgentsOnlyContent as h}from"@redocly/theme/markdoc/tags/visibility";import{getSearchDocuments as g}from"./get-search-documents.js";import{AstToSearchNodeTransformer as C}from"./walk-sections.js";import{setDocumentSearchFacets as R,extractDocumentSearchFacets as S}from"./search-facets.js";import{MARKDOC_PARTIALS_DATA_KEY as D}from"../../../constants/common.js";import{normalizeFrontmatterKeywords as _}from"../../helpers/normalize-frontmatter-keywords.js";function Y(e,m,o,c){return async(t,r,a)=>{if(e?.excludeFromSearch)return[];const i=d.Ast.fromJSON(r.ast),f=new C({ast:i,getInnerContent:T,partials:a.getGlobalConfig(D)||{},renderTag:h,indexPromptTitles:!0}),p=t.metadata||{},n=S(p,o);R(n,o,c);const u=e?.seo?.title||m,{result:s}=_(e?.keywords);return g(f,t.slug,u,r[A],r[l],n,s||void 0)}}export{Y as searchResolver};
@@ -1,4 +1,4 @@
1
- import type { Function, Node, RenderableTreeNode, Variable } from '@markdoc/markdoc';
1
+ import type { Function, Node, RenderableTreeNode, Variable } from '@redocly/markdoc';
2
2
  import type { GetInnerContentFnOptions } from '../../../../types/index.js';
3
3
  export declare function toMarkdown(children: (RenderableTreeNode | Node | Variable | Function)[], options?: GetInnerContentFnOptions): string;
4
4
  //# sourceMappingURL=to-markdown.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { Node } from '@markdoc/markdoc';
1
+ import type { Node } from '@redocly/markdoc';
2
2
  import type { GetInnerContentFn } from '../../../../types/index.js';
3
3
  import type { SearchNode } from './nodes/types.js';
4
4
  import type { RenderTagFn } from '../../../types/plugins/markdown.js';
@@ -1,3 +1,3 @@
1
- import{PROMPT_TAG as a}from"@redocly/theme/core/constants";import{logger as w}from"../../../tools/notifiers/logger.js";import{isNode as p}from"../../../../markdoc/helpers/guards/is-node.js";import{isConditionalNode as N}from"../../../../markdoc/helpers/guards/is-conditional-node.js";import{isContentNode as m}from"../../../../markdoc/helpers/guards/is-content-node.js";import{getNodeAttribute as f}from"../../../../markdoc/helpers/get-node-attribute.js";import{extractRbacFromCondition as b}from"../../../../markdoc/helpers/extract-rbac-from-condition-node.js";import{TextNode as n}from"./nodes/text-node.js";import{TAG_TITLE_ATTRIBUTES as g,TagNode as u}from"./nodes/tag-node.js";import{HeadingNode as y}from"./nodes/heading-node.js";import{joinSectionContent as d}from"./join-section-content.js";class G{#r;#e;#o;#s;#c;#n;constructor({ast:i,partials:t,skipConditionals:s=!1,getInnerContent:r,renderTag:e,indexPromptTitles:o=!1}){if(this.#r=i,this.#e=t,this.#o=s,this.#s=r,this.#c=e,this.#n=o,!this.#r||!p(this.#r))throw new Error("ast is not a valid Markdoc Node.")}#i(i={}){return{skipConditionals:this.#o,renderTag:this.#c,...i}}*transform(){yield*this.#l(this.#r,{parentNode:null})}*#l(i,t,s=this.#s){if(!(!i||!p(i))){if(N(i)){if(this.#o)return;const r=b(i);r&&r.length>0&&(yield*this.#t(i,{...t,rbacTeams:r},s));return}if(m(i)){yield new n({node:i,content:s([i],this.#i()),...t});return}if(i.type==="heading"){yield new y({node:i,content:s([i],this.#i()),rbacTeams:t?.rbacTeams});return}if(i.type==="tag"){yield*this.#h(i,t,s);return}yield*this.#t(i,t,s)}}*#h(i,t,s=this.#s){switch(i.tag){case"partial":{const r=i.attributes.file,e=i.attributes.variables??{};if(r&&this.#e[r]){yield*this.#l(this.#e[r],t,(o,h)=>s(o,{...h,variables:e}));return}w.warn(`Could not create search indexes for partial \u201C${r}\u201D: file not found`);return}case"html":case"cards":case"tabs":case"code-walkthrough":{yield*this.#t(i,t,s);return}case a:{const r=f(i,"title");this.#n&&r&&(yield new u({node:i,content:r,...t}));return}case"markdoc-example":{const r=s([i],this.#i());yield new n({node:i,content:r,...t});return}case"code-snippet":{const r=f(i,"title"),e=s([i],this.#i());if(r){const o=new u({node:i,content:r,...t});t={...t,parentNode:o},yield o}e&&(yield new n({node:i,content:e,...t}));return}default:{const r=this.#f(i,t,s);if(r!==void 0){yield new n({node:i,content:k(r),...t});return}const e=g.find(l=>l in i.attributes),o=(e&&f(i,e))??"",h=typeof o=="string"?o:s([o]);if(h){const l=new u({node:i,content:h,...t});t={...t,parentNode:l},yield l}if(T(i))yield*this.#t(i,t,s);else{const l=s([i],this.#i());l&&(yield new n({node:i,content:l,...t}))}return}}}#f(i,t,s){const r=()=>T(i)?d([...this.#t(i,t,s)]):"";return this.#c?.(i,{getBody:r})}*#t(i,t,s=this.#s){for(const r of[...Object.values(i.slots),...i.children])for(const e of this.#l(r,t,s))e instanceof y&&(t={...t,parentNode:e}),yield e}}function T(c){return c.children.length>0||Object.keys(c.slots).length>0}function k(c){return c.endsWith(`
1
+ import{PROMPT_TAG as a}from"@redocly/theme/core/constants";import{logger as w}from"../../../tools/notifiers/logger.js";import{isNode as p}from"../../../../markdoc/helpers/guards/is-node.js";import{isConditionalNode as N}from"../../../../markdoc/helpers/guards/is-conditional-node.js";import{isContentNode as m}from"../../../../markdoc/helpers/guards/is-content-node.js";import{getNodeAttribute as f}from"../../../../markdoc/helpers/get-node-attribute.js";import{extractRbacFromCondition as b}from"../../../../markdoc/helpers/extract-rbac-from-condition-node.js";import{TextNode as n}from"./nodes/text-node.js";import{TAG_TITLE_ATTRIBUTES as g,TagNode as u}from"./nodes/tag-node.js";import{HeadingNode as y}from"./nodes/heading-node.js";import{joinSectionContent as d}from"./join-section-content.js";class G{#r;#e;#o;#s;#c;#n;constructor({ast:i,partials:t,skipConditionals:s=!1,getInnerContent:r,renderTag:e,indexPromptTitles:o=!1}){if(this.#r=i,this.#e=t,this.#o=s,this.#s=r,this.#c=e,this.#n=o,!this.#r||!p(this.#r))throw new Error("ast is not a valid Markdoc Node.")}#i(i={}){return{skipConditionals:this.#o,renderTag:this.#c,...i}}*transform(){yield*this.#l(this.#r,{parentNode:null})}*#l(i,t,s=this.#s){if(!(!i||!p(i))){if(N(i)){if(this.#o)return;const r=b(i);r&&r.length>0&&(yield*this.#t(i,{...t,rbacTeams:r},s));return}if(m(i)){yield new n({node:i,content:s([i],this.#i()),...t});return}if(i.type==="heading"){yield new y({node:i,content:s([i],this.#i()),rbacTeams:t?.rbacTeams});return}if(i.type==="tag"){yield*this.#h(i,t,s);return}yield*this.#t(i,t,s)}}*#h(i,t,s=this.#s){switch(i.tag){case"partial":{const r=i.attributes.file,e=i.attributes.variables??{};if(r&&this.#e[r]){yield*this.#l(this.#e[r],t,(o,h)=>s(o,{...h,variables:e}));return}w.warn(`Could not create search indexes for partial \u201C${r}\u201D: file not found`);return}case"html":case"cards":case"tabs":case"code-walkthrough":{yield*this.#t(i,t,s);return}case a:{const r=f(i,"title");this.#n&&r&&(yield new u({node:i,content:r,...t}));return}case"markdoc-example":{const r=s([i],this.#i());yield new n({node:i,content:r,...t});return}case"code-snippet":{const r=f(i,"title"),e=s([i],this.#i());if(r){const o=new u({node:i,content:r,...t});t={...t,parentNode:o},yield o}e&&(yield new n({node:i,content:e,...t}));return}default:{const r=this.#f(i,t,s);if(r!==void 0){yield new n({node:i,content:k(r),...t});return}const e=g.find(l=>l in i.attributes),o=(e&&f(i,e))??"",h=typeof o=="string"?o:s([o]);if(h){const l=new u({node:i,content:h,...t});t={...t,parentNode:l},yield l}if(T(i))yield*this.#t(i,t,s);else{const l=s([i],this.#i());l&&(yield new n({node:i,content:l,...t}))}return}}}#f(i,t,s){const r=()=>T(i)?d([...this.#t(i,t,s)]):"";return this.#c?.(i,{getBody:r})}*#t(i,t,s=this.#s){for(const r of[...Object.values(i.slots??{}),...i.children])for(const e of this.#l(r,t,s))e instanceof y&&(t={...t,parentNode:e}),yield e}}function T(c){return c.children.length>0||Object.keys(c.slots??{}).length>0}function k(c){return c.endsWith(`
2
2
  `)?c:`${c}
3
3
  `}export{G as AstToSearchNodeTransformer};
@@ -1,3 +1,3 @@
1
- import type { Tag } from '@markdoc/markdoc';
1
+ import type { Tag } from '@redocly/markdoc';
2
2
  export declare function stringifyTagChildrenObjects(tag?: Tag | null): void;
3
3
  //# sourceMappingURL=stringify-tag-children-objects.d.ts.map
@@ -2,5 +2,5 @@ import type { McpToolSchema } from '../../../../types';
2
2
  import type { McpToolCallback, McpToolContext } from '../../types.js';
3
3
  import { type SandboxCapability } from '../capabilities/index.js';
4
4
  export declare function describeToolsSchema(tools: McpToolSchema[], capabilities: SandboxCapability[]): McpToolSchema;
5
- export declare function describeTools(tools: McpToolSchema[], isToolAvailable: (toolName: string) => Promise<boolean>, capabilities: SandboxCapability[], context: McpToolContext): McpToolCallback;
5
+ export declare function describeTools(tools: McpToolSchema[], capabilities: SandboxCapability[], context: McpToolContext): McpToolCallback;
6
6
  //# sourceMappingURL=describe-tools.d.ts.map
@@ -1,3 +1 @@
1
- import{renderDescribeToolsOutput as N}from"../capabilities/index.js";import{McpServerType as u,READ_ONLY_ANNOTATIONS as D}from"../../constants.js";import{logMcpToolCallAudit as E,reportMcpToolCalled as k,reportMcpToolError as C}from"../../workers/mcp-tool-telemetry.js";import{DESCRIBE_TOOLS_TOOL_NAME as l}from"../constants.js";import{DESCRIBE_TOOLS_DESCRIPTION as j}from"../prompts.js";import{sanitizeToolName as s}from"../build-tool-type-declarations.js";import{UnknownToolError as O}from"./tool-errors.js";import{callAttribution as A}from"../../utils/telemetry-attributes.js";function B(c,f){const r=[...new Set([...c.map(n=>s(n.name)),...f.map(n=>s(n.id))])];return{name:l,title:"Get docs function signatures",description:j,annotations:D,schema:{type:"object",required:[],additionalProperties:!1,properties:{tools:{type:"array",description:`Tool names to describe: ${r.join(", ")}. Omit to describe everything.`,items:r.length>0?{type:"string",enum:r}:{type:"string"},nullable:!0}}}}}function z(c,f,r,n){const p=new Map(c.map(t=>[s(t.name),t])),w=new Map(r.map(t=>[s(t.id),t]));return async t=>{const b=performance.now(),m=n.mcpMode??"code",d=A(n);try{const e=[...new Set((t.tools??[]).map(s))],i=e.length===0,a=e.filter(o=>!p.has(o)&&!w.has(o));if(a.length>0){const o=[...p.keys(),...w.keys()];throw new O(`Unknown tool(s): ${a.join(", ")}. Valid tools: ${o.join(", ")}.`)}const S=i?r:r.filter(o=>e.includes(s(o.id))),T=i?c:e.filter(o=>p.has(o)).map(o=>p.get(o)),g=await Promise.all(T.map(o=>f(o.name))),_=T.filter((o,y)=>g[y]),v=T.filter((o,y)=>!g[y]),M=[N(_,S,n)];v.length>0&&M.push(`Not available for this request: ${v.map(o=>s(o.name)).join(", ")}`);const h=M.join(`
2
-
3
- `);return E({tool:l,mode:m,serverType:u.Docs,args:t,result:h,...d}),k({tool:l,mode:m,serverType:u.Docs,durationMs:Math.round(performance.now()-b),outputLength:h.length,...d}),{content:[{type:"text",text:h}]}}catch(e){const i=e instanceof O,a=i?"tool_error":"server_error";throw E({tool:l,mode:m,serverType:u.Docs,args:t,errorClass:a,...d}),C({tool:l,mode:m,serverType:u.Docs,durationMs:Math.round(performance.now()-b),message:e instanceof Error?e.message:String(e),stack:!i&&e instanceof Error&&e.stack||"",errorClass:a,...d}),e}}}export{z as describeTools,B as describeToolsSchema};
1
+ import{renderDescribeToolsOutput as E}from"../capabilities/index.js";import{McpServerType as u,READ_ONLY_ANNOTATIONS as O}from"../../constants.js";import{logMcpToolCallAudit as h,reportMcpToolCalled as S,reportMcpToolError as b}from"../../workers/mcp-tool-telemetry.js";import{DESCRIBE_TOOLS_TOOL_NAME as l}from"../constants.js";import{DESCRIBE_TOOLS_DESCRIPTION as v}from"../prompts.js";import{sanitizeToolName as s}from"../build-tool-type-declarations.js";import{UnknownToolError as w}from"./tool-errors.js";import{callAttribution as D}from"../../utils/telemetry-attributes.js";function R(p,i){const n=[...new Set([...p.map(r=>s(r.name)),...i.map(r=>s(r.id))])];return{name:l,title:"Get docs function signatures",description:v,annotations:O,schema:{type:"object",required:[],additionalProperties:!1,properties:{tools:{type:"array",description:`Tool names to describe: ${n.join(", ")}. Omit to describe everything.`,items:n.length>0?{type:"string",enum:n}:{type:"string"},nullable:!0}}}}}function U(p,i,n){const r=new Map(p.map(t=>[s(t.name),t])),T=new Map(i.map(t=>[s(t.id),t]));return async t=>{const y=performance.now(),m=n.mcpMode??"code",d=D(n);try{const o=[...new Set((t.tools??[]).map(s))],a=o.length===0,c=o.filter(e=>!r.has(e)&&!T.has(e));if(c.length>0){const e=[...r.keys(),...T.keys()];throw new w(`Unknown tool(s): ${c.join(", ")}. Valid tools: ${e.join(", ")}.`)}const M=a?i:i.filter(e=>o.includes(s(e.id))),g=a?p:o.filter(e=>r.has(e)).map(e=>r.get(e)),f=E(g,M,n);return h({tool:l,mode:m,serverType:u.Docs,args:t,result:f,...d}),S({tool:l,mode:m,serverType:u.Docs,durationMs:Math.round(performance.now()-y),outputLength:f.length,...d}),{content:[{type:"text",text:f}]}}catch(o){const a=o instanceof w,c=a?"tool_error":"server_error";throw h({tool:l,mode:m,serverType:u.Docs,args:t,errorClass:c,...d}),b({tool:l,mode:m,serverType:u.Docs,durationMs:Math.round(performance.now()-y),message:o instanceof Error?o.message:String(o),stack:!a&&o instanceof Error&&o.stack||"",errorClass:c,...d}),o}}}export{U as describeTools,R as describeToolsSchema};
@@ -1 +1 @@
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
+ 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,limit:a}=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??1,a??300)},null,2)});var D={"get-graphql-type-list":E};export{D as default};
@@ -1 +1 @@
1
- import{paginate as p,textResult as m}from"./tool-helpers.js";const c=async(r,l)=>{const{filter:i,page:o=1,limit:n=300}=r;let t=l.graphqlDescriptions;if(i){const e=i.toLowerCase();t=t.filter(s=>s.name.toLowerCase().includes(e))}const a=p(t,o,n);return m(JSON.stringify({...a,items:a.items.map(({name:e,description:s})=>({name:e,description:s}))}))};var g={"list-graphql-apis":c};export{g as default};
1
+ import{paginate as p,textResult as m}from"./tool-helpers.js";const c=async(r,l)=>{const{filter:i,page:o,limit:n}=r;let t=l.graphqlDescriptions;if(i){const e=i.toLowerCase();t=t.filter(s=>s.name.toLowerCase().includes(e))}const a=p(t,o??1,n??300);return m(JSON.stringify({...a,items:a.items.map(({name:e,description:s})=>({name:e,description:s}))}))};var g={"list-graphql-apis":c};export{g as default};
@@ -14,8 +14,8 @@ export type SchemaMemberWithKind = SchemaMember & {
14
14
  export type GroupedSchemaTypes = Record<GraphqlTypeKind, SchemaMember[]>;
15
15
  export type ListGraphqlApisArgs = {
16
16
  filter?: string;
17
- page?: number;
18
- limit?: number;
17
+ page?: number | null;
18
+ limit?: number | null;
19
19
  };
20
20
  export type GetGraphqlTypeListArgs = {
21
21
  name: string;
@@ -23,8 +23,8 @@ export type GetGraphqlTypeListArgs = {
23
23
  scope?: GraphqlListScope;
24
24
  filter?: string;
25
25
  referencesType?: string;
26
- page?: number;
27
- limit?: number;
26
+ page?: number | null;
27
+ limit?: number | null;
28
28
  };
29
29
  export type GetGraphqlTypeArgs = {
30
30
  name: string;
@@ -1 +1 @@
1
- import{getCallableApis as b}from"../../../gateway-mcp/callable-apis.js";import{filterApiDescriptionsByName as d}from"../../utils/api-name-matching.js";import{apiTitleKey as y,countApiTitles as A,orderSharedTitles as T}from"../../utils/api-titles.js";const x=async(r,l)=>{const{filter:s,page:a=1,limit:e=300}=r,n=new Set(b(l).map(i=>i.relativePath)),m=n.size>0,o=T(Object.values(l.apiDescriptionsMap)),f=A(o);let t=o;s&&(t=d(t,s));const c=(a-1)*e,u=c+e,g=Math.ceil(t.length/e),h=t.length;return t=t.slice(c,u),{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:i,fetchEligible:D,...p})=>({filePath:i,...p,...(f.get(y(p.name))??0)>1?{ambiguousTitle:!0}:{},...m?{callable:n.has(i)}:{}})),limit:e,total:h,page:a,totalPages:g})}]}};var I={"list-apis":x};export{I as default};
1
+ import{getCallableApis as b}from"../../../gateway-mcp/callable-apis.js";import{filterApiDescriptionsByName as d}from"../../utils/api-name-matching.js";import{apiTitleKey as y,countApiTitles as A,orderSharedTitles as T}from"../../utils/api-titles.js";const x=async(l,s)=>{const{filter:a}=l,n=l.page??1,e=l.limit??300,o=new Set(b(s).map(i=>i.relativePath)),m=o.size>0,c=T(Object.values(s.apiDescriptionsMap)),f=A(c);let t=c;a&&(t=d(t,a));const p=(n-1)*e,u=p+e,g=Math.ceil(t.length/e),h=t.length;return t=t.slice(p,u),{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:i,fetchEligible:D,...r})=>({filePath:i,...r,...(f.get(y(r.name))??0)>1?{ambiguousTitle:!0}:{},...m?{callable:o.has(i)}:{}})),limit:e,total:h,page:n,totalPages:g})}]}};var I={"list-apis":x};export{I as default};
@@ -1,7 +1,7 @@
1
1
  export type ListApisArgs = {
2
2
  filter?: string;
3
- page?: number;
4
- limit?: number;
3
+ page?: number | null;
4
+ limit?: number | null;
5
5
  };
6
6
  export type ApiNameVersionArgs = {
7
7
  name?: string;
@@ -1 +1 @@
1
- import{logger as A}from"../../../tools/notifiers/logger.js";import{getFeedbackClientIp as N}from"../../../web-server/utils/feedback-ip.js";import{getForwardedOrigin as M,getInternalOrigin as L}from"../../../web-server/utils/get-request-origin.js";import{GATEWAY_FETCH_LIMIT_DEFAULTS as B,DEFAULT_ANONYMOUS_VISITOR_TEAM as H,RbacFeatures as j}from"../../../../constants/common.js";import{isObject as V}from"../../../../utils/guards/is-object.js";import{getAccessibleSkills as $}from"../../../utils/skills/get-accessible-skills.js";import{getSkillUrl as G}from"../../../utils/skills/get-skill-url.js";import{createMcpHandler as J}from"@modelcontextprotocol/server";import{createDocsMcpServer as K}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as Y,filterGraphqlDescriptionsByRbac as z}from"../utils.js";import{userSubject as W}from"../gateway-mcp/subject.js";import{ipRateLimitKey as X}from"../gateway-mcp/rate-limit/utils/ip-key.js";import{McpClientInputError as Q,createMethodNotAllowedError as Z,withErrorHandling as q}from"./errors.js";import{constructForbiddenResponse as x,constructInvalidTokenResponse as ee,constructUnauthorizedResponse as re,handleMcpAuth as oe}from"../auth/auth-handlers.js";import{isAssistantAnonymousToken as se}from"../auth/assistant-anonymous-token.js";import{shouldHandleMcpAuth as ne}from"../../../utils/rbac/should-handle-mcp-auth.js";import{extractTokenFromAuthHeader as ie}from"../utils/jwt.js";import{resolveMcpClient as te}from"../utils/mcp-client.js";import{randomUUID as ce}from"../../../utils/crypto/random-uuid.js";import{getPublicMcpEndpointStatus as ae}from"../utils/public-endpoint.js";import{narrowMcpConfigForCaller as pe}from"../gateway-mcp/caller-api-calls.js";import{DEFAULT_DOCS_MCP_SERVER_NAME as de,SSE_KEEPALIVE_INTERVAL_MS as me}from"../constants.js";import{withPathPrefix as le}from"@redocly/theme/core/utils";import{PUBLIC_MCP_ROUTE as ue}from"@redocly/theme/core/constants/mcp";import{canAccessFeature as fe}from"../../../utils/rbac.js";import{ANONYMOUS_AUTH_DETAILS as ge}from"../../../constants/rbac.js";const E="X-Redocly-AI-Metadata";function he(r){if(r)try{const e=JSON.parse(r);if(V(e))return e;A.warn(`Ignoring ${E} header: not a JSON object.`)}catch{A.warn(`Ignoring ${E} header: invalid JSON.`)}}function Ae(r,e){return new URL(r).searchParams.get("mode")==="tools"?"tools":e}function I(){return{...ge,email:"",idpAccessToken:void 0,idpId:void 0}}const Me=async(r,e,i)=>{const t=!!e?.config?.access?.requiresLogin,c=e?.config?.access?.rbac||{},y=i?.props?.config?.mcpMode??"tools",p=Ae(r.url,y),C=i?.props?.config?.gatewayFetchBudgetPerExec??B.budgetPerExec,U=i?.props?.config?.searchIgnoredRoutes??[],s=i,R=!!s?.props?.config?.isPublicEndpoint;let f;const T=r.headers.get("Authorization");if(R)e.user=I();else if(ne(t,c)){const{isAuthenticated:n,isTokenValid:d,isFirstPartyAnonymous:g,currentUser:m,accessToken:h}=await oe(r,e);if(g)e.user=I();else if(n)m&&(e.user=m),f=h;else{const a=M(r),l=ae(e.config)==="served"?`${a}${le(ue)}`:void 0;return d===!1?ee(a,l):re(a,l)}}else if(T){const n=ie(T)??void 0;f=(n?await se(n):!1)?void 0:n}const w={isAuthenticated:!!e.user?.isAuthenticated,teams:e.user?.teams||[H],claims:e.user?.claims??{}};return fe(j.MCP,w,c,t)?await q(async()=>{const n=p==="code"&&(i?.props?.config?.elicitationEnabled??!1);if(r.method==="GET")return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need to register it in your MCP client (VS Code, Cursor, Claude Code, etc.) using this URL: ${r.url}`}),{status:405,headers:{"Content-Type":"application/json"}});if(r.method!=="POST")return Z();const d=s?.props?.config?.apiDescriptionsMap||{},g=s?.props?.config?.graphqlDescriptions||[],m=s?.props?.config?.mcpDocsServerName||de,{config:{mcp:h={}}}=e,a=Y(d,e.user,c,t),l=z(g,e.user,c,t),P=e.config.products?Object.values(e.config.products).map(o=>o?.name):[],D=h.docs?.name||m,u=he(r.headers.get(E)),_=s?.props?.tools||[],O=s?.props?.skillsBaseUrl||M(r),k=$(s?.props?.skills||[],e.user,c,t).map(o=>({slug:o.slug,name:o.name,description:o.description,content:o.content,uri:G(O,o.slug)})),S=await Ee(r),b=s?.props?.fetchCountSecret,v={name:D,tools:_,skills:k,context:{...e,config:{...e.config,mcp:pe(e.config.mcp,u)},accessToken:f,outdir:e.outdir||"",baseUrl:e.baseUrl||M(r),internalBaseUrl:L(r),apiDescriptionsMap:a,graphqlDescriptions:l,products:P,metadata:u,mcpMode:p,elicitationEnabled:n,gatewayFetchBudgetPerExec:C,fetchCountRequest:p==="code"&&b?{caller:{subject:W(e.user),ip:X(r)},secret:b}:void 0,searchIgnoredRoutes:U,clientIp:N(r),...te(r),requestId:ce(),messageId:typeof u?.messageId=="string"?u.messageId:void 0}},F=await K({...v,getKv:e.getKv});return await J(async()=>F,{keepAliveMs:me,onerror:o=>A.warn(`MCP handler: ${o.message}`)}).fetch(r,S!==void 0?{parsedBody:S}:void 0)},p):x()};async function Ee(r){try{return await r.json()}catch(e){throw new Q(e instanceof Error?e.message:String(e),{cause:e})}}var ze=Me;export{ze as default};
1
+ import{logger as A}from"../../../tools/notifiers/logger.js";import{getFeedbackClientIp as v}from"../../../web-server/utils/feedback-ip.js";import{getForwardedOrigin as M,getInternalOrigin as N}from"../../../web-server/utils/get-request-origin.js";import{GATEWAY_FETCH_LIMIT_DEFAULTS as L,DEFAULT_ANONYMOUS_VISITOR_TEAM as B,RbacFeatures as H}from"../../../../constants/common.js";import{isObject as j}from"../../../../utils/guards/is-object.js";import{getAccessibleSkills as V}from"../../../utils/skills/get-accessible-skills.js";import{getSkillUrl as $}from"../../../utils/skills/get-skill-url.js";import{createMcpHandler as Y}from"@modelcontextprotocol/server";import{createDocsMcpServer as G}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as J,filterGraphqlDescriptionsByRbac as K}from"../utils.js";import{userSubject as z}from"../gateway-mcp/subject.js";import{ipRateLimitKey as X}from"../gateway-mcp/rate-limit/utils/ip-key.js";import{createMethodNotAllowedError as Q,withErrorHandling as W}from"./errors.js";import{constructForbiddenResponse as Z,constructInvalidTokenResponse as q,constructUnauthorizedResponse as x,handleMcpAuth as ee}from"../auth/auth-handlers.js";import{isAssistantAnonymousToken as oe}from"../auth/assistant-anonymous-token.js";import{shouldHandleMcpAuth as re}from"../../../utils/rbac/should-handle-mcp-auth.js";import{extractTokenFromAuthHeader as se}from"../utils/jwt.js";import{resolveMcpClient as ie}from"../utils/mcp-client.js";import{randomUUID as ne}from"../../../utils/crypto/random-uuid.js";import{getPublicMcpEndpointStatus as te}from"../utils/public-endpoint.js";import{narrowMcpConfigForCaller as ce}from"../gateway-mcp/caller-api-calls.js";import{DEFAULT_DOCS_MCP_SERVER_NAME as ae,SSE_KEEPALIVE_INTERVAL_MS as pe}from"../constants.js";import{withPathPrefix as de}from"@redocly/theme/core/utils";import{PUBLIC_MCP_ROUTE as le}from"@redocly/theme/core/constants/mcp";import{canAccessFeature as me}from"../../../utils/rbac.js";import{ANONYMOUS_AUTH_DETAILS as fe}from"../../../constants/rbac.js";const E="X-Redocly-AI-Metadata",ue=1024*1024;function ge(o){if(o)try{const e=JSON.parse(o);if(j(e))return e;A.warn(`Ignoring ${E} header: not a JSON object.`)}catch{A.warn(`Ignoring ${E} header: invalid JSON.`)}}function he(o,e){return new URL(o).searchParams.get("mode")==="tools"?"tools":e}function b(){return{...fe,email:"",idpAccessToken:void 0,idpId:void 0}}const Ae=async(o,e,n)=>{const t=!!e?.config?.access?.requiresLogin,c=e?.config?.access?.rbac||{},I=n?.props?.config?.mcpMode??"tools",p=he(o.url,I),U=n?.props?.config?.gatewayFetchBudgetPerExec??L.budgetPerExec,R=n?.props?.config?.searchIgnoredRoutes??[],r=n,C=!!r?.props?.config?.isPublicEndpoint;let u;const T=o.headers.get("Authorization");if(C)e.user=b();else if(re(t,c)){const{isAuthenticated:i,isTokenValid:d,isFirstPartyAnonymous:g,currentUser:l,accessToken:h}=await ee(o,e);if(g)e.user=b();else if(i)l&&(e.user=l),u=h;else{const a=M(o),m=te(e.config)==="served"?`${a}${de(le)}`:void 0;return d===!1?q(a,m):x(a,m)}}else if(T){const i=se(T)??void 0;u=(i?await oe(i):!1)?void 0:i}const _={isAuthenticated:!!e.user?.isAuthenticated,teams:e.user?.teams||[B],claims:e.user?.claims??{}};return me(H.MCP,_,c,t)?await W(async()=>{const i=p==="code"&&(n?.props?.config?.elicitationEnabled??!1);if(o.method==="GET")return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need to register it in your MCP client (VS Code, Cursor, Claude Code, etc.) using this URL: ${o.url}`}),{status:405,headers:{"Content-Type":"application/json"}});if(o.method!=="POST")return Q();const d=r?.props?.config?.apiDescriptionsMap||{},g=r?.props?.config?.graphqlDescriptions||[],l=r?.props?.config?.mcpDocsServerName||ae,{config:{mcp:h={}}}=e,a=J(d,e.user,c,t),m=K(g,e.user,c,t),y=e.config.products?Object.values(e.config.products).map(s=>s?.name):[],D=h.docs?.name||l,f=ge(o.headers.get(E)),P=r?.props?.tools||[],O=r?.props?.skillsBaseUrl||M(o),w=V(r?.props?.skills||[],e.user,c,t).map(s=>({slug:s.slug,name:s.name,description:s.description,content:s.content,uri:$(O,s.slug)})),S=r?.props?.fetchCountSecret,F={name:D,tools:P,skills:w,context:{...e,config:{...e.config,mcp:ce(e.config.mcp,f)},configFile:r?.props?.configFile,accessToken:u,outdir:e.outdir||"",baseUrl:e.baseUrl||M(o),internalBaseUrl:N(o),apiDescriptionsMap:a,graphqlDescriptions:m,products:y,metadata:f,mcpMode:p,elicitationEnabled:i,gatewayFetchBudgetPerExec:U,fetchCountRequest:p==="code"&&S?{caller:{subject:z(e.user),ip:X(o)},secret:S}:void 0,searchIgnoredRoutes:R,clientIp:v(o),...ie(o),requestId:ne(),messageId:typeof f?.messageId=="string"?f.messageId:void 0}},k=await G({...F,getKv:e.getKv});return await Y(async()=>k,{keepAliveMs:pe,maxRequestBodySize:ue,onerror:s=>A.warn(`MCP handler: ${s.message}`)}).fetch(o)},p):Z()};var Je=Ae;export{Je as default};
@@ -12,11 +12,6 @@ export declare class McpError extends Error {
12
12
  constructor(code: McpErrorCodeTypes, message: string, data?: unknown, requestId?: string | number | null);
13
13
  createErrorResponse(): Response;
14
14
  }
15
- export declare class McpClientInputError extends Error {
16
- constructor(message: string, options?: {
17
- cause?: unknown;
18
- });
19
- }
20
15
  export declare function createMethodNotAllowedError(requestId?: string | number | null): Response;
21
16
  export declare function createInternalServerError(error: Error | string, requestId?: string | number | null): Response;
22
17
  export declare function withErrorHandling<T>(operation: () => Promise<T>, mode?: McpMode): Promise<T | Response>;
@@ -1 +1 @@
1
- import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as o,McpServerType as i}from"../constants.js";import{serverAttributes as d}from"../utils/telemetry-attributes.js";class n extends Error{code;data;requestId;constructor(t,r,s,a){super(r),this.name="McpError",this.code=t,this.data=s,this.requestId=a}createErrorResponse(){const t={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},r=u(this.code);return new Response(JSON.stringify(t),{status:r,headers:{"Content-Type":"application/json"}})}}class p extends Error{constructor(t,r){super(t,r),this.name="McpClientInputError"}}function u(e){switch(e){case o.InvalidRequest:case o.InvalidParams:return 400;case o.MethodNotFound:return 404;case o.ServerError:return 405;case o.InternalError:default:return 500}}function f(e){return new n(o.ServerError,"Method not allowed",void 0,e).createErrorResponse()}function l(e,t){const r=e instanceof Error?e.message:String(e);return new n(o.InternalError,"Internal server error mcp",r,t).createErrorResponse()}async function M(e,t="tools"){try{return await e()}catch(r){return c.sendMcpErrorMessage([{...d(i.Docs),message:r?.message||"",stack:r?.stack||"",error_class:r instanceof p?"client_error":"server_error",mode:t}]),l(r)}}export{p as McpClientInputError,n as McpError,l as createInternalServerError,f as createMethodNotAllowedError,M as withErrorHandling};
1
+ import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as o,McpServerType as d}from"../constants.js";import{serverAttributes as i}from"../utils/telemetry-attributes.js";class n extends Error{code;data;requestId;constructor(t,e,s,a){super(e),this.name="McpError",this.code=t,this.data=s,this.requestId=a}createErrorResponse(){const t={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},e=p(this.code);return new Response(JSON.stringify(t),{status:e,headers:{"Content-Type":"application/json"}})}}function p(r){switch(r){case o.InvalidRequest:case o.InvalidParams:return 400;case o.MethodNotFound:return 404;case o.ServerError:return 405;case o.InternalError:default:return 500}}function h(r){return new n(o.ServerError,"Method not allowed",void 0,r).createErrorResponse()}function u(r,t){const e=r instanceof Error?r.message:String(r);return new n(o.InternalError,"Internal server error mcp",e,t).createErrorResponse()}async function f(r,t="tools"){try{return await r()}catch(e){return c.sendMcpErrorMessage([{...i(d.Docs),message:e?.message||"",stack:e?.stack||"",error_class:"server_error",mode:t}]),u(e)}}export{n as McpError,u as createInternalServerError,h as createMethodNotAllowedError,f as withErrorHandling};
@@ -1 +1 @@
1
- import{withPathPrefix as g}from"@redocly/theme/core/utils";import{importApiRoutesHandler as h}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as D}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as E}from"../../../persistence/kv/services/kv-service.js";import{envConfig as l}from"../../../config/env-config.js";import{acceptsHtml as R}from"../../../utils/ai-agent-detection.js";import{handleErrorPageRender as T}from"../../../web-server/utils.js";import{MCP_DOCS_SERVER_HANDLER_ID as _,MCP_NOT_ALLOWED_TEMPLATE_ID as w}from"../../../constants/mcp.js";import{resolvePublicBaseUrl as S}from"../../../web-server/utils/resolve-public-base-url.js";import{getForwardedOrigin as q}from"../../../web-server/utils/get-request-origin.js";import{applyEdgeRateLimit as C}from"../gateway-mcp/rate-limit/request-limiter/apply-edge-rate-limit.js";import{fetchCountSecret as O}from"../gateway-mcp/rate-limit/fetch-limiter/fetch-count-secret.js";async function G(a,t,e){const n=t.req.raw;if(a.requestHandlerId===_&&n.method==="GET"&&R(n.headers.get("accept"))&&e.globalData.mcpData?.docs?.enabled)return T(t,e,{slug:a.slug},405,w);const r=t.get("auth"),o=await C(n,e);if(o)return o;const s=await e.resolveRouteStaticData(a)||{},m=g(a.slug),{requestHandlers:c}=await h(e.serverOutDir),p=c[a.requestHandlerId],d=(await p()).default,u=async()=>await E.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:l.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:l.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),f=D({honoCtx:t,ctx:{user:{teams:r.teams,email:r.claims.email,claims:r.claims,idpAccessToken:r.idpAccessToken,idpId:r.claims.idpId,isAuthenticated:r.isAuthenticated},config:e.config,outdir:e.outdir,baseUrl:q(t.req.raw)},telemetry:A,getKv:u}),i=await d(t.req.raw,f,{...s,props:{...s.props,routeSlug:m,outdir:e.outdir,fetchCountSecret:O(),skills:e.config.skills?.hide===!0?[]:e.getSkills(),skillsBaseUrl:S(e,t)}});return i instanceof Response?i:typeof i=="string"?new Response(i,{headers:{"Content-Type":"text/plain"}}):new Response(JSON.stringify(i),{headers:{"Content-Type":"application/json"}})}export{G as handleMcpRequest};
1
+ import{withPathPrefix as g}from"@redocly/theme/core/utils";import{importApiRoutesHandler as h}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as D}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as E}from"../../../persistence/kv/services/kv-service.js";import{envConfig as l}from"../../../config/env-config.js";import{acceptsHtml as R}from"../../../utils/ai-agent-detection.js";import{handleErrorPageRender as T}from"../../../web-server/utils.js";import{MCP_DOCS_SERVER_HANDLER_ID as _,MCP_NOT_ALLOWED_TEMPLATE_ID as w}from"../../../constants/mcp.js";import{resolvePublicBaseUrl as S}from"../../../web-server/utils/resolve-public-base-url.js";import{getForwardedOrigin as q}from"../../../web-server/utils/get-request-origin.js";import{applyEdgeRateLimit as C}from"../gateway-mcp/rate-limit/request-limiter/apply-edge-rate-limit.js";import{fetchCountSecret as O}from"../gateway-mcp/rate-limit/fetch-limiter/fetch-count-secret.js";async function K(i,t,e){const n=t.req.raw;if(i.requestHandlerId===_&&n.method==="GET"&&R(n.headers.get("accept"))&&e.globalData.mcpData?.docs?.enabled)return T(t,e,{slug:i.slug},405,w);const r=t.get("auth"),o=await C(n,e);if(o)return o;const s=await e.resolveRouteStaticData(i)||{},c=g(i.slug),{requestHandlers:m}=await h(e.serverOutDir),p=m[i.requestHandlerId],d=(await p()).default,u=async()=>await E.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:l.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:l.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),f=D({honoCtx:t,ctx:{user:{teams:r.teams,email:r.claims.email,claims:r.claims,idpAccessToken:r.idpAccessToken,idpId:r.claims.idpId,isAuthenticated:r.isAuthenticated},config:e.config,outdir:e.outdir,baseUrl:q(t.req.raw)},telemetry:A,getKv:u}),a=await d(t.req.raw,f,{...s,props:{...s.props,routeSlug:c,outdir:e.outdir,fetchCountSecret:O(),skills:e.config.skills?.hide===!0?[]:e.getSkills(),skillsBaseUrl:S(e,t),configFile:e.configFile}});return a instanceof Response?a:typeof a=="string"?new Response(a,{headers:{"Content-Type":"text/plain"}}):new Response(JSON.stringify(a),{headers:{"Content-Type":"application/json"}})}export{K as handleMcpRequest};
@@ -1 +1 @@
1
- import{secretStore as d}from"../gateway-mcp/secret-store.js";import{rejectCredential as _}from"../gateway-mcp/credential-validation.js";import{buildAllowedHostMatchers as C}from"../gateway-mcp/fetch/allowed-hosts.js";import{assertUrlAllowed as A}from"../gateway-mcp/fetch/ssrf-guard.js";import{readCappedBody as T,getDefaultAgent as P}from"../gateway-mcp/fetch/fetch-bridge.js";import{logger as x}from"../../../tools/notifiers/logger.js";import{FORM_ACTIONS as k}from"./credentials-page/constants.js";import{credentialSchemesOf as w,schemeFieldName as f}from"./credentials-page/form-contract.js";import{formPage as N}from"./credentials-page/form-page.js";import{htmlDocument as O}from"./credentials-page/layout.js";import{declinedPage as R,expiredPage as I,outcomePage as j}from"./credentials-page/outcome-pages.js";const D={"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Frame-Options":"DENY","Referrer-Policy":"no-referrer","Content-Security-Policy":"default-src 'none'; style-src 'unsafe-inline'; img-src 'self'; form-action 'self'; frame-ancestors 'none'; base-uri 'none'"},$=3e4,F=64*1024,M=/^bearer\s+/i,U=/^\d+$/,B=async(e,t,o)=>{const n=await t.getKv(),r=L(e,t.baseUrl,o);if(e.method==="GET"){const i=new URL(e.url).searchParams.get("token")??"",c=await d.peekElicitation(n,i);return c?S({kv:n,site:r,token:i,target:c},{},200):p(r)}if(e.method==="POST"){const i=await e.formData(),c=u(i,"token"),a=await d.peekElicitation(n,c);if(!a)return p(r);const s={kv:n,site:r,token:c,target:a,form:i};switch(u(i,"action")){case k.remove:return b(s,z(a,u(i,"scheme")));case k.removeAll:return b(s,w(a));case k.decline:return K(s);default:return H(s)}}return new Response("Method Not Allowed",{status:405,headers:{Allow:"GET, POST"}})};async function H(e){const{target:t,form:o}=e,n=w(t),r=n.map((s,l)=>u(o,f("client_id",l)).trim()),i=s=>S(e,{error:s,clientIds:r},400),c=X(n,o);if("error"in c)return i(c.error);if(c.writes.length===0)return i(G(n));const a=[];for(const s of c.writes){if(s.kind!=="exchange"){a.push(s);continue}const l=await J(s.auth,s.clientId,s.clientSecret);if(!l.ok)return x.warn(`gateway oauth2 client_credentials exchange failed for ${t.api}: ${l.reason}`),i(E(n,s.schemeIndex,"client_id","We could not exchange those client credentials for a token. Check the client ID and secret, then try again."));a.push({kind:"set",scheme:s.scheme,secret:l.secret})}return v(e,a)}function X(e,t){const o=[];for(const[n,r]of e.entries()){const i=u(t,f("secret",n)).trim();if(i){const s=_(r.auth,i);if(s)return{error:E(e,n,"secret",s)};o.push({kind:"set",scheme:r.name,secret:W(r.auth,i)});continue}if(r.auth.kind!=="oauth2ClientCredentials")continue;const c=u(t,f("client_id",n)).trim(),a=u(t,f("client_secret",n)).trim();if(c&&a)o.push({kind:"exchange",scheme:r.name,schemeIndex:n,auth:r.auth,clientId:c,clientSecret:a});else if(c||a)return{error:E(e,n,c?"client_secret":"client_id","Enter both the client ID and the client secret, or leave both blank.")}}return{writes:o}}function G(e){return e.length>1?{message:"Fill in at least one credential before saving."}:{message:e[0].auth.kind==="oauth2ClientCredentials"?"Enter an access token, or the client ID and the client secret, before saving.":"Enter a value before saving.",schemeIndex:0,field:"secret"}}function E(e,t,o,n){return{message:e.length>1?`${e[t].name}: ${n}`:n,schemeIndex:t,field:o}}async function b(e,t){const{kv:o,target:n}=e,r=await d.getStoredSchemes(o,n.subject,n.api),i=t.filter(c=>r[c.name]).map(c=>({kind:"remove",scheme:c.name}));return i.length===0?S(e,{error:{message:"No credential is stored there, so there is nothing to remove."}},400):v(e,i)}function z(e,t){const o=U.test(t)?w(e)[Number(t)]:void 0;return o?[o]:[]}async function K({kv:e,site:t,token:o}){return await d.consumeElicitation(e,o)?h(t,R(),200):p(t)}async function v({kv:e,site:t,token:o},n){const r=await d.consumeElicitation(e,o);if(!r)return p(t);for(const a of n)a.kind==="remove"?await d.deleteSecret(e,r.subject,r.api,a.scheme):await d.setSecret(e,r.subject,r.api,a.scheme,a.secret);const i=await d.getStoredSchemes(e,r.subject,r.api),c={action:n.some(a=>a.kind==="set")?"saved":"removed",schemes:n.map(a=>a.scheme),stored:Object.keys(i).sort()};return h(t,j(r,c),200)}async function S({kv:e,site:t,token:o,target:n},r,i){const c=await d.getStoredSchemes(e,n.subject,n.api);return h(t,N({site:t,target:n,token:o,stored:c,...r}),i)}function L(e,t,o){const n=o?.props?.branding??{},r=t&&URL.canParse(t)?t:e.url;return{...n,host:new URL(r).host}}async function J(e,t,o){try{const n=C([{url:e.tokenUrl}]),r=A(e.tokenUrl,n),i=new AbortController,c=setTimeout(()=>i.abort(),$);let a;try{a=await fetch(r,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"client_credentials",client_id:t,client_secret:o}),redirect:"manual",signal:i.signal,dispatcher:P()})}finally{clearTimeout(c)}if(!a.ok)return m(`token endpoint returned ${a.status}`);let s;try{s=await T(a,F)}catch{return m("token response exceeded the size cap")}let l;try{l=JSON.parse(s)}catch{return m("token response was not valid JSON")}const y=typeof l=="object"&&l!==null&&"access_token"in l?l.access_token:void 0,g=typeof y=="string"?y.trim():"";return g?_(e,g)?m("token response had an access_token that cannot be sent in a header"):{ok:!0,secret:{header:"Authorization",value:`Bearer ${g}`}}:m("token response had no access_token")}catch(n){return m(n instanceof Error?n.message:String(n))}}function m(e){return{ok:!1,reason:e}}function u(e,t){const o=e.get(t);return typeof o=="string"?o:""}function h(e,t,o){return new Response(O(t,e.colorScheme),{status:o,headers:D})}function p(e){return h(e,I(),404)}function W(e,t){return e.kind==="apiKey"?{header:e.header,value:t}:e.kind==="cookie"?{header:"Cookie",value:`${e.name}=${t}`}:e.kind==="bearer"||e.kind==="oauth2ClientCredentials"?{header:"Authorization",value:Y(t)}:{header:"Authorization",value:t}}function Y(e){return`Bearer ${e.replace(M,"")}`}var ie=B;export{ie as default};
1
+ import{readRequestBody as C}from"@modelcontextprotocol/server";import{secretStore as d}from"../gateway-mcp/secret-store.js";import{rejectCredential as _}from"../gateway-mcp/credential-validation.js";import{buildAllowedHostMatchers as T}from"../gateway-mcp/fetch/allowed-hosts.js";import{assertUrlAllowed as A}from"../gateway-mcp/fetch/ssrf-guard.js";import{readCappedBody as R,getDefaultAgent as P}from"../gateway-mcp/fetch/fetch-bridge.js";import{logger as x}from"../../../tools/notifiers/logger.js";import{FORM_ACTIONS as k}from"./credentials-page/constants.js";import{credentialSchemesOf as w,schemeFieldName as f}from"./credentials-page/form-contract.js";import{formPage as O}from"./credentials-page/form-page.js";import{htmlDocument as N}from"./credentials-page/layout.js";import{declinedPage as I,expiredPage as j,outcomePage as D}from"./credentials-page/outcome-pages.js";const $={"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Frame-Options":"DENY","Referrer-Policy":"no-referrer","Content-Security-Policy":"default-src 'none'; style-src 'unsafe-inline'; img-src 'self'; form-action 'self'; frame-ancestors 'none'; base-uri 'none'"},M=3e4,B=64*1024,F=64*1024,U=/^bearer\s+/i,X=/^\d+$/,H=async(e,t,o)=>{const n=await t.getKv(),r=J(e,t.baseUrl,o);if(e.method==="GET"){const i=new URL(e.url).searchParams.get("token")??"",a=await d.peekElicitation(n,i);return a?E({kv:n,site:r,token:i,target:a},{},200):p(r)}if(e.method==="POST"){const i=await C(e,F);if(i.tooLarge)return new Response("Payload Too Large",{status:413});const a=await new Response(i.text,{headers:{"Content-Type":e.headers.get("content-type")??""}}).formData(),c=u(a,"token"),s=await d.peekElicitation(n,c);if(!s)return p(r);const l={kv:n,site:r,token:c,target:s,form:a};switch(u(a,"action")){case k.remove:return b(l,K(s,u(a,"scheme")));case k.removeAll:return b(l,w(s));case k.decline:return Y(l);default:return L(l)}}return new Response("Method Not Allowed",{status:405,headers:{Allow:"GET, POST"}})};async function L(e){const{target:t,form:o}=e,n=w(t),r=n.map((s,l)=>u(o,f("client_id",l)).trim()),i=s=>E(e,{error:s,clientIds:r},400),a=G(n,o);if("error"in a)return i(a.error);if(a.writes.length===0)return i(z(n));const c=[];for(const s of a.writes){if(s.kind!=="exchange"){c.push(s);continue}const l=await W(s.auth,s.clientId,s.clientSecret);if(!l.ok)return x.warn(`gateway oauth2 client_credentials exchange failed for ${t.api}: ${l.reason}`),i(y(n,s.schemeIndex,"client_id","We could not exchange those client credentials for a token. Check the client ID and secret, then try again."));c.push({kind:"set",scheme:s.scheme,secret:l.secret})}return v(e,c)}function G(e,t){const o=[];for(const[n,r]of e.entries()){const i=u(t,f("secret",n)).trim();if(i){const s=_(r.auth,i);if(s)return{error:y(e,n,"secret",s)};o.push({kind:"set",scheme:r.name,secret:Q(r.auth,i)});continue}if(r.auth.kind!=="oauth2ClientCredentials")continue;const a=u(t,f("client_id",n)).trim(),c=u(t,f("client_secret",n)).trim();if(a&&c)o.push({kind:"exchange",scheme:r.name,schemeIndex:n,auth:r.auth,clientId:a,clientSecret:c});else if(a||c)return{error:y(e,n,a?"client_secret":"client_id","Enter both the client ID and the client secret, or leave both blank.")}}return{writes:o}}function z(e){return e.length>1?{message:"Fill in at least one credential before saving."}:{message:e[0].auth.kind==="oauth2ClientCredentials"?"Enter an access token, or the client ID and the client secret, before saving.":"Enter a value before saving.",schemeIndex:0,field:"secret"}}function y(e,t,o,n){return{message:e.length>1?`${e[t].name}: ${n}`:n,schemeIndex:t,field:o}}async function b(e,t){const{kv:o,target:n}=e,r=await d.getStoredSchemes(o,n.subject,n.api),i=t.filter(a=>r[a.name]).map(a=>({kind:"remove",scheme:a.name}));return i.length===0?E(e,{error:{message:"No credential is stored there, so there is nothing to remove."}},400):v(e,i)}function K(e,t){const o=X.test(t)?w(e)[Number(t)]:void 0;return o?[o]:[]}async function Y({kv:e,site:t,token:o}){return await d.consumeElicitation(e,o)?h(t,I(),200):p(t)}async function v({kv:e,site:t,token:o},n){const r=await d.consumeElicitation(e,o);if(!r)return p(t);for(const c of n)c.kind==="remove"?await d.deleteSecret(e,r.subject,r.api,c.scheme):await d.setSecret(e,r.subject,r.api,c.scheme,c.secret);const i=await d.getStoredSchemes(e,r.subject,r.api),a={action:n.some(c=>c.kind==="set")?"saved":"removed",schemes:n.map(c=>c.scheme),stored:Object.keys(i).sort()};return h(t,D(r,a),200)}async function E({kv:e,site:t,token:o,target:n},r,i){const a=await d.getStoredSchemes(e,n.subject,n.api);return h(t,O({site:t,target:n,token:o,stored:a,...r}),i)}function J(e,t,o){const n=o?.props?.branding??{},r=t&&URL.canParse(t)?t:e.url;return{...n,host:new URL(r).host}}async function W(e,t,o){try{const n=T([{url:e.tokenUrl}]),r=A(e.tokenUrl,n),i=new AbortController,a=setTimeout(()=>i.abort(),M);let c;try{c=await fetch(r,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"client_credentials",client_id:t,client_secret:o}),redirect:"manual",signal:i.signal,dispatcher:P()})}finally{clearTimeout(a)}if(!c.ok)return m(`token endpoint returned ${c.status}`);let s;try{s=await R(c,B)}catch{return m("token response exceeded the size cap")}let l;try{l=JSON.parse(s)}catch{return m("token response was not valid JSON")}const S=typeof l=="object"&&l!==null&&"access_token"in l?l.access_token:void 0,g=typeof S=="string"?S.trim():"";return g?_(e,g)?m("token response had an access_token that cannot be sent in a header"):{ok:!0,secret:{header:"Authorization",value:`Bearer ${g}`}}:m("token response had no access_token")}catch(n){return m(n instanceof Error?n.message:String(n))}}function m(e){return{ok:!1,reason:e}}function u(e,t){const o=e.get(t);return typeof o=="string"?o:""}function h(e,t,o){return new Response(N(t,e.colorScheme),{status:o,headers:$})}function p(e){return h(e,j(),404)}function Q(e,t){return e.kind==="apiKey"?{header:e.header,value:t}:e.kind==="cookie"?{header:"Cookie",value:`${e.name}=${t}`}:e.kind==="bearer"||e.kind==="oauth2ClientCredentials"?{header:"Authorization",value:V(t)}:{header:"Authorization",value:t}}function V(e){return`Bearer ${e.replace(U,"")}`}var de=H;export{de as default};
@@ -1 +1 @@
1
- import{logger as N}from"../../../tools/notifiers/logger.js";import{mcpToolWorkers as y,MCP_TOOL_IS_AVAILABLE_KEY as U}from"../../../workers/mcp-tool-worker-pool.js";import{CREATE_ANONYMOUS_SESSION_TOOL_NAME as S,MANAGE_API_CREDENTIALS_TOOL_NAME as w,SUBMIT_FEEDBACK_TOOL_NAME as h}from"../constants.js";import{isAnonymousSessionToolAvailable as I}from"../docs-mcp/tools/core/create-anonymous-session.js";import{isManageApiCredentialsToolAvailable as x,manageApiCredentials as H,manageApiCredentialsSchema as B}from"../codemode/tools/manage-credentials.js";import{EXECUTE_TOOL_SCHEMA as M,executeToolTitle as F}from"../codemode/tools/execute-schema.js";import{EXECUTE_TOOL_NAME as P,CODE_MODE_TOOL_NAMES as g,FETCH_TOOL_NAME as R}from"../codemode/constants.js";import{buildCodeModeInstructions as Y,buildExecuteDescription as z}from"../codemode/prompts.js";import{toToolListEntries as K}from"../codemode/build-tool-list.js";import{composeExecuteAnnotations as W,getActiveCapabilities as X}from"../codemode/capabilities/index.js";import{describeToolsSchema as $,describeTools as j}from"../codemode/tools/describe-tools.js";import{availableSandboxTools as G}from"../utils/available-sandbox-tools.js";import{resolveDocsSiteUrl as V}from"../utils/docs-site-url.js";import{isToolDisabledByCaller as b}from"../utils/disabled-tools.js";import{toRegisterToolConfig as L}from"../utils/tool-registration.js";import{createMcpServer as q,createToolDispatch as J,extractSerializableContext as Q}from"./mcp-server.js";const Z=new Set([...g].filter(s=>s!==h));function v(s,a){const o=a.schema;if(s)return o;const{sessionHandle:u,...f}=o.properties;return{...o,properties:f}}function ee(s){return Object.fromEntries(s.map(a=>[a.name,a.schema]))}async function ue({name:s,tools:a,context:o,skills:u=[],getKv:f}){const l=Q(o),r=o.mcpMode==="code",c=r?X(o):[],_=c.some(e=>e.id===R),m=r?await G(a.filter(e=>!g.has(e.name)),l):[],A=K(m,c),T=I(o)&&!b(S,o.metadata),D=r&&x(o)&&!b(w,o.metadata),p=q(s,r?Y(_,A):void 0),O={getClientCapabilities:()=>p.server.getClientCapabilities(),getKv:f},d=J(r?{...l,sandboxToolSchemas:ee(m)}:l,O),C=async e=>{try{return await y.exec(U,[{toolName:e,context:l}],{timeout:1e4})}catch(i){return N.error(`Failed to check MCP tool availability for "${e}": ${i instanceof Error?i.message:String(i)}`),!1}};if(r){const e=W(m,c,o.config?.mcp),i=[{tool:{...M,title:F(e),description:z(_,A,V(o.config?.seo?.siteUrl,o.baseUrl)),schema:v(T,M),annotations:e},callback:d(P)},{tool:$(m,c),callback:j(m,C,c,o)}],n=a.find(t=>t.name===h);n&&!b(n.name,o.metadata)&&i.push({tool:n,callback:d(n.name)});const E=a.find(t=>t.name===S);if(E&&T&&i.push({tool:E,callback:d(E.name)}),D){const t=B(o);i.push({tool:{...t,schema:v(T,t)},callback:H(l,O)})}for(const{tool:t,callback:k}of i)p.registerTool(t.name,L(t),k)}else{const e=a.filter(i=>!Z.has(i.name));await Promise.all(e.map(async i=>{const n=p.registerTool(i.name,L({...i,outputSchema:void 0}),d(i.name));await C(i.name)||n.disable()}))}for(const e of u)p.registerResource(e.slug,e.uri,{title:e.name,description:e.description,mimeType:"text/markdown"},async()=>({contents:[{uri:e.uri,mimeType:"text/markdown",text:e.content}]}));return p}export{ue as createDocsMcpServer};
1
+ import{CREATE_ANONYMOUS_SESSION_TOOL_NAME as C,MANAGE_API_CREDENTIALS_TOOL_NAME as k,SUBMIT_FEEDBACK_TOOL_NAME as S}from"../constants.js";import{isAnonymousSessionToolAvailable as U}from"../docs-mcp/tools/core/create-anonymous-session.js";import{isManageApiCredentialsToolAvailable as w,manageApiCredentials as y,manageApiCredentialsSchema as H}from"../codemode/tools/manage-credentials.js";import{EXECUTE_TOOL_SCHEMA as h,executeToolTitle as I}from"../codemode/tools/execute-schema.js";import{EXECUTE_TOOL_NAME as R,CODE_MODE_TOOL_NAMES as M,FETCH_TOOL_NAME as B}from"../codemode/constants.js";import{buildCodeModeInstructions as F,buildExecuteDescription as x}from"../codemode/prompts.js";import{toToolListEntries as z}from"../codemode/build-tool-list.js";import{composeExecuteAnnotations as X,getActiveCapabilities as Y}from"../codemode/capabilities/index.js";import{describeToolsSchema as j,describeTools as G}from"../codemode/tools/describe-tools.js";import{availableTools as g}from"../utils/available-tools.js";import{resolveDocsSiteUrl as K}from"../utils/docs-site-url.js";import{isToolDisabledByCaller as b}from"../utils/disabled-tools.js";import{toRegisterToolConfig as N}from"../utils/tool-registration.js";import{createMcpServer as P,createToolDispatch as W,extractSerializableContext as q}from"./mcp-server.js";const J=new Set([...M].filter(s=>s!==S));function D(s,t){const e=t.schema;if(s)return e;const{sessionHandle:u,...T}=e.properties;return{...e,properties:T}}function Q(s){return Object.fromEntries(s.map(t=>[t.name,t.schema]))}async function pe({name:s,tools:t,context:e,skills:u=[],getKv:T}){const l=q(e),n=e.mcpMode==="code",c=n?Y(e):[],O=c.some(o=>o.id===B),m=n?await g(t.filter(o=>!M.has(o.name)),l):[],_=z(m,c),E=U(e)&&!b(C,e.metadata),v=n&&w(e)&&!b(k,e.metadata),p=P(s,n?F(O,_):void 0),A={getClientCapabilities:()=>p.server.getClientCapabilities(),getKv:T},f=W(n?{...l,sandboxToolSchemas:Q(m)}:l,A);if(n){const o=X(m,c,e.config?.mcp),r=[{tool:{...h,title:I(o),description:x(O,_,K(e.config?.seo?.siteUrl,e.baseUrl)),schema:D(E,h),annotations:o},callback:f(R)},{tool:j(m,c),callback:G(m,c,e)}],i=t.find(a=>a.name===S);i&&!b(i.name,e.metadata)&&r.push({tool:i,callback:f(i.name)});const d=t.find(a=>a.name===C);if(d&&E&&r.push({tool:d,callback:f(d.name)}),v){const a=H(e);r.push({tool:{...a,schema:D(E,a)},callback:y(l,A)})}for(const{tool:a,callback:L}of r)p.registerTool(a.name,N(a),L)}else{const o=t.filter(i=>!J.has(i.name)),r=new Set((await g(o,l)).map(i=>i.name));for(const i of o){const d=p.registerTool(i.name,N({...i,outputSchema:void 0}),f(i.name));r.has(i.name)||d.disable()}}for(const o of u)p.registerResource(o.slug,o.uri,{title:o.name,description:o.description,mimeType:"text/markdown"},async()=>({contents:[{uri:o.uri,mimeType:"text/markdown",text:o.content}]}));return p}export{pe as createDocsMcpServer};