@brainfish-ai/devdoc 0.1.41 → 0.1.43
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.
- package/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +710 -79
- package/ai-agents/.claude/skills/check-docs/SKILL.md +83 -8
- package/ai-agents/.claude/skills/create-doc/SKILL.md +267 -55
- package/ai-agents/.claude/skills/update-doc/SKILL.md +162 -63
- package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +145 -15
- package/ai-agents/.cursor/rules/devdoc-create.mdc +108 -57
- package/ai-agents/.cursor/rules/devdoc-update.mdc +93 -70
- package/ai-agents/.cursor/rules/devdoc.mdc +21 -0
- package/ai-agents/schemas/docs.schema.json +332 -0
- package/ai-agents/schemas/theme.schema.json +243 -0
- package/dist/cli/commands/create.js +4 -9
- package/dist/cli/commands/deploy.js +50 -25
- package/dist/cli/commands/dev.js +19 -10
- package/package.json +3 -2
- package/renderer/app/api/assets/[...path]/route.js +108 -0
- package/renderer/app/api/assets/route.js +114 -0
- package/renderer/app/api/assets/upload/route.js +163 -0
- package/renderer/app/api/auth-schemes/route.js +58 -0
- package/renderer/app/api/chat/route.js +759 -0
- package/renderer/app/api/codegen/route.js +52 -0
- package/renderer/app/api/collections/route.js +675 -0
- package/renderer/app/api/debug/route.js +47 -0
- package/renderer/app/api/deploy/route.js +199 -0
- package/renderer/app/api/device/route.js +36 -0
- package/renderer/app/api/docs/route.js +205 -0
- package/renderer/app/api/domains/add/route.js +121 -0
- package/renderer/app/api/domains/lookup/route.js +43 -0
- package/renderer/app/api/domains/remove/route.js +89 -0
- package/renderer/app/api/domains/status/route.js +140 -0
- package/renderer/app/api/domains/verify/route.js +168 -0
- package/renderer/app/api/keys/regenerate/route.js +71 -0
- package/renderer/app/api/local-assets/[...path]/route.js +108 -0
- package/renderer/app/api/openapi-spec/route.js +73 -0
- package/renderer/app/api/projects/[slug]/route.js +129 -0
- package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
- package/renderer/app/api/projects/register/route.js +176 -0
- package/renderer/app/api/proxy/route.js +139 -0
- package/renderer/app/api/proxy-stream/route.js +156 -0
- package/renderer/app/api/redirects/route.js +35 -0
- package/renderer/app/api/schema/route.js +85 -0
- package/renderer/app/api/subdomains/check/route.js +158 -0
- package/renderer/app/api/suggestions/route.js +175 -0
- package/renderer/app/layout.js +47 -0
- package/renderer/app/llms-full.txt/route.js +257 -0
- package/renderer/app/llms.txt/route.js +219 -0
- package/renderer/app/page.js +12 -0
- package/renderer/app/robots.txt/route.js +66 -0
- package/renderer/app/sitemap.xml/route.js +145 -0
- package/renderer/components/docs/index.js +8 -0
- package/renderer/components/docs/mdx/accordion.js +113 -0
- package/renderer/components/docs/mdx/badge.js +72 -0
- package/renderer/components/docs/mdx/callouts.js +137 -0
- package/renderer/components/docs/mdx/cards.js +175 -0
- package/renderer/components/docs/mdx/changelog.js +100 -0
- package/renderer/components/docs/mdx/code-block.js +147 -0
- package/renderer/components/docs/mdx/code-group.js +287 -0
- package/renderer/components/docs/mdx/file-embeds.js +82 -0
- package/renderer/components/docs/mdx/frame.js +59 -0
- package/renderer/components/docs/mdx/highlight.js +90 -0
- package/renderer/components/docs/mdx/iframe.js +69 -0
- package/renderer/components/docs/mdx/image.js +135 -0
- package/renderer/components/docs/mdx/index.js +134 -0
- package/renderer/components/docs/mdx/landing.js +315 -0
- package/renderer/components/docs/mdx/mermaid.js +212 -0
- package/renderer/components/docs/mdx/param-field.js +112 -0
- package/renderer/components/docs/mdx/steps.js +74 -0
- package/renderer/components/docs/mdx/tabs.js +50 -0
- package/renderer/components/docs/mdx-renderer.js +77 -0
- package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
- package/renderer/components/docs/navigation/index.js +6 -0
- package/renderer/components/docs/navigation/page-nav.js +57 -0
- package/renderer/components/docs/navigation/sidebar.js +375 -0
- package/renderer/components/docs/navigation/toc.js +89 -0
- package/renderer/components/docs/notice.js +77 -0
- package/renderer/components/docs-header.js +202 -0
- package/renderer/components/docs-viewer/agent/agent-chat.js +1930 -0
- package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
- package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
- package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
- package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
- package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
- package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
- package/renderer/components/docs-viewer/agent/index.js +4 -0
- package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
- package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
- package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
- package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
- package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
- package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
- package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
- package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
- package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
- package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
- package/renderer/components/docs-viewer/content/doc-page.js +264 -0
- package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
- package/renderer/components/docs-viewer/content/index.js +29 -0
- package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
- package/renderer/components/docs-viewer/content/request-details.js +528 -0
- package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
- package/renderer/components/docs-viewer/content/sections/body.js +80 -0
- package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
- package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
- package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
- package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
- package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
- package/renderer/components/docs-viewer/index.js +1552 -0
- package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
- package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
- package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
- package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
- package/renderer/components/docs-viewer/playground/graphql-playground.js +734 -0
- package/renderer/components/docs-viewer/playground/index.js +682 -0
- package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
- package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
- package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
- package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
- package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
- package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
- package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
- package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
- package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
- package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
- package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
- package/renderer/components/docs-viewer/search/index.js +2 -0
- package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
- package/renderer/components/docs-viewer/search/use-search.js +89 -0
- package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
- package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
- package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
- package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
- package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
- package/renderer/components/docs-viewer/sidebar/index.js +196 -0
- package/renderer/components/docs-viewer/sidebar/right-sidebar.js +163 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
- package/renderer/components/theme-provider.js +10 -0
- package/renderer/components/theme-toggle.js +106 -0
- package/renderer/components/ui/badge.js +29 -0
- package/renderer/components/ui/button.js +40 -0
- package/renderer/components/ui/dialog.js +50 -0
- package/renderer/components/ui/dropdown-menu.js +143 -0
- package/renderer/components/ui/input.js +12 -0
- package/renderer/components/ui/label.js +13 -0
- package/renderer/components/ui/navigation-menu.js +83 -0
- package/renderer/components/ui/select.js +116 -0
- package/renderer/components/ui/spinner.js +92 -0
- package/renderer/components/ui/tabs.js +34 -0
- package/renderer/components/ui/tooltip.js +43 -0
- package/renderer/hooks/use-code-copy.js +76 -0
- package/renderer/hooks/use-openapi-title.js +33 -0
- package/renderer/lib/api-docs/agent/index.js +4 -0
- package/renderer/lib/api-docs/agent/indexer.js +254 -0
- package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
- package/renderer/lib/api-docs/agent/types.js +5 -0
- package/renderer/lib/api-docs/auth/auth-context.js +157 -0
- package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
- package/renderer/lib/api-docs/auth/crypto.js +64 -0
- package/renderer/lib/api-docs/auth/index.js +3 -0
- package/renderer/lib/api-docs/code-editor/db.js +145 -0
- package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
- package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
- package/renderer/lib/api-docs/code-editor/mode-context.js +154 -0
- package/renderer/lib/api-docs/code-editor/types.js +53 -0
- package/renderer/lib/api-docs/codegen/definitions.js +258 -0
- package/renderer/lib/api-docs/codegen/har.js +171 -0
- package/renderer/lib/api-docs/codegen/index.js +118 -0
- package/renderer/lib/api-docs/factories.js +136 -0
- package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
- package/renderer/lib/api-docs/mobile-context.js +79 -0
- package/renderer/lib/api-docs/navigation-context.js +62 -0
- package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
- package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
- package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
- package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
- package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
- package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
- package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
- package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
- package/renderer/lib/api-docs/playground/context.js +65 -0
- package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
- package/renderer/lib/api-docs/playground/request-builder.js +163 -0
- package/renderer/lib/api-docs/playground/request-runner.js +224 -0
- package/renderer/lib/api-docs/playground/types.js +5 -0
- package/renderer/lib/api-docs/types.js +23 -0
- package/renderer/lib/api-docs/utils.js +212 -0
- package/renderer/lib/cache.js +157 -0
- package/renderer/lib/docs/config/domain-schema.js +161 -0
- package/renderer/lib/docs/config/index.js +5 -0
- package/renderer/lib/docs/config/loader.js +113 -0
- package/renderer/lib/docs/config/schema.js +269 -0
- package/renderer/lib/docs/index.js +8 -0
- package/renderer/lib/docs/mdx/compiler.js +128 -0
- package/renderer/lib/docs/mdx/frontmatter.js +73 -0
- package/renderer/lib/docs/mdx/index.js +8 -0
- package/renderer/lib/docs/navigation/generator.js +269 -0
- package/renderer/lib/docs/navigation/index.js +4 -0
- package/renderer/lib/docs/navigation/types.js +9 -0
- package/renderer/lib/docs-navigation-context.js +40 -0
- package/renderer/lib/multi-tenant/context.js +80 -0
- package/renderer/lib/storage/blob.js +767 -0
- package/renderer/lib/utils/icons.js +30 -0
- package/renderer/lib/utils.js +5 -0
- package/renderer/next.config.js +62 -0
- package/renderer/tsconfig.json +23 -5
- package/renderer/app/api/assets/[...path]/route.ts +0 -123
- package/renderer/app/api/assets/route.ts +0 -124
- package/renderer/app/api/assets/upload/route.ts +0 -177
- package/renderer/app/api/auth-schemes/route.ts +0 -77
- package/renderer/app/api/chat/route.ts +0 -858
- package/renderer/app/api/codegen/route.ts +0 -72
- package/renderer/app/api/collections/route.ts +0 -1002
- package/renderer/app/api/debug/route.ts +0 -53
- package/renderer/app/api/deploy/route.ts +0 -234
- package/renderer/app/api/device/route.ts +0 -42
- package/renderer/app/api/docs/route.ts +0 -201
- package/renderer/app/api/domains/add/route.ts +0 -132
- package/renderer/app/api/domains/lookup/route.ts +0 -43
- package/renderer/app/api/domains/remove/route.ts +0 -100
- package/renderer/app/api/domains/status/route.ts +0 -158
- package/renderer/app/api/domains/verify/route.ts +0 -181
- package/renderer/app/api/keys/regenerate/route.ts +0 -80
- package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
- package/renderer/app/api/openapi-spec/route.ts +0 -151
- package/renderer/app/api/projects/[slug]/route.ts +0 -153
- package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
- package/renderer/app/api/projects/register/route.ts +0 -152
- package/renderer/app/api/proxy/route.ts +0 -149
- package/renderer/app/api/proxy-stream/route.ts +0 -168
- package/renderer/app/api/redirects/route.ts +0 -47
- package/renderer/app/api/schema/route.ts +0 -73
- package/renderer/app/api/subdomains/check/route.ts +0 -172
- package/renderer/app/api/suggestions/route.ts +0 -144
- package/renderer/app/layout.tsx +0 -54
- package/renderer/app/llms-full.txt/route.ts +0 -346
- package/renderer/app/llms.txt/route.ts +0 -279
- package/renderer/app/page.tsx +0 -14
- package/renderer/app/robots.txt/route.ts +0 -84
- package/renderer/app/sitemap.xml/route.ts +0 -199
- package/renderer/components/docs/index.ts +0 -12
- package/renderer/components/docs/mdx/accordion.tsx +0 -169
- package/renderer/components/docs/mdx/badge.tsx +0 -132
- package/renderer/components/docs/mdx/callouts.tsx +0 -154
- package/renderer/components/docs/mdx/cards.tsx +0 -241
- package/renderer/components/docs/mdx/changelog.tsx +0 -120
- package/renderer/components/docs/mdx/code-block.tsx +0 -186
- package/renderer/components/docs/mdx/code-group.tsx +0 -421
- package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
- package/renderer/components/docs/mdx/frame.tsx +0 -112
- package/renderer/components/docs/mdx/highlight.tsx +0 -151
- package/renderer/components/docs/mdx/iframe.tsx +0 -134
- package/renderer/components/docs/mdx/image.tsx +0 -235
- package/renderer/components/docs/mdx/index.ts +0 -237
- package/renderer/components/docs/mdx/landing.tsx +0 -684
- package/renderer/components/docs/mdx/mermaid.tsx +0 -240
- package/renderer/components/docs/mdx/param-field.tsx +0 -200
- package/renderer/components/docs/mdx/steps.tsx +0 -113
- package/renderer/components/docs/mdx/tabs.tsx +0 -86
- package/renderer/components/docs/mdx-renderer.tsx +0 -100
- package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
- package/renderer/components/docs/navigation/index.ts +0 -8
- package/renderer/components/docs/navigation/page-nav.tsx +0 -64
- package/renderer/components/docs/navigation/sidebar.tsx +0 -515
- package/renderer/components/docs/navigation/toc.tsx +0 -113
- package/renderer/components/docs/notice.tsx +0 -105
- package/renderer/components/docs-header.tsx +0 -278
- package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
- package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
- package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
- package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
- package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
- package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
- package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
- package/renderer/components/docs-viewer/agent/index.tsx +0 -6
- package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
- package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
- package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
- package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
- package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
- package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
- package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
- package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
- package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
- package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
- package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
- package/renderer/components/docs-viewer/content/index.tsx +0 -29
- package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
- package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
- package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
- package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
- package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
- package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
- package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
- package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
- package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
- package/renderer/components/docs-viewer/index.tsx +0 -1662
- package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
- package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
- package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
- package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
- package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
- package/renderer/components/docs-viewer/playground/index.tsx +0 -671
- package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
- package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
- package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
- package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
- package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
- package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
- package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
- package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
- package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
- package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
- package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
- package/renderer/components/docs-viewer/search/index.ts +0 -2
- package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
- package/renderer/components/docs-viewer/search/use-search.ts +0 -117
- package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
- package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
- package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
- package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
- package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
- package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
- package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
- package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
- package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
- package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
- package/renderer/components/theme-provider.tsx +0 -11
- package/renderer/components/theme-toggle.tsx +0 -76
- package/renderer/components/ui/badge.tsx +0 -46
- package/renderer/components/ui/button.tsx +0 -59
- package/renderer/components/ui/dialog.tsx +0 -118
- package/renderer/components/ui/dropdown-menu.tsx +0 -257
- package/renderer/components/ui/input.tsx +0 -21
- package/renderer/components/ui/label.tsx +0 -24
- package/renderer/components/ui/navigation-menu.tsx +0 -168
- package/renderer/components/ui/select.tsx +0 -190
- package/renderer/components/ui/spinner.tsx +0 -114
- package/renderer/components/ui/tabs.tsx +0 -66
- package/renderer/components/ui/tooltip.tsx +0 -61
- package/renderer/hooks/use-code-copy.ts +0 -88
- package/renderer/hooks/use-openapi-title.ts +0 -44
- package/renderer/lib/api-docs/agent/index.ts +0 -6
- package/renderer/lib/api-docs/agent/indexer.ts +0 -323
- package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
- package/renderer/lib/api-docs/agent/types.ts +0 -116
- package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
- package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
- package/renderer/lib/api-docs/auth/crypto.ts +0 -89
- package/renderer/lib/api-docs/auth/index.ts +0 -4
- package/renderer/lib/api-docs/code-editor/db.ts +0 -164
- package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
- package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
- package/renderer/lib/api-docs/code-editor/types.ts +0 -105
- package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
- package/renderer/lib/api-docs/codegen/har.ts +0 -251
- package/renderer/lib/api-docs/codegen/index.ts +0 -159
- package/renderer/lib/api-docs/factories.ts +0 -170
- package/renderer/lib/api-docs/mobile-context.tsx +0 -112
- package/renderer/lib/api-docs/navigation-context.tsx +0 -88
- package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
- package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
- package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
- package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
- package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
- package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
- package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
- package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
- package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
- package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
- package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
- package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
- package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
- package/renderer/lib/api-docs/playground/context.tsx +0 -107
- package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
- package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
- package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
- package/renderer/lib/api-docs/playground/types.ts +0 -35
- package/renderer/lib/api-docs/types.ts +0 -269
- package/renderer/lib/api-docs/utils.ts +0 -311
- package/renderer/lib/cache.ts +0 -193
- package/renderer/lib/docs/config/domain-schema.ts +0 -260
- package/renderer/lib/docs/config/index.ts +0 -43
- package/renderer/lib/docs/config/loader.ts +0 -142
- package/renderer/lib/docs/config/schema.ts +0 -308
- package/renderer/lib/docs/index.ts +0 -12
- package/renderer/lib/docs/mdx/compiler.ts +0 -176
- package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
- package/renderer/lib/docs/mdx/index.ts +0 -26
- package/renderer/lib/docs/navigation/generator.ts +0 -348
- package/renderer/lib/docs/navigation/index.ts +0 -12
- package/renderer/lib/docs/navigation/types.ts +0 -123
- package/renderer/lib/docs-navigation-context.tsx +0 -80
- package/renderer/lib/multi-tenant/context.ts +0 -105
- package/renderer/lib/storage/blob.ts +0 -1083
- package/renderer/lib/utils/icons.ts +0 -48
- package/renderer/lib/utils.ts +0 -6
- package/renderer/next.config.ts +0 -76
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join, isAbsolute } from 'path';
|
|
4
|
+
// Configuration
|
|
5
|
+
const STARTER_PATH = process.env.STARTER_PATH || 'devdoc-docs';
|
|
6
|
+
// Helper to resolve paths - supports both relative and absolute STARTER_PATH
|
|
7
|
+
function resolvePath(...paths) {
|
|
8
|
+
if (isAbsolute(STARTER_PATH)) {
|
|
9
|
+
return join(STARTER_PATH, ...paths);
|
|
10
|
+
}
|
|
11
|
+
return join(process.cwd(), STARTER_PATH, ...paths);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* GET /api/redirects
|
|
15
|
+
* Returns the redirect configuration from docs.json
|
|
16
|
+
*/ export async function GET() {
|
|
17
|
+
try {
|
|
18
|
+
const docsJsonPath = resolvePath('docs.json');
|
|
19
|
+
if (!existsSync(docsJsonPath)) {
|
|
20
|
+
return NextResponse.json({
|
|
21
|
+
redirects: []
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const docsJsonContent = readFileSync(docsJsonPath, 'utf-8');
|
|
25
|
+
const docsConfig = JSON.parse(docsJsonContent);
|
|
26
|
+
return NextResponse.json({
|
|
27
|
+
redirects: docsConfig.redirects || []
|
|
28
|
+
});
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error('[Redirects API] Error:', error);
|
|
31
|
+
return NextResponse.json({
|
|
32
|
+
redirects: []
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join, isAbsolute } from 'path';
|
|
4
|
+
import { getProjectContent } from '@/lib/storage/blob';
|
|
5
|
+
// Configuration - match collections route
|
|
6
|
+
const STARTER_PATH = process.env.STARTER_PATH || 'devdoc-docs';
|
|
7
|
+
// Get the docs directory - respects STARTER_PATH for local development
|
|
8
|
+
function getDocsDir() {
|
|
9
|
+
const projectSlug = process.env.BRAINFISH_PROJECT_SLUG;
|
|
10
|
+
if (projectSlug) {
|
|
11
|
+
return join(process.cwd(), '.devdoc', projectSlug);
|
|
12
|
+
}
|
|
13
|
+
// Use STARTER_PATH (can be absolute or relative)
|
|
14
|
+
if (isAbsolute(STARTER_PATH)) {
|
|
15
|
+
return STARTER_PATH;
|
|
16
|
+
}
|
|
17
|
+
return join(process.cwd(), STARTER_PATH);
|
|
18
|
+
}
|
|
19
|
+
export async function GET(request) {
|
|
20
|
+
const searchParams = request.nextUrl.searchParams;
|
|
21
|
+
const path = searchParams.get('path');
|
|
22
|
+
if (!path) {
|
|
23
|
+
return NextResponse.json({
|
|
24
|
+
error: 'Missing path parameter'
|
|
25
|
+
}, {
|
|
26
|
+
status: 400
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Security: Only allow .graphql, .gql files
|
|
30
|
+
if (!path.endsWith('.graphql') && !path.endsWith('.gql')) {
|
|
31
|
+
return NextResponse.json({
|
|
32
|
+
error: 'Invalid file type'
|
|
33
|
+
}, {
|
|
34
|
+
status: 400
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Security: Prevent path traversal
|
|
38
|
+
if (path.includes('..')) {
|
|
39
|
+
return NextResponse.json({
|
|
40
|
+
error: 'Invalid path'
|
|
41
|
+
}, {
|
|
42
|
+
status: 400
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Try blob storage first (for deployed projects)
|
|
47
|
+
const projectSlug = process.env.BRAINFISH_PROJECT_SLUG;
|
|
48
|
+
if (projectSlug) {
|
|
49
|
+
const projectContent = await getProjectContent(projectSlug);
|
|
50
|
+
if (projectContent?.files) {
|
|
51
|
+
const file = projectContent.files.find((f)=>f.path === path || f.path === `/${path}`);
|
|
52
|
+
if (file?.content) {
|
|
53
|
+
return new NextResponse(file.content, {
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'text/plain'
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Try local filesystem
|
|
62
|
+
const docsDir = getDocsDir();
|
|
63
|
+
const fullPath = join(docsDir, path);
|
|
64
|
+
if (!existsSync(fullPath)) {
|
|
65
|
+
return NextResponse.json({
|
|
66
|
+
error: 'Schema file not found'
|
|
67
|
+
}, {
|
|
68
|
+
status: 404
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
72
|
+
return new NextResponse(content, {
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'text/plain'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error('[Schema API] Error:', error);
|
|
79
|
+
return NextResponse.json({
|
|
80
|
+
error: 'Failed to read schema'
|
|
81
|
+
}, {
|
|
82
|
+
status: 500
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { isSubdomainRegistered } from '@/lib/storage/blob';
|
|
3
|
+
// Reserved/blacklisted subdomains
|
|
4
|
+
const BLACKLISTED_SUBDOMAINS = new Set([
|
|
5
|
+
// Generic reserved
|
|
6
|
+
'www',
|
|
7
|
+
'api',
|
|
8
|
+
'app',
|
|
9
|
+
'admin',
|
|
10
|
+
'dashboard',
|
|
11
|
+
'console',
|
|
12
|
+
'panel',
|
|
13
|
+
'manage',
|
|
14
|
+
'login',
|
|
15
|
+
'signin',
|
|
16
|
+
'signup',
|
|
17
|
+
'register',
|
|
18
|
+
'auth',
|
|
19
|
+
'oauth',
|
|
20
|
+
'sso',
|
|
21
|
+
// Brand/product
|
|
22
|
+
'devdoc',
|
|
23
|
+
'brainfish',
|
|
24
|
+
'docs',
|
|
25
|
+
'documentation',
|
|
26
|
+
'help',
|
|
27
|
+
'support',
|
|
28
|
+
'status',
|
|
29
|
+
'blog',
|
|
30
|
+
'news',
|
|
31
|
+
// Infrastructure
|
|
32
|
+
'mail',
|
|
33
|
+
'email',
|
|
34
|
+
'smtp',
|
|
35
|
+
'ftp',
|
|
36
|
+
'cdn',
|
|
37
|
+
'static',
|
|
38
|
+
'assets',
|
|
39
|
+
'images',
|
|
40
|
+
'files',
|
|
41
|
+
'media',
|
|
42
|
+
'download',
|
|
43
|
+
'downloads',
|
|
44
|
+
// Common
|
|
45
|
+
'test',
|
|
46
|
+
'testing',
|
|
47
|
+
'dev',
|
|
48
|
+
'development',
|
|
49
|
+
'staging',
|
|
50
|
+
'prod',
|
|
51
|
+
'production',
|
|
52
|
+
'demo',
|
|
53
|
+
'example',
|
|
54
|
+
'sandbox',
|
|
55
|
+
'preview',
|
|
56
|
+
// Security
|
|
57
|
+
'secure',
|
|
58
|
+
'ssl',
|
|
59
|
+
'security',
|
|
60
|
+
'abuse',
|
|
61
|
+
'spam',
|
|
62
|
+
'postmaster',
|
|
63
|
+
'hostmaster',
|
|
64
|
+
'webmaster',
|
|
65
|
+
// Misc
|
|
66
|
+
'null',
|
|
67
|
+
'undefined',
|
|
68
|
+
'true',
|
|
69
|
+
'false',
|
|
70
|
+
'root',
|
|
71
|
+
'system',
|
|
72
|
+
'localhost'
|
|
73
|
+
]);
|
|
74
|
+
/**
|
|
75
|
+
* POST /api/subdomains/check
|
|
76
|
+
* Check if a subdomain is available
|
|
77
|
+
*
|
|
78
|
+
* Body:
|
|
79
|
+
* subdomain: string - The subdomain to check
|
|
80
|
+
*
|
|
81
|
+
* Returns:
|
|
82
|
+
* available: boolean
|
|
83
|
+
* error?: string - If not available, why
|
|
84
|
+
* suggestion?: string - Alternative suggestion
|
|
85
|
+
*/ export async function POST(request) {
|
|
86
|
+
try {
|
|
87
|
+
const body = await request.json();
|
|
88
|
+
const { subdomain } = body;
|
|
89
|
+
if (!subdomain) {
|
|
90
|
+
return NextResponse.json({
|
|
91
|
+
available: false,
|
|
92
|
+
error: 'Subdomain is required'
|
|
93
|
+
}, {
|
|
94
|
+
status: 400
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Normalize subdomain
|
|
98
|
+
const normalized = subdomain.toLowerCase().trim();
|
|
99
|
+
// Format validation
|
|
100
|
+
if (normalized.length < 3) {
|
|
101
|
+
return NextResponse.json({
|
|
102
|
+
available: false,
|
|
103
|
+
error: 'Subdomain must be at least 3 characters'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (normalized.length > 63) {
|
|
107
|
+
return NextResponse.json({
|
|
108
|
+
available: false,
|
|
109
|
+
error: 'Subdomain must be 63 characters or less'
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(normalized)) {
|
|
113
|
+
return NextResponse.json({
|
|
114
|
+
available: false,
|
|
115
|
+
error: 'Subdomain must start and end with alphanumeric characters, and can only contain lowercase letters, numbers, and hyphens'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (/--/.test(normalized)) {
|
|
119
|
+
return NextResponse.json({
|
|
120
|
+
available: false,
|
|
121
|
+
error: 'Subdomain cannot contain consecutive hyphens'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Check blacklist
|
|
125
|
+
if (BLACKLISTED_SUBDOMAINS.has(normalized)) {
|
|
126
|
+
// Generate suggestion
|
|
127
|
+
const suggestion = `${normalized}-docs`;
|
|
128
|
+
return NextResponse.json({
|
|
129
|
+
available: false,
|
|
130
|
+
error: `"${normalized}" is a reserved subdomain`,
|
|
131
|
+
suggestion
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Check if subdomain is already registered (O(1) lookup from registry)
|
|
135
|
+
const exists = await isSubdomainRegistered(normalized);
|
|
136
|
+
if (exists) {
|
|
137
|
+
// Generate suggestion with random suffix
|
|
138
|
+
const suffix = Math.random().toString(36).substring(2, 6);
|
|
139
|
+
const suggestion = `${normalized}-${suffix}`;
|
|
140
|
+
return NextResponse.json({
|
|
141
|
+
available: false,
|
|
142
|
+
error: `"${normalized}" is already taken`,
|
|
143
|
+
suggestion
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return NextResponse.json({
|
|
147
|
+
available: true
|
|
148
|
+
});
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error('[Subdomains API] Check Error:', error);
|
|
151
|
+
return NextResponse.json({
|
|
152
|
+
available: false,
|
|
153
|
+
error: 'Internal server error'
|
|
154
|
+
}, {
|
|
155
|
+
status: 500
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { generateObject } from 'ai';
|
|
2
|
+
import { anthropic } from '@ai-sdk/anthropic';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const runtime = 'nodejs';
|
|
5
|
+
// In-memory cache for suggestions (persists across requests in the same server instance)
|
|
6
|
+
const suggestionsCache = new Map();
|
|
7
|
+
const CACHE_TTL = 1000 * 60 * 60 // 1 hour
|
|
8
|
+
;
|
|
9
|
+
const SuggestionsSchema = z.object({
|
|
10
|
+
suggestions: z.array(z.object({
|
|
11
|
+
title: z.string().describe('Short action phrase (2-4 words) like "Find endpoints" or "How do I"'),
|
|
12
|
+
label: z.string().describe('Completion of the title (2-5 words) like "for user management" or "authenticate?"'),
|
|
13
|
+
prompt: z.string().describe('Full question the user would ask')
|
|
14
|
+
})).length(4)
|
|
15
|
+
});
|
|
16
|
+
function buildSuggestionPrompt(endpoints, currentEndpointId) {
|
|
17
|
+
const currentEndpoint = currentEndpointId ? endpoints.find((e)=>e.id === currentEndpointId) : null;
|
|
18
|
+
if (currentEndpoint) {
|
|
19
|
+
return `You are helping users explore an API. Generate 4 helpful question suggestions for the "${currentEndpoint.name}" endpoint.
|
|
20
|
+
|
|
21
|
+
Endpoint details:
|
|
22
|
+
- Name: ${currentEndpoint.name}
|
|
23
|
+
- Method: ${currentEndpoint.method}
|
|
24
|
+
- Path: ${currentEndpoint.path}
|
|
25
|
+
- Description: ${currentEndpoint.description || 'No description'}
|
|
26
|
+
- Parameters: ${currentEndpoint.parameters.join(', ') || 'None'}
|
|
27
|
+
- Has request body: ${currentEndpoint.hasBody}
|
|
28
|
+
|
|
29
|
+
Generate questions that help users:
|
|
30
|
+
1. Understand what this endpoint does
|
|
31
|
+
2. Know what parameters/data to send
|
|
32
|
+
3. See example requests or responses
|
|
33
|
+
4. Understand error handling or edge cases
|
|
34
|
+
|
|
35
|
+
Make questions specific to this endpoint, not generic.`;
|
|
36
|
+
}
|
|
37
|
+
// General suggestions based on the API
|
|
38
|
+
const methodCounts = endpoints.reduce((acc, e)=>{
|
|
39
|
+
acc[e.method] = (acc[e.method] || 0) + 1;
|
|
40
|
+
return acc;
|
|
41
|
+
}, {});
|
|
42
|
+
const categories = [
|
|
43
|
+
...new Set(endpoints.flatMap((e)=>e.tags))
|
|
44
|
+
].slice(0, 5);
|
|
45
|
+
return `You are helping users explore an API documentation. Generate 4 helpful starter question suggestions.
|
|
46
|
+
|
|
47
|
+
API Overview:
|
|
48
|
+
- Total endpoints: ${endpoints.length}
|
|
49
|
+
- Methods: ${Object.entries(methodCounts).map(([m, c])=>`${m}: ${c}`).join(', ')}
|
|
50
|
+
- Categories: ${categories.join(', ') || 'General'}
|
|
51
|
+
|
|
52
|
+
Sample endpoints:
|
|
53
|
+
${endpoints.slice(0, 8).map((e)=>`- ${e.method} ${e.name}: ${e.description || 'No description'}`).join('\n')}
|
|
54
|
+
|
|
55
|
+
Generate questions that help users:
|
|
56
|
+
1. Find the right endpoint for their use case
|
|
57
|
+
2. Understand authentication/authorization
|
|
58
|
+
3. Explore common operations (create, read, update, delete)
|
|
59
|
+
4. Get started quickly with the API
|
|
60
|
+
|
|
61
|
+
Make questions specific to this API's capabilities.`;
|
|
62
|
+
}
|
|
63
|
+
export async function POST(req) {
|
|
64
|
+
try {
|
|
65
|
+
const body = await req.json();
|
|
66
|
+
const { endpointIndex, currentEndpointId } = body;
|
|
67
|
+
// Create cache key based on endpoint context
|
|
68
|
+
const cacheKey = currentEndpointId ? `endpoint:${currentEndpointId}` : `general:${endpointIndex.length}`;
|
|
69
|
+
// Check cache
|
|
70
|
+
const cached = suggestionsCache.get(cacheKey);
|
|
71
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
72
|
+
return Response.json({
|
|
73
|
+
suggestions: cached.suggestions,
|
|
74
|
+
cached: true
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
78
|
+
if (!apiKey) {
|
|
79
|
+
// Return fallback suggestions if no API key
|
|
80
|
+
const fallback = currentEndpointId ? [
|
|
81
|
+
{
|
|
82
|
+
title: 'What does this',
|
|
83
|
+
label: 'endpoint do?',
|
|
84
|
+
prompt: 'What does this endpoint do?'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
title: 'What parameters',
|
|
88
|
+
label: 'are required?',
|
|
89
|
+
prompt: 'What parameters are required?'
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
title: 'Show me an',
|
|
93
|
+
label: 'example request',
|
|
94
|
+
prompt: 'Show me an example request'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
title: 'What are the',
|
|
98
|
+
label: 'possible responses?',
|
|
99
|
+
prompt: 'What are the possible responses?'
|
|
100
|
+
}
|
|
101
|
+
] : [
|
|
102
|
+
{
|
|
103
|
+
title: 'Find endpoints',
|
|
104
|
+
label: 'for creating resources',
|
|
105
|
+
prompt: 'Find endpoints for creating resources'
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
title: 'How do I',
|
|
109
|
+
label: 'authenticate?',
|
|
110
|
+
prompt: 'How do I authenticate?'
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
title: 'What APIs are',
|
|
114
|
+
label: 'available?',
|
|
115
|
+
prompt: 'What APIs are available?'
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
title: 'Show me',
|
|
119
|
+
label: 'GET endpoints',
|
|
120
|
+
prompt: 'Show me all GET endpoints'
|
|
121
|
+
}
|
|
122
|
+
];
|
|
123
|
+
return Response.json({
|
|
124
|
+
suggestions: fallback,
|
|
125
|
+
cached: false,
|
|
126
|
+
fallback: true
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const prompt = buildSuggestionPrompt(endpointIndex, currentEndpointId);
|
|
130
|
+
const { object } = await generateObject({
|
|
131
|
+
model: anthropic('claude-sonnet-4-20250514'),
|
|
132
|
+
schema: SuggestionsSchema,
|
|
133
|
+
prompt
|
|
134
|
+
});
|
|
135
|
+
// Cache the result
|
|
136
|
+
suggestionsCache.set(cacheKey, {
|
|
137
|
+
suggestions: object.suggestions,
|
|
138
|
+
timestamp: Date.now()
|
|
139
|
+
});
|
|
140
|
+
return Response.json({
|
|
141
|
+
suggestions: object.suggestions,
|
|
142
|
+
cached: false
|
|
143
|
+
});
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error('[Suggestions API] Error:', error);
|
|
146
|
+
// Return fallback on error
|
|
147
|
+
const fallback = [
|
|
148
|
+
{
|
|
149
|
+
title: 'What APIs are',
|
|
150
|
+
label: 'available?',
|
|
151
|
+
prompt: 'What APIs are available?'
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
title: 'How do I',
|
|
155
|
+
label: 'authenticate?',
|
|
156
|
+
prompt: 'How do I authenticate?'
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
title: 'Find endpoints',
|
|
160
|
+
label: 'for my use case',
|
|
161
|
+
prompt: 'Help me find the right endpoint'
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
title: 'Show me',
|
|
165
|
+
label: 'examples',
|
|
166
|
+
prompt: 'Show me some example requests'
|
|
167
|
+
}
|
|
168
|
+
];
|
|
169
|
+
return Response.json({
|
|
170
|
+
suggestions: fallback,
|
|
171
|
+
cached: false,
|
|
172
|
+
error: true
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Geist, Geist_Mono } from "next/font/google";
|
|
3
|
+
import { ThemeProvider } from "@/components/theme-provider";
|
|
4
|
+
import "./globals.css";
|
|
5
|
+
const geistSans = Geist({
|
|
6
|
+
variable: "--font-geist-sans",
|
|
7
|
+
subsets: [
|
|
8
|
+
"latin"
|
|
9
|
+
]
|
|
10
|
+
});
|
|
11
|
+
const geistMono = Geist_Mono({
|
|
12
|
+
variable: "--font-geist-mono",
|
|
13
|
+
subsets: [
|
|
14
|
+
"latin"
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
export const metadata = {
|
|
18
|
+
title: "Documentation",
|
|
19
|
+
description: "API Documentation and Reference",
|
|
20
|
+
icons: {
|
|
21
|
+
icon: '/icon.png',
|
|
22
|
+
shortcut: '/icon.png',
|
|
23
|
+
apple: '/icon.png'
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const viewport = {
|
|
27
|
+
width: "device-width",
|
|
28
|
+
initialScale: 1,
|
|
29
|
+
maximumScale: 1,
|
|
30
|
+
userScalable: false
|
|
31
|
+
};
|
|
32
|
+
export default function RootLayout({ children }) {
|
|
33
|
+
return /*#__PURE__*/ _jsx("html", {
|
|
34
|
+
lang: "en",
|
|
35
|
+
suppressHydrationWarning: true,
|
|
36
|
+
children: /*#__PURE__*/ _jsx("body", {
|
|
37
|
+
className: `${geistSans.variable} ${geistMono.variable} antialiased`,
|
|
38
|
+
children: /*#__PURE__*/ _jsx(ThemeProvider, {
|
|
39
|
+
attribute: "class",
|
|
40
|
+
defaultTheme: "system",
|
|
41
|
+
enableSystem: true,
|
|
42
|
+
disableTransitionOnChange: true,
|
|
43
|
+
children: children
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
}
|