@promptbook/cli 0.103.0-8 → 0.103.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 (482) hide show
  1. package/README.md +59 -39
  2. package/apps/agents-server/README.md +3 -0
  3. package/apps/agents-server/TODO.txt +7 -0
  4. package/apps/agents-server/config.ts +130 -0
  5. package/apps/agents-server/next.config.ts +45 -0
  6. package/apps/agents-server/package-lock.json +27 -0
  7. package/apps/agents-server/package.json +12 -0
  8. package/apps/agents-server/postcss.config.mjs +8 -0
  9. package/apps/agents-server/public/.gitkeep +0 -0
  10. package/apps/agents-server/public/favicon.ico +0 -0
  11. package/apps/agents-server/public/fonts/OpenMoji-black-glyf.woff2 +0 -0
  12. package/apps/agents-server/public/fonts/download-font.js +22 -0
  13. package/apps/agents-server/public/logo-blue-white-256.png +0 -0
  14. package/apps/agents-server/public/sw.js +16 -0
  15. package/apps/agents-server/src/app/AddAgentButton.tsx +41 -0
  16. package/apps/agents-server/src/app/[agentName]/[...rest]/page.tsx +11 -0
  17. package/apps/agents-server/src/app/[agentName]/page.tsx +1 -0
  18. package/apps/agents-server/src/app/actions.ts +53 -0
  19. package/apps/agents-server/src/app/admin/api-tokens/ApiTokensClient.tsx +186 -0
  20. package/apps/agents-server/src/app/admin/api-tokens/page.tsx +13 -0
  21. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +614 -0
  22. package/apps/agents-server/src/app/admin/chat-feedback/page.tsx +22 -0
  23. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +634 -0
  24. package/apps/agents-server/src/app/admin/chat-history/page.tsx +21 -0
  25. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +477 -0
  26. package/apps/agents-server/src/app/admin/metadata/page.tsx +13 -0
  27. package/apps/agents-server/src/app/admin/models/page.tsx +22 -0
  28. package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +131 -0
  29. package/apps/agents-server/src/app/admin/users/[userId]/page.tsx +21 -0
  30. package/apps/agents-server/src/app/admin/users/page.tsx +18 -0
  31. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +78 -0
  32. package/apps/agents-server/src/app/agents/[agentName]/AgentOptionsMenu.tsx +314 -0
  33. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +91 -0
  34. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileWrapper.tsx +48 -0
  35. package/apps/agents-server/src/app/agents/[agentName]/AgentUrlCopy.tsx +40 -0
  36. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatFeedbackButton.tsx +63 -0
  37. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatHistoryButton.tsx +63 -0
  38. package/apps/agents-server/src/app/agents/[agentName]/CloneAgentButton.tsx +41 -0
  39. package/apps/agents-server/src/app/agents/[agentName]/CopyField.tsx +44 -0
  40. package/apps/agents-server/src/app/agents/[agentName]/InstallPwaButton.tsx +74 -0
  41. package/apps/agents-server/src/app/agents/[agentName]/ServiceWorkerRegister.tsx +24 -0
  42. package/apps/agents-server/src/app/agents/[agentName]/TODO.txt +1 -0
  43. package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +19 -0
  44. package/apps/agents-server/src/app/agents/[agentName]/agentLinks.tsx +80 -0
  45. package/apps/agents-server/src/app/agents/[agentName]/api/agents/route.ts +67 -0
  46. package/apps/agents-server/src/app/agents/[agentName]/api/book/route.ts +88 -0
  47. package/apps/agents-server/src/app/agents/[agentName]/api/book/test.http +37 -0
  48. package/apps/agents-server/src/app/agents/[agentName]/api/chat/route.ts +174 -0
  49. package/apps/agents-server/src/app/agents/[agentName]/api/feedback/route.ts +54 -0
  50. package/apps/agents-server/src/app/agents/[agentName]/api/mcp/route.ts +203 -0
  51. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/TODO.txt +1 -0
  52. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/route.ts +55 -0
  53. package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/systemMessage/route.ts +47 -0
  54. package/apps/agents-server/src/app/agents/[agentName]/api/openai/chat/completions/route.ts +10 -0
  55. package/apps/agents-server/src/app/agents/[agentName]/api/openai/models/route.ts +93 -0
  56. package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/chat/completions/route.ts +10 -0
  57. package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/models/route.ts +93 -0
  58. package/apps/agents-server/src/app/agents/[agentName]/api/openrouter/chat/completions/route.ts +10 -0
  59. package/apps/agents-server/src/app/agents/[agentName]/api/profile/route.ts +76 -0
  60. package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +181 -0
  61. package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +139 -0
  62. package/apps/agents-server/src/app/agents/[agentName]/book/page.tsx +35 -0
  63. package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChat.tsx +75 -0
  64. package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChatComponent.tsx.todo +160 -0
  65. package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx +32 -0
  66. package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx.todo +21 -0
  67. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatWrapper.tsx +68 -0
  68. package/apps/agents-server/src/app/agents/[agentName]/chat/page.tsx +33 -0
  69. package/apps/agents-server/src/app/agents/[agentName]/generateAgentMetadata.ts +46 -0
  70. package/apps/agents-server/src/app/agents/[agentName]/history/RestoreVersionButton.tsx +46 -0
  71. package/apps/agents-server/src/app/agents/[agentName]/history/actions.ts +12 -0
  72. package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +62 -0
  73. package/apps/agents-server/src/app/agents/[agentName]/images/icon-256.png/route.tsx +80 -0
  74. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-fullhd.png/route.tsx +92 -0
  75. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-phone.png/route.tsx +92 -0
  76. package/apps/agents-server/src/app/agents/[agentName]/integration/SdkCodeTabs.tsx +31 -0
  77. package/apps/agents-server/src/app/agents/[agentName]/integration/page.tsx +302 -0
  78. package/apps/agents-server/src/app/agents/[agentName]/layout.tsx +41 -0
  79. package/apps/agents-server/src/app/agents/[agentName]/links/page.tsx +182 -0
  80. package/apps/agents-server/src/app/agents/[agentName]/opengraph-image.tsx +102 -0
  81. package/apps/agents-server/src/app/agents/[agentName]/page.tsx +106 -0
  82. package/apps/agents-server/src/app/agents/[agentName]/website-integration/page.tsx +70 -0
  83. package/apps/agents-server/src/app/agents/page.tsx +11 -0
  84. package/apps/agents-server/src/app/api/agents/[agentName]/clone/route.ts +47 -0
  85. package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +19 -0
  86. package/apps/agents-server/src/app/api/agents/route.ts +43 -0
  87. package/apps/agents-server/src/app/api/api-tokens/route.ts +76 -0
  88. package/apps/agents-server/src/app/api/auth/change-password/route.ts +75 -0
  89. package/apps/agents-server/src/app/api/auth/login/route.ts +27 -0
  90. package/apps/agents-server/src/app/api/auth/logout/route.ts +7 -0
  91. package/apps/agents-server/src/app/api/chat/route.ts +32 -0
  92. package/apps/agents-server/src/app/api/chat-feedback/[id]/route.ts +38 -0
  93. package/apps/agents-server/src/app/api/chat-feedback/export/route.ts +55 -0
  94. package/apps/agents-server/src/app/api/chat-feedback/route.ts +157 -0
  95. package/apps/agents-server/src/app/api/chat-history/[id]/route.ts +37 -0
  96. package/apps/agents-server/src/app/api/chat-history/export/route.ts +55 -0
  97. package/apps/agents-server/src/app/api/chat-history/route.ts +147 -0
  98. package/apps/agents-server/src/app/api/chat-streaming/route.ts +48 -0
  99. package/apps/agents-server/src/app/api/embed.js/route.ts +93 -0
  100. package/apps/agents-server/src/app/api/federated-agents/route.ts +17 -0
  101. package/apps/agents-server/src/app/api/long-running-task/route.ts +7 -0
  102. package/apps/agents-server/src/app/api/long-streaming/route.ts +20 -0
  103. package/apps/agents-server/src/app/api/metadata/route.ts +116 -0
  104. package/apps/agents-server/src/app/api/openai/v1/chat/completions/route.ts +6 -0
  105. package/apps/agents-server/src/app/api/openai/v1/models/route.ts +65 -0
  106. package/apps/agents-server/src/app/api/upload/route.ts +83 -0
  107. package/apps/agents-server/src/app/api/users/[username]/route.ts +75 -0
  108. package/apps/agents-server/src/app/api/users/route.ts +71 -0
  109. package/apps/agents-server/src/app/docs/[docId]/page.tsx +43 -0
  110. package/apps/agents-server/src/app/docs/page.tsx +59 -0
  111. package/apps/agents-server/src/app/embed/page.tsx +24 -0
  112. package/apps/agents-server/src/app/globals.css +276 -0
  113. package/apps/agents-server/src/app/humans.txt/route.ts +15 -0
  114. package/apps/agents-server/src/app/layout.tsx +139 -0
  115. package/apps/agents-server/src/app/manifest.ts +114 -0
  116. package/apps/agents-server/src/app/not-found.tsx +5 -0
  117. package/apps/agents-server/src/app/page.tsx +96 -0
  118. package/apps/agents-server/src/app/recycle-bin/RestoreAgentButton.tsx +40 -0
  119. package/apps/agents-server/src/app/recycle-bin/actions.ts +27 -0
  120. package/apps/agents-server/src/app/recycle-bin/page.tsx +58 -0
  121. package/apps/agents-server/src/app/restricted/page.tsx +33 -0
  122. package/apps/agents-server/src/app/robots.txt/route.ts +15 -0
  123. package/apps/agents-server/src/app/security.txt/route.ts +15 -0
  124. package/apps/agents-server/src/app/sitemap.xml/route.ts +37 -0
  125. package/apps/agents-server/src/app/test/og-image/README.md +1 -0
  126. package/apps/agents-server/src/app/test/og-image/opengraph-image.tsx +37 -0
  127. package/apps/agents-server/src/app/test/og-image/page.tsx +22 -0
  128. package/apps/agents-server/src/components/AgentProfile/AgentProfile.tsx +339 -0
  129. package/apps/agents-server/src/components/AgentProfile/AgentProfileFromSource.tsx +23 -0
  130. package/apps/agents-server/src/components/AgentProfile/AgentQrCode.tsx +62 -0
  131. package/apps/agents-server/src/components/AgentProfile/QrCodeModal.tsx +90 -0
  132. package/apps/agents-server/src/components/Auth/AuthControls.tsx +123 -0
  133. package/apps/agents-server/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx +41 -0
  134. package/apps/agents-server/src/components/ChangePasswordForm/ChangePasswordForm.tsx +159 -0
  135. package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +88 -0
  136. package/apps/agents-server/src/components/ErrorPage/ErrorPage.tsx +33 -0
  137. package/apps/agents-server/src/components/Footer/Footer.tsx +175 -0
  138. package/apps/agents-server/src/components/ForbiddenPage/ForbiddenPage.tsx +15 -0
  139. package/apps/agents-server/src/components/Header/Header.tsx +668 -0
  140. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +60 -0
  141. package/apps/agents-server/src/components/Homepage/AgentsList.tsx +58 -0
  142. package/apps/agents-server/src/components/Homepage/Card.tsx +18 -0
  143. package/apps/agents-server/src/components/Homepage/ExternalAgentsSection.tsx +21 -0
  144. package/apps/agents-server/src/components/Homepage/ExternalAgentsSectionClient.tsx +183 -0
  145. package/apps/agents-server/src/components/Homepage/ModelCard.tsx +29 -0
  146. package/apps/agents-server/src/components/Homepage/ModelsSection.tsx +75 -0
  147. package/apps/agents-server/src/components/Homepage/Section.tsx +17 -0
  148. package/apps/agents-server/src/components/Homepage/TechInfoCard.tsx +20 -0
  149. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +57 -0
  150. package/apps/agents-server/src/components/LoginDialog/LoginDialog.tsx +41 -0
  151. package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +109 -0
  152. package/apps/agents-server/src/components/NotFoundPage/NotFoundPage.tsx +17 -0
  153. package/apps/agents-server/src/components/OpenMojiIcon/OpenMojiIcon.tsx +20 -0
  154. package/apps/agents-server/src/components/Portal/Portal.tsx +38 -0
  155. package/apps/agents-server/src/components/PrintButton/PrintButton.tsx +18 -0
  156. package/apps/agents-server/src/components/PrintHeader/PrintHeader.tsx +18 -0
  157. package/apps/agents-server/src/components/UsersList/UsersList.tsx +141 -0
  158. package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +139 -0
  159. package/apps/agents-server/src/components/VercelDeploymentCard/VercelDeploymentCard.tsx +55 -0
  160. package/apps/agents-server/src/components/_utils/generateMetaTxt.ts +28 -0
  161. package/apps/agents-server/src/components/_utils/headlessParam.tsx +36 -0
  162. package/apps/agents-server/src/database/$getTableName.ts +18 -0
  163. package/apps/agents-server/src/database/$provideSupabase.ts +29 -0
  164. package/apps/agents-server/src/database/$provideSupabaseForBrowser.ts +41 -0
  165. package/apps/agents-server/src/database/$provideSupabaseForServer.ts +48 -0
  166. package/apps/agents-server/src/database/$provideSupabaseForWorker.ts +43 -0
  167. package/apps/agents-server/src/database/getMetadata.ts +31 -0
  168. package/apps/agents-server/src/database/metadataDefaults.ts +75 -0
  169. package/apps/agents-server/src/database/migrate.ts +131 -0
  170. package/apps/agents-server/src/database/migrations/2025-11-0001-initial-schema.sql +163 -0
  171. package/apps/agents-server/src/database/migrations/2025-11-0002-metadata-table.sql +16 -0
  172. package/apps/agents-server/src/database/migrations/2025-12-0010-llm-cache.sql +12 -0
  173. package/apps/agents-server/src/database/migrations/2025-12-0060-api-tokens.sql +13 -0
  174. package/apps/agents-server/src/database/migrations/2025-12-0070-chat-history-source.sql +2 -0
  175. package/apps/agents-server/src/database/schema.ts +308 -0
  176. package/apps/agents-server/src/deamons/longRunningTask.ts +37 -0
  177. package/apps/agents-server/src/middleware.ts +305 -0
  178. package/apps/agents-server/src/tools/$provideAgentCollectionForServer.ts +54 -0
  179. package/apps/agents-server/src/tools/$provideCdnForServer.ts +36 -0
  180. package/apps/agents-server/src/tools/$provideExecutionToolsForServer.ts +117 -0
  181. package/apps/agents-server/src/tools/$provideOpenAiAssistantExecutionToolsForServer.ts +35 -0
  182. package/apps/agents-server/src/tools/$provideServer.ts +39 -0
  183. package/apps/agents-server/src/utils/auth.ts +33 -0
  184. package/apps/agents-server/src/utils/authenticateUser.ts +42 -0
  185. package/apps/agents-server/src/utils/cache/SupabaseCacheStorage.ts +55 -0
  186. package/apps/agents-server/src/utils/cdn/classes/DigitalOceanSpaces.ts +119 -0
  187. package/apps/agents-server/src/utils/cdn/classes/VercelBlobStorage.ts +64 -0
  188. package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +32 -0
  189. package/apps/agents-server/src/utils/cdn/interfaces/IStorage.ts +14 -0
  190. package/apps/agents-server/src/utils/cdn/utils/getUserFileCdnKey.ts +28 -0
  191. package/apps/agents-server/src/utils/cdn/utils/nameToSubfolderPath.ts +9 -0
  192. package/apps/agents-server/src/utils/cdn/utils/nextRequestToNodeRequest.ts +27 -0
  193. package/apps/agents-server/src/utils/chatFeedbackAdmin.ts +96 -0
  194. package/apps/agents-server/src/utils/chatHistoryAdmin.ts +96 -0
  195. package/apps/agents-server/src/utils/convertToCsv.ts +31 -0
  196. package/apps/agents-server/src/utils/getCurrentUser.ts +32 -0
  197. package/apps/agents-server/src/utils/getEffectiveFederatedServers.ts +22 -0
  198. package/apps/agents-server/src/utils/getFederatedAgents.ts +89 -0
  199. package/apps/agents-server/src/utils/getFederatedServersFromMetadata.ts +10 -0
  200. package/apps/agents-server/src/utils/getVisibleCommitmentDefinitions.ts +12 -0
  201. package/apps/agents-server/src/utils/handleChatCompletion.ts +355 -0
  202. package/apps/agents-server/src/utils/isIpAllowed.ts +101 -0
  203. package/apps/agents-server/src/utils/isUserAdmin.ts +31 -0
  204. package/apps/agents-server/src/utils/resolveInheritedAgentSource.ts +100 -0
  205. package/apps/agents-server/src/utils/session.ts +50 -0
  206. package/apps/agents-server/src/utils/validateApiKey.ts +128 -0
  207. package/apps/agents-server/src/utils/validators/validateMimeType.ts +24 -0
  208. package/apps/agents-server/tailwind.config.ts +26 -0
  209. package/apps/agents-server/tsconfig.json +29 -0
  210. package/apps/agents-server/vercel.json +7 -0
  211. package/esm/index.es.js +5406 -443
  212. package/esm/index.es.js.map +1 -1
  213. package/esm/typings/books/index.d.ts +0 -81
  214. package/esm/typings/servers.d.ts +9 -7
  215. package/esm/typings/src/_packages/browser.index.d.ts +6 -0
  216. package/esm/typings/src/_packages/cli.index.d.ts +4 -0
  217. package/esm/typings/src/_packages/components.index.d.ts +22 -8
  218. package/esm/typings/src/_packages/core.index.d.ts +58 -18
  219. package/esm/typings/src/_packages/node.index.d.ts +2 -2
  220. package/esm/typings/src/_packages/remote-server.index.d.ts +2 -0
  221. package/esm/typings/src/_packages/types.index.d.ts +70 -8
  222. package/esm/typings/src/_packages/utils.index.d.ts +6 -0
  223. package/esm/typings/src/_packages/wizard.index.d.ts +4 -0
  224. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +20 -5
  225. package/esm/typings/src/book-2.0/agent-source/AgentModelRequirements.d.ts +17 -1
  226. package/esm/typings/src/book-2.0/agent-source/AgentSourceParseResult.d.ts +3 -2
  227. package/esm/typings/src/book-2.0/agent-source/computeAgentHash.d.ts +8 -0
  228. package/esm/typings/src/book-2.0/agent-source/createCommitmentRegex.d.ts +3 -3
  229. package/esm/typings/src/book-2.0/agent-source/createDefaultAgentName.d.ts +8 -0
  230. package/esm/typings/src/book-2.0/agent-source/normalizeAgentName.d.ts +9 -0
  231. package/esm/typings/src/book-2.0/agent-source/padBook.d.ts +18 -0
  232. package/esm/typings/src/book-2.0/agent-source/parseAgentSourceWithCommitments.d.ts +1 -1
  233. package/esm/typings/src/book-2.0/agent-source/string_book.d.ts +3 -0
  234. package/esm/typings/src/book-components/AvatarProfile/AvatarProfile/AvatarProfile.d.ts +6 -1
  235. package/esm/typings/src/book-components/BookEditor/BookEditor.d.ts +85 -14
  236. package/esm/typings/src/book-components/BookEditor/BookEditorActionbar.d.ts +18 -0
  237. package/esm/typings/src/book-components/BookEditor/BookEditorMonaco.d.ts +5 -0
  238. package/esm/typings/src/book-components/Chat/AgentChat/AgentChat.d.ts +17 -0
  239. package/esm/typings/src/book-components/Chat/AgentChat/AgentChatProps.d.ts +13 -0
  240. package/esm/typings/src/book-components/Chat/Chat/ChatProps.d.ts +16 -0
  241. package/esm/typings/src/book-components/Chat/LlmChat/LlmChatProps.d.ts +5 -0
  242. package/esm/typings/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +15 -0
  243. package/esm/typings/src/book-components/Chat/MockedChat/MockedChat.d.ts +5 -0
  244. package/esm/typings/src/book-components/Chat/save/_common/ChatSaveFormatDefinition.d.ts +1 -1
  245. package/esm/typings/src/book-components/Chat/save/html/htmlSaveFormatDefinition.d.ts +1 -0
  246. package/esm/typings/src/book-components/Chat/save/pdf/pdfSaveFormatDefinition.d.ts +4 -0
  247. package/esm/typings/src/book-components/Chat/types/ChatParticipant.d.ts +1 -1
  248. package/esm/typings/src/book-components/PromptbookAgent/PromptbookAgentIntegration.d.ts +52 -0
  249. package/esm/typings/src/book-components/PromptbookAgent/PromptbookAgentSeamlessIntegration.d.ts +14 -0
  250. package/esm/typings/src/book-components/Qr/BrandedQrCode.d.ts +18 -0
  251. package/esm/typings/src/book-components/Qr/GenericQrCode.d.ts +10 -0
  252. package/esm/typings/src/book-components/Qr/PromptbookQrCode.d.ts +18 -0
  253. package/esm/typings/src/book-components/Qr/useQrCode.d.ts +15 -0
  254. package/esm/typings/src/book-components/_common/Dropdown/Dropdown.d.ts +15 -0
  255. package/esm/typings/src/book-components/_common/HamburgerMenu/HamburgerMenu.d.ts +12 -0
  256. package/esm/typings/src/book-components/_common/Modal/Modal.d.ts +2 -2
  257. package/esm/typings/src/book-components/_common/Tooltip/Tooltip.d.ts +47 -0
  258. package/esm/typings/src/book-components/icons/AboutIcon.d.ts +9 -0
  259. package/esm/typings/src/book-components/icons/CameraIcon.d.ts +11 -0
  260. package/esm/typings/src/book-components/icons/CloseIcon.d.ts +4 -8
  261. package/esm/typings/src/book-components/icons/DownloadIcon.d.ts +9 -0
  262. package/esm/typings/src/book-components/icons/ExitFullscreenIcon.d.ts +7 -0
  263. package/esm/typings/src/book-components/icons/FullscreenIcon.d.ts +7 -0
  264. package/esm/typings/src/book-components/icons/MenuIcon.d.ts +12 -0
  265. package/esm/typings/src/book-components/icons/MicIcon.d.ts +8 -0
  266. package/esm/typings/src/book-components/icons/SendIcon.d.ts +3 -0
  267. package/esm/typings/src/cli/cli-commands/_boilerplate.d.ts +2 -1
  268. package/esm/typings/src/cli/cli-commands/about.d.ts +3 -1
  269. package/esm/typings/src/cli/cli-commands/hello.d.ts +2 -1
  270. package/esm/typings/src/cli/cli-commands/list-models.d.ts +2 -1
  271. package/esm/typings/src/cli/cli-commands/list-scrapers.d.ts +2 -1
  272. package/esm/typings/src/cli/cli-commands/login.d.ts +2 -1
  273. package/esm/typings/src/cli/cli-commands/make.d.ts +2 -1
  274. package/esm/typings/src/cli/cli-commands/prettify.d.ts +2 -1
  275. package/esm/typings/src/cli/cli-commands/run.d.ts +2 -1
  276. package/esm/typings/src/cli/cli-commands/{start-server.d.ts → start-agents-server.d.ts} +3 -2
  277. package/esm/typings/src/cli/cli-commands/start-pipelines-server.d.ts +15 -0
  278. package/esm/typings/src/cli/cli-commands/test-command.d.ts +2 -1
  279. package/esm/typings/src/cli/common/$addGlobalOptionsToCommand.d.ts +2 -1
  280. package/esm/typings/src/collection/agent-collection/AgentCollection.d.ts +12 -0
  281. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +75 -0
  282. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabaseOptions.d.ts +10 -0
  283. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentsDatabaseSchema.d.ts +154 -0
  284. package/esm/typings/src/collection/{PipelineCollection.d.ts → pipeline-collection/PipelineCollection.d.ts} +7 -3
  285. package/esm/typings/src/collection/{SimplePipelineCollection.d.ts → pipeline-collection/SimplePipelineCollection.d.ts} +5 -5
  286. package/esm/typings/src/collection/{constructors/createCollectionFromDirectory.d.ts → pipeline-collection/constructors/createPipelineCollectionFromDirectory.d.ts} +8 -11
  287. package/esm/typings/src/collection/pipeline-collection/constructors/createPipelineCollectionFromJson.d.ts +13 -0
  288. package/esm/typings/src/collection/{constructors/createCollectionFromPromise.d.ts → pipeline-collection/constructors/createPipelineCollectionFromPromise.d.ts} +6 -5
  289. package/esm/typings/src/collection/pipeline-collection/constructors/createPipelineCollectionFromPromise.test.d.ts +1 -0
  290. package/esm/typings/src/collection/{constructors/createCollectionFromUrl.d.ts → pipeline-collection/constructors/createPipelineCollectionFromUrl.d.ts} +3 -3
  291. package/esm/typings/src/collection/{constructors/createSubcollection.d.ts → pipeline-collection/constructors/createPipelineSubcollection.d.ts} +3 -3
  292. package/esm/typings/src/collection/pipeline-collection/pipelineCollectionToJson.d.ts +13 -0
  293. package/esm/typings/src/commands/_common/types/CommandParser.d.ts +4 -5
  294. package/esm/typings/src/{book-2.0/commitments → commitments}/ACTION/ACTION.d.ts +5 -1
  295. package/esm/typings/src/commitments/CLOSED/CLOSED.d.ts +39 -0
  296. package/esm/typings/src/commitments/CLOSED/CLOSED.test.d.ts +4 -0
  297. package/esm/typings/src/commitments/COMPONENT/COMPONENT.d.ts +28 -0
  298. package/esm/typings/src/{book-2.0/commitments → commitments}/DELETE/DELETE.d.ts +5 -1
  299. package/esm/typings/src/{book-2.0/commitments → commitments}/FORMAT/FORMAT.d.ts +5 -1
  300. package/esm/typings/src/commitments/FROM/FROM.d.ts +34 -0
  301. package/esm/typings/src/{book-2.0/commitments → commitments}/GOAL/GOAL.d.ts +5 -1
  302. package/esm/typings/src/{book-2.0/commitments → commitments}/KNOWLEDGE/KNOWLEDGE.d.ts +5 -5
  303. package/esm/typings/src/commitments/LANGUAGE/LANGUAGE.d.ts +35 -0
  304. package/esm/typings/src/{book-2.0/commitments → commitments}/MEMORY/MEMORY.d.ts +5 -1
  305. package/esm/typings/src/commitments/MESSAGE/AgentMessageCommitmentDefinition.d.ts +32 -0
  306. package/esm/typings/src/commitments/MESSAGE/InitialMessageCommitmentDefinition.d.ts +32 -0
  307. package/esm/typings/src/{book-2.0/commitments → commitments}/MESSAGE/MESSAGE.d.ts +5 -1
  308. package/esm/typings/src/commitments/MESSAGE/UserMessageCommitmentDefinition.d.ts +32 -0
  309. package/esm/typings/src/{book-2.0/commitments → commitments}/META/META.d.ts +5 -1
  310. package/esm/typings/src/commitments/META_COLOR/META_COLOR.d.ts +48 -0
  311. package/esm/typings/src/commitments/META_FONT/META_FONT.d.ts +42 -0
  312. package/esm/typings/src/{book-2.0/commitments → commitments}/META_IMAGE/META_IMAGE.d.ts +5 -1
  313. package/esm/typings/src/{book-2.0/commitments → commitments}/META_LINK/META_LINK.d.ts +5 -1
  314. package/esm/typings/src/{book-2.0/commitments → commitments}/MODEL/MODEL.d.ts +5 -1
  315. package/esm/typings/src/{book-2.0/commitments → commitments}/NOTE/NOTE.d.ts +5 -1
  316. package/esm/typings/src/commitments/OPEN/OPEN.d.ts +35 -0
  317. package/esm/typings/src/{book-2.0/commitments → commitments}/PERSONA/PERSONA.d.ts +5 -1
  318. package/esm/typings/src/{book-2.0/commitments → commitments}/RULE/RULE.d.ts +5 -1
  319. package/esm/typings/src/{book-2.0/commitments → commitments}/SAMPLE/SAMPLE.d.ts +5 -1
  320. package/esm/typings/src/{book-2.0/commitments → commitments}/SCENARIO/SCENARIO.d.ts +5 -1
  321. package/esm/typings/src/{book-2.0/commitments → commitments}/STYLE/STYLE.d.ts +5 -1
  322. package/esm/typings/src/commitments/USE/USE.d.ts +53 -0
  323. package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.d.ts +42 -0
  324. package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.test.d.ts +1 -0
  325. package/esm/typings/src/commitments/USE_MCP/USE_MCP.d.ts +37 -0
  326. package/esm/typings/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +38 -0
  327. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BaseCommitmentDefinition.d.ts +14 -2
  328. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/CommitmentDefinition.d.ts +6 -1
  329. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/NotYetImplementedCommitmentDefinition.d.ts +5 -1
  330. package/esm/typings/src/{book-2.0/commitments → commitments}/_base/createEmptyAgentModelRequirements.d.ts +1 -1
  331. package/esm/typings/src/commitments/index.d.ts +93 -0
  332. package/esm/typings/src/config.d.ts +24 -3
  333. package/esm/typings/src/conversion/validation/validatePipeline.d.ts +2 -0
  334. package/esm/typings/src/errors/0-index.d.ts +6 -0
  335. package/esm/typings/src/errors/DatabaseError.d.ts +12 -0
  336. package/esm/typings/src/errors/NotAllowed.d.ts +9 -0
  337. package/esm/typings/src/errors/WrappedError.d.ts +2 -2
  338. package/esm/typings/src/execution/AvailableModel.d.ts +1 -0
  339. package/esm/typings/src/execution/Executables.d.ts +3 -0
  340. package/esm/typings/src/execution/ExecutionTask.d.ts +12 -3
  341. package/esm/typings/src/execution/ExecutionTools.d.ts +5 -0
  342. package/esm/typings/src/execution/FilesystemTools.d.ts +1 -1
  343. package/esm/typings/src/execution/LlmExecutionTools.d.ts +26 -2
  344. package/esm/typings/src/execution/PromptResult.d.ts +7 -1
  345. package/esm/typings/src/execution/createPipelineExecutor/10-executePipeline.d.ts +5 -0
  346. package/esm/typings/src/execution/createPipelineExecutor/20-executeTask.d.ts +5 -0
  347. package/esm/typings/src/execution/createPipelineExecutor/30-executeFormatSubvalues.d.ts +5 -0
  348. package/esm/typings/src/execution/createPipelineExecutor/40-executeAttempts.d.ts +5 -0
  349. package/esm/typings/src/execution/utils/usage-constants.d.ts +4 -124
  350. package/esm/typings/src/execution/utils/validatePromptResult.d.ts +2 -0
  351. package/esm/typings/src/high-level-abstractions/_common/HighLevelAbstraction.d.ts +2 -1
  352. package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForWizardOrCli.d.ts +2 -2
  353. package/esm/typings/src/llm-providers/_common/register/$registeredLlmToolsMessage.d.ts +2 -1
  354. package/esm/typings/src/llm-providers/_common/register/LlmToolsMetadata.d.ts +1 -1
  355. package/esm/typings/src/llm-providers/_common/utils/assertUniqueModels.d.ts +12 -0
  356. package/esm/typings/src/llm-providers/_multiple/getSingleLlmExecutionTools.d.ts +1 -0
  357. package/esm/typings/src/llm-providers/_multiple/joinLlmExecutionTools.d.ts +1 -0
  358. package/esm/typings/src/llm-providers/agent/Agent.d.ts +72 -0
  359. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +26 -4
  360. package/esm/typings/src/llm-providers/agent/AgentOptions.d.ts +19 -0
  361. package/esm/typings/src/llm-providers/agent/CreateAgentLlmExecutionToolsOptions.d.ts +17 -0
  362. package/esm/typings/src/llm-providers/agent/RemoteAgent.d.ts +50 -0
  363. package/esm/typings/src/llm-providers/agent/RemoteAgentOptions.d.ts +11 -0
  364. package/esm/typings/src/llm-providers/agent/createAgentLlmExecutionTools.d.ts +1 -19
  365. package/esm/typings/src/llm-providers/anthropic-claude/anthropic-claude-models.d.ts +1 -1
  366. package/esm/typings/src/llm-providers/google/google-models.d.ts +1 -1
  367. package/esm/typings/src/llm-providers/ollama/OllamaExecutionTools.d.ts +4 -0
  368. package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionTools.d.ts +60 -2
  369. package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionToolsOptions.d.ts +7 -1
  370. package/esm/typings/src/llm-providers/openai/OpenAiCompatibleExecutionTools.d.ts +13 -1
  371. package/esm/typings/src/llm-providers/openai/OpenAiExecutionTools.d.ts +4 -0
  372. package/esm/typings/src/llm-providers/openai/createOpenAiCompatibleExecutionTools.d.ts +6 -6
  373. package/esm/typings/src/llm-providers/openai/openai-models.d.ts +1 -1
  374. package/esm/typings/src/llm-providers/openai/openai-models.test.d.ts +4 -0
  375. package/esm/typings/src/other/templates/getTemplatesPipelineCollection.d.ts +1 -1
  376. package/esm/typings/src/pipeline/validatePipelineString.d.ts +2 -0
  377. package/esm/typings/src/playground/permanent/_boilerplate.d.ts +5 -0
  378. package/esm/typings/src/playground/permanent/agent-with-browser-playground.d.ts +5 -0
  379. package/esm/typings/src/prepare/PrepareAndScrapeOptions.d.ts +1 -0
  380. package/esm/typings/src/remote-server/startAgentServer.d.ts +26 -0
  381. package/esm/typings/src/remote-server/startRemoteServer.d.ts +4 -1
  382. package/esm/typings/src/remote-server/types/RemoteServerOptions.d.ts +3 -8
  383. package/esm/typings/src/scrapers/_boilerplate/createBoilerplateScraper.d.ts +1 -12
  384. package/esm/typings/src/scrapers/_boilerplate/register-metadata.d.ts +1 -9
  385. package/esm/typings/src/scrapers/document/createDocumentScraper.d.ts +1 -12
  386. package/esm/typings/src/scrapers/document/register-metadata.d.ts +1 -9
  387. package/esm/typings/src/scrapers/document-legacy/createLegacyDocumentScraper.d.ts +1 -12
  388. package/esm/typings/src/scrapers/document-legacy/register-metadata.d.ts +1 -9
  389. package/esm/typings/src/scrapers/markdown/createMarkdownScraper.d.ts +1 -12
  390. package/esm/typings/src/scrapers/markdown/register-metadata.d.ts +1 -9
  391. package/esm/typings/src/scrapers/markitdown/createMarkitdownScraper.d.ts +1 -12
  392. package/esm/typings/src/scrapers/markitdown/register-metadata.d.ts +1 -9
  393. package/esm/typings/src/scrapers/pdf/createPdfScraper.d.ts +1 -12
  394. package/esm/typings/src/scrapers/pdf/register-metadata.d.ts +1 -9
  395. package/esm/typings/src/scrapers/website/createWebsiteScraper.d.ts +1 -12
  396. package/esm/typings/src/scrapers/website/register-metadata.d.ts +1 -9
  397. package/esm/typings/src/storage/_common/PromptbookStorage.d.ts +1 -0
  398. package/esm/typings/src/storage/env-storage/$EnvStorage.d.ts +2 -1
  399. package/esm/typings/src/transpilers/_common/BookTranspiler.d.ts +33 -0
  400. package/esm/typings/src/transpilers/_common/BookTranspilerOptions.d.ts +18 -0
  401. package/esm/typings/src/transpilers/_common/register/$bookTranspilersRegister.d.ts +15 -0
  402. package/esm/typings/src/transpilers/formatted-book-in-markdown/FormattedBookInMarkdownTranspiler.d.ts +16 -0
  403. package/esm/typings/src/transpilers/formatted-book-in-markdown/register.d.ts +15 -0
  404. package/esm/typings/src/transpilers/openai-sdk/OpenAiSdkTranspiler.d.ts +16 -0
  405. package/esm/typings/src/transpilers/openai-sdk/OpenAiSdkTranspiler.test.d.ts +1 -0
  406. package/esm/typings/src/transpilers/openai-sdk/playground/playground.d.ts +5 -0
  407. package/esm/typings/src/transpilers/openai-sdk/register.d.ts +15 -0
  408. package/esm/typings/src/types/LlmCall.d.ts +20 -0
  409. package/esm/typings/src/types/ModelRequirements.d.ts +13 -1
  410. package/esm/typings/src/types/ModelVariant.d.ts +1 -1
  411. package/esm/typings/src/types/Prompt.d.ts +13 -1
  412. package/esm/typings/src/types/Updatable.d.ts +19 -0
  413. package/esm/typings/src/types/typeAliases.d.ts +38 -2
  414. package/esm/typings/src/utils/color/$randomColor.d.ts +1 -0
  415. package/esm/typings/src/utils/color/Color.d.ts +16 -1
  416. package/esm/typings/src/utils/color/Color.test.d.ts +1 -0
  417. package/esm/typings/src/utils/color/css-colors.d.ts +1 -0
  418. package/esm/typings/src/utils/color/internal-utils/checkChannelValue.d.ts +0 -3
  419. package/esm/typings/src/utils/color/operators/darken.d.ts +1 -1
  420. package/esm/typings/src/utils/color/operators/grayscale.d.ts +1 -1
  421. package/esm/typings/src/utils/color/operators/lighten.d.ts +1 -1
  422. package/esm/typings/src/utils/color/operators/mixWithColor.d.ts +1 -1
  423. package/esm/typings/src/utils/color/operators/saturate.d.ts +1 -1
  424. package/esm/typings/src/utils/environment/$detectRuntimeEnvironment.d.ts +16 -0
  425. package/esm/typings/src/utils/environment/$getGlobalScope.d.ts +2 -2
  426. package/esm/typings/src/utils/execCommand/$execCommand.d.ts +2 -1
  427. package/esm/typings/src/utils/execCommand/$execCommands.d.ts +2 -1
  428. package/esm/typings/src/utils/files/$induceBookDownload.d.ts +13 -0
  429. package/esm/typings/src/utils/files/$induceFileDownload.d.ts +13 -0
  430. package/esm/typings/src/utils/files/ObjectUrl.d.ts +46 -0
  431. package/esm/typings/src/utils/files/listAllFiles.d.ts +2 -3
  432. package/esm/typings/src/utils/misc/aboutPromptbookInformation.d.ts +27 -0
  433. package/esm/typings/src/utils/misc/computeHash.d.ts +11 -0
  434. package/esm/typings/src/utils/misc/computeHash.test.d.ts +1 -0
  435. package/esm/typings/src/utils/misc/injectCssModuleIntoShadowRoot.d.ts +1 -0
  436. package/esm/typings/src/utils/misc/xAboutPromptbookInformation.d.ts +13 -0
  437. package/esm/typings/src/utils/normalization/normalize-to-kebab-case.d.ts +2 -0
  438. package/esm/typings/src/utils/normalization/normalizeMessageText.d.ts +9 -0
  439. package/esm/typings/src/utils/normalization/normalizeMessageText.test.d.ts +1 -0
  440. package/esm/typings/src/utils/normalization/normalizeTo_PascalCase.d.ts +3 -0
  441. package/esm/typings/src/utils/normalization/normalizeTo_camelCase.d.ts +2 -0
  442. package/esm/typings/src/utils/normalization/titleToName.d.ts +2 -0
  443. package/esm/typings/src/utils/organization/$sideEffect.d.ts +2 -2
  444. package/esm/typings/src/utils/organization/$side_effect.d.ts +7 -0
  445. package/esm/typings/src/utils/organization/TODO_USE.d.ts +2 -2
  446. package/esm/typings/src/utils/organization/keepUnused.d.ts +2 -2
  447. package/esm/typings/src/utils/organization/preserve.d.ts +3 -3
  448. package/esm/typings/src/utils/organization/really_any.d.ts +7 -0
  449. package/esm/typings/src/utils/random/$generateBookBoilerplate.d.ts +31 -0
  450. package/esm/typings/src/utils/random/$randomAgentPersona.d.ts +9 -0
  451. package/esm/typings/src/utils/random/$randomFullnameWithColor.d.ts +13 -0
  452. package/esm/typings/src/utils/random/$randomItem.d.ts +9 -0
  453. package/esm/typings/src/utils/random/$randomSeed.d.ts +3 -0
  454. package/esm/typings/src/utils/random/$randomToken.d.ts +2 -0
  455. package/esm/typings/src/utils/random/CzechNamePool.d.ts +7 -0
  456. package/esm/typings/src/utils/random/EnglishNamePool.d.ts +7 -0
  457. package/esm/typings/src/utils/random/NamePool.d.ts +17 -0
  458. package/esm/typings/src/utils/random/getNamePool.d.ts +10 -0
  459. package/esm/typings/src/utils/serialization/$deepFreeze.d.ts +2 -1
  460. package/esm/typings/src/utils/serialization/asSerializable.d.ts +2 -2
  461. package/esm/typings/src/utils/serialization/serializeToPromptbookJavascript.d.ts +2 -2
  462. package/esm/typings/src/utils/validators/parameterName/validateParameterName.d.ts +2 -0
  463. package/esm/typings/src/version.d.ts +1 -1
  464. package/esm/typings/src/wizard/$getCompiledBook.d.ts +1 -2
  465. package/package.json +16 -16
  466. package/umd/index.umd.js +5382 -417
  467. package/umd/index.umd.js.map +1 -1
  468. package/esm/typings/src/book-2.0/commitments/index.d.ts +0 -60
  469. package/esm/typings/src/book-components/BookEditor/BookEditorInner.d.ts +0 -5
  470. package/esm/typings/src/book-components/BookEditor/BookEditorWrapper.d.ts +0 -9
  471. package/esm/typings/src/book-components/BookEditor/config.d.ts +0 -10
  472. package/esm/typings/src/book-components/Chat/utils/renderMarkdown.d.ts +0 -21
  473. package/esm/typings/src/collection/collectionToJson.d.ts +0 -13
  474. package/esm/typings/src/collection/constructors/createCollectionFromJson.d.ts +0 -13
  475. /package/esm/typings/src/{book-components/Chat/utils/renderMarkdown.test.d.ts → book-2.0/agent-source/computeAgentHash.test.d.ts} +0 -0
  476. /package/esm/typings/src/{collection/constructors/createCollectionFromDirectory.test.d.ts → book-2.0/agent-source/normalizeAgentName.test.d.ts} +0 -0
  477. /package/esm/typings/src/{collection/constructors/createCollectionFromJson.test.d.ts → book-components/Chat/AgentChat/AgentChat.test.d.ts} +0 -0
  478. /package/esm/typings/src/collection/{constructors/createCollectionFromPromise.test.d.ts → pipeline-collection/constructors/createPipelineCollectionFromDirectory.test.d.ts} +0 -0
  479. /package/esm/typings/src/{commands/_common/parseCommand.test.d.ts → collection/pipeline-collection/constructors/createPipelineCollectionFromJson.test.d.ts} +0 -0
  480. /package/esm/typings/src/collection/{collectionToJson.test.d.ts → pipeline-collection/pipelineCollectionToJson.test.d.ts} +0 -0
  481. /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BookCommitment.d.ts +0 -0
  482. /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/ParsedCommitment.d.ts +0 -0
@@ -0,0 +1,92 @@
1
+ import { PROMPTBOOK_COLOR } from '@promptbook-local/core';
2
+ import { serializeError } from '@promptbook-local/utils';
3
+ import { ImageResponse } from 'next/og';
4
+ import { assertsError } from '../../../../../../../../src/errors/assertsError';
5
+ import { Color } from '../../../../../../../../src/utils/color/Color';
6
+ import { textColor } from '../../../../../../../../src/utils/color/operators/furthest';
7
+ import { grayscale } from '../../../../../../../../src/utils/color/operators/grayscale';
8
+ import { keepUnused } from '../../../../../../../../src/utils/organization/keepUnused';
9
+ import { getAgentName, getAgentProfile } from '../../_utils';
10
+
11
+ const size = {
12
+ width: 1080,
13
+ height: 1920,
14
+ };
15
+
16
+ export async function GET(request: Request, { params }: { params: Promise<{ agentName: string }> }) {
17
+ keepUnused(request /* <- Note: We dont need `request` parameter */);
18
+
19
+ try {
20
+ const agentName = await getAgentName(params);
21
+ const agentProfile = await getAgentProfile(agentName);
22
+ const agentColor = Color.from(agentProfile.meta.color || PROMPTBOOK_COLOR);
23
+ const backgroundColor = agentColor.then(grayscale(0.5));
24
+
25
+ return new ImageResponse(
26
+ (
27
+ <div
28
+ style={{
29
+ width: '100%',
30
+ height: '100%',
31
+ backgroundColor: backgroundColor.toHex(),
32
+ color: agentColor.then(textColor).toHex(),
33
+ display: 'flex',
34
+ alignItems: 'center',
35
+ justifyContent: 'center',
36
+ }}
37
+ >
38
+ <div
39
+ style={{
40
+ width: '40%',
41
+ display: 'flex',
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ }}
45
+ >
46
+ {/* Note: `next/image` is not working propperly with `next/og` */}
47
+ {/* eslint-disable-next-line @next/next/no-img-element */}
48
+ <img
49
+ style={{
50
+ width: '80%',
51
+ backgroundColor: agentColor.toHex(),
52
+ borderRadius: '50%',
53
+ }}
54
+ src={agentProfile.meta.image!}
55
+ alt="Agent Icon"
56
+ />
57
+ </div>
58
+ <div style={{ width: '60%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
59
+ <h1 style={{ fontSize: '110px' }}>{agentProfile.meta.fullname || agentName}</h1>
60
+ </div>
61
+ </div>
62
+ ),
63
+ {
64
+ ...size,
65
+ emoji: 'openmoji',
66
+ },
67
+ );
68
+ } catch (error) {
69
+ assertsError(error);
70
+
71
+ console.error(error);
72
+
73
+ return new Response(
74
+ JSON.stringify(
75
+ serializeError(error),
76
+ // <- TODO: [🐱‍🚀] Rename `serializeError` to `errorToJson`
77
+ null,
78
+ 4,
79
+ // <- TODO: [🐱‍🚀] Allow to configure pretty print for agent server
80
+ ),
81
+ {
82
+ status: 400, // <- TODO: [🐱‍🚀] Make `errorToHttpStatusCode`
83
+ headers: { 'Content-Type': 'application/json' },
84
+ },
85
+ );
86
+ }
87
+ }
88
+
89
+ /**
90
+ * TODO: [🦚] DRY
91
+ * TODO: [🦚] This should be the true screenshot NOT just image + Agent name
92
+ */
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+
3
+ import { CodePreview } from '../../../../../../_common/components/CodePreview/CodePreview';
4
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../../../../_common/components/Tabs/Tabs';
5
+
6
+ type SdkCodeTabsProps = {
7
+ curlCode: string;
8
+ pythonCode: string;
9
+ jsCode: string;
10
+ };
11
+
12
+ export function SdkCodeTabs({ curlCode, pythonCode, jsCode }: SdkCodeTabsProps) {
13
+ return (
14
+ <Tabs defaultValue="curl" className="w-full">
15
+ <TabsList>
16
+ <TabsTrigger value="curl">cURL</TabsTrigger>
17
+ <TabsTrigger value="python">Python SDK</TabsTrigger>
18
+ <TabsTrigger value="javascript">JavaScript/TypeScript SDK</TabsTrigger>
19
+ </TabsList>
20
+ <TabsContent value="curl">
21
+ <CodePreview code={curlCode} language="bash" />
22
+ </TabsContent>
23
+ <TabsContent value="python">
24
+ <CodePreview code={pythonCode} language="python" />
25
+ </TabsContent>
26
+ <TabsContent value="javascript">
27
+ <CodePreview code={jsCode} language="typescript" />
28
+ </TabsContent>
29
+ </Tabs>
30
+ );
31
+ }
@@ -0,0 +1,302 @@
1
+ 'use server';
2
+
3
+ import { $getTableName } from '@/src/database/$getTableName';
4
+ import { $provideSupabase } from '@/src/database/$provideSupabase';
5
+ import { $provideServer } from '@/src/tools/$provideServer';
6
+ import { isUserAdmin } from '@/src/utils/isUserAdmin';
7
+ import { PROMPTBOOK_COLOR } from '@promptbook-local/core';
8
+ import { ArrowLeftIcon, BoxIcon, CodeIcon, GlobeIcon, ServerIcon, TerminalIcon } from 'lucide-react';
9
+ import { headers } from 'next/headers';
10
+ import Link from 'next/link';
11
+ import { notFound } from 'next/navigation';
12
+ import spaceTrim from 'spacetrim';
13
+ import { Color } from '../../../../../../../src/utils/color/Color';
14
+ import { withAlpha } from '../../../../../../../src/utils/color/operators/withAlpha';
15
+ import { $sideEffect } from '../../../../../../../src/utils/organization/$sideEffect';
16
+ import { CodePreview } from '../../../../../../_common/components/CodePreview/CodePreview';
17
+ import { getAgentLinks } from '../agentLinks';
18
+ import { CopyField } from '../CopyField';
19
+ import { getAgentName, getAgentProfile } from '../_utils';
20
+ import { generateAgentMetadata } from '../generateAgentMetadata';
21
+ import { SdkCodeTabs } from './SdkCodeTabs';
22
+
23
+ export const generateMetadata = generateAgentMetadata;
24
+
25
+ export default async function AgentIntegrationPage({ params }: { params: Promise<{ agentName: string }> }) {
26
+ $sideEffect(headers());
27
+ const agentName = await getAgentName(params);
28
+ const isAdmin = await isUserAdmin();
29
+
30
+ let agentProfile;
31
+ try {
32
+ agentProfile = await getAgentProfile(agentName);
33
+ } catch (error) {
34
+ if (
35
+ error instanceof Error &&
36
+ (error.message.includes('Cannot coerce the result to a single JSON object') ||
37
+ error.message.includes('JSON object requested, multiple (or no) results returned'))
38
+ ) {
39
+ notFound();
40
+ }
41
+ throw error;
42
+ }
43
+
44
+ const { publicUrl } = await $provideServer();
45
+ const baseUrl = `${publicUrl.href}agents/${encodeURIComponent(agentName)}`;
46
+ const agentApiBase = `${publicUrl.href}agents/${encodeURIComponent(agentName)}`;
47
+ const rootUrl = publicUrl.href.replace(/\/$/, '');
48
+
49
+ // Get API Key if admin
50
+ let apiKey = 'ptbk_...';
51
+ if (isAdmin) {
52
+ const supabase = $provideSupabase();
53
+ const table = await $getTableName('ApiTokens');
54
+ const { data } = await supabase
55
+ .from(table)
56
+ .select('token')
57
+ .eq('isRevoked', false)
58
+ .order('createdAt', { ascending: false })
59
+ .limit(1);
60
+
61
+ if (data && data.length > 0) {
62
+ apiKey = data[0].token;
63
+ }
64
+ }
65
+
66
+ // Extract brand color from meta
67
+ const brandColor = Color.from(agentProfile.meta.color || PROMPTBOOK_COLOR);
68
+ const backgroundColor = (await brandColor.then(withAlpha(0.05))).toHex();
69
+ const borderColor = (await brandColor.then(withAlpha(0.1))).toHex();
70
+ const primaryColor = (await brandColor).toHex();
71
+
72
+ // Website Integration Code
73
+ const { fullname, color, image, ...restMeta } = agentProfile.meta;
74
+ const websiteIntegrationCode = spaceTrim(
75
+ (block) => `
76
+ import { PromptbookAgent } from '@promptbook/components';
77
+
78
+ export function YourComponent() {
79
+ return(
80
+ <PromptbookAgent
81
+ agentUrl="${baseUrl}"
82
+ meta={${block(JSON.stringify({ fullname, color, image, ...restMeta }, null, 4))}}
83
+ />
84
+ );
85
+ }
86
+ `,
87
+ );
88
+
89
+ // OpenAI Compatible Curl
90
+ const curlCode = spaceTrim(`
91
+ curl ${agentApiBase}/api/openai/v1/chat/completions \\
92
+ -H "Content-Type: application/json" \\
93
+ -H "Authorization: Bearer ${apiKey}" \\
94
+ -d '{
95
+ "model": "agent:${agentName}",
96
+ "messages": [
97
+ {"role": "user", "content": "Hello!"}
98
+ ]
99
+ }'
100
+ `);
101
+
102
+ // OpenAI Compatible Python
103
+ const pythonCode = spaceTrim(`
104
+ from openai import OpenAI
105
+
106
+ client = OpenAI(
107
+ base_url="${agentApiBase}/api/openai/v1",
108
+ api_key="${apiKey}",
109
+ )
110
+
111
+ response = client.chat.completions.create(
112
+ model="agent:${agentName}",
113
+ messages=[
114
+ {"role": "user", "content": "Hello!"}
115
+ ]
116
+ )
117
+
118
+ print(response.choices[0].message.content)
119
+ `);
120
+
121
+ // OpenAI Compatible JS
122
+ const jsCode = spaceTrim(`
123
+ import OpenAI from 'openai';
124
+
125
+ const client = new OpenAI({
126
+ baseURL: '${agentApiBase}/api/openai/v1',
127
+ apiKey: '${apiKey}',
128
+ });
129
+
130
+ async function main() {
131
+ const response = await client.chat.completions.create({
132
+ model: 'agent:${agentName}',
133
+ messages: [{ role: 'user', content: 'Hello!' }],
134
+ });
135
+
136
+ console.log(response.choices[0].message.content);
137
+ }
138
+
139
+ main();
140
+ `);
141
+
142
+ // MCP Config
143
+ const mcpConfigCode = spaceTrim(`
144
+ {
145
+ "mcpServers": {
146
+ "${agentName}": {
147
+ "command": "npx",
148
+ "args": [
149
+ "-y",
150
+ "@promptbook/cli",
151
+ "mcp",
152
+ "${baseUrl}"
153
+ ]
154
+ }
155
+ }
156
+ }
157
+ `);
158
+
159
+ const agentLinks = getAgentLinks(agentName);
160
+ const chatLink = agentLinks.find((l) => l.title === 'Chat with Agent')!;
161
+ const websiteIntegrationLink = agentLinks.find((l) => l.title === 'Website Integration')!;
162
+
163
+ return (
164
+ <div
165
+ className="min-h-screen p-6 md:p-12 flex flex-col items-center"
166
+ style={{
167
+ backgroundColor,
168
+ }}
169
+ >
170
+ <div className="w-full max-w-5xl bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden">
171
+ {/* Header */}
172
+ <div className="p-6 border-b flex items-center gap-4" style={{ borderColor }}>
173
+ {agentProfile.meta.image && (
174
+ // eslint-disable-next-line @next/next/no-img-element
175
+ <img
176
+ src={agentProfile.meta.image as string}
177
+ alt={agentProfile.meta.fullname || agentName}
178
+ className="w-16 h-16 rounded-full object-cover border-2"
179
+ style={{ borderColor: primaryColor }}
180
+ />
181
+ )}
182
+ <div className="flex-1">
183
+ <h1 className="text-2xl font-bold text-gray-900">{agentProfile.meta.fullname || agentName}</h1>
184
+ <p className="text-gray-500 flex items-center gap-2">
185
+ <CodeIcon className="w-4 h-4" />
186
+ Integration Options
187
+ </p>
188
+ </div>
189
+ <Link
190
+ href={chatLink.href}
191
+ className="p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-full transition-colors"
192
+ title="Back to Agent"
193
+ >
194
+ <ArrowLeftIcon className="w-6 h-6" />
195
+ </Link>
196
+ </div>
197
+
198
+ <div className="p-6 space-y-6">
199
+ {/* Website Integration */}
200
+ <div className="p-6 rounded-xl border-2 border-green-200 bg-green-50/30 shadow-sm">
201
+ <div className="flex items-start gap-4 mb-4">
202
+ <div className="p-3 rounded-xl bg-green-100 text-green-600 shadow-sm">
203
+ <GlobeIcon className="w-6 h-6" />
204
+ </div>
205
+ <div>
206
+ <h2 className="text-xl font-bold text-gray-900">Website Integration</h2>
207
+ <p className="text-gray-600">
208
+ Embed the agent chat widget directly into your React application.
209
+ </p>
210
+ <p className="text-sm text-gray-500 mt-1">
211
+ <Link href={websiteIntegrationLink.href} className="text-blue-600 hover:underline">
212
+ View detailed guide &rarr;
213
+ </Link>
214
+ </p>
215
+ </div>
216
+ </div>
217
+ <CodePreview code={websiteIntegrationCode} language="typescript" />
218
+ </div>
219
+
220
+ {/* OpenAI API Compatible Endpoint */}
221
+ <div className="p-6 rounded-xl border-2 border-blue-200 bg-blue-50/30 shadow-sm">
222
+ <div className="flex items-start gap-4 mb-4">
223
+ <div className="p-3 rounded-xl bg-blue-100 text-blue-600 shadow-sm">
224
+ <TerminalIcon className="w-6 h-6" />
225
+ </div>
226
+ <div className="flex-1">
227
+ <h2 className="text-xl font-bold text-gray-900">OpenAI Compatible API</h2>
228
+ <p className="text-gray-600">
229
+ Use the agent as a drop-in replacement for OpenAI API in your existing applications.
230
+ </p>
231
+ <div className="grid md:grid-cols-3 gap-4 mt-4 mb-2">
232
+ <CopyField label="Endpoint URL" value={`${agentApiBase}/api/openai/v1`} />
233
+ <CopyField label="Model Name" value={`agent:${agentName}`} />
234
+ {isAdmin ? (
235
+ <CopyField label="API Key" value={apiKey} />
236
+ ) : (
237
+ <div className="flex flex-col gap-1">
238
+ <span className="text-xs font-medium text-gray-500 uppercase tracking-wider">
239
+ API Key
240
+ </span>
241
+ <div className="text-sm text-gray-500 italic bg-gray-50 p-2 rounded border border-gray-200">
242
+ Contact admin for API Key
243
+ </div>
244
+ </div>
245
+ )}
246
+ </div>
247
+ {isAdmin && apiKey === 'ptbk_...' && (
248
+ <p className="text-sm text-amber-600 mt-2">
249
+ No API token found.{' '}
250
+ <Link href="/admin/api-tokens" className="underline font-medium">
251
+ Create one in settings
252
+ </Link>
253
+ .
254
+ </p>
255
+ )}
256
+ </div>
257
+ </div>
258
+
259
+ <SdkCodeTabs curlCode={curlCode} pythonCode={pythonCode} jsCode={jsCode} />
260
+ </div>
261
+
262
+ {/* OpenRouter Integration */}
263
+ <div className="p-6 rounded-xl border-2 border-purple-200 bg-purple-50/30 shadow-sm">
264
+ <div className="flex items-start gap-4 mb-4">
265
+ <div className="p-3 rounded-xl bg-purple-100 text-purple-600 shadow-sm">
266
+ <ServerIcon className="w-6 h-6" />
267
+ </div>
268
+ <div>
269
+ <h2 className="text-xl font-bold text-gray-900">OpenRouter Integration</h2>
270
+ <p className="text-gray-600">Connect via OpenRouter compatible endpoint.</p>
271
+ <div className="grid md:grid-cols-2 gap-4 mt-4">
272
+ <CopyField label="Endpoint URL" value={`${agentApiBase}/api/openrouter`} />
273
+ <CopyField label="Model Name" value={`agent:${agentName}`} />
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+
279
+ {/* MCP Integration */}
280
+ <div className="p-6 rounded-xl border-2 border-orange-200 bg-orange-50/30 shadow-sm">
281
+ <div className="flex items-start gap-4 mb-4">
282
+ <div className="p-3 rounded-xl bg-orange-100 text-orange-600 shadow-sm">
283
+ <BoxIcon className="w-6 h-6" />
284
+ </div>
285
+ <div>
286
+ <h2 className="text-xl font-bold text-gray-900">MCP Integration</h2>
287
+ <p className="text-gray-600">
288
+ Use Model Context Protocol to connect this agent with compatible tools and IDEs
289
+ (like Claude Desktop, Cursor, etc.).
290
+ </p>
291
+ </div>
292
+ </div>
293
+ <CodePreview
294
+ code={mcpConfigCode.replace(rootUrl + '/api', agentApiBase + '/api')}
295
+ language="json"
296
+ />
297
+ </div>
298
+ </div>
299
+ </div>
300
+ </div>
301
+ );
302
+ }
@@ -0,0 +1,41 @@
1
+ 'use server';
2
+
3
+ import type { Metadata } from 'next';
4
+ import { getAgentName, getAgentProfile } from './_utils';
5
+
6
+ export async function generateMetadata({ params }: { params: Promise<{ agentName: string }> }): Promise<Metadata> {
7
+ const agentName = await getAgentName(params);
8
+
9
+ try {
10
+ const agentProfile = await getAgentProfile(agentName);
11
+
12
+ const title = agentProfile.meta.fullname || agentProfile.agentName;
13
+ const description = agentProfile.meta.description || agentProfile.personaDescription || undefined;
14
+
15
+ // Use the agent's icon-256.png as the favicon for all agent pages and subpages
16
+ const iconUrl = `/agents/${encodeURIComponent(agentName)}/images/icon-256.png`;
17
+
18
+ return {
19
+ title,
20
+ description,
21
+ icons: {
22
+ icon: iconUrl,
23
+ shortcut: iconUrl,
24
+ apple: iconUrl,
25
+ },
26
+ };
27
+ } catch (error) {
28
+ console.warn(`Failed to generate metadata for agent ${agentName}`, error);
29
+ return {
30
+ title: agentName,
31
+ };
32
+ }
33
+ }
34
+
35
+ export default async function AgentLayout({
36
+ children,
37
+ }: Readonly<{
38
+ children: React.ReactNode;
39
+ }>) {
40
+ return <>{children}</>;
41
+ }
@@ -0,0 +1,182 @@
1
+ 'use server';
2
+
3
+ import { $provideServer } from '@/src/tools/$provideServer';
4
+ import { PROMPTBOOK_COLOR } from '@promptbook-local/core';
5
+ import { ArrowLeftIcon, CodeIcon, HomeIcon, LinkIcon, ShareIcon } from 'lucide-react';
6
+ import { headers } from 'next/headers';
7
+ import Link from 'next/link';
8
+ import { notFound } from 'next/navigation';
9
+ import { Color } from '../../../../../../../src/utils/color/Color';
10
+ import { withAlpha } from '../../../../../../../src/utils/color/operators/withAlpha';
11
+ import { $sideEffect } from '../../../../../../../src/utils/organization/$sideEffect';
12
+ import { getAgentExternalLinks, getAgentLinks } from '../agentLinks';
13
+ import { CopyField } from '../CopyField';
14
+ import { getAgentName, getAgentProfile } from '../_utils';
15
+ import { generateAgentMetadata } from '../generateAgentMetadata';
16
+
17
+ export const generateMetadata = generateAgentMetadata;
18
+
19
+ export default async function AgentLinksPage({ params }: { params: Promise<{ agentName: string }> }) {
20
+ $sideEffect(headers());
21
+ const agentName = await getAgentName(params);
22
+
23
+ let agentProfile;
24
+ try {
25
+ agentProfile = await getAgentProfile(agentName);
26
+ } catch (error) {
27
+ if (
28
+ error instanceof Error &&
29
+ (error.message.includes('Cannot coerce the result to a single JSON object') ||
30
+ error.message.includes('JSON object requested, multiple (or no) results returned'))
31
+ ) {
32
+ notFound();
33
+ }
34
+ throw error;
35
+ }
36
+
37
+ const { publicUrl } = await $provideServer();
38
+ const baseUrl = `${publicUrl.href}agents/${encodeURIComponent(agentName)}`;
39
+
40
+ // Extract brand color from meta
41
+ const brandColor = Color.from(agentProfile.meta.color || PROMPTBOOK_COLOR);
42
+ const backgroundColor = (await brandColor.then(withAlpha(0.05))).toHex();
43
+ const borderColor = (await brandColor.then(withAlpha(0.1))).toHex();
44
+ const primaryColor = (await brandColor).toHex();
45
+
46
+ return (
47
+ <div
48
+ className="min-h-screen p-6 md:p-12 flex flex-col items-center"
49
+ style={{
50
+ backgroundColor,
51
+ }}
52
+ >
53
+ <div className="w-full max-w-3xl bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden">
54
+ {/* Header */}
55
+ <div className="p-6 border-b flex items-center gap-4" style={{ borderColor }}>
56
+ {agentProfile.meta.image && (
57
+ // eslint-disable-next-line @next/next/no-img-element
58
+ <img
59
+ src={agentProfile.meta.image as string}
60
+ alt={agentProfile.meta.fullname || agentName}
61
+ className="w-16 h-16 rounded-full object-cover border-2"
62
+ style={{ borderColor: primaryColor }}
63
+ />
64
+ )}
65
+ <div className="flex-1">
66
+ <h1 className="text-2xl font-bold text-gray-900">{agentProfile.meta.fullname || agentName}</h1>
67
+ <p className="text-gray-500 flex items-center gap-2">
68
+ <LinkIcon className="w-4 h-4" />
69
+ Signpost & Links
70
+ </p>
71
+ </div>
72
+ <Link
73
+ href={`/agents/${encodeURIComponent(agentName)}`}
74
+ className="p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-full transition-colors"
75
+ title="Back to Agent"
76
+ >
77
+ <ArrowLeftIcon className="w-6 h-6" />
78
+ </Link>
79
+ </div>
80
+
81
+ <div className="divide-y divide-gray-100">
82
+ {/* API Endpoints */}
83
+ <div className="p-6">
84
+ <h2 className="text-lg font-semibold text-gray-800 mb-4 flex items-center gap-2">
85
+ <CodeIcon className="w-5 h-5 text-gray-500" />
86
+ API Endpoints
87
+ </h2>
88
+ <div className="grid gap-4">
89
+ <div>
90
+ <h3 className="text-sm font-medium text-gray-700 mb-1">
91
+ OpenAI Compatible Chat Completion
92
+ </h3>
93
+ <p className="text-xs text-gray-500 mb-2">
94
+ Standard OpenAI API endpoint for chat completions.
95
+ </p>
96
+ <CopyField label="Endpoint URL" value={`${baseUrl}/api/openai/v1/chat/completions`} />
97
+ </div>
98
+
99
+ <div>
100
+ <h3 className="text-sm font-medium text-gray-700 mb-1">OpenRouter Compatible</h3>
101
+ <p className="text-xs text-gray-500 mb-2">
102
+ Endpoint compatible with OpenRouter API format.
103
+ </p>
104
+ <CopyField label="Endpoint URL" value={`${baseUrl}/api/openrouter/chat/completions`} />
105
+ </div>
106
+
107
+ <div>
108
+ <h3 className="text-sm font-medium text-gray-700 mb-1">Model Context Protocol (MCP)</h3>
109
+ <p className="text-xs text-gray-500 mb-2">
110
+ Endpoint for Model Context Protocol integration.
111
+ </p>
112
+ <CopyField label="Endpoint URL" value={`${baseUrl}/api/mcp`} />
113
+ </div>
114
+
115
+ <div>
116
+ <h3 className="text-sm font-medium text-gray-700 mb-1">Model Requirements</h3>
117
+ <p className="text-xs text-gray-500 mb-2">
118
+ Get requirements and capabilities of the model.
119
+ </p>
120
+ <CopyField label="Endpoint URL" value={`${baseUrl}/api/modelRequirements`} />
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+ {/* Agent Resources */}
126
+ <div className="p-6">
127
+ <h2 className="text-lg font-semibold text-gray-800 mb-4 flex items-center gap-2">
128
+ <HomeIcon className="w-5 h-5 text-gray-500" />
129
+ Agent Resources
130
+ </h2>
131
+ <div className="grid md:grid-cols-2 gap-4">
132
+ {getAgentLinks(agentName)
133
+ .filter((link) =>
134
+ ['Chat with Agent', 'History & Feedback', 'Integration'].includes(link.title),
135
+ )
136
+ .map((link) => (
137
+ <Link
138
+ key={link.href}
139
+ href={link.href}
140
+ className="block p-4 rounded-lg border border-gray-200 hover:border-gray-300 hover:shadow-md transition-all group bg-white"
141
+ >
142
+ <div className="flex items-center gap-3 mb-2">
143
+ <div className="p-2 rounded-lg bg-gray-50 text-gray-600 group-hover:bg-gray-100 transition-colors">
144
+ <link.icon className="w-5 h-5" />
145
+ </div>
146
+ <span className="font-medium text-gray-900">{link.title}</span>
147
+ </div>
148
+ <p className="text-sm text-gray-500">{link.description}</p>
149
+ </Link>
150
+ ))}
151
+ </div>
152
+ </div>
153
+
154
+ {/* Ecosystem */}
155
+ <div className="p-6 bg-gray-50">
156
+ <h2 className="text-lg font-semibold text-gray-800 mb-4 flex items-center gap-2">
157
+ <ShareIcon className="w-5 h-5 text-gray-500" />
158
+ Promptbook Ecosystem
159
+ </h2>
160
+ <div className="grid md:grid-cols-2 gap-4">
161
+ {getAgentExternalLinks().map((link) => (
162
+ <a
163
+ key={link.href}
164
+ href={link.href}
165
+ target={link.target}
166
+ rel={link.rel}
167
+ className="flex items-center gap-3 p-3 rounded-lg bg-white border border-gray-200 hover:border-gray-300 transition-colors"
168
+ >
169
+ <link.icon className="w-5 h-5 text-gray-400" />
170
+ <div>
171
+ <div className="font-medium text-gray-900">{link.title}</div>
172
+ <div className="text-xs text-gray-500">{link.description}</div>
173
+ </div>
174
+ </a>
175
+ ))}
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ );
182
+ }