@promptbook/cli 0.104.0-9 → 0.104.0

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 (335) hide show
  1. package/README.md +0 -4
  2. package/esm/index.es.js +255 -130
  3. package/esm/index.es.js.map +1 -1
  4. package/esm/typings/src/_packages/components.index.d.ts +0 -6
  5. package/esm/typings/src/_packages/core.index.d.ts +8 -6
  6. package/esm/typings/src/_packages/types.index.d.ts +8 -0
  7. package/esm/typings/src/_packages/utils.index.d.ts +2 -0
  8. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +24 -0
  9. package/esm/typings/src/book-2.0/agent-source/AgentModelRequirements.d.ts +12 -2
  10. package/esm/typings/src/book-2.0/agent-source/createAgentModelRequirements.tools.test.d.ts +1 -0
  11. package/esm/typings/src/book-2.0/utils/generatePlaceholderAgentProfileImageUrl.d.ts +1 -1
  12. package/esm/typings/src/book-components/Chat/save/_common/string_chat_format_name.d.ts +1 -1
  13. package/esm/typings/src/book-components/Chat/types/ChatMessage.d.ts +6 -3
  14. package/esm/typings/src/book-components/_common/Dropdown/Dropdown.d.ts +5 -1
  15. package/esm/typings/src/book-components/_common/HamburgerMenu/HamburgerMenu.d.ts +5 -1
  16. package/esm/typings/src/book-components/icons/AboutIcon.d.ts +5 -1
  17. package/esm/typings/src/book-components/icons/AttachmentIcon.d.ts +6 -2
  18. package/esm/typings/src/book-components/icons/CameraIcon.d.ts +6 -2
  19. package/esm/typings/src/book-components/icons/DownloadIcon.d.ts +5 -1
  20. package/esm/typings/src/book-components/icons/MenuIcon.d.ts +5 -1
  21. package/esm/typings/src/book-components/icons/SaveIcon.d.ts +6 -2
  22. package/esm/typings/src/collection/agent-collection/AgentCollection.d.ts +1 -1
  23. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +9 -7
  24. package/esm/typings/src/commands/_common/types/Command.d.ts +1 -1
  25. package/esm/typings/src/commitments/META/META_DESCRIPTION.d.ts +41 -0
  26. package/esm/typings/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +2 -2
  27. package/esm/typings/src/commitments/_base/BookCommitment.d.ts +1 -1
  28. package/esm/typings/src/config.d.ts +8 -1
  29. package/esm/typings/src/formfactors/_common/FormfactorDefinition.d.ts +1 -1
  30. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForTestingAndScriptsAndPlayground.d.ts +1 -1
  31. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForWizardOrCli.d.ts +1 -1
  32. package/esm/typings/src/llm-providers/_common/utils/count-total-usage/LlmExecutionToolsWithTotalUsage.d.ts +1 -1
  33. package/esm/typings/src/llm-providers/_common/utils/count-total-usage/countUsage.d.ts +8 -4
  34. package/esm/typings/src/llm-providers/_common/utils/count-total-usage/limitTotalUsage.d.ts +1 -1
  35. package/esm/typings/src/llm-providers/_multiple/getSingleLlmExecutionTools.d.ts +1 -1
  36. package/esm/typings/src/llm-providers/_multiple/joinLlmExecutionTools.d.ts +12 -8
  37. package/esm/typings/src/llm-providers/agent/Agent.d.ts +7 -1
  38. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +1 -1
  39. package/esm/typings/src/llm-providers/openai/utils/mapToolsToOpenAi.d.ts +8 -0
  40. package/esm/typings/src/remote-server/ui/ServerApp.d.ts +5 -1
  41. package/esm/typings/src/scrapers/_common/utils/promptbookFetch.test.d.ts +1 -0
  42. package/esm/typings/src/search-engines/SearchEngine.d.ts +9 -0
  43. package/esm/typings/src/search-engines/SearchResult.d.ts +18 -0
  44. package/esm/typings/src/search-engines/bing/BingSearchEngine.d.ts +15 -0
  45. package/esm/typings/src/search-engines/dummy/DummySearchEngine.d.ts +15 -0
  46. package/esm/typings/src/types/LlmToolDefinition.d.ts +20 -0
  47. package/esm/typings/src/types/ModelRequirements.d.ts +13 -0
  48. package/esm/typings/src/types/typeAliasEmoji.d.ts +2 -2
  49. package/esm/typings/src/utils/random/$randomAgentPersona.d.ts +7 -2
  50. package/esm/typings/src/utils/random/$randomItem.d.ts +1 -1
  51. package/esm/typings/src/utils/random/$randomSeed.d.ts +1 -1
  52. package/esm/typings/src/utils/validators/url/isValidAgentUrl.d.ts +16 -0
  53. package/esm/typings/src/utils/validators/url/isValidAgentUrl.test.d.ts +1 -0
  54. package/esm/typings/src/utils/validators/url/isValidPipelineUrl.d.ts +2 -1
  55. package/esm/typings/src/utils/validators/url/isValidUrl.d.ts +4 -3
  56. package/esm/typings/src/version.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/umd/index.umd.js +255 -130
  59. package/umd/index.umd.js.map +1 -1
  60. package/apps/agents-server/README.md +0 -3
  61. package/apps/agents-server/TODO.txt +0 -7
  62. package/apps/agents-server/config.ts +0 -128
  63. package/apps/agents-server/next.config.ts +0 -45
  64. package/apps/agents-server/package.json +0 -16
  65. package/apps/agents-server/postcss.config.mjs +0 -8
  66. package/apps/agents-server/public/.gitkeep +0 -0
  67. package/apps/agents-server/public/favicon.ico +0 -0
  68. package/apps/agents-server/public/fonts/OpenMoji-black-glyf.woff2 +0 -0
  69. package/apps/agents-server/public/fonts/OpenMoji-color-cbdt.woff2 +0 -0
  70. package/apps/agents-server/public/logo-blue-white-256.png +0 -0
  71. package/apps/agents-server/public/sw.js +0 -16
  72. package/apps/agents-server/public/swagger.json +0 -115
  73. package/apps/agents-server/scripts/generate-reserved-paths/generate-reserved-paths.ts +0 -54
  74. package/apps/agents-server/scripts/generate-reserved-paths/tsconfig.json +0 -19
  75. package/apps/agents-server/src/app/AddAgentButton.tsx +0 -67
  76. package/apps/agents-server/src/app/[agentName]/[...rest]/page.tsx +0 -11
  77. package/apps/agents-server/src/app/[agentName]/page.tsx +0 -1
  78. package/apps/agents-server/src/app/actions.ts +0 -70
  79. package/apps/agents-server/src/app/admin/api-tokens/ApiTokensClient.tsx +0 -186
  80. package/apps/agents-server/src/app/admin/api-tokens/page.tsx +0 -13
  81. package/apps/agents-server/src/app/admin/browser-test/BrowserTestClient.tsx +0 -108
  82. package/apps/agents-server/src/app/admin/browser-test/page.tsx +0 -13
  83. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +0 -561
  84. package/apps/agents-server/src/app/admin/chat-feedback/page.tsx +0 -22
  85. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +0 -591
  86. package/apps/agents-server/src/app/admin/chat-history/page.tsx +0 -21
  87. package/apps/agents-server/src/app/admin/messages/MessagesClient.tsx +0 -294
  88. package/apps/agents-server/src/app/admin/messages/page.tsx +0 -13
  89. package/apps/agents-server/src/app/admin/messages/send-email/SendEmailClient.tsx +0 -104
  90. package/apps/agents-server/src/app/admin/messages/send-email/actions.ts +0 -35
  91. package/apps/agents-server/src/app/admin/messages/send-email/page.tsx +0 -13
  92. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +0 -481
  93. package/apps/agents-server/src/app/admin/metadata/page.tsx +0 -13
  94. package/apps/agents-server/src/app/admin/models/page.tsx +0 -22
  95. package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +0 -131
  96. package/apps/agents-server/src/app/admin/users/[userId]/page.tsx +0 -21
  97. package/apps/agents-server/src/app/admin/users/page.tsx +0 -18
  98. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +0 -92
  99. package/apps/agents-server/src/app/agents/[agentName]/AgentOptionsMenu.tsx +0 -356
  100. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +0 -134
  101. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileWrapper.tsx +0 -90
  102. package/apps/agents-server/src/app/agents/[agentName]/AgentUrlCopy.tsx +0 -40
  103. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatFeedbackButton.tsx +0 -63
  104. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatHistoryButton.tsx +0 -63
  105. package/apps/agents-server/src/app/agents/[agentName]/CloneAgentButton.tsx +0 -41
  106. package/apps/agents-server/src/app/agents/[agentName]/CopyField.tsx +0 -44
  107. package/apps/agents-server/src/app/agents/[agentName]/InstallPwaButton.tsx +0 -74
  108. package/apps/agents-server/src/app/agents/[agentName]/ServiceWorkerRegister.tsx +0 -24
  109. package/apps/agents-server/src/app/agents/[agentName]/TODO.txt +0 -1
  110. package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +0 -39
  111. package/apps/agents-server/src/app/agents/[agentName]/agentLinks.tsx +0 -80
  112. package/apps/agents-server/src/app/agents/[agentName]/api/agents/route.ts +0 -58
  113. package/apps/agents-server/src/app/agents/[agentName]/api/book/route.ts +0 -90
  114. package/apps/agents-server/src/app/agents/[agentName]/api/book/test.http +0 -37
  115. package/apps/agents-server/src/app/agents/[agentName]/api/chat/route.ts +0 -194
  116. package/apps/agents-server/src/app/agents/[agentName]/api/feedback/route.ts +0 -54
  117. package/apps/agents-server/src/app/agents/[agentName]/api/mcp/route.ts +0 -198
  118. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/TODO.txt +0 -1
  119. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/route.ts +0 -55
  120. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/systemMessage/route.ts +0 -47
  121. package/apps/agents-server/src/app/agents/[agentName]/api/openai/chat/completions/route.ts +0 -10
  122. package/apps/agents-server/src/app/agents/[agentName]/api/openai/models/route.ts +0 -93
  123. package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/chat/completions/route.ts +0 -10
  124. package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/models/route.ts +0 -93
  125. package/apps/agents-server/src/app/agents/[agentName]/api/openrouter/chat/completions/route.ts +0 -10
  126. package/apps/agents-server/src/app/agents/[agentName]/api/profile/route.ts +0 -80
  127. package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +0 -184
  128. package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +0 -143
  129. package/apps/agents-server/src/app/agents/[agentName]/book/page.tsx +0 -48
  130. package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChat.tsx +0 -75
  131. package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChatComponent.tsx.todo +0 -160
  132. package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx +0 -45
  133. package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx.todo +0 -21
  134. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatWrapper.tsx +0 -68
  135. package/apps/agents-server/src/app/agents/[agentName]/chat/page.tsx +0 -45
  136. package/apps/agents-server/src/app/agents/[agentName]/code/api/route.ts +0 -68
  137. package/apps/agents-server/src/app/agents/[agentName]/code/page.tsx +0 -223
  138. package/apps/agents-server/src/app/agents/[agentName]/generateAgentMetadata.ts +0 -51
  139. package/apps/agents-server/src/app/agents/[agentName]/history/RestoreVersionButton.tsx +0 -46
  140. package/apps/agents-server/src/app/agents/[agentName]/history/actions.ts +0 -12
  141. package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +0 -69
  142. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/getAgentDefaultAvatarPrompt.ts +0 -31
  143. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/route.ts +0 -161
  144. package/apps/agents-server/src/app/agents/[agentName]/images/icon-256.png/route.tsx +0 -92
  145. package/apps/agents-server/src/app/agents/[agentName]/images/page.tsx +0 -200
  146. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-fullhd.png/route.tsx +0 -93
  147. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-phone.png/route.tsx +0 -93
  148. package/apps/agents-server/src/app/agents/[agentName]/integration/SdkCodeTabs.tsx +0 -31
  149. package/apps/agents-server/src/app/agents/[agentName]/integration/WebsiteIntegrationTabs.tsx +0 -26
  150. package/apps/agents-server/src/app/agents/[agentName]/integration/page.tsx +0 -326
  151. package/apps/agents-server/src/app/agents/[agentName]/layout.tsx +0 -41
  152. package/apps/agents-server/src/app/agents/[agentName]/links/page.tsx +0 -189
  153. package/apps/agents-server/src/app/agents/[agentName]/opengraph-image.tsx +0 -111
  154. package/apps/agents-server/src/app/agents/[agentName]/page.tsx +0 -114
  155. package/apps/agents-server/src/app/agents/[agentName]/system-message/page.tsx +0 -100
  156. package/apps/agents-server/src/app/agents/[agentName]/website-integration/page.tsx +0 -89
  157. package/apps/agents-server/src/app/agents/page.tsx +0 -11
  158. package/apps/agents-server/src/app/api/admin-email/route.ts +0 -12
  159. package/apps/agents-server/src/app/api/agents/[agentName]/clone/route.ts +0 -46
  160. package/apps/agents-server/src/app/api/agents/[agentName]/restore/route.ts +0 -20
  161. package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +0 -61
  162. package/apps/agents-server/src/app/api/agents/route.ts +0 -68
  163. package/apps/agents-server/src/app/api/api-tokens/route.ts +0 -75
  164. package/apps/agents-server/src/app/api/auth/change-password/route.ts +0 -75
  165. package/apps/agents-server/src/app/api/auth/login/route.ts +0 -27
  166. package/apps/agents-server/src/app/api/auth/logout/route.ts +0 -7
  167. package/apps/agents-server/src/app/api/browser-test/screenshot/route.ts +0 -30
  168. package/apps/agents-server/src/app/api/browser-test/scroll-facebook/route.ts +0 -62
  169. package/apps/agents-server/src/app/api/chat/route.ts +0 -32
  170. package/apps/agents-server/src/app/api/chat-feedback/[id]/route.ts +0 -38
  171. package/apps/agents-server/src/app/api/chat-feedback/export/route.ts +0 -55
  172. package/apps/agents-server/src/app/api/chat-feedback/route.ts +0 -157
  173. package/apps/agents-server/src/app/api/chat-history/[id]/route.ts +0 -37
  174. package/apps/agents-server/src/app/api/chat-history/export/route.ts +0 -55
  175. package/apps/agents-server/src/app/api/chat-history/route.ts +0 -147
  176. package/apps/agents-server/src/app/api/chat-streaming/route.ts +0 -48
  177. package/apps/agents-server/src/app/api/docs/book.md/route.ts +0 -61
  178. package/apps/agents-server/src/app/api/emails/incoming/sendgrid/route.ts +0 -48
  179. package/apps/agents-server/src/app/api/embed.js/route.ts +0 -113
  180. package/apps/agents-server/src/app/api/federated-agents/route.ts +0 -29
  181. package/apps/agents-server/src/app/api/images/[filename]/route.ts +0 -107
  182. package/apps/agents-server/src/app/api/long-running-task/route.ts +0 -7
  183. package/apps/agents-server/src/app/api/long-streaming/route.ts +0 -20
  184. package/apps/agents-server/src/app/api/messages/route.ts +0 -102
  185. package/apps/agents-server/src/app/api/metadata/route.ts +0 -115
  186. package/apps/agents-server/src/app/api/openai/v1/chat/completions/route.ts +0 -6
  187. package/apps/agents-server/src/app/api/openai/v1/models/route.ts +0 -65
  188. package/apps/agents-server/src/app/api/upload/route.ts +0 -166
  189. package/apps/agents-server/src/app/api/users/[username]/route.ts +0 -75
  190. package/apps/agents-server/src/app/api/users/route.ts +0 -71
  191. package/apps/agents-server/src/app/docs/[docId]/page.tsx +0 -42
  192. package/apps/agents-server/src/app/docs/page.tsx +0 -59
  193. package/apps/agents-server/src/app/embed/layout.tsx +0 -31
  194. package/apps/agents-server/src/app/embed/page.tsx +0 -37
  195. package/apps/agents-server/src/app/globals.css +0 -383
  196. package/apps/agents-server/src/app/humans.txt/route.ts +0 -15
  197. package/apps/agents-server/src/app/layout.tsx +0 -144
  198. package/apps/agents-server/src/app/manifest.ts +0 -114
  199. package/apps/agents-server/src/app/not-found.tsx +0 -5
  200. package/apps/agents-server/src/app/page.tsx +0 -144
  201. package/apps/agents-server/src/app/recycle-bin/RestoreAgentButton.tsx +0 -40
  202. package/apps/agents-server/src/app/recycle-bin/actions.ts +0 -33
  203. package/apps/agents-server/src/app/recycle-bin/page.tsx +0 -44
  204. package/apps/agents-server/src/app/restricted/page.tsx +0 -33
  205. package/apps/agents-server/src/app/robots.txt/route.ts +0 -15
  206. package/apps/agents-server/src/app/security.txt/route.ts +0 -15
  207. package/apps/agents-server/src/app/sitemap.xml/route.ts +0 -39
  208. package/apps/agents-server/src/app/swagger/page.tsx +0 -14
  209. package/apps/agents-server/src/app/test/og-image/README.md +0 -1
  210. package/apps/agents-server/src/app/test/og-image/opengraph-image.tsx +0 -37
  211. package/apps/agents-server/src/app/test/og-image/page.tsx +0 -22
  212. package/apps/agents-server/src/components/AgentProfile/AgentProfile.tsx +0 -264
  213. package/apps/agents-server/src/components/AgentProfile/AgentProfileFromSource.tsx +0 -23
  214. package/apps/agents-server/src/components/AgentProfile/AgentProfileImage.tsx +0 -79
  215. package/apps/agents-server/src/components/AgentProfile/AgentQrCode.tsx +0 -62
  216. package/apps/agents-server/src/components/AgentProfile/QrCodeModal.tsx +0 -89
  217. package/apps/agents-server/src/components/AgentProfile/useAgentBackground.ts +0 -97
  218. package/apps/agents-server/src/components/Auth/AuthControls.tsx +0 -124
  219. package/apps/agents-server/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx +0 -41
  220. package/apps/agents-server/src/components/ChangePasswordForm/ChangePasswordForm.tsx +0 -159
  221. package/apps/agents-server/src/components/DeletedAgentBanner.tsx +0 -26
  222. package/apps/agents-server/src/components/DocsToolbar/DocsToolbar.tsx +0 -38
  223. package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +0 -90
  224. package/apps/agents-server/src/components/ErrorPage/ErrorPage.tsx +0 -33
  225. package/apps/agents-server/src/components/Footer/Footer.tsx +0 -175
  226. package/apps/agents-server/src/components/ForbiddenPage/ForbiddenPage.tsx +0 -15
  227. package/apps/agents-server/src/components/ForgottenPasswordDialog/ForgottenPasswordDialog.tsx +0 -61
  228. package/apps/agents-server/src/components/Header/Header.tsx +0 -742
  229. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +0 -182
  230. package/apps/agents-server/src/components/Homepage/AgentsList.tsx +0 -136
  231. package/apps/agents-server/src/components/Homepage/Card.tsx +0 -18
  232. package/apps/agents-server/src/components/Homepage/DeletedAgentsList.tsx +0 -66
  233. package/apps/agents-server/src/components/Homepage/ExternalAgentsSection.tsx +0 -30
  234. package/apps/agents-server/src/components/Homepage/ExternalAgentsSectionClient.tsx +0 -192
  235. package/apps/agents-server/src/components/Homepage/ModelCard.tsx +0 -29
  236. package/apps/agents-server/src/components/Homepage/ModelsSection.tsx +0 -75
  237. package/apps/agents-server/src/components/Homepage/Section.tsx +0 -17
  238. package/apps/agents-server/src/components/Homepage/TechInfoCard.tsx +0 -20
  239. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +0 -58
  240. package/apps/agents-server/src/components/LoginDialog/LoginDialog.tsx +0 -41
  241. package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +0 -158
  242. package/apps/agents-server/src/components/NewAgentDialog/NewAgentDialog.tsx +0 -88
  243. package/apps/agents-server/src/components/NotFoundPage/NotFoundPage.tsx +0 -22
  244. package/apps/agents-server/src/components/OpenMojiIcon/OpenMojiIcon.tsx +0 -29
  245. package/apps/agents-server/src/components/Portal/Portal.tsx +0 -38
  246. package/apps/agents-server/src/components/PrintHeader/PrintHeader.tsx +0 -18
  247. package/apps/agents-server/src/components/RegisterUserDialog/RegisterUserDialog.tsx +0 -61
  248. package/apps/agents-server/src/components/UsersList/UsersList.tsx +0 -141
  249. package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +0 -139
  250. package/apps/agents-server/src/components/VercelDeploymentCard/VercelDeploymentCard.tsx +0 -57
  251. package/apps/agents-server/src/components/_utils/generateMetaTxt.ts +0 -30
  252. package/apps/agents-server/src/components/_utils/headlessParam.tsx +0 -40
  253. package/apps/agents-server/src/database/$getTableName.ts +0 -18
  254. package/apps/agents-server/src/database/$provideSupabase.ts +0 -29
  255. package/apps/agents-server/src/database/$provideSupabaseForBrowser.ts +0 -41
  256. package/apps/agents-server/src/database/$provideSupabaseForServer.ts +0 -48
  257. package/apps/agents-server/src/database/$provideSupabaseForWorker.ts +0 -43
  258. package/apps/agents-server/src/database/getMetadata.ts +0 -31
  259. package/apps/agents-server/src/database/metadataDefaults.ts +0 -93
  260. package/apps/agents-server/src/database/migrate.ts +0 -164
  261. package/apps/agents-server/src/database/migrations/2025-11-0001-initial-schema.sql +0 -161
  262. package/apps/agents-server/src/database/migrations/2025-11-0002-metadata-table.sql +0 -14
  263. package/apps/agents-server/src/database/migrations/2025-12-0010-llm-cache.sql +0 -12
  264. package/apps/agents-server/src/database/migrations/2025-12-0060-api-tokens.sql +0 -13
  265. package/apps/agents-server/src/database/migrations/2025-12-0070-chat-history-source.sql +0 -2
  266. package/apps/agents-server/src/database/migrations/2025-12-0240-agent-public-id.sql +0 -3
  267. package/apps/agents-server/src/database/migrations/2025-12-0360-agent-deleted-at.sql +0 -1
  268. package/apps/agents-server/src/database/migrations/2025-12-0370-image-table.sql +0 -19
  269. package/apps/agents-server/src/database/migrations/2025-12-0380-agent-visibility.sql +0 -1
  270. package/apps/agents-server/src/database/migrations/2025-12-0390-upload-tracking.sql +0 -20
  271. package/apps/agents-server/src/database/migrations/2025-12-0401-file-upload-status.sql +0 -13
  272. package/apps/agents-server/src/database/migrations/2025-12-0402-message-table.sql +0 -42
  273. package/apps/agents-server/src/database/migrations/2025-12-0640-openai-assistant-cache.sql +0 -12
  274. package/apps/agents-server/src/database/migrations/2025-12-0820-agent-history-permanent-id.sql +0 -29
  275. package/apps/agents-server/src/database/schema.ts +0 -511
  276. package/apps/agents-server/src/deamons/longRunningTask.ts +0 -37
  277. package/apps/agents-server/src/generated/reservedPaths.ts +0 -32
  278. package/apps/agents-server/src/message-providers/email/_common/Email.ts +0 -73
  279. package/apps/agents-server/src/message-providers/email/_common/utils/TODO.txt +0 -1
  280. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.test.ts.todo +0 -108
  281. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.ts +0 -62
  282. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.test.ts.todo +0 -117
  283. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.ts +0 -19
  284. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.test.ts.todo +0 -119
  285. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.ts +0 -19
  286. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.test.ts.todo +0 -74
  287. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.ts +0 -14
  288. package/apps/agents-server/src/message-providers/email/sendgrid/SendgridMessageProvider.ts +0 -44
  289. package/apps/agents-server/src/message-providers/email/sendgrid/parseInboundSendgridEmail.ts +0 -49
  290. package/apps/agents-server/src/message-providers/email/zeptomail/ZeptomailMessageProvider.ts +0 -51
  291. package/apps/agents-server/src/message-providers/index.ts +0 -13
  292. package/apps/agents-server/src/message-providers/interfaces/MessageProvider.ts +0 -11
  293. package/apps/agents-server/src/middleware.ts +0 -301
  294. package/apps/agents-server/src/tools/$provideAgentCollectionForServer.ts +0 -54
  295. package/apps/agents-server/src/tools/$provideBrowserForServer.ts +0 -29
  296. package/apps/agents-server/src/tools/$provideCdnForServer.ts +0 -41
  297. package/apps/agents-server/src/tools/$provideExecutionToolsForServer.ts +0 -117
  298. package/apps/agents-server/src/tools/$provideOpenAiAssistantExecutionToolsForServer.ts +0 -35
  299. package/apps/agents-server/src/tools/$provideServer.ts +0 -39
  300. package/apps/agents-server/src/utils/auth.ts +0 -133
  301. package/apps/agents-server/src/utils/authenticateUser.ts +0 -42
  302. package/apps/agents-server/src/utils/cache/SupabaseCacheStorage.ts +0 -55
  303. package/apps/agents-server/src/utils/cdn/classes/DigitalOceanSpaces.ts +0 -119
  304. package/apps/agents-server/src/utils/cdn/classes/TrackedFilesStorage.ts +0 -57
  305. package/apps/agents-server/src/utils/cdn/classes/VercelBlobStorage.ts +0 -68
  306. package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +0 -50
  307. package/apps/agents-server/src/utils/cdn/interfaces/IStorage.ts +0 -14
  308. package/apps/agents-server/src/utils/cdn/utils/getUserFileCdnKey.ts +0 -28
  309. package/apps/agents-server/src/utils/cdn/utils/nameToSubfolderPath.ts +0 -9
  310. package/apps/agents-server/src/utils/cdn/utils/nextRequestToNodeRequest.ts +0 -27
  311. package/apps/agents-server/src/utils/chatFeedbackAdmin.ts +0 -96
  312. package/apps/agents-server/src/utils/chatHistoryAdmin.ts +0 -96
  313. package/apps/agents-server/src/utils/content/extractBodyContentFromHtml.ts +0 -19
  314. package/apps/agents-server/src/utils/convertToCsv.ts +0 -31
  315. package/apps/agents-server/src/utils/getCurrentUser.ts +0 -32
  316. package/apps/agents-server/src/utils/getEffectiveFederatedServers.ts +0 -22
  317. package/apps/agents-server/src/utils/getFederatedAgents.ts +0 -89
  318. package/apps/agents-server/src/utils/getFederatedServersFromMetadata.ts +0 -10
  319. package/apps/agents-server/src/utils/getUserIdFromRequest.ts +0 -35
  320. package/apps/agents-server/src/utils/getVisibleCommitmentDefinitions.ts +0 -12
  321. package/apps/agents-server/src/utils/handleChatCompletion.ts +0 -415
  322. package/apps/agents-server/src/utils/isIpAllowed.ts +0 -101
  323. package/apps/agents-server/src/utils/isUserAdmin.ts +0 -31
  324. package/apps/agents-server/src/utils/messages/sendMessage.ts +0 -91
  325. package/apps/agents-server/src/utils/messagesAdmin.ts +0 -72
  326. package/apps/agents-server/src/utils/normalization/filenameToPrompt.test.ts +0 -36
  327. package/apps/agents-server/src/utils/normalization/filenameToPrompt.ts +0 -25
  328. package/apps/agents-server/src/utils/resolveInheritedAgentSource.ts +0 -100
  329. package/apps/agents-server/src/utils/session.ts +0 -50
  330. package/apps/agents-server/src/utils/validateApiKey.ts +0 -124
  331. package/apps/agents-server/src/utils/validators/validateMimeType.ts +0 -24
  332. package/apps/agents-server/tailwind.config.ts +0 -26
  333. package/apps/agents-server/tsconfig.json +0 -29
  334. package/apps/agents-server/vercel.json +0 -7
  335. package/esm/typings/servers.d.ts +0 -50
