@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.
Files changed (400) hide show
  1. package/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +710 -79
  2. package/ai-agents/.claude/skills/check-docs/SKILL.md +83 -8
  3. package/ai-agents/.claude/skills/create-doc/SKILL.md +267 -55
  4. package/ai-agents/.claude/skills/update-doc/SKILL.md +162 -63
  5. package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +145 -15
  6. package/ai-agents/.cursor/rules/devdoc-create.mdc +108 -57
  7. package/ai-agents/.cursor/rules/devdoc-update.mdc +93 -70
  8. package/ai-agents/.cursor/rules/devdoc.mdc +21 -0
  9. package/ai-agents/schemas/docs.schema.json +332 -0
  10. package/ai-agents/schemas/theme.schema.json +243 -0
  11. package/dist/cli/commands/create.js +4 -9
  12. package/dist/cli/commands/deploy.js +50 -25
  13. package/dist/cli/commands/dev.js +19 -10
  14. package/package.json +3 -2
  15. package/renderer/app/api/assets/[...path]/route.js +108 -0
  16. package/renderer/app/api/assets/route.js +114 -0
  17. package/renderer/app/api/assets/upload/route.js +163 -0
  18. package/renderer/app/api/auth-schemes/route.js +58 -0
  19. package/renderer/app/api/chat/route.js +759 -0
  20. package/renderer/app/api/codegen/route.js +52 -0
  21. package/renderer/app/api/collections/route.js +675 -0
  22. package/renderer/app/api/debug/route.js +47 -0
  23. package/renderer/app/api/deploy/route.js +199 -0
  24. package/renderer/app/api/device/route.js +36 -0
  25. package/renderer/app/api/docs/route.js +205 -0
  26. package/renderer/app/api/domains/add/route.js +121 -0
  27. package/renderer/app/api/domains/lookup/route.js +43 -0
  28. package/renderer/app/api/domains/remove/route.js +89 -0
  29. package/renderer/app/api/domains/status/route.js +140 -0
  30. package/renderer/app/api/domains/verify/route.js +168 -0
  31. package/renderer/app/api/keys/regenerate/route.js +71 -0
  32. package/renderer/app/api/local-assets/[...path]/route.js +108 -0
  33. package/renderer/app/api/openapi-spec/route.js +73 -0
  34. package/renderer/app/api/projects/[slug]/route.js +129 -0
  35. package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
  36. package/renderer/app/api/projects/register/route.js +176 -0
  37. package/renderer/app/api/proxy/route.js +139 -0
  38. package/renderer/app/api/proxy-stream/route.js +156 -0
  39. package/renderer/app/api/redirects/route.js +35 -0
  40. package/renderer/app/api/schema/route.js +85 -0
  41. package/renderer/app/api/subdomains/check/route.js +158 -0
  42. package/renderer/app/api/suggestions/route.js +175 -0
  43. package/renderer/app/layout.js +47 -0
  44. package/renderer/app/llms-full.txt/route.js +257 -0
  45. package/renderer/app/llms.txt/route.js +219 -0
  46. package/renderer/app/page.js +12 -0
  47. package/renderer/app/robots.txt/route.js +66 -0
  48. package/renderer/app/sitemap.xml/route.js +145 -0
  49. package/renderer/components/docs/index.js +8 -0
  50. package/renderer/components/docs/mdx/accordion.js +113 -0
  51. package/renderer/components/docs/mdx/badge.js +72 -0
  52. package/renderer/components/docs/mdx/callouts.js +137 -0
  53. package/renderer/components/docs/mdx/cards.js +175 -0
  54. package/renderer/components/docs/mdx/changelog.js +100 -0
  55. package/renderer/components/docs/mdx/code-block.js +147 -0
  56. package/renderer/components/docs/mdx/code-group.js +287 -0
  57. package/renderer/components/docs/mdx/file-embeds.js +82 -0
  58. package/renderer/components/docs/mdx/frame.js +59 -0
  59. package/renderer/components/docs/mdx/highlight.js +90 -0
  60. package/renderer/components/docs/mdx/iframe.js +69 -0
  61. package/renderer/components/docs/mdx/image.js +135 -0
  62. package/renderer/components/docs/mdx/index.js +134 -0
  63. package/renderer/components/docs/mdx/landing.js +315 -0
  64. package/renderer/components/docs/mdx/mermaid.js +212 -0
  65. package/renderer/components/docs/mdx/param-field.js +112 -0
  66. package/renderer/components/docs/mdx/steps.js +74 -0
  67. package/renderer/components/docs/mdx/tabs.js +50 -0
  68. package/renderer/components/docs/mdx-renderer.js +77 -0
  69. package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
  70. package/renderer/components/docs/navigation/index.js +6 -0
  71. package/renderer/components/docs/navigation/page-nav.js +57 -0
  72. package/renderer/components/docs/navigation/sidebar.js +375 -0
  73. package/renderer/components/docs/navigation/toc.js +89 -0
  74. package/renderer/components/docs/notice.js +77 -0
  75. package/renderer/components/docs-header.js +202 -0
  76. package/renderer/components/docs-viewer/agent/agent-chat.js +1930 -0
  77. package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
  78. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
  79. package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
  80. package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
  81. package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
  82. package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
  83. package/renderer/components/docs-viewer/agent/index.js +4 -0
  84. package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
  85. package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
  86. package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
  87. package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
  88. package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
  89. package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
  90. package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
  91. package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
  92. package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
  93. package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
  94. package/renderer/components/docs-viewer/content/doc-page.js +264 -0
  95. package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
  96. package/renderer/components/docs-viewer/content/index.js +29 -0
  97. package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
  98. package/renderer/components/docs-viewer/content/request-details.js +528 -0
  99. package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
  100. package/renderer/components/docs-viewer/content/sections/body.js +80 -0
  101. package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
  102. package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
  103. package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
  104. package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
  105. package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
  106. package/renderer/components/docs-viewer/index.js +1552 -0
  107. package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
  108. package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
  109. package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
  110. package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
  111. package/renderer/components/docs-viewer/playground/graphql-playground.js +734 -0
  112. package/renderer/components/docs-viewer/playground/index.js +682 -0
  113. package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
  114. package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
  115. package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
  116. package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
  117. package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
  118. package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
  119. package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
  120. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
  121. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
  122. package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
  123. package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
  124. package/renderer/components/docs-viewer/search/index.js +2 -0
  125. package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
  126. package/renderer/components/docs-viewer/search/use-search.js +89 -0
  127. package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
  128. package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
  129. package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
  130. package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
  131. package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
  132. package/renderer/components/docs-viewer/sidebar/index.js +196 -0
  133. package/renderer/components/docs-viewer/sidebar/right-sidebar.js +163 -0
  134. package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
  135. package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
  136. package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
  137. package/renderer/components/theme-provider.js +10 -0
  138. package/renderer/components/theme-toggle.js +106 -0
  139. package/renderer/components/ui/badge.js +29 -0
  140. package/renderer/components/ui/button.js +40 -0
  141. package/renderer/components/ui/dialog.js +50 -0
  142. package/renderer/components/ui/dropdown-menu.js +143 -0
  143. package/renderer/components/ui/input.js +12 -0
  144. package/renderer/components/ui/label.js +13 -0
  145. package/renderer/components/ui/navigation-menu.js +83 -0
  146. package/renderer/components/ui/select.js +116 -0
  147. package/renderer/components/ui/spinner.js +92 -0
  148. package/renderer/components/ui/tabs.js +34 -0
  149. package/renderer/components/ui/tooltip.js +43 -0
  150. package/renderer/hooks/use-code-copy.js +76 -0
  151. package/renderer/hooks/use-openapi-title.js +33 -0
  152. package/renderer/lib/api-docs/agent/index.js +4 -0
  153. package/renderer/lib/api-docs/agent/indexer.js +254 -0
  154. package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
  155. package/renderer/lib/api-docs/agent/types.js +5 -0
  156. package/renderer/lib/api-docs/auth/auth-context.js +157 -0
  157. package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
  158. package/renderer/lib/api-docs/auth/crypto.js +64 -0
  159. package/renderer/lib/api-docs/auth/index.js +3 -0
  160. package/renderer/lib/api-docs/code-editor/db.js +145 -0
  161. package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
  162. package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
  163. package/renderer/lib/api-docs/code-editor/mode-context.js +154 -0
  164. package/renderer/lib/api-docs/code-editor/types.js +53 -0
  165. package/renderer/lib/api-docs/codegen/definitions.js +258 -0
  166. package/renderer/lib/api-docs/codegen/har.js +171 -0
  167. package/renderer/lib/api-docs/codegen/index.js +118 -0
  168. package/renderer/lib/api-docs/factories.js +136 -0
  169. package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
  170. package/renderer/lib/api-docs/mobile-context.js +79 -0
  171. package/renderer/lib/api-docs/navigation-context.js +62 -0
  172. package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
  173. package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
  174. package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
  175. package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
  176. package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
  177. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
  178. package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
  179. package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
  180. package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
  181. package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
  182. package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
  183. package/renderer/lib/api-docs/playground/context.js +65 -0
  184. package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
  185. package/renderer/lib/api-docs/playground/request-builder.js +163 -0
  186. package/renderer/lib/api-docs/playground/request-runner.js +224 -0
  187. package/renderer/lib/api-docs/playground/types.js +5 -0
  188. package/renderer/lib/api-docs/types.js +23 -0
  189. package/renderer/lib/api-docs/utils.js +212 -0
  190. package/renderer/lib/cache.js +157 -0
  191. package/renderer/lib/docs/config/domain-schema.js +161 -0
  192. package/renderer/lib/docs/config/index.js +5 -0
  193. package/renderer/lib/docs/config/loader.js +113 -0
  194. package/renderer/lib/docs/config/schema.js +269 -0
  195. package/renderer/lib/docs/index.js +8 -0
  196. package/renderer/lib/docs/mdx/compiler.js +128 -0
  197. package/renderer/lib/docs/mdx/frontmatter.js +73 -0
  198. package/renderer/lib/docs/mdx/index.js +8 -0
  199. package/renderer/lib/docs/navigation/generator.js +269 -0
  200. package/renderer/lib/docs/navigation/index.js +4 -0
  201. package/renderer/lib/docs/navigation/types.js +9 -0
  202. package/renderer/lib/docs-navigation-context.js +40 -0
  203. package/renderer/lib/multi-tenant/context.js +80 -0
  204. package/renderer/lib/storage/blob.js +767 -0
  205. package/renderer/lib/utils/icons.js +30 -0
  206. package/renderer/lib/utils.js +5 -0
  207. package/renderer/next.config.js +62 -0
  208. package/renderer/tsconfig.json +23 -5
  209. package/renderer/app/api/assets/[...path]/route.ts +0 -123
  210. package/renderer/app/api/assets/route.ts +0 -124
  211. package/renderer/app/api/assets/upload/route.ts +0 -177
  212. package/renderer/app/api/auth-schemes/route.ts +0 -77
  213. package/renderer/app/api/chat/route.ts +0 -858
  214. package/renderer/app/api/codegen/route.ts +0 -72
  215. package/renderer/app/api/collections/route.ts +0 -1002
  216. package/renderer/app/api/debug/route.ts +0 -53
  217. package/renderer/app/api/deploy/route.ts +0 -234
  218. package/renderer/app/api/device/route.ts +0 -42
  219. package/renderer/app/api/docs/route.ts +0 -201
  220. package/renderer/app/api/domains/add/route.ts +0 -132
  221. package/renderer/app/api/domains/lookup/route.ts +0 -43
  222. package/renderer/app/api/domains/remove/route.ts +0 -100
  223. package/renderer/app/api/domains/status/route.ts +0 -158
  224. package/renderer/app/api/domains/verify/route.ts +0 -181
  225. package/renderer/app/api/keys/regenerate/route.ts +0 -80
  226. package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
  227. package/renderer/app/api/openapi-spec/route.ts +0 -151
  228. package/renderer/app/api/projects/[slug]/route.ts +0 -153
  229. package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
  230. package/renderer/app/api/projects/register/route.ts +0 -152
  231. package/renderer/app/api/proxy/route.ts +0 -149
  232. package/renderer/app/api/proxy-stream/route.ts +0 -168
  233. package/renderer/app/api/redirects/route.ts +0 -47
  234. package/renderer/app/api/schema/route.ts +0 -73
  235. package/renderer/app/api/subdomains/check/route.ts +0 -172
  236. package/renderer/app/api/suggestions/route.ts +0 -144
  237. package/renderer/app/layout.tsx +0 -54
  238. package/renderer/app/llms-full.txt/route.ts +0 -346
  239. package/renderer/app/llms.txt/route.ts +0 -279
  240. package/renderer/app/page.tsx +0 -14
  241. package/renderer/app/robots.txt/route.ts +0 -84
  242. package/renderer/app/sitemap.xml/route.ts +0 -199
  243. package/renderer/components/docs/index.ts +0 -12
  244. package/renderer/components/docs/mdx/accordion.tsx +0 -169
  245. package/renderer/components/docs/mdx/badge.tsx +0 -132
  246. package/renderer/components/docs/mdx/callouts.tsx +0 -154
  247. package/renderer/components/docs/mdx/cards.tsx +0 -241
  248. package/renderer/components/docs/mdx/changelog.tsx +0 -120
  249. package/renderer/components/docs/mdx/code-block.tsx +0 -186
  250. package/renderer/components/docs/mdx/code-group.tsx +0 -421
  251. package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
  252. package/renderer/components/docs/mdx/frame.tsx +0 -112
  253. package/renderer/components/docs/mdx/highlight.tsx +0 -151
  254. package/renderer/components/docs/mdx/iframe.tsx +0 -134
  255. package/renderer/components/docs/mdx/image.tsx +0 -235
  256. package/renderer/components/docs/mdx/index.ts +0 -237
  257. package/renderer/components/docs/mdx/landing.tsx +0 -684
  258. package/renderer/components/docs/mdx/mermaid.tsx +0 -240
  259. package/renderer/components/docs/mdx/param-field.tsx +0 -200
  260. package/renderer/components/docs/mdx/steps.tsx +0 -113
  261. package/renderer/components/docs/mdx/tabs.tsx +0 -86
  262. package/renderer/components/docs/mdx-renderer.tsx +0 -100
  263. package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
  264. package/renderer/components/docs/navigation/index.ts +0 -8
  265. package/renderer/components/docs/navigation/page-nav.tsx +0 -64
  266. package/renderer/components/docs/navigation/sidebar.tsx +0 -515
  267. package/renderer/components/docs/navigation/toc.tsx +0 -113
  268. package/renderer/components/docs/notice.tsx +0 -105
  269. package/renderer/components/docs-header.tsx +0 -278
  270. package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
  271. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
  272. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
  273. package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
  274. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
  275. package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
  276. package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
  277. package/renderer/components/docs-viewer/agent/index.tsx +0 -6
  278. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
  279. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
  280. package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
  281. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
  282. package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
  283. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
  284. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
  285. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
  286. package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
  287. package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
  288. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
  289. package/renderer/components/docs-viewer/content/index.tsx +0 -29
  290. package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
  291. package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
  292. package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
  293. package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
  294. package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
  295. package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
  296. package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
  297. package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
  298. package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
  299. package/renderer/components/docs-viewer/index.tsx +0 -1662
  300. package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
  301. package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
  302. package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
  303. package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
  304. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
  305. package/renderer/components/docs-viewer/playground/index.tsx +0 -671
  306. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
  307. package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
  308. package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
  309. package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
  310. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
  311. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
  312. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
  313. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
  314. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
  315. package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
  316. package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
  317. package/renderer/components/docs-viewer/search/index.ts +0 -2
  318. package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
  319. package/renderer/components/docs-viewer/search/use-search.ts +0 -117
  320. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
  321. package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
  322. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
  323. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
  324. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
  325. package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
  326. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
  327. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
  328. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
  329. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
  330. package/renderer/components/theme-provider.tsx +0 -11
  331. package/renderer/components/theme-toggle.tsx +0 -76
  332. package/renderer/components/ui/badge.tsx +0 -46
  333. package/renderer/components/ui/button.tsx +0 -59
  334. package/renderer/components/ui/dialog.tsx +0 -118
  335. package/renderer/components/ui/dropdown-menu.tsx +0 -257
  336. package/renderer/components/ui/input.tsx +0 -21
  337. package/renderer/components/ui/label.tsx +0 -24
  338. package/renderer/components/ui/navigation-menu.tsx +0 -168
  339. package/renderer/components/ui/select.tsx +0 -190
  340. package/renderer/components/ui/spinner.tsx +0 -114
  341. package/renderer/components/ui/tabs.tsx +0 -66
  342. package/renderer/components/ui/tooltip.tsx +0 -61
  343. package/renderer/hooks/use-code-copy.ts +0 -88
  344. package/renderer/hooks/use-openapi-title.ts +0 -44
  345. package/renderer/lib/api-docs/agent/index.ts +0 -6
  346. package/renderer/lib/api-docs/agent/indexer.ts +0 -323
  347. package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
  348. package/renderer/lib/api-docs/agent/types.ts +0 -116
  349. package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
  350. package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
  351. package/renderer/lib/api-docs/auth/crypto.ts +0 -89
  352. package/renderer/lib/api-docs/auth/index.ts +0 -4
  353. package/renderer/lib/api-docs/code-editor/db.ts +0 -164
  354. package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
  355. package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
  356. package/renderer/lib/api-docs/code-editor/types.ts +0 -105
  357. package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
  358. package/renderer/lib/api-docs/codegen/har.ts +0 -251
  359. package/renderer/lib/api-docs/codegen/index.ts +0 -159
  360. package/renderer/lib/api-docs/factories.ts +0 -170
  361. package/renderer/lib/api-docs/mobile-context.tsx +0 -112
  362. package/renderer/lib/api-docs/navigation-context.tsx +0 -88
  363. package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
  364. package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
  365. package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
  366. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
  367. package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
  368. package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
  369. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
  370. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
  371. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
  372. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
  373. package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
  374. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
  375. package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
  376. package/renderer/lib/api-docs/playground/context.tsx +0 -107
  377. package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
  378. package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
  379. package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
  380. package/renderer/lib/api-docs/playground/types.ts +0 -35
  381. package/renderer/lib/api-docs/types.ts +0 -269
  382. package/renderer/lib/api-docs/utils.ts +0 -311
  383. package/renderer/lib/cache.ts +0 -193
  384. package/renderer/lib/docs/config/domain-schema.ts +0 -260
  385. package/renderer/lib/docs/config/index.ts +0 -43
  386. package/renderer/lib/docs/config/loader.ts +0 -142
  387. package/renderer/lib/docs/config/schema.ts +0 -308
  388. package/renderer/lib/docs/index.ts +0 -12
  389. package/renderer/lib/docs/mdx/compiler.ts +0 -176
  390. package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
  391. package/renderer/lib/docs/mdx/index.ts +0 -26
  392. package/renderer/lib/docs/navigation/generator.ts +0 -348
  393. package/renderer/lib/docs/navigation/index.ts +0 -12
  394. package/renderer/lib/docs/navigation/types.ts +0 -123
  395. package/renderer/lib/docs-navigation-context.tsx +0 -80
  396. package/renderer/lib/multi-tenant/context.ts +0 -105
  397. package/renderer/lib/storage/blob.ts +0 -1083
  398. package/renderer/lib/utils/icons.ts +0 -48
  399. package/renderer/lib/utils.ts +0 -6
  400. package/renderer/next.config.ts +0 -76
@@ -1,171 +0,0 @@
1
- /**
2
- * OpenAPI Importer
3
- *
4
- * Main entry point for importing OpenAPI specifications
5
- * Ported from Hoppscotch's openapi/index.ts
6
- */
7
-
8
- import yaml from 'js-yaml'
9
- import type { OpenAPI, OpenAPIV2, OpenAPIV3 } from 'openapi-types'
10
- import type { BrainfishCollection } from '../../types'
11
- import { objectHasProperty } from '../../utils'
12
- import { validateOpenAPISpec } from './validator'
13
- import { dereferenceOpenAPISpec, hasUnresolvedRefs } from './dereferencer'
14
- import { convertOpenAPIToCollection } from './transformer'
15
-
16
- export const OPENAPI_DEREF_ERROR = 'openapi/deref_error' as const
17
- export const IMPORTER_INVALID_FILE_FORMAT = 'importer/invalid_file_format' as const
18
-
19
- /**
20
- * Safely parses JSON string
21
- */
22
- function safeParseJSON(str: string): unknown | null {
23
- try {
24
- return JSON.parse(str)
25
- } catch {
26
- return null
27
- }
28
- }
29
-
30
- /**
31
- * Safely parses YAML string
32
- */
33
- function safeParseYAML(str: string): unknown | null {
34
- try {
35
- return yaml.load(str)
36
- } catch {
37
- return null
38
- }
39
- }
40
-
41
- /**
42
- * Parses OpenAPI document content (JSON or YAML)
43
- */
44
- function parseOpenAPIDocContent(str: string): unknown | null {
45
- const jsonResult = safeParseJSON(str)
46
- if (jsonResult !== null) {
47
- return jsonResult
48
- }
49
- return safeParseYAML(str)
50
- }
51
-
52
- /**
53
- * Checks if document is OpenAPI v2
54
- */
55
- function isOpenAPIV2Document(doc: unknown): doc is OpenAPIV2.Document {
56
- return (
57
- objectHasProperty(doc, 'swagger') &&
58
- typeof doc.swagger === 'string' &&
59
- doc.swagger === '2.0'
60
- )
61
- }
62
-
63
- /**
64
- * Checks if document is OpenAPI v3
65
- */
66
- function isOpenAPIV3Document(
67
- doc: unknown
68
- ): doc is OpenAPIV3.Document {
69
- return (
70
- objectHasProperty(doc, 'openapi') &&
71
- typeof doc.openapi === 'string' &&
72
- doc.openapi.startsWith('3.')
73
- )
74
- }
75
-
76
- /**
77
- * Imports OpenAPI specification from file contents or document
78
- *
79
- * @param input - OpenAPI document object or array of file contents (strings)
80
- * @returns Promise resolving to BrainfishCollection array
81
- */
82
- export async function importOpenAPISpec(
83
- input: OpenAPI.Document | string | string[]
84
- ): Promise<BrainfishCollection[]> {
85
- let docArr: unknown[]
86
-
87
- // Handle different input types
88
- if (typeof input === 'string') {
89
- // Single file content string
90
- const parsed = parseOpenAPIDocContent(input)
91
- if (!parsed) {
92
- throw new Error(IMPORTER_INVALID_FILE_FORMAT)
93
- }
94
- docArr = [parsed]
95
- } else if (Array.isArray(input)) {
96
- // Array of file content strings
97
- docArr = input
98
- .map((str) => parseOpenAPIDocContent(str))
99
- .filter((doc): doc is unknown => doc !== null)
100
-
101
- if (docArr.length === 0) {
102
- throw new Error(IMPORTER_INVALID_FILE_FORMAT)
103
- }
104
- } else {
105
- // Already a parsed OpenAPI document
106
- docArr = [input]
107
- }
108
-
109
- // Validate documents
110
- const validatedDocs: OpenAPI.Document[] = []
111
-
112
- for (const docObj of docArr) {
113
- try {
114
- // More lenient check - if it has paths, we'll try to import it
115
- const isValidOpenAPISpec =
116
- objectHasProperty(docObj, 'paths') &&
117
- (isOpenAPIV2Document(docObj) ||
118
- isOpenAPIV3Document(docObj) ||
119
- objectHasProperty(docObj, 'info'))
120
-
121
- if (!isValidOpenAPISpec) {
122
- throw new Error('INVALID_OPENAPI_SPEC')
123
- }
124
-
125
- try {
126
- const validatedDoc = await validateOpenAPISpec(docObj)
127
- validatedDocs.push(validatedDoc)
128
- } catch (validationError) {
129
- // If validation fails but it has basic OpenAPI structure, add it anyway
130
- if (objectHasProperty(docObj, 'paths')) {
131
- validatedDocs.push(docObj as OpenAPI.Document)
132
- } else {
133
- throw validationError
134
- }
135
- }
136
- } catch (err) {
137
- if (err instanceof Error && err.message === 'INVALID_OPENAPI_SPEC') {
138
- throw new Error('INVALID_OPENAPI_SPEC')
139
- }
140
- // Continue with other documents
141
- console.warn('Failed to validate document:', err)
142
- }
143
- }
144
-
145
- if (validatedDocs.length === 0) {
146
- throw new Error(IMPORTER_INVALID_FILE_FORMAT)
147
- }
148
-
149
- // Dereference documents
150
- const dereferencedDocs: OpenAPI.Document[] = []
151
-
152
- for (const docObj of validatedDocs) {
153
- try {
154
- const dereferencedDoc = await dereferenceOpenAPISpec(docObj)
155
- dereferencedDocs.push(dereferencedDoc)
156
- } catch {
157
- // Check if the document has unresolved references
158
- if (hasUnresolvedRefs(docObj)) {
159
- console.warn(
160
- 'Document contains unresolved references which may affect import quality'
161
- )
162
- }
163
-
164
- // If dereferencing fails, use the original document
165
- dereferencedDocs.push(docObj)
166
- }
167
- }
168
-
169
- // Convert to BrainfishCollections
170
- return convertOpenAPIToCollection(dereferencedDocs)
171
- }
@@ -1,278 +0,0 @@
1
- /**
2
- * OpenAPI Transformer
3
- *
4
- * Ported from Hoppscotch's openapi/index.ts
5
- * Converts OpenAPI Document to BrainfishCollection
6
- */
7
-
8
- /* eslint-disable @typescript-eslint/no-explicit-any */
9
-
10
- import type {
11
- OpenAPI,
12
- OpenAPIV2,
13
- OpenAPIV3,
14
- } from 'openapi-types'
15
- import type {
16
- BrainfishCollection,
17
- BrainfishRESTRequest,
18
- BrainfishRESTResponseOriginalRequest,
19
- } from '../../types'
20
- import {
21
- makeBrainfishCollection,
22
- makeBrainfishRESTRequest,
23
- makeBrainfishRESTResponseOriginalRequest,
24
- } from '../../factories'
25
- import { objectHasProperty, cloneDeep } from '../../utils'
26
- import { hasUnresolvedRefs } from './dereferencer'
27
- import {
28
- replaceOpenApiPathTemplating,
29
- parseOpenAPIParams,
30
- parseOpenAPIHeaders,
31
- parseOpenAPIVariables,
32
- parseOpenAPIResponses,
33
- type OpenAPIPathInfoType,
34
- type OpenAPIOperationType,
35
- } from './extractors'
36
- import { parseOpenAPIBody } from './extractors/body'
37
- import { parseOpenAPIAuth, extractSecurityHeaders, getDefaultAuth } from './extractors/auth'
38
-
39
- /**
40
- * Formats an operation name for display
41
- * Converts snake_case/kebab-case operationIds to readable Title Case
42
- * Prefers summary over operationId if available
43
- */
44
- function formatOperationName(info: any): string {
45
- const summary = info.summary?.trim()
46
- const operationId = info.operationId?.trim()
47
-
48
- // Prefer summary as it's usually more human-readable
49
- if (summary) {
50
- return summary
51
- }
52
-
53
- // If only operationId is available, convert to readable format
54
- if (operationId) {
55
- return operationId
56
- // Replace underscores and hyphens with spaces
57
- .replace(/[_-]/g, ' ')
58
- // Handle camelCase by adding space before capital letters
59
- .replace(/([a-z])([A-Z])/g, '$1 $2')
60
- // Capitalize first letter of each word
61
- .replace(/\b\w/g, (char: string) => char.toUpperCase())
62
- // Clean up multiple spaces
63
- .replace(/\s+/g, ' ')
64
- .trim()
65
- }
66
-
67
- return 'Untitled Request'
68
- }
69
-
70
- /**
71
- * Parses OpenAPI URL from document (v2 or v3)
72
- */
73
- function parseOpenAPIUrl(
74
- doc: OpenAPI.Document | OpenAPIV2.Document | OpenAPIV3.Document
75
- ): string {
76
- // OpenAPI V2 has host and basePath in document properties
77
- if (objectHasProperty(doc, 'swagger')) {
78
- const host = (doc as OpenAPIV2.Document).host?.trim() || '<<baseUrl>>'
79
- const basePath = (doc as OpenAPIV2.Document).basePath?.trim() || ''
80
- return `${host}${basePath}`
81
- }
82
-
83
- // OpenAPI V3 has servers array
84
- if (objectHasProperty(doc, 'servers')) {
85
- const serverUrl = (doc as OpenAPIV3.Document).servers?.[0]?.url
86
- return !serverUrl || serverUrl === './' ? '<<baseUrl>>' : serverUrl
87
- }
88
-
89
- // Fallback
90
- return '<<baseUrl>>'
91
- }
92
-
93
- /**
94
- * Converts an OpenAPI path to Brainfish requests
95
- */
96
- function convertPathToBrainfishReqs(
97
- doc: OpenAPI.Document,
98
- pathName: string,
99
- pathObj: OpenAPIPathInfoType
100
- ): Array<{
101
- request: BrainfishRESTRequest
102
- metadata: {
103
- tags: string[]
104
- }
105
- }> {
106
- const methods = ['get', 'head', 'post', 'put', 'delete', 'options', 'patch'] as const
107
-
108
- return methods
109
- .filter((method) => !!pathObj[method])
110
- .map((method) => {
111
- const info = pathObj[method]! as OpenAPIOperationType
112
- const openAPIUrl = parseOpenAPIUrl(doc)
113
- const openAPIPath = replaceOpenApiPathTemplating(pathName)
114
-
115
- const endpoint =
116
- openAPIUrl.endsWith('/') && openAPIPath.startsWith('/')
117
- ? openAPIUrl + openAPIPath.slice(1)
118
- : openAPIUrl + openAPIPath
119
-
120
- const params = parseOpenAPIParams(
121
- (info.parameters as any) ?? []
122
- )
123
- const baseHeaders = parseOpenAPIHeaders(
124
- (info.parameters as any) ?? []
125
- )
126
-
127
- // Get the primary auth key (handled by global auth) to exclude from additional headers
128
- const defaultAuth = getDefaultAuth(doc)
129
- const primaryAuthKey = defaultAuth?.authType === 'api-key' ? defaultAuth.key : undefined
130
-
131
- // Extract additional security headers (e.g., agent-key when access-token is primary)
132
- const securityHeaders = extractSecurityHeaders(doc, info, primaryAuthKey)
133
-
134
- // Merge headers: base headers + security headers (avoiding duplicates)
135
- const existingKeys = new Set(baseHeaders.map(h => h.key.toLowerCase()))
136
- const additionalSecurityHeaders = securityHeaders
137
- .filter(h => !existingKeys.has(h.key.toLowerCase()))
138
- .map(h => ({
139
- key: h.key,
140
- value: h.value,
141
- active: h.active,
142
- description: h.description,
143
- }))
144
-
145
- const headers = [...baseHeaders, ...additionalSecurityHeaders]
146
-
147
- const requestVariables = parseOpenAPIVariables(
148
- (info.parameters as any) ?? []
149
- )
150
- const auth = parseOpenAPIAuth(doc, info)
151
- const body = parseOpenAPIBody(doc, info)
152
-
153
- const displayName = formatOperationName(info)
154
-
155
- const originalRequest: BrainfishRESTResponseOriginalRequest =
156
- makeBrainfishRESTResponseOriginalRequest({
157
- name: displayName,
158
- method: method.toUpperCase() as any,
159
- endpoint,
160
- params,
161
- headers,
162
- body,
163
- auth,
164
- requestVariables,
165
- })
166
-
167
- const responses = parseOpenAPIResponses(doc, info, originalRequest)
168
-
169
- const request = makeBrainfishRESTRequest({
170
- name: displayName,
171
- description: (info as any).description ?? null,
172
- method: method.toUpperCase() as any,
173
- endpoint,
174
- params,
175
- headers,
176
- auth,
177
- body,
178
- requestVariables,
179
- responses,
180
- tags: (info as any).tags ?? [],
181
- operationId: (info as any).operationId ?? undefined,
182
- })
183
-
184
- return {
185
- request,
186
- metadata: {
187
- tags: (info as any).tags ?? [],
188
- },
189
- }
190
- })
191
- }
192
-
193
- /**
194
- * Converts OpenAPI documents to BrainfishCollections
195
- */
196
- export function convertOpenAPIToCollection(
197
- docs: OpenAPI.Document[]
198
- ): BrainfishCollection[] {
199
- // Check for unresolved references before conversion
200
- for (const doc of docs) {
201
- if (hasUnresolvedRefs(doc)) {
202
- console.warn(
203
- 'Document contains unresolved references which may affect import quality'
204
- )
205
- // Continue anyway to provide a best-effort import
206
- }
207
- }
208
-
209
- const collections = docs.map((doc) => {
210
- const name = doc.info.title
211
- const description = doc.info.description ?? null
212
-
213
- // Extract tag descriptions from OpenAPI spec
214
- const tagDescriptions: Record<string, string> = {}
215
- if ('tags' in doc && Array.isArray(doc.tags)) {
216
- doc.tags.forEach((tag: any) => {
217
- if (tag.name && tag.description) {
218
- tagDescriptions[tag.name] = tag.description
219
- }
220
- })
221
- }
222
-
223
- // Convert all paths to requests
224
- const paths = Object.entries(doc.paths ?? {})
225
- .map(([pathName, pathObj]) =>
226
- convertPathToBrainfishReqs(doc, pathName, pathObj as OpenAPIPathInfoType)
227
- )
228
- .flat()
229
-
230
- // Organize requests by tags
231
- const requestsByTags: Record<string, BrainfishRESTRequest[]> = {}
232
- const requestsWithoutTags: BrainfishRESTRequest[] = []
233
-
234
- paths.forEach(({ metadata, request }) => {
235
- const tags = metadata.tags
236
-
237
- if (tags.length === 0) {
238
- requestsWithoutTags.push(request)
239
- return
240
- }
241
-
242
- for (const tag of tags) {
243
- if (!requestsByTags[tag]) {
244
- requestsByTags[tag] = []
245
- }
246
-
247
- // Clone request for each tag (request can belong to multiple tags)
248
- requestsByTags[tag].push(cloneDeep(request))
249
- }
250
- })
251
-
252
- // Create folders (collections) for each tag
253
- const folders = Object.entries(requestsByTags).map(([tagName, requests]) =>
254
- makeBrainfishCollection({
255
- name: tagName,
256
- description: tagDescriptions[tagName] ?? null,
257
- requests,
258
- folders: [],
259
- variables: [],
260
- auth: { authType: 'inherit', authActive: true },
261
- headers: [],
262
- })
263
- )
264
-
265
- // Create main collection
266
- return makeBrainfishCollection({
267
- name,
268
- description,
269
- folders,
270
- requests: requestsWithoutTags,
271
- variables: [],
272
- auth: { authType: 'inherit', authActive: true },
273
- headers: [],
274
- })
275
- })
276
-
277
- return collections
278
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * OpenAPI Validator
3
- *
4
- * Ported from Hoppscotch's openapi-import-worker.ts
5
- * Converts Web Worker pattern to direct function calls for Next.js
6
- */
7
-
8
- import SwaggerParser from '@apidevtools/swagger-parser'
9
- import type { OpenAPI } from 'openapi-types'
10
-
11
- /**
12
- * Validates an OpenAPI document using SwaggerParser
13
- *
14
- * @param docs - The OpenAPI document to validate
15
- * @returns Promise resolving to validated OpenAPI document
16
- * @throws Error if validation fails
17
- */
18
- export async function validateOpenAPISpec(
19
- docs: unknown
20
- ): Promise<OpenAPI.Document> {
21
- try {
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- const validated = await SwaggerParser.validate(docs as any, {
24
- // @ts-expect-error - this is a valid option, but types may not be updated
25
- continueOnError: true,
26
- })
27
- return validated as unknown as OpenAPI.Document
28
- } catch {
29
- throw new Error('COULD_NOT_VALIDATE')
30
- }
31
- }
@@ -1,107 +0,0 @@
1
- 'use client'
2
-
3
- import { createContext, useContext, useState, useCallback, type ReactNode } from 'react'
4
- import type { PrefillData } from '@/lib/api-docs/agent/types'
5
-
6
- /** Current request payload from the playground */
7
- export interface CurrentRequestPayload {
8
- method: string
9
- endpoint: string
10
- params: Array<{ key: string; value: string; active: boolean }>
11
- headers: Array<{ key: string; value: string; active: boolean }>
12
- body: string | null
13
- bodyContentType: string | null
14
- }
15
-
16
- interface PlaygroundContextValue {
17
- /** Pending prefill data to be applied */
18
- pendingPrefill: PrefillData | null
19
- /** Set prefill data - will be consumed by playground */
20
- setPrefill: (data: PrefillData) => void
21
- /** Clear pending prefill after it's been applied */
22
- clearPrefill: () => void
23
- /** Current request payload from the playground */
24
- currentRequestPayload: CurrentRequestPayload | null
25
- /** Set current request payload - called by playground when values change */
26
- setCurrentRequestPayload: (payload: CurrentRequestPayload | null) => void
27
- /** Trigger to send request from agent */
28
- triggerSend: boolean
29
- /** Call to trigger send from agent */
30
- requestSend: () => void
31
- /** Clear send trigger after playground handles it */
32
- clearSendTrigger: () => void
33
- }
34
-
35
- const PlaygroundContext = createContext<PlaygroundContextValue | null>(null)
36
-
37
- export function PlaygroundProvider({ children }: { children: ReactNode }) {
38
- const [pendingPrefill, setPendingPrefill] = useState<PrefillData | null>(null)
39
- const [currentRequestPayload, setCurrentRequestPayloadState] = useState<CurrentRequestPayload | null>(null)
40
- const [triggerSend, setTriggerSend] = useState(false)
41
-
42
- const setPrefill = useCallback((data: PrefillData) => {
43
- setPendingPrefill(data)
44
- }, [])
45
-
46
- const clearPrefill = useCallback(() => {
47
- setPendingPrefill(null)
48
- }, [])
49
-
50
- const setCurrentRequestPayload = useCallback((payload: CurrentRequestPayload | null) => {
51
- setCurrentRequestPayloadState(payload)
52
- }, [])
53
-
54
- const requestSend = useCallback(() => {
55
- setTriggerSend(true)
56
- }, [])
57
-
58
- const clearSendTrigger = useCallback(() => {
59
- setTriggerSend(false)
60
- }, [])
61
-
62
- return (
63
- <PlaygroundContext.Provider value={{
64
- pendingPrefill,
65
- setPrefill,
66
- clearPrefill,
67
- currentRequestPayload,
68
- setCurrentRequestPayload,
69
- triggerSend,
70
- requestSend,
71
- clearSendTrigger,
72
- }}>
73
- {children}
74
- </PlaygroundContext.Provider>
75
- )
76
- }
77
-
78
- export function usePlaygroundPrefill() {
79
- const context = useContext(PlaygroundContext)
80
- if (!context) {
81
- throw new Error('usePlaygroundPrefill must be used within a PlaygroundProvider')
82
- }
83
- return context
84
- }
85
-
86
- export function useCurrentRequestPayload() {
87
- const context = useContext(PlaygroundContext)
88
- if (!context) {
89
- throw new Error('useCurrentRequestPayload must be used within a PlaygroundProvider')
90
- }
91
- return {
92
- currentRequestPayload: context.currentRequestPayload,
93
- setCurrentRequestPayload: context.setCurrentRequestPayload,
94
- }
95
- }
96
-
97
- export function useSendTrigger() {
98
- const context = useContext(PlaygroundContext)
99
- if (!context) {
100
- throw new Error('useSendTrigger must be used within a PlaygroundProvider')
101
- }
102
- return {
103
- triggerSend: context.triggerSend,
104
- requestSend: context.requestSend,
105
- clearSendTrigger: context.clearSendTrigger,
106
- }
107
- }
@@ -1,124 +0,0 @@
1
- 'use client'
2
-
3
- import { createContext, useContext, useState, useCallback, ReactNode } from 'react'
4
-
5
- // Tabs that can be navigated to
6
- export type PlaygroundTab = 'params' | 'body' | 'headers' | 'auth'
7
-
8
- // Fields that can be highlighted
9
- export type HighlightField =
10
- | { type: 'param'; key?: string }
11
- | { type: 'header'; key?: string }
12
- | { type: 'body' }
13
- | { type: 'auth'; field?: 'apiKey' | 'bearerToken' | 'basicUsername' | 'basicPassword' }
14
-
15
- interface PlaygroundNavigationState {
16
- /** Currently active tab (controlled externally) */
17
- activeTab: PlaygroundTab | null
18
- /** Field to highlight */
19
- highlightField: HighlightField | null
20
- /** Whether to show error styling on highlighted field */
21
- showError: boolean
22
- }
23
-
24
- interface PlaygroundNavigationContextType {
25
- state: PlaygroundNavigationState
26
- /** Navigate to a specific tab */
27
- navigateToTab: (tab: PlaygroundTab) => void
28
- /** Navigate to tab and highlight a field */
29
- navigateAndHighlight: (tab: PlaygroundTab, field?: HighlightField, showError?: boolean) => void
30
- /** Clear highlight */
31
- clearHighlight: () => void
32
- /** Set active tab (called by RequestTabs) */
33
- setActiveTab: (tab: PlaygroundTab) => void
34
- /** Reset navigation state (called when endpoint changes) */
35
- resetNavigation: () => void
36
- }
37
-
38
- const PlaygroundNavigationContext = createContext<PlaygroundNavigationContextType | undefined>(undefined)
39
-
40
- export function PlaygroundNavigationProvider({ children }: { children: ReactNode }) {
41
- const [state, setState] = useState<PlaygroundNavigationState>({
42
- activeTab: null,
43
- highlightField: null,
44
- showError: false,
45
- })
46
-
47
- const navigateToTab = useCallback((tab: PlaygroundTab) => {
48
- setState(prev => ({
49
- ...prev,
50
- activeTab: tab,
51
- highlightField: null,
52
- showError: false,
53
- }))
54
- }, [])
55
-
56
- const navigateAndHighlight = useCallback((
57
- tab: PlaygroundTab,
58
- field?: HighlightField,
59
- showError: boolean = true
60
- ) => {
61
- setState({
62
- activeTab: tab,
63
- highlightField: field || null,
64
- showError,
65
- })
66
-
67
- // Auto-clear highlight after a delay
68
- if (field) {
69
- setTimeout(() => {
70
- setState(prev => ({
71
- ...prev,
72
- highlightField: null,
73
- showError: false,
74
- }))
75
- }, 3000)
76
- }
77
- }, [])
78
-
79
- const clearHighlight = useCallback(() => {
80
- setState(prev => ({
81
- ...prev,
82
- highlightField: null,
83
- showError: false,
84
- }))
85
- }, [])
86
-
87
- const setActiveTab = useCallback((tab: PlaygroundTab) => {
88
- setState(prev => ({
89
- ...prev,
90
- activeTab: tab,
91
- }))
92
- }, [])
93
-
94
- const resetNavigation = useCallback(() => {
95
- setState({
96
- activeTab: null,
97
- highlightField: null,
98
- showError: false,
99
- })
100
- }, [])
101
-
102
- return (
103
- <PlaygroundNavigationContext.Provider
104
- value={{
105
- state,
106
- navigateToTab,
107
- navigateAndHighlight,
108
- clearHighlight,
109
- setActiveTab,
110
- resetNavigation,
111
- }}
112
- >
113
- {children}
114
- </PlaygroundNavigationContext.Provider>
115
- )
116
- }
117
-
118
- export function usePlaygroundNavigation() {
119
- const context = useContext(PlaygroundNavigationContext)
120
- if (context === undefined) {
121
- throw new Error('usePlaygroundNavigation must be used within a PlaygroundNavigationProvider')
122
- }
123
- return context
124
- }