@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,591 +0,0 @@
1
- 'use client';
2
-
3
- import { MockedChat } from '@promptbook-local/components';
4
- import type { ChatMessage } from '@promptbook-local/types';
5
- import { useEffect, useMemo, useState } from 'react';
6
- import { Card } from '../../../components/Homepage/Card';
7
- import {
8
- $clearAgentChatHistory,
9
- $deleteChatHistoryRow,
10
- $fetchChatHistory,
11
- type ChatHistoryRow,
12
- type ChatHistorySortField,
13
- type ChatHistorySortOrder,
14
- } from '../../../utils/chatHistoryAdmin';
15
-
16
- type ChatHistoryClientProps = {
17
- /**
18
- * Optional initial agent filter, taken from the URL query.
19
- */
20
- initialAgentName?: string;
21
- };
22
-
23
- type AdminAgentInfo = {
24
- agentName: string;
25
- fullname?: string | null;
26
- };
27
-
28
- type AgentsApiResponse = {
29
- agents: Array<{
30
- agentName: string;
31
- meta: { fullname?: string | null };
32
- }>;
33
- };
34
-
35
- function formatDate(dateString: string | null | undefined): string {
36
- if (!dateString) return '-';
37
- const date = new Date(dateString);
38
- if (Number.isNaN(date.getTime())) return dateString;
39
- return date.toLocaleString();
40
- }
41
-
42
- function getMessageRole(message: unknown): string {
43
- if (!message || typeof message !== 'object') return '-';
44
- // Chat route stores { role, content }
45
- const role = (message as { role?: string }).role;
46
- return role || '-';
47
- }
48
-
49
- function getMessagePreview(message: unknown, maxLength = 120): string {
50
- if (message == null) return '-';
51
-
52
- if (typeof message === 'string') {
53
- return message.length > maxLength ? `${message.slice(0, maxLength)}…` : message;
54
- }
55
-
56
- if (typeof message === 'object') {
57
- const content = (message as { content?: unknown }).content ?? (message as { text?: unknown }).text ?? message;
58
-
59
- let text: string;
60
-
61
- if (typeof content === 'string') {
62
- text = content;
63
- } else if (Array.isArray(content)) {
64
- text = content.map((part) => String(part)).join(' ');
65
- } else {
66
- text = JSON.stringify(content);
67
- }
68
-
69
- return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text;
70
- }
71
-
72
- return String(message);
73
- }
74
-
75
- export function ChatHistoryClient({ initialAgentName }: ChatHistoryClientProps) {
76
- const [items, setItems] = useState<ChatHistoryRow[]>([]);
77
- const [total, setTotal] = useState(0);
78
- const [page, setPage] = useState(1);
79
- const [pageSize, setPageSize] = useState(20);
80
- const [agentName, setAgentName] = useState(initialAgentName ?? '');
81
- const [searchInput, setSearchInput] = useState('');
82
- const [search, setSearch] = useState('');
83
- const [sortBy, setSortBy] = useState<ChatHistorySortField>('createdAt');
84
- const [sortOrder, setSortOrder] = useState<ChatHistorySortOrder>('desc');
85
- const [viewMode, setViewMode] = useState<'table' | 'chat'>('table');
86
- const [loading, setLoading] = useState(true);
87
- const [error, setError] = useState<string | null>(null);
88
-
89
- const [agents, setAgents] = useState<AdminAgentInfo[]>([]);
90
- const [agentsLoading, setAgentsLoading] = useState(false);
91
-
92
- // Load agents for filter dropdown
93
- useEffect(() => {
94
- let isCancelled = false;
95
-
96
- async function loadAgents() {
97
- try {
98
- setAgentsLoading(true);
99
- const response = await fetch('/api/agents');
100
- if (!response.ok) {
101
- // If agents listing fails, we can still show chat history
102
- return;
103
- }
104
- const data = (await response.json()) as AgentsApiResponse;
105
-
106
- if (isCancelled) return;
107
-
108
- const mappedAgents: AdminAgentInfo[] =
109
- data.agents?.map((agent) => ({
110
- agentName: agent.agentName,
111
- fullname: agent.meta?.fullname ?? null,
112
- })) ?? [];
113
-
114
- // Sort by display name
115
- mappedAgents.sort((a, b) => {
116
- const nameA = (a.fullname || a.agentName).toLowerCase();
117
- const nameB = (b.fullname || b.agentName).toLowerCase();
118
- return nameA.localeCompare(nameB);
119
- });
120
-
121
- setAgents(mappedAgents);
122
- } finally {
123
- if (!isCancelled) {
124
- setAgentsLoading(false);
125
- }
126
- }
127
- }
128
-
129
- loadAgents();
130
-
131
- return () => {
132
- isCancelled = true;
133
- };
134
- }, []);
135
-
136
- // Initial search input: we do not auto-search, but if initialAgentName is present we set it
137
- useEffect(() => {
138
- if (initialAgentName) {
139
- setAgentName(initialAgentName);
140
- }
141
- }, [initialAgentName]);
142
-
143
- // Load chat history whenever filters / pagination / sorting change
144
- useEffect(() => {
145
- let isCancelled = false;
146
-
147
- async function loadData() {
148
- try {
149
- setLoading(true);
150
- setError(null);
151
-
152
- const response = await $fetchChatHistory({
153
- page,
154
- pageSize,
155
- agentName: agentName || undefined,
156
- search: search || undefined,
157
- sortBy,
158
- sortOrder,
159
- });
160
-
161
- if (isCancelled) return;
162
-
163
- setItems(response.items);
164
- setTotal(response.total);
165
- } catch (err) {
166
- if (isCancelled) return;
167
- setError(err instanceof Error ? err.message : 'Failed to load chat history');
168
- } finally {
169
- if (!isCancelled) {
170
- setLoading(false);
171
- }
172
- }
173
- }
174
-
175
- loadData();
176
-
177
- return () => {
178
- isCancelled = true;
179
- };
180
- }, [page, pageSize, agentName, search, sortBy, sortOrder]);
181
-
182
- const totalPages = useMemo(() => {
183
- if (total <= 0 || pageSize <= 0) return 1;
184
- return Math.max(1, Math.ceil(total / pageSize));
185
- }, [total, pageSize]);
186
-
187
- const handleSearchSubmit = (event: React.FormEvent) => {
188
- event.preventDefault();
189
- setPage(1);
190
- setSearch(searchInput.trim());
191
- };
192
-
193
- const handleAgentChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
194
- const value = event.target.value;
195
- setAgentName(value);
196
- setPage(1);
197
- };
198
-
199
- const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
200
- const next = parseInt(event.target.value, 10);
201
- if (!Number.isNaN(next) && next > 0) {
202
- setPageSize(next);
203
- setPage(1);
204
- }
205
- };
206
-
207
- const handleSortChange = (field: ChatHistorySortField) => {
208
- if (sortBy === field) {
209
- setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');
210
- } else {
211
- setSortBy(field);
212
- setSortOrder(field === 'createdAt' ? 'desc' : 'asc');
213
- }
214
- };
215
-
216
- const handleViewModeChange = (mode: 'table' | 'chat') => {
217
- setViewMode(mode);
218
- if (mode === 'chat') {
219
- // When switching to chat view, sort by creation date ascending to make sense of conversation flow
220
- setSortBy('createdAt');
221
- setSortOrder('asc');
222
- setPageSize(100); // Show more messages in chat view
223
- } else {
224
- // Default back to desc when switching to table
225
- setSortBy('createdAt');
226
- setSortOrder('desc');
227
- setPageSize(20);
228
- }
229
- };
230
-
231
- const handleDeleteRow = async (row: ChatHistoryRow) => {
232
- if (!row.id) return;
233
-
234
- const confirmed = window.confirm('Are you sure you want to delete this chat message?');
235
- if (!confirmed) return;
236
-
237
- try {
238
- await $deleteChatHistoryRow(row.id);
239
- // Reload current page
240
- const response = await $fetchChatHistory({
241
- page,
242
- pageSize,
243
- agentName: agentName || undefined,
244
- search: search || undefined,
245
- sortBy,
246
- sortOrder,
247
- });
248
- setItems(response.items);
249
- setTotal(response.total);
250
- } catch (err) {
251
- setError(err instanceof Error ? err.message : 'Failed to delete chat message');
252
- }
253
- };
254
-
255
- const handleClearAgentHistory = async () => {
256
- if (!agentName) return;
257
-
258
- const confirmed = window.confirm(
259
- `Are you sure you want to permanently delete all chat history for agent "${agentName}"?`,
260
- );
261
- if (!confirmed) return;
262
-
263
- try {
264
- setLoading(true);
265
- setError(null);
266
- await $clearAgentChatHistory(agentName);
267
-
268
- // After clearing, reload first page
269
- setPage(1);
270
- const response = await $fetchChatHistory({
271
- page: 1,
272
- pageSize,
273
- agentName: agentName || undefined,
274
- search: search || undefined,
275
- sortBy,
276
- sortOrder,
277
- });
278
- setItems(response.items);
279
- setTotal(response.total);
280
- } catch (err) {
281
- setError(err instanceof Error ? err.message : 'Failed to clear chat history');
282
- } finally {
283
- setLoading(false);
284
- }
285
- };
286
-
287
- const isSortedBy = (field: ChatHistorySortField) => sortBy === field;
288
-
289
- const getExportUrl = () => {
290
- const params = new URLSearchParams();
291
- if (agentName) {
292
- params.set('agentName', agentName);
293
- }
294
- return `/api/chat-history/export?${params.toString()}`;
295
- };
296
-
297
- const chatMessages = useMemo(() => {
298
- if (viewMode !== 'chat') return [];
299
- return items.map((row) => {
300
- const message = row.message as { role?: string; content?: string };
301
- const role = (message.role || 'USER').toUpperCase();
302
- return {
303
- // channel: 'PROMPTBOOK_CHAT',
304
- id: String(row.id),
305
- sender: role === 'USER' ? 'USER' : 'ASSISTANT',
306
- content: message.content || JSON.stringify(message),
307
- isComplete: true,
308
- createdAt: new Date(row.createdAt),
309
- } satisfies ChatMessage;
310
- });
311
- }, [items, viewMode]);
312
-
313
- const pagination = (
314
- <div className="mt-4 flex flex-col items-center justify-between gap-3 border-t border-gray-100 pt-4 text-xs text-gray-600 md:flex-row">
315
- <div>
316
- {total > 0 ? (
317
- <>
318
- Showing <span className="font-semibold">{Math.min((page - 1) * pageSize + 1, total)}</span> –{' '}
319
- <span className="font-semibold">{Math.min(page * pageSize, total)}</span> of{' '}
320
- <span className="font-semibold">{total}</span> messages
321
- </>
322
- ) : (
323
- 'No messages'
324
- )}
325
- </div>
326
- <div className="flex items-center gap-2">
327
- <button
328
- type="button"
329
- onClick={() => setPage((prev) => Math.max(1, prev - 1))}
330
- disabled={page <= 1}
331
- className="inline-flex items-center justify-center rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-700 disabled:cursor-not-allowed disabled:opacity-50"
332
- >
333
- Previous
334
- </button>
335
- <span>
336
- Page <span className="font-semibold">{page}</span> of{' '}
337
- <span className="font-semibold">{totalPages}</span>
338
- </span>
339
- <button
340
- type="button"
341
- onClick={() => setPage((prev) => Math.min(totalPages, prev + 1))}
342
- disabled={page >= totalPages}
343
- className="inline-flex items-center justify-center rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-700 disabled:cursor-not-allowed disabled:opacity-50"
344
- >
345
- Next
346
- </button>
347
- </div>
348
- </div>
349
- );
350
-
351
- return (
352
- <div className="container mx-auto px-4 py-8 space-y-6">
353
- <div className="mt-20 mb-4 flex flex-col gap-2 md:flex-row md:items-end md:justify-between">
354
- <div>
355
- <h1 className="text-3xl text-gray-900 font-light">Chat history</h1>
356
- <p className="mt-1 text-sm text-gray-500">
357
- Inspect and manage all recorded chat messages across your agents.
358
- </p>
359
- </div>
360
- <div className="flex items-end gap-4 text-sm text-gray-500 md:text-right">
361
- <div className="flex rounded-md shadow-sm" role="group">
362
- <button
363
- type="button"
364
- onClick={() => handleViewModeChange('table')}
365
- className={`px-4 py-2 text-sm font-medium border border-gray-300 rounded-l-lg ${
366
- viewMode === 'table'
367
- ? 'bg-blue-600 text-white border-blue-600'
368
- : 'bg-white text-gray-700 hover:bg-gray-50'
369
- }`}
370
- >
371
- Table
372
- </button>
373
- <button
374
- type="button"
375
- onClick={() => handleViewModeChange('chat')}
376
- className={`px-4 py-2 text-sm font-medium border border-gray-300 rounded-r-lg border-l-0 ${
377
- viewMode === 'chat'
378
- ? 'bg-blue-600 text-white border-blue-600'
379
- : 'bg-white text-gray-700 hover:bg-gray-50'
380
- }`}
381
- >
382
- Chat
383
- </button>
384
- </div>
385
- <div>
386
- <a
387
- href={getExportUrl()}
388
- target="_blank"
389
- rel="noopener noreferrer"
390
- className="inline-flex items-center justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
391
- >
392
- Download CSV
393
- </a>
394
- </div>
395
- <div>
396
- <div className="text-xl font-semibold text-gray-900">{total.toLocaleString()}</div>
397
- <div className="text-xs uppercase tracking-wide text-gray-400">Total messages</div>
398
- </div>
399
- </div>
400
- </div>
401
- <Card>
402
- <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
403
- <form onSubmit={handleSearchSubmit} className="flex flex-col gap-2 md:flex-row md:items-end">
404
- <div className="flex flex-col gap-1">
405
- <label htmlFor="search" className="text-sm font-medium text-gray-700">
406
- Search
407
- </label>
408
- <input
409
- id="search"
410
- type="text"
411
- value={searchInput}
412
- onChange={(event) => setSearchInput(event.target.value)}
413
- placeholder="Search by agent name, URL or IP"
414
- className="w-full md:w-72 px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
415
- />
416
- </div>
417
- <button
418
- type="submit"
419
- className="mt-2 inline-flex items-center justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 md:mt-0 md:ml-3"
420
- >
421
- Apply
422
- </button>
423
- </form>
424
-
425
- <div className="flex flex-col gap-2 md:flex-row md:items-end md:gap-4">
426
- <div className="flex flex-col gap-1">
427
- <label htmlFor="agentFilter" className="text-sm font-medium text-gray-700">
428
- Agent filter
429
- </label>
430
- <select
431
- id="agentFilter"
432
- value={agentName}
433
- onChange={handleAgentChange}
434
- className="w-full md:w-64 px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
435
- >
436
- <option value="">All agents</option>
437
- {agents.map((agent) => (
438
- <option key={agent.agentName} value={agent.agentName}>
439
- {agent.fullname || agent.agentName}
440
- </option>
441
- ))}
442
- </select>
443
- {agentsLoading && <span className="text-xs text-gray-400">Loading agents…</span>}
444
- </div>
445
-
446
- <div className="flex flex-col gap-1">
447
- <label htmlFor="pageSize" className="text-sm font-medium text-gray-700">
448
- Page size
449
- </label>
450
- <select
451
- id="pageSize"
452
- value={pageSize}
453
- onChange={handlePageSizeChange}
454
- className="w-28 px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
455
- >
456
- <option value={10}>10</option>
457
- <option value={20}>20</option>
458
- <option value={50}>50</option>
459
- <option value={100}>100</option>
460
- </select>
461
- </div>
462
- </div>
463
- </div>
464
-
465
- {agentName && (
466
- <div className="mt-4 flex items-center justify-between gap-4 rounded-md border border-amber-200 bg-amber-50 px-4 py-3">
467
- <p className="text-sm text-amber-800">
468
- Showing chat history for agent <span className="font-semibold break-all">{agentName}</span>.
469
- </p>
470
- <button
471
- type="button"
472
- onClick={handleClearAgentHistory}
473
- className="inline-flex items-center justify-center rounded-md border border-red-300 bg-white px-3 py-1.5 text-xs font-medium text-red-700 hover:bg-red-50"
474
- >
475
- Clear history for this agent
476
- </button>
477
- </div>
478
- )}
479
- </Card>
480
-
481
- {viewMode === 'chat' ? (
482
- <div className="bg-white rounded-lg shadow border border-gray-200 overflow-hidden flex flex-col">
483
- <div className="h-[800px] relative">
484
- <MockedChat
485
- messages={chatMessages}
486
- isPausable={true}
487
- isResettable={false}
488
- isSaveButtonEnabled={true}
489
- />
490
- </div>
491
- <div className="p-4 bg-gray-50 border-t border-gray-200">{pagination}</div>
492
- </div>
493
- ) : (
494
- <Card>
495
- <div className="flex items-center justify-between mb-4">
496
- <h2 className="text-lg font-medium text-gray-900">Messages ({total})</h2>
497
- </div>
498
- {error && <div className="mb-4 rounded-md bg-red-50 px-4 py-3 text-sm text-red-800">{error}</div>}
499
-
500
- {loading && items.length === 0 ? (
501
- <div className="py-8 text-center text-gray-500">Loading chat history…</div>
502
- ) : items.length === 0 ? (
503
- <div className="py-8 text-center text-gray-500">No chat history found.</div>
504
- ) : (
505
- <div className="overflow-x-auto">
506
- <table className="min-w-full divide-y divide-gray-200 text-sm">
507
- <thead className="bg-gray-50">
508
- <tr>
509
- <th className="px-4 py-3 text-left font-medium text-gray-500">
510
- <button
511
- type="button"
512
- onClick={() => handleSortChange('createdAt')}
513
- className="inline-flex items-center gap-1"
514
- >
515
- Time
516
- {isSortedBy('createdAt') && (
517
- <span>{sortOrder === 'asc' ? '▲' : '▼'}</span>
518
- )}
519
- </button>
520
- </th>
521
- <th className="px-4 py-3 text-left font-medium text-gray-500">
522
- <button
523
- type="button"
524
- onClick={() => handleSortChange('agentName')}
525
- className="inline-flex items-center gap-1"
526
- >
527
- Agent
528
- {isSortedBy('agentName') && (
529
- <span>{sortOrder === 'asc' ? '▲' : '▼'}</span>
530
- )}
531
- </button>
532
- </th>
533
- <th className="px-4 py-3 text-left font-medium text-gray-500">Role</th>
534
- <th className="px-4 py-3 text-left font-medium text-gray-500">Message</th>
535
- <th className="px-4 py-3 text-left font-medium text-gray-500">URL</th>
536
- <th className="px-4 py-3 text-left font-medium text-gray-500">IP</th>
537
- <th className="px-4 py-3 text-left font-medium text-gray-500">Language</th>
538
- <th className="px-4 py-3 text-left font-medium text-gray-500">Platform</th>
539
- <th className="px-4 py-3 text-right font-medium text-gray-500">Actions</th>
540
- </tr>
541
- </thead>
542
- <tbody className="divide-y divide-gray-200 bg-white">
543
- {items.map((row) => (
544
- <tr key={row.id}>
545
- <td className="whitespace-nowrap px-4 py-3 text-gray-700">
546
- {formatDate(row.createdAt)}
547
- </td>
548
- <td className="whitespace-nowrap px-4 py-3 text-gray-700">
549
- {row.agentName}
550
- </td>
551
- <td className="whitespace-nowrap px-4 py-3 text-gray-700">
552
- {getMessageRole(row.message)}
553
- </td>
554
- <td className="max-w-xs px-4 py-3 text-gray-700">
555
- <div className="max-h-24 overflow-hidden overflow-ellipsis text-xs leading-snug">
556
- {getMessagePreview(row.message)}
557
- </div>
558
- </td>
559
- <td className="max-w-xs px-4 py-3 text-gray-500">
560
- <div className="truncate text-xs">{row.url || '-'}</div>
561
- </td>
562
- <td className="whitespace-nowrap px-4 py-3 text-gray-500">
563
- {row.ip || '-'}
564
- </td>
565
- <td className="whitespace-nowrap px-4 py-3 text-gray-500">
566
- {row.language || '-'}
567
- </td>
568
- <td className="max-w-xs px-4 py-3 text-gray-500">
569
- <div className="truncate text-xs">{row.platform || '-'}</div>
570
- </td>
571
- <td className="whitespace-nowrap px-4 py-3 text-right text-xs font-medium">
572
- <button
573
- type="button"
574
- onClick={() => handleDeleteRow(row)}
575
- className="text-red-600 hover:text-red-800"
576
- >
577
- Delete
578
- </button>
579
- </td>
580
- </tr>
581
- ))}
582
- </tbody>
583
- </table>
584
- </div>
585
- )}
586
- {pagination}
587
- </Card>
588
- )}
589
- </div>
590
- );
591
- }
@@ -1,21 +0,0 @@
1
- import { ForbiddenPage } from '../../../components/ForbiddenPage/ForbiddenPage';
2
- import { isUserAdmin } from '../../../utils/isUserAdmin';
3
- import { ChatHistoryClient } from './ChatHistoryClient';
4
-
5
- type AdminChatHistoryPageProps = {
6
- searchParams?: Promise<{
7
- agentName?: string;
8
- }>;
9
- };
10
-
11
- export default async function AdminChatHistoryPage({ searchParams }: AdminChatHistoryPageProps) {
12
- const isAdmin = await isUserAdmin();
13
-
14
- if (!isAdmin) {
15
- return <ForbiddenPage />;
16
- }
17
-
18
- const initialAgentName = (await searchParams)?.agentName || undefined;
19
-
20
- return <ChatHistoryClient initialAgentName={initialAgentName} />;
21
- }