@brainfish-ai/devdoc 0.1.42 → 0.1.44
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/dist/cli/commands/create.js +2 -2
- 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 +706 -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 +195 -0
- package/renderer/app/globals.css +69 -0
- package/renderer/app/layout.js +47 -0
- package/renderer/app/llms-full.txt/route.js +266 -0
- package/renderer/app/llms.txt/route.js +228 -0
- package/renderer/app/page.js +12 -0
- package/renderer/app/robots.txt/route.js +66 -0
- package/renderer/app/sitemap.xml/route.js +155 -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 +317 -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 +1831 -0
- package/renderer/components/docs-viewer/agent/agent-popup-button.js +99 -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 +7 -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/content-router.js +182 -0
- package/renderer/components/docs-viewer/content/doc-page.js +290 -0
- package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
- package/renderer/components/docs-viewer/content/index.js +31 -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 +1448 -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 +936 -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 +159 -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 +86 -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/hooks/use-route-state.js +159 -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/agent/use-suggestions.js +97 -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 +126 -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 +116 -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/environment.js +38 -0
- package/renderer/lib/docs/config/index.js +6 -0
- package/renderer/lib/docs/config/loader.js +113 -0
- package/renderer/lib/docs/config/schema.js +281 -0
- package/renderer/lib/docs/index.js +8 -0
- package/renderer/lib/docs/mdx/compiler.js +131 -0
- package/renderer/lib/docs/mdx/frontmatter.js +73 -0
- package/renderer/lib/docs/mdx/index.js +10 -0
- package/renderer/lib/docs/mdx/remark-mermaid.js +63 -0
- package/renderer/lib/docs/navigation/generator.js +269 -0
- package/renderer/lib/docs/navigation/index.js +3 -0
- package/renderer/lib/docs/navigation/types.js +11 -0
- package/renderer/lib/docs-navigation-context.js +40 -0
- package/renderer/lib/docs-navigation.js +140 -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/package.json +1 -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 -1670
- 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,195 @@
|
|
|
1
|
+
import { generateObject } from 'ai';
|
|
2
|
+
import { anthropic } from '@ai-sdk/anthropic';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import crypto from 'crypto';
|
|
5
|
+
import { CacheUtils } from '@/lib/cache';
|
|
6
|
+
export const runtime = 'nodejs';
|
|
7
|
+
// Cache TTL: 1 week in seconds
|
|
8
|
+
const CACHE_TTL_SECONDS = 60 * 60 * 24 * 7 // 7 days
|
|
9
|
+
;
|
|
10
|
+
const SuggestionsSchema = z.object({
|
|
11
|
+
suggestions: z.array(z.object({
|
|
12
|
+
title: z.string().describe('Short action phrase (2-4 words) like "Find endpoints" or "How do I"'),
|
|
13
|
+
label: z.string().describe('Completion of the title (2-5 words) like "for user management" or "authenticate?"'),
|
|
14
|
+
prompt: z.string().describe('Full question the user would ask')
|
|
15
|
+
})).length(4)
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Generate a hash key for caching based on page context
|
|
19
|
+
* Uses SHA-256 hash of endpoint details or general API info
|
|
20
|
+
*/ function generateCacheKey(endpointIndex, currentEndpointId) {
|
|
21
|
+
let content;
|
|
22
|
+
if (currentEndpointId) {
|
|
23
|
+
// For specific endpoint: hash the endpoint details
|
|
24
|
+
const endpoint = endpointIndex.find((e)=>e.id === currentEndpointId);
|
|
25
|
+
content = endpoint ? `endpoint:${endpoint.id}:${endpoint.name}:${endpoint.method}:${endpoint.path}` : `endpoint:${currentEndpointId}`;
|
|
26
|
+
} else {
|
|
27
|
+
// For general API: hash based on endpoint count and first few endpoint signatures
|
|
28
|
+
const signature = endpointIndex.slice(0, 10).map((e)=>`${e.method}:${e.path}`).join('|');
|
|
29
|
+
content = `general:${endpointIndex.length}:${signature}`;
|
|
30
|
+
}
|
|
31
|
+
const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
32
|
+
return `suggestions:${hash}`;
|
|
33
|
+
}
|
|
34
|
+
function buildSuggestionPrompt(endpoints, currentEndpointId) {
|
|
35
|
+
const currentEndpoint = currentEndpointId ? endpoints.find((e)=>e.id === currentEndpointId) : null;
|
|
36
|
+
if (currentEndpoint) {
|
|
37
|
+
return `You are helping users explore an API. Generate 4 helpful question suggestions for the "${currentEndpoint.name}" endpoint.
|
|
38
|
+
|
|
39
|
+
Endpoint details:
|
|
40
|
+
- Name: ${currentEndpoint.name}
|
|
41
|
+
- Method: ${currentEndpoint.method}
|
|
42
|
+
- Path: ${currentEndpoint.path}
|
|
43
|
+
- Description: ${currentEndpoint.description || 'No description'}
|
|
44
|
+
- Parameters: ${currentEndpoint.parameters.join(', ') || 'None'}
|
|
45
|
+
- Has request body: ${currentEndpoint.hasBody}
|
|
46
|
+
|
|
47
|
+
Generate questions that help users:
|
|
48
|
+
1. Understand what this endpoint does
|
|
49
|
+
2. Know what parameters/data to send
|
|
50
|
+
3. See example requests or responses
|
|
51
|
+
4. Understand error handling or edge cases
|
|
52
|
+
|
|
53
|
+
Make questions specific to this endpoint, not generic.`;
|
|
54
|
+
}
|
|
55
|
+
// General suggestions based on the API
|
|
56
|
+
const methodCounts = endpoints.reduce((acc, e)=>{
|
|
57
|
+
acc[e.method] = (acc[e.method] || 0) + 1;
|
|
58
|
+
return acc;
|
|
59
|
+
}, {});
|
|
60
|
+
const categories = [
|
|
61
|
+
...new Set(endpoints.flatMap((e)=>e.tags))
|
|
62
|
+
].slice(0, 5);
|
|
63
|
+
return `You are helping users explore an API documentation. Generate 4 helpful starter question suggestions.
|
|
64
|
+
|
|
65
|
+
API Overview:
|
|
66
|
+
- Total endpoints: ${endpoints.length}
|
|
67
|
+
- Methods: ${Object.entries(methodCounts).map(([m, c])=>`${m}: ${c}`).join(', ')}
|
|
68
|
+
- Categories: ${categories.join(', ') || 'General'}
|
|
69
|
+
|
|
70
|
+
Sample endpoints:
|
|
71
|
+
${endpoints.slice(0, 8).map((e)=>`- ${e.method} ${e.name}: ${e.description || 'No description'}`).join('\n')}
|
|
72
|
+
|
|
73
|
+
Generate questions that help users:
|
|
74
|
+
1. Find the right endpoint for their use case
|
|
75
|
+
2. Understand authentication/authorization
|
|
76
|
+
3. Explore common operations (create, read, update, delete)
|
|
77
|
+
4. Get started quickly with the API
|
|
78
|
+
|
|
79
|
+
Make questions specific to this API's capabilities.`;
|
|
80
|
+
}
|
|
81
|
+
export async function POST(req) {
|
|
82
|
+
try {
|
|
83
|
+
const body = await req.json();
|
|
84
|
+
const { endpointIndex, currentEndpointId } = body;
|
|
85
|
+
// Generate hash-based cache key
|
|
86
|
+
const cacheKey = generateCacheKey(endpointIndex, currentEndpointId);
|
|
87
|
+
// Check KV cache first (1 week TTL)
|
|
88
|
+
const cached = await CacheUtils.get(cacheKey);
|
|
89
|
+
if (cached) {
|
|
90
|
+
console.log(`[Suggestions API] Cache HIT: ${cacheKey}`);
|
|
91
|
+
return Response.json({
|
|
92
|
+
suggestions: cached,
|
|
93
|
+
cached: true
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
console.log(`[Suggestions API] Cache MISS: ${cacheKey}`);
|
|
97
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
98
|
+
if (!apiKey) {
|
|
99
|
+
// Return fallback suggestions if no API key
|
|
100
|
+
const fallback = currentEndpointId ? [
|
|
101
|
+
{
|
|
102
|
+
title: 'What does this',
|
|
103
|
+
label: 'endpoint do?',
|
|
104
|
+
prompt: 'What does this endpoint do?'
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
title: 'What parameters',
|
|
108
|
+
label: 'are required?',
|
|
109
|
+
prompt: 'What parameters are required?'
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
title: 'Show me an',
|
|
113
|
+
label: 'example request',
|
|
114
|
+
prompt: 'Show me an example request'
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
title: 'What are the',
|
|
118
|
+
label: 'possible responses?',
|
|
119
|
+
prompt: 'What are the possible responses?'
|
|
120
|
+
}
|
|
121
|
+
] : [
|
|
122
|
+
{
|
|
123
|
+
title: 'Find endpoints',
|
|
124
|
+
label: 'for creating resources',
|
|
125
|
+
prompt: 'Find endpoints for creating resources'
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
title: 'How do I',
|
|
129
|
+
label: 'authenticate?',
|
|
130
|
+
prompt: 'How do I authenticate?'
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
title: 'What APIs are',
|
|
134
|
+
label: 'available?',
|
|
135
|
+
prompt: 'What APIs are available?'
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
title: 'Show me',
|
|
139
|
+
label: 'GET endpoints',
|
|
140
|
+
prompt: 'Show me all GET endpoints'
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
// Don't cache fallback suggestions - allow real suggestions to be generated later
|
|
144
|
+
return Response.json({
|
|
145
|
+
suggestions: fallback,
|
|
146
|
+
cached: false,
|
|
147
|
+
fallback: true
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const prompt = buildSuggestionPrompt(endpointIndex, currentEndpointId);
|
|
151
|
+
const { object } = await generateObject({
|
|
152
|
+
model: anthropic('claude-sonnet-4-20250514'),
|
|
153
|
+
schema: SuggestionsSchema,
|
|
154
|
+
prompt
|
|
155
|
+
});
|
|
156
|
+
// Cache the result in KV with 1 week TTL
|
|
157
|
+
await CacheUtils.set(cacheKey, object.suggestions, CACHE_TTL_SECONDS, {
|
|
158
|
+
log: true
|
|
159
|
+
});
|
|
160
|
+
return Response.json({
|
|
161
|
+
suggestions: object.suggestions,
|
|
162
|
+
cached: false
|
|
163
|
+
});
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error('[Suggestions API] Error:', error);
|
|
166
|
+
// Return fallback on error
|
|
167
|
+
const fallback = [
|
|
168
|
+
{
|
|
169
|
+
title: 'What APIs are',
|
|
170
|
+
label: 'available?',
|
|
171
|
+
prompt: 'What APIs are available?'
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
title: 'How do I',
|
|
175
|
+
label: 'authenticate?',
|
|
176
|
+
prompt: 'How do I authenticate?'
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
title: 'Find endpoints',
|
|
180
|
+
label: 'for my use case',
|
|
181
|
+
prompt: 'Help me find the right endpoint'
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
title: 'Show me',
|
|
185
|
+
label: 'examples',
|
|
186
|
+
prompt: 'Show me some example requests'
|
|
187
|
+
}
|
|
188
|
+
];
|
|
189
|
+
return Response.json({
|
|
190
|
+
suggestions: fallback,
|
|
191
|
+
cached: false,
|
|
192
|
+
error: true
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
package/renderer/app/globals.css
CHANGED
|
@@ -1197,4 +1197,73 @@ code[data-line-numbers] > [data-line]::before {
|
|
|
1197
1197
|
.landing-section {
|
|
1198
1198
|
width: 100%;
|
|
1199
1199
|
margin: 0;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/* ============================================
|
|
1203
|
+
Agent Popup Button Animations
|
|
1204
|
+
============================================ */
|
|
1205
|
+
|
|
1206
|
+
/* Scale in animation for popup button appearing */
|
|
1207
|
+
@keyframes popup-scale-in {
|
|
1208
|
+
from {
|
|
1209
|
+
transform: scale(0.8);
|
|
1210
|
+
opacity: 0;
|
|
1211
|
+
}
|
|
1212
|
+
to {
|
|
1213
|
+
transform: scale(1);
|
|
1214
|
+
opacity: 1;
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
/* Scale out animation for popup button disappearing */
|
|
1219
|
+
@keyframes popup-scale-out {
|
|
1220
|
+
from {
|
|
1221
|
+
transform: scale(1);
|
|
1222
|
+
opacity: 1;
|
|
1223
|
+
}
|
|
1224
|
+
to {
|
|
1225
|
+
transform: scale(0.8);
|
|
1226
|
+
opacity: 0;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
.agent-popup-enter {
|
|
1231
|
+
animation: popup-scale-in 0.2s ease-out forwards;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
.agent-popup-exit {
|
|
1235
|
+
animation: popup-scale-out 0.15s ease-in forwards;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
/* Suggestions container slide up animation */
|
|
1239
|
+
@keyframes suggestions-slide-up {
|
|
1240
|
+
from {
|
|
1241
|
+
transform: translateY(10px);
|
|
1242
|
+
opacity: 0;
|
|
1243
|
+
}
|
|
1244
|
+
to {
|
|
1245
|
+
transform: translateY(0);
|
|
1246
|
+
opacity: 1;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
.agent-suggestions-enter {
|
|
1251
|
+
animation: suggestions-slide-up 0.3s ease-out forwards;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
/* Individual suggestion item staggered animation */
|
|
1255
|
+
@keyframes suggestion-fade-in {
|
|
1256
|
+
from {
|
|
1257
|
+
transform: translateX(10px);
|
|
1258
|
+
opacity: 0;
|
|
1259
|
+
}
|
|
1260
|
+
to {
|
|
1261
|
+
transform: translateX(0);
|
|
1262
|
+
opacity: 1;
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
.agent-suggestion-item {
|
|
1267
|
+
animation: suggestion-fade-in 0.2s ease-out forwards;
|
|
1268
|
+
animation-fill-mode: both;
|
|
1200
1269
|
}
|
|
@@ -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: "dark",
|
|
41
|
+
enableSystem: false,
|
|
42
|
+
disableTransitionOnChange: true,
|
|
43
|
+
children: children
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
}
|