@@ -1,742 +0,0 @@
1
- 'use client';
2
-
3
- import promptbookLogoBlueTransparent from '@/public/logo-blue-white-256.png';
4
- import { $createAgentAction, logoutAction } from '@/src/app/actions';
5
- import { ArrowRight, ChevronDown, Lock, LogIn, LogOut, User } from 'lucide-react';
6
- import Image from 'next/image';
7
- import { useRouter } from 'next/navigation';
8
- import { ReactNode, useState } from 'react';
9
- import { AgentBasicInformation } from '../../../../../src/book-2.0/agent-source/AgentBasicInformation';
10
- import { HamburgerMenu } from '../../../../../src/book-components/_common/HamburgerMenu/HamburgerMenu';
11
- import { useMenuHoisting } from '../../../../../src/book-components/_common/MenuHoisting/MenuHoistingContext';
12
- import { just } from '../../../../../src/utils/organization/just';
13
- import type { UserInfo } from '../../utils/getCurrentUser';
14
- import { getVisibleCommitmentDefinitions } from '../../utils/getVisibleCommitmentDefinitions';
15
- import { HeadlessLink, pushWithHeadless, useIsHeadless } from '../_utils/headlessParam';
16
- import { ChangePasswordDialog } from '../ChangePasswordDialog/ChangePasswordDialog';
17
- import { LoginDialog } from '../LoginDialog/LoginDialog';
18
- import { useUsersAdmin } from '../UsersList/useUsersAdmin';
19
-
20
- type HeaderProps = {
21
- /**
22
- * Is the user an admin
23
- */
24
- isAdmin?: boolean;
25
-
26
- /**
27
- * Current user info (if logged in)
28
- */
29
- currentUser?: UserInfo | null;
30
-
31
- /**
32
- * The name of the server
33
- */
34
- serverName: string;
35
-
36
- /**
37
- * The URL of the logo displayed in the heading bar
38
- */
39
- serverLogoUrl: string | null;
40
-
41
- /**
42
- * List of agents
43
- */
44
- agents: Array<AgentBasicInformation>;
45
-
46
- /**
47
- * List of federated servers for navigation dropdown
48
- */
49
- federatedServers: Array<{ url: string; title: string; logoUrl?: string | null }>;
50
- };
51
-
52
- /* TODO: [🐱‍🚀] Make this Agents server native */
53
-
54
- type SubMenuItem = {
55
- label: ReactNode;
56
- href?: string;
57
- onClick?: () => void | Promise<void>;
58
- isBold?: boolean;
59
- isBordered?: boolean;
60
- };
61
-
62
- type MenuItem =
63
- | {
64
- type: 'link';
65
- label: ReactNode;
66
- href: string;
67
- }
68
- | {
69
- type: 'dropdown';
70
- label: ReactNode;
71
- isOpen: boolean;
72
- setIsOpen: (isOpen: boolean) => void;
73
- isMobileOpen: boolean;
74
- setIsMobileOpen: (isOpen: boolean) => void;
75
- items: Array<SubMenuItem>;
76
- };
77
-
78
- export function Header(props: HeaderProps) {
79
- const { isAdmin = false, currentUser = null, serverName, serverLogoUrl, agents, federatedServers } = props;
80
-
81
- const [isMenuOpen, setIsMenuOpen] = useState(false);
82
- const [isLoginOpen, setIsLoginOpen] = useState(false);
83
- const [isChangePasswordOpen, setIsChangePasswordOpen] = useState(false);
84
- const [isAgentsOpen, setIsAgentsOpen] = useState(false);
85
- const [isDocsOpen, setIsDocsOpen] = useState(false);
86
- const [isUsersOpen, setIsUsersOpen] = useState(false);
87
- const [isSystemOpen, setIsSystemOpen] = useState(false);
88
- const [isProfileOpen, setIsProfileOpen] = useState(false);
89
- const [isMobileAgentsOpen, setIsMobileAgentsOpen] = useState(false);
90
- const [isMobileDocsOpen, setIsMobileDocsOpen] = useState(false);
91
- const [isMobileUsersOpen, setIsMobileUsersOpen] = useState(false);
92
- const [isMobileSystemOpen, setIsMobileSystemOpen] = useState(false);
93
- const [isCreatingAgent, setIsCreatingAgent] = useState(false);
94
- const router = useRouter();
95
- const isHeadless = useIsHeadless();
96
- const menuHoisting = useMenuHoisting();
97
-
98
- const { users: adminUsers } = useUsersAdmin();
99
-
100
- const handleLogout = async () => {
101
- await logoutAction();
102
- };
103
-
104
- const handleCreateAgent = async () => {
105
- setIsCreatingAgent(true);
106
- const agentName = await $createAgentAction();
107
-
108
- if (agentName) {
109
- pushWithHeadless(router, `/agents/${agentName}`, isHeadless);
110
- setIsAgentsOpen(false);
111
- setIsMenuOpen(false);
112
- } else {
113
- router.refresh();
114
- setIsCreatingAgent(false);
115
- setIsAgentsOpen(false);
116
- setIsMenuOpen(false);
117
- }
118
- };
119
-
120
- // Federated servers dropdown items (respect logo, only current is not clickable)
121
- const [isFederatedOpen, setIsFederatedOpen] = useState(false);
122
- // const [isMobileFederatedOpen, setIsMobileFederatedOpen] = useState(false);
123
-
124
- const federatedDropdownItems: SubMenuItem[] = federatedServers.map((server) => {
125
- const isCurrent = server.url === (typeof window !== 'undefined' ? window.location.origin : '');
126
- return isCurrent
127
- ? {
128
- label: (
129
- <span className="flex items-center gap-2">
130
- {/* eslint-disable-next-line @next/next/no-img-element */}
131
- <img
132
- src={server.logoUrl || serverLogoUrl || promptbookLogoBlueTransparent.src}
133
- alt={server.title}
134
- width={20}
135
- height={20}
136
- className="w-5 h-5 object-contain rounded-full"
137
- />
138
- <span className="font-semibold">{server.title.replace(/^Federated: /, '')}</span>
139
- <span className="ml-1 text-xs text-blue-600">(current)</span>
140
- </span>
141
- ),
142
- isBold: true,
143
- isBordered: true,
144
- }
145
- : {
146
- label: (
147
- <span className="flex items-center gap-2">
148
- {/* eslint-disable-next-line @next/next/no-img-element */}
149
- <img
150
- src={server.logoUrl || promptbookLogoBlueTransparent.src}
151
- alt={server.title}
152
- width={20}
153
- height={20}
154
- className="w-5 h-5 object-contain rounded-full"
155
- />
156
- <span>{server.title.replace(/^Federated: /, '')}</span>
157
- </span>
158
- ),
159
- href: server.url,
160
- };
161
- });
162
-
163
- // Menu items configuration (DRY principle)
164
- const menuItems: MenuItem[] = [
165
- {
166
- type: 'link' as const,
167
- label: 'Home',
168
- href: '/',
169
- },
170
- {
171
- type: 'dropdown' as const,
172
- label: 'Documentation',
173
- isOpen: isDocsOpen,
174
- setIsOpen: setIsDocsOpen,
175
- isMobileOpen: isMobileDocsOpen,
176
- setIsMobileOpen: setIsMobileDocsOpen,
177
- items: [
178
- {
179
- label: 'Overview',
180
- href: '/docs',
181
- isBold: true,
182
- isBordered: true,
183
- } as SubMenuItem,
184
- {
185
- label: 'API Reference',
186
- href: '/swagger',
187
- isBold: true,
188
- isBordered: true,
189
- } as SubMenuItem,
190
- ...getVisibleCommitmentDefinitions().map(
191
- ({ primary, aliases }) =>
192
- ({
193
- label: (
194
- <>
195
- {primary.type}
196
- {aliases.length > 0 && (
197
- <span className="text-gray-400 font-normal"> / {aliases.join(' / ')}</span>
198
- )}
199
- </>
200
- ),
201
- href: `/docs/${primary.type}`,
202
- } as SubMenuItem),
203
- ),
204
- ],
205
- },
206
- ...(isAdmin
207
- ? [
208
- {
209
- type: 'dropdown' as const,
210
- label: 'Agents',
211
- isOpen: isAgentsOpen,
212
- setIsOpen: setIsAgentsOpen,
213
- isMobileOpen: isMobileAgentsOpen,
214
- setIsMobileOpen: setIsMobileAgentsOpen,
215
- items: [
216
- ...agents.map(
217
- (agent) =>
218
- ({
219
- label: agent.meta.fullname || agent.agentName,
220
- href: `/${agent.agentName}`,
221
- } as SubMenuItem),
222
- ),
223
- {
224
- label: 'View all agents',
225
- href: '/',
226
- isBold: true,
227
- isBordered: true,
228
- } as SubMenuItem,
229
- {
230
- label: isCreatingAgent ? (
231
- <div className="flex items-center">
232
- <span className="mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" />
233
- Creating agent...
234
- </div>
235
- ) : (
236
- 'Create new agent'
237
- ),
238
- onClick: isCreatingAgent ? undefined : handleCreateAgent,
239
- isBold: true,
240
- } as SubMenuItem,
241
- ],
242
- },
243
- {
244
- type: 'link' as const,
245
- label: 'Models',
246
- href: '/admin/models',
247
- },
248
- {
249
- type: 'dropdown' as const,
250
- label: 'Users',
251
- isOpen: isUsersOpen,
252
- setIsOpen: setIsUsersOpen,
253
- isMobileOpen: isMobileUsersOpen,
254
- setIsMobileOpen: setIsMobileUsersOpen,
255
- items: [
256
- ...adminUsers.map(
257
- (user) =>
258
- ({
259
- label: user.username,
260
- href: `/admin/users/${encodeURIComponent(user.username)}`,
261
- } as SubMenuItem),
262
- ),
263
- {
264
- label: 'View all users',
265
- href: '/admin/users',
266
- isBold: true,
267
- isBordered: true,
268
- } as SubMenuItem,
269
- {
270
- label: 'Create new user',
271
- href: '/admin/users#create-user',
272
- isBold: true,
273
- } as SubMenuItem,
274
- ],
275
- },
276
- {
277
- type: 'dropdown' as const,
278
- label: 'System',
279
- isOpen: isSystemOpen,
280
- setIsOpen: setIsSystemOpen,
281
- isMobileOpen: isMobileSystemOpen,
282
- setIsMobileOpen: setIsMobileSystemOpen,
283
- items: [
284
- {
285
- label: 'OpenAPI Documentation',
286
- href: '/swagger',
287
- },
288
- {
289
- label: 'API Tokens',
290
- href: '/admin/api-tokens',
291
- },
292
- {
293
- label: 'Metadata',
294
- href: '/admin/metadata',
295
- },
296
- {
297
- label: 'Chat history',
298
- href: '/admin/chat-history',
299
- },
300
- {
301
- label: 'Messages & Emails',
302
- href: '/admin/messages',
303
- },
304
- {
305
- label: 'Chat feedback',
306
- href: '/admin/chat-feedback',
307
- },
308
- {
309
- label: 'Browser',
310
- href: '/admin/browser-test',
311
- },
312
- ],
313
- },
314
- {
315
- type: 'link' as const,
316
- label: 'About',
317
- href: 'https://ptbk.io/',
318
- },
319
- ]
320
- : []),
321
- ];
322
-
323
- return (
324
- <header className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-gray-200 h-16">
325
- <LoginDialog isOpen={isLoginOpen} onClose={() => setIsLoginOpen(false)} />
326
- <ChangePasswordDialog isOpen={isChangePasswordOpen} onClose={() => setIsChangePasswordOpen(false)} />
327
- <div className="container mx-auto px-4 h-full">
328
- <div className="flex items-center justify-between h-full">
329
- {/* Logo and heading */}
330
- <HeadlessLink href="/" className="flex items-center gap-3 hover:opacity-80 transition-opacity">
331
- {serverLogoUrl ? (
332
- // Note: `next/image` does not load external images well without extra config
333
- // eslint-disable-next-line @next/next/no-img-element
334
- <img
335
- src={serverLogoUrl}
336
- alt={serverName}
337
- width={32}
338
- height={32}
339
- className="w-8 h-8 object-contain"
340
- />
341
- ) : (
342
- <Image
343
- src={promptbookLogoBlueTransparent}
344
- alt={serverName}
345
- width={32}
346
- height={32}
347
- className="w-8 h-8 object-contain"
348
- />
349
- )}
350
- <h1 className="text-xl font-bold tracking-tight text-gray-900">{serverName}</h1>
351
- </HeadlessLink>
352
-
353
- {/* Desktop Navigation */}
354
- <nav className="hidden lg:flex items-center gap-8">
355
- {/* Federated servers dropdown - only show if there are federated servers */}
356
- {federatedServers.length > 0 && (
357
- <div className="relative">
358
- <button
359
- className="flex items-center gap-1 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer"
360
- onClick={() => setIsFederatedOpen(!isFederatedOpen)}
361
- onBlur={() => setTimeout(() => setIsFederatedOpen(false), 200)}
362
- >
363
- <ChevronDown className="w-4 h-4" />
364
- <span>Switch server</span>
365
- </button>
366
- {isFederatedOpen && (
367
- <div className="absolute top-full left-0 mt-2 w-56 bg-white rounded-md shadow-lg border border-gray-100 py-1 z-50 animate-in fade-in zoom-in-95 duration-200 max-h-[80vh] overflow-y-auto">
368
- {federatedDropdownItems.map((subItem, subIndex) => {
369
- const className = `block px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 hover:text-gray-900 ${
370
- subItem.isBold ? 'font-medium' : ''
371
- } ${subItem.isBordered ? 'border-b border-gray-100' : ''}`;
372
-
373
- if (subItem.href) {
374
- return (
375
- <HeadlessLink
376
- key={subIndex}
377
- href={subItem.href}
378
- className={className}
379
- onClick={() => setIsFederatedOpen(false)}
380
- >
381
- {subItem.label}
382
- </HeadlessLink>
383
- );
384
- }
385
- return (
386
- <span key={subIndex} className={className}>
387
- {subItem.label}
388
- </span>
389
- );
390
- })}
391
- </div>
392
- )}
393
- </div>
394
- )}
395
- {menuItems.map((item, index) => {
396
- if (item.type === 'link') {
397
- return (
398
- <HeadlessLink
399
- key={index}
400
- href={item.href}
401
- className="text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer"
402
- >
403
- {item.label}
404
- </HeadlessLink>
405
- );
406
- }
407
-
408
- if (item.type === 'dropdown') {
409
- return (
410
- <div key={index} className="relative">
411
- <button
412
- className="flex items-center gap-1 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer"
413
- onClick={() => item.setIsOpen(!item.isOpen)}
414
- onBlur={() => setTimeout(() => item.setIsOpen(false), 200)}
415
- >
416
- {item.label}
417
- <ChevronDown className="w-4 h-4" />
418
- </button>
419
-
420
- {item.isOpen && (
421
- <div className="absolute top-full left-0 mt-2 w-56 bg-white rounded-md shadow-lg border border-gray-100 py-1 z-50 animate-in fade-in zoom-in-95 duration-200 max-h-[80vh] overflow-y-auto">
422
- {item.items.map((subItem, subIndex) => {
423
- const className = `block px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 hover:text-gray-900 ${
424
- subItem.isBold ? 'font-medium' : ''
425
- } ${subItem.isBordered ? 'border-b border-gray-100' : ''}`;
426
-
427
- if (subItem.onClick) {
428
- return (
429
- <button
430
- key={subIndex}
431
- onClick={subItem.onClick}
432
- className={`${className} w-full text-left`}
433
- >
434
- {subItem.label}
435
- </button>
436
- );
437
- }
438
-
439
- return (
440
- <HeadlessLink
441
- key={subIndex}
442
- href={subItem.href!}
443
- className={className}
444
- onClick={() => item.setIsOpen(false)}
445
- >
446
- {subItem.label}
447
- </HeadlessLink>
448
- );
449
- })}
450
- </div>
451
- )}
452
- </div>
453
- );
454
- }
455
-
456
- return null;
457
- })}
458
-
459
- {just(false /* TODO: [🧠] Figure out what to do with theese links */) && (
460
- <a
461
- href="https://ptbk.io/"
462
- target="_blank"
463
- className="text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors cursor-pointer"
464
- >
465
- Create your server
466
- </a>
467
- )}
468
- </nav>
469
-
470
- {/* Hoisted Menu Items */}
471
- {menuHoisting && menuHoisting.menu.length > 0 && (
472
- <div className="hidden lg:flex items-center gap-2 border-r border-gray-200 pr-4 mr-2">
473
- {menuHoisting.menu.map((item, index) => (
474
- <button
475
- key={index}
476
- onClick={item.onClick}
477
- className={`p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600 hover:text-gray-900 ${
478
- item.isActive ? 'bg-gray-100 text-gray-900' : ''
479
- }`}
480
- title={item.name}
481
- >
482
- {item.icon}
483
- </button>
484
- ))}
485
- </div>
486
- )}
487
-
488
- {/* CTA Button & Mobile Menu Toggle */}
489
- <div className="flex items-center gap-4">
490
- {just(false /* TODO: [🧠] Figure out what to do with call to action */) && (
491
- <a href="https://ptbk.io/?modal=get-started" target="_blank" className="hidden md:block">
492
- <button className="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 h-10 px-4 py-2 bg-promptbook-blue-dark text-white hover:bg-promptbook-blue-dark/90">
493
- Get Started
494
- <ArrowRight className="ml-2 w-4 h-4" />
495
- </button>
496
- </a>
497
- )}
498
-
499
- {!currentUser && !isAdmin && (
500
- <button
501
- onClick={() => {
502
- setIsLoginOpen(true);
503
- setIsMenuOpen(false);
504
- }}
505
- className="hidden lg:inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium h-10 px-4 py-2 text-gray-600 hover:text-gray-900 hover:bg-gray-100 transition-colors"
506
- >
507
- Log in
508
- <LogIn className="ml-2 w-4 h-4" />
509
- </button>
510
- )}
511
-
512
- {(currentUser || isAdmin) && (
513
- <div className="hidden lg:flex items-center gap-3">
514
- <div className="relative">
515
- <button
516
- onClick={() => setIsProfileOpen(!isProfileOpen)}
517
- onBlur={() => setTimeout(() => setIsProfileOpen(false), 200)}
518
- className="flex items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors px-3 py-2 rounded-md hover:bg-gray-50"
519
- >
520
- <div className="w-8 h-8 rounded-full bg-blue-100 flex items-center justify-center text-blue-600">
521
- <User className="w-4 h-4" />
522
- </div>
523
- <div className="flex flex-col items-start">
524
- <span className="leading-none">{currentUser?.username || 'Admin'}</span>
525
- {(currentUser?.isAdmin || isAdmin) && (
526
- <span className="text-xs text-blue-600">Admin</span>
527
- )}
528
- </div>
529
- <ChevronDown className="w-4 h-4 ml-1 opacity-50" />
530
- </button>
531
-
532
- {isProfileOpen && (
533
- <div className="absolute top-full right-0 mt-2 w-56 bg-white rounded-md shadow-lg border border-gray-100 py-1 z-50 animate-in fade-in zoom-in-95 duration-200">
534
- <div className="px-4 py-3 border-b border-gray-100">
535
- <p className="text-sm font-medium text-gray-900">
536
- {currentUser?.username || 'Admin'}
537
- </p>
538
- {(currentUser?.isAdmin || isAdmin) && (
539
- <p className="text-xs text-blue-600 mt-1">Administrator</p>
540
- )}
541
- </div>
542
-
543
- <button
544
- onClick={() => setIsChangePasswordOpen(true)}
545
- className="w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 hover:text-gray-900 flex items-center gap-2"
546
- >
547
- <Lock className="w-4 h-4" />
548
- Change Password
549
- </button>
550
-
551
- <button
552
- onClick={() => {
553
- handleLogout();
554
- setIsMenuOpen(false);
555
- }}
556
- className="w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-red-50 hover:text-red-700 flex items-center gap-2"
557
- >
558
- <LogOut className="w-4 h-4" />
559
- Log out
560
- </button>
561
- </div>
562
- )}
563
- </div>
564
- </div>
565
- )}
566
-
567
- {/* Mobile Menu Toggle */}
568
- <HamburgerMenu
569
- isOpen={isMenuOpen}
570
- onClick={() => setIsMenuOpen(!isMenuOpen)}
571
- className="lg:hidden p-2 text-gray-600 hover:text-gray-900"
572
- />
573
- </div>
574
- </div>
575
-
576
- {/* Mobile Navigation */}
577
- {isMenuOpen && (
578
- <div
579
- className="lg:hidden absolute top-16 left-0 right-0 z-50 bg-white shadow-xl py-4 border-t border-gray-100 animate-in slide-in-from-top-2 h-[calc(100vh-4rem)] overflow-y-auto"
580
- style={{
581
- backdropFilter: 'blur(20px)',
582
- WebkitBackdropFilter: 'blur(20px)',
583
- }}
584
- >
585
- <nav className="container mx-auto flex flex-col gap-4 px-6">
586
- {/* Hoisted Menu Items for Mobile */}
587
- {menuHoisting && menuHoisting.menu.length > 0 && (
588
- <div className="py-2 border-b border-gray-100 mb-2 flex gap-2 overflow-x-auto">
589
- {menuHoisting.menu.map((item, index) => (
590
- <button
591
- key={index}
592
- onClick={() => {
593
- item.onClick();
594
- setIsMenuOpen(false);
595
- }}
596
- className={`p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600 hover:text-gray-900 ${
597
- item.isActive ? 'bg-gray-100 text-gray-900' : ''
598
- }`}
599
- title={item.name}
600
- >
601
- {item.icon}
602
- <span className="sr-only">{item.name}</span>
603
- </button>
604
- ))}
605
- </div>
606
- )}
607
-
608
- {/* Login Status for Mobile */}
609
- <div className="py-2 border-b border-gray-100 mb-2">
610
- {!currentUser && !isAdmin && (
611
- <button
612
- onClick={() => {
613
- setIsLoginOpen(true);
614
- setIsMenuOpen(false);
615
- }}
616
- className="flex items-center gap-2 text-base font-medium text-gray-600 hover:text-gray-900 w-full"
617
- >
618
- <LogIn className="w-4 h-4" />
619
- Log in
620
- </button>
621
- )}
622
-
623
- {(currentUser || isAdmin) && (
624
- <div className="flex flex-col gap-3">
625
- <div className="text-sm text-gray-600">
626
- Logged in as <strong>{currentUser?.username || 'Admin'}</strong>
627
- {(currentUser?.isAdmin || isAdmin) && (
628
- <span className="ml-2 bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">
629
- Admin
630
- </span>
631
- )}
632
- </div>
633
- <button
634
- onClick={() => {
635
- setIsChangePasswordOpen(true);
636
- setIsMenuOpen(false);
637
- }}
638
- className="flex items-center gap-2 text-base font-medium text-gray-600 hover:text-gray-900 w-full"
639
- >
640
- <Lock className="w-4 h-4" />
641
- Change Password
642
- </button>
643
- <button
644
- onClick={() => {
645
- handleLogout();
646
- setIsMenuOpen(false);
647
- }}
648
- className="flex items-center gap-2 text-base font-medium text-red-600 hover:text-red-700 w-full"
649
- >
650
- <LogOut className="w-4 h-4" />
651
- Log out
652
- </button>
653
- </div>
654
- )}
655
- </div>
656
-
657
- {menuItems.map((item, index) => {
658
- if (item.type === 'link') {
659
- return (
660
- <HeadlessLink
661
- key={index}
662
- href={item.href}
663
- className="block text-base font-medium text-gray-600 hover:text-gray-900 py-2"
664
- onClick={() => setIsMenuOpen(false)}
665
- >
666
- {item.label}
667
- </HeadlessLink>
668
- );
669
- }
670
-
671
- if (item.type === 'dropdown') {
672
- return (
673
- <div key={index} className="flex flex-col">
674
- <button
675
- className="w-full flex items-center justify-between text-base font-medium text-gray-600 hover:text-gray-900 py-2"
676
- onClick={() => item.setIsMobileOpen(!item.isMobileOpen)}
677
- >
678
- {item.label}
679
- <ChevronDown
680
- className={`w-4 h-4 transition-transform duration-200 ${
681
- item.isMobileOpen ? 'rotate-180' : ''
682
- }`}
683
- />
684
- </button>
685
- {item.isMobileOpen && (
686
- <div className="pl-4 flex flex-col gap-2 border-l-2 border-gray-100 ml-1 mt-1">
687
- {item.items.map((subItem, subIndex) => {
688
- const className = `block text-sm ${
689
- subItem.isBold
690
- ? 'font-medium text-gray-900 hover:text-gray-700'
691
- : 'text-gray-600 hover:text-gray-900'
692
- } py-2`;
693
-
694
- if (subItem.onClick) {
695
- return (
696
- <button
697
- key={subIndex}
698
- className={`${className} w-full text-left`}
699
- onClick={subItem.onClick}
700
- >
701
- {subItem.label}
702
- </button>
703
- );
704
- }
705
-
706
- return (
707
- <HeadlessLink
708
- key={subIndex}
709
- href={subItem.href!}
710
- className={className}
711
- onClick={() => setIsMenuOpen(false)}
712
- >
713
- {subItem.label}
714
- </HeadlessLink>
715
- );
716
- })}
717
- </div>
718
- )}
719
- </div>
720
- );
721
- }
722
-
723
- return null;
724
- })}
725
-
726
- {just(false /* TODO: [🧠] Figure out what to do with these links */) && (
727
- <a
728
- href="https://ptbk.io/"
729
- target="_blank"
730
- className="text-base font-medium text-gray-600 hover:text-gray-900 py-2"
731
- onClick={() => setIsMenuOpen(false)}
732
- >
733
- Create your server
734
- </a>
735
- )}
736
- </nav>
737
- </div>
738
- )}
739
- </div>
740
- </header>
741
- );
742
- }