@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,54 @@
1
+ 'use server';
2
+
3
+ import { AgentCollectionInSupabase } from '@promptbook-local/core';
4
+ import { AgentCollection } from '@promptbook-local/types';
5
+ import { just } from '../../../../src/utils/organization/just';
6
+ import { $provideSupabaseForServer } from '../database/$provideSupabaseForServer';
7
+ import { $provideServer } from './$provideServer';
8
+
9
+ /**
10
+ * Cache of provided agent collection
11
+ *
12
+ * @private internal cache for `$provideAgentCollectionForServer`
13
+ */
14
+ let agentCollection: null | AgentCollection = null;
15
+
16
+ /**
17
+ * [🐱‍🚀]
18
+ */
19
+ export async function $provideAgentCollectionForServer(): Promise<AgentCollection> {
20
+ // <- Note: This function is potentially async
21
+
22
+ // TODO: [🐱‍🚀] [🌕] DRY
23
+
24
+ const isVerbose = true; // <- TODO: [🐱‍🚀] Pass
25
+
26
+ if (agentCollection !== null && just(false /* <- TODO: [🐱‍🚀] Fix caching */)) {
27
+ console.log('[🐱‍🚀] Returning cached agent collection');
28
+ return agentCollection;
29
+ // TODO: [🐱‍🚀] Be aware of options changes
30
+ }
31
+
32
+ console.log('[🐱‍🚀] Creating NEW agent collection');
33
+
34
+ /*
35
+ // TODO: [🧟‍♂️][◽] DRY:
36
+ const collection = new AgentCollectionInDirectory(path, tools, {
37
+ isVerbose,
38
+ isRecursive: true,
39
+ isLazyLoaded: false,
40
+ isCrashedOnError: true,
41
+ // <- TODO: [🍖] Add `intermediateFilesStrategy`
42
+ });
43
+ */
44
+
45
+ const supabase = $provideSupabaseForServer();
46
+ const { tablePrefix } = await $provideServer();
47
+
48
+ agentCollection = new AgentCollectionInSupabase(supabase, {
49
+ isVerbose,
50
+ tablePrefix,
51
+ });
52
+
53
+ return agentCollection;
54
+ }
@@ -0,0 +1,36 @@
1
+ import { VercelBlobStorage } from '../utils/cdn/classes/VercelBlobStorage';
2
+ import { IIFilesStorageWithCdn } from '../utils/cdn/interfaces/IFilesStorage';
3
+
4
+ /**
5
+ * Cache of CDN instance
6
+ *
7
+ * @private internal cache for `$provideCdnForServer`
8
+ */
9
+ let cdn: IIFilesStorageWithCdn | null = null;
10
+
11
+ /**
12
+ * [🐱‍🚀]
13
+ */
14
+ export function $provideCdnForServer(): IIFilesStorageWithCdn {
15
+ if (!cdn) {
16
+ cdn = new VercelBlobStorage({
17
+ token: process.env.VERCEL_BLOB_READ_WRITE_TOKEN!,
18
+ pathPrefix: process.env.NEXT_PUBLIC_CDN_PATH_PREFIX!,
19
+ cdnPublicUrl: new URL(process.env.NEXT_PUBLIC_CDN_PUBLIC_URL!),
20
+ });
21
+
22
+ /*
23
+ cdn = new DigitalOceanSpaces({
24
+ bucket: process.env.CDN_BUCKET!,
25
+ pathPrefix: process.env.NEXT_PUBLIC_CDN_PATH_PREFIX!,
26
+ endpoint: process.env.CDN_ENDPOINT!,
27
+ accessKeyId: process.env.CDN_ACCESS_KEY_ID!,
28
+ secretAccessKey: process.env.CDN_SECRET_ACCESS_KEY!,
29
+ cdnPublicUrl: new URL(process.env.NEXT_PUBLIC_CDN_PUBLIC_URL!),
30
+ gzip: true,
31
+ });
32
+ */
33
+ }
34
+
35
+ return cdn;
36
+ }
@@ -0,0 +1,117 @@
1
+ 'use server';
2
+
3
+ import {
4
+ cacheLlmTools,
5
+ _AnthropicClaudeMetadataRegistration,
6
+ _AzureOpenAiMetadataRegistration,
7
+ _BoilerplateScraperMetadataRegistration,
8
+ _DeepseekMetadataRegistration,
9
+ _DocumentScraperMetadataRegistration,
10
+ _GoogleMetadataRegistration,
11
+ _LegacyDocumentScraperMetadataRegistration,
12
+ _MarkdownScraperMetadataRegistration,
13
+ _MarkitdownScraperMetadataRegistration,
14
+ _OllamaMetadataRegistration,
15
+ _OpenAiAssistantMetadataRegistration,
16
+ _OpenAiCompatibleMetadataRegistration,
17
+ _OpenAiMetadataRegistration,
18
+ _PdfScraperMetadataRegistration,
19
+ _WebsiteScraperMetadataRegistration,
20
+ } from '@promptbook-local/core';
21
+ import { _GoogleRegistration } from '@promptbook-local/google';
22
+ import { _OpenAiRegistration } from '@promptbook-local/openai';
23
+ import { ExecutionTools, TODO_any } from '@promptbook-local/types';
24
+ import { $provideLlmToolsForCli } from '../../../../src/cli/common/$provideLlmToolsForCli';
25
+ import { $provideExecutablesForNode } from '../../../../src/executables/$provideExecutablesForNode';
26
+ import { $provideFilesystemForNode } from '../../../../src/scrapers/_common/register/$provideFilesystemForNode';
27
+ import { $provideScrapersForNode } from '../../../../src/scrapers/_common/register/$provideScrapersForNode';
28
+ import { $provideScriptingForNode } from '../../../../src/scrapers/_common/register/$provideScriptingForNode';
29
+ import { $sideEffect } from '../../../../src/utils/organization/$sideEffect';
30
+ import { SupabaseCacheStorage } from '../utils/cache/SupabaseCacheStorage';
31
+
32
+ $sideEffect(
33
+ _AnthropicClaudeMetadataRegistration,
34
+ _AzureOpenAiMetadataRegistration,
35
+ _DeepseekMetadataRegistration,
36
+ _GoogleMetadataRegistration,
37
+ _OllamaMetadataRegistration,
38
+ _OpenAiMetadataRegistration,
39
+ _OpenAiAssistantMetadataRegistration,
40
+ _OpenAiCompatibleMetadataRegistration,
41
+ _BoilerplateScraperMetadataRegistration,
42
+ _LegacyDocumentScraperMetadataRegistration,
43
+ _DocumentScraperMetadataRegistration,
44
+ _MarkdownScraperMetadataRegistration,
45
+ _MarkitdownScraperMetadataRegistration,
46
+ _PdfScraperMetadataRegistration,
47
+ _WebsiteScraperMetadataRegistration,
48
+ // <- TODO: [🐱‍🚀] Export all registrations from one variabile in `@promptbook/core`
49
+ );
50
+ $sideEffect(/* [㊗] */ _OpenAiRegistration);
51
+ $sideEffect(/* [㊗] */ _GoogleRegistration);
52
+ // <- TODO: [🐱‍🚀] Allow to dynamically install required metadata
53
+
54
+ /**
55
+ * Cache of provided execution tools
56
+ *
57
+ * @private internal cache for `$provideExecutionToolsForServer`
58
+ */
59
+ let executionTools: null | ExecutionTools = null;
60
+
61
+ /*
62
+ TODO: [▶️]
63
+ type ProvideExecutionToolsForServerOptions = {
64
+ isLlmProvided
65
+ }
66
+ */
67
+
68
+ /**
69
+ * [🐱‍🚀]
70
+ */
71
+ export async function $provideExecutionToolsForServer(): Promise<ExecutionTools> {
72
+ // TODO: [🐱‍🚀] [🌕] DRY
73
+
74
+ // const path = '../../agents'; // <- TODO: [🐱‍🚀] Pass
75
+ const isVerbose = true; // <- TODO: [🐱‍🚀] Pass
76
+ const isCacheReloaded = false; // <- TODO: [🐱‍🚀] Pass
77
+ const cliOptions = {
78
+ provider: 'BRING_YOUR_OWN_KEYS',
79
+ } as TODO_any; // <- TODO: [🐱‍🚀] Pass
80
+
81
+ if (executionTools !== null) {
82
+ console.log('[🐱‍🚀] Returning cached execution tools');
83
+ return executionTools;
84
+ // TODO: [🐱‍🚀] Be aware of options changes
85
+ }
86
+
87
+ console.log('[🐱‍🚀] Creating NEW execution tools');
88
+
89
+ // TODO: DRY [◽]
90
+ const prepareAndScrapeOptions = {
91
+ isVerbose,
92
+ isCacheReloaded,
93
+ }; /* <- TODO: ` satisfies PrepareAndScrapeOptions` */
94
+ const fs = await $provideFilesystemForNode(prepareAndScrapeOptions);
95
+ const { /* [0] strategy,*/ llm: llmUncached } = await $provideLlmToolsForCli({
96
+ cliOptions,
97
+ ...prepareAndScrapeOptions,
98
+ });
99
+
100
+ const llm = cacheLlmTools(llmUncached, {
101
+ storage: new SupabaseCacheStorage(),
102
+ isVerbose,
103
+ isCacheReloaded,
104
+ });
105
+
106
+ const executables = await $provideExecutablesForNode(prepareAndScrapeOptions);
107
+
108
+ executionTools = {
109
+ llm,
110
+ fs,
111
+ executables,
112
+ scrapers: await $provideScrapersForNode({ fs, llm, executables }, prepareAndScrapeOptions),
113
+ script: await $provideScriptingForNode(prepareAndScrapeOptions),
114
+ };
115
+
116
+ return executionTools;
117
+ }
@@ -0,0 +1,35 @@
1
+ 'use server';
2
+
3
+ import { OpenAiAssistantExecutionTools } from '@promptbook-local/openai';
4
+
5
+ /**
6
+ * Cache of provided OpenAiAssistantExecutionTools
7
+ *
8
+ * @private internal cache for `$provideOpenAiAssistantExecutionToolsForServer`
9
+ */
10
+ let executionTools: null | OpenAiAssistantExecutionTools = null;
11
+
12
+ /**
13
+ * [🐱‍🚀]
14
+ */
15
+ export async function $provideOpenAiAssistantExecutionToolsForServer(): Promise<OpenAiAssistantExecutionTools> {
16
+ // TODO: [🐱‍🚀] [🌕] DRY
17
+ const isVerbose = true; // <- TODO: [🐱‍🚀] Pass
18
+
19
+ if (executionTools !== null) {
20
+ console.log('[🐱‍🚀] Returning cached OpenAiAssistantExecutionTools');
21
+ return executionTools;
22
+ // TODO: [🐱‍🚀] Be aware of options changes
23
+ }
24
+
25
+ console.log('[🐱‍🚀] Creating NEW OpenAiAssistantExecutionTools');
26
+
27
+ executionTools = new OpenAiAssistantExecutionTools({
28
+ apiKey: process.env.OPENAI_API_KEY,
29
+ assistantId: 'abstract_assistant', // <- TODO: [🐱‍🚀] In `OpenAiAssistantExecutionTools` Allow to create abstract assistants with `isCreatingNewAssistantsAllowed`
30
+ isCreatingNewAssistantsAllowed: true,
31
+ isVerbose,
32
+ });
33
+
34
+ return executionTools;
35
+ }
@@ -0,0 +1,39 @@
1
+ import { NEXT_PUBLIC_SITE_URL, SERVERS, SUPABASE_TABLE_PREFIX } from '@/config';
2
+ import { normalizeTo_PascalCase } from '@promptbook-local/utils';
3
+ import { headers } from 'next/headers';
4
+
5
+ export async function $provideServer() {
6
+ if (!SERVERS) {
7
+ return {
8
+ publicUrl: NEXT_PUBLIC_SITE_URL || new URL(`https://${(await headers()).get('host') || 'localhost:4440'}`),
9
+ tablePrefix: SUPABASE_TABLE_PREFIX,
10
+ };
11
+ }
12
+
13
+ const headersList = await headers();
14
+ let host = headersList.get('host');
15
+ const xPromptbookServer = headersList.get('x-promptbook-server');
16
+
17
+ if (host === null) {
18
+ throw new Error('Host header is missing');
19
+ }
20
+
21
+ // If host is not in known servers, check if we have a context header from middleware
22
+ if (!SERVERS.some((server) => server === host)) {
23
+ if (xPromptbookServer && SERVERS.some((server) => server === xPromptbookServer)) {
24
+ host = xPromptbookServer;
25
+ } else {
26
+ throw new Error(`Server with host "${host}" is not configured in SERVERS`);
27
+ }
28
+ }
29
+
30
+ let serverName = host;
31
+
32
+ serverName = serverName.replace(/\.ptbk\.io$/, '');
33
+ serverName = normalizeTo_PascalCase(serverName);
34
+
35
+ return {
36
+ publicUrl: new URL(`https://${host}`),
37
+ tablePrefix: `server_${serverName}_`,
38
+ };
39
+ }
@@ -0,0 +1,33 @@
1
+ import { randomBytes, scrypt, timingSafeEqual } from 'crypto';
2
+ import { promisify } from 'util';
3
+
4
+ const scryptAsync = promisify(scrypt);
5
+
6
+ /**
7
+ * Hashes a password using scrypt
8
+ *
9
+ * @param password The plain text password
10
+ * @returns The salt and hash formatted as "salt:hash"
11
+ */
12
+ export async function hashPassword(password: string): Promise<string> {
13
+ const salt = randomBytes(16).toString('hex');
14
+ const derivedKey = (await scryptAsync(password, salt, 64)) as Buffer;
15
+ return `${salt}:${derivedKey.toString('hex')}`;
16
+ }
17
+
18
+ /**
19
+ * Verifies a password against a stored hash
20
+ *
21
+ * @param password The plain text password
22
+ * @param storedHash The stored hash in format "salt:hash"
23
+ * @returns True if the password matches
24
+ */
25
+ export async function verifyPassword(password: string, storedHash: string): Promise<boolean> {
26
+ const [salt, key] = storedHash.split(':');
27
+ if (!salt || !key) return false;
28
+
29
+ const derivedKey = (await scryptAsync(password, salt, 64)) as Buffer;
30
+ const keyBuffer = Buffer.from(key, 'hex');
31
+
32
+ return timingSafeEqual(derivedKey, keyBuffer);
33
+ }
@@ -0,0 +1,42 @@
1
+ import { $getTableName } from '../database/$getTableName';
2
+ import { $provideSupabaseForServer } from '../database/$provideSupabaseForServer';
3
+ import { AgentsServerDatabase } from '../database/schema';
4
+ import { verifyPassword } from './auth';
5
+
6
+ export type AuthenticatedUser = {
7
+ username: string;
8
+ isAdmin: boolean;
9
+ };
10
+
11
+ export async function authenticateUser(username: string, password: string): Promise<AuthenticatedUser | null> {
12
+ // 1. Check if it's the environment admin
13
+ if (username === 'admin' && process.env.ADMIN_PASSWORD && password === process.env.ADMIN_PASSWORD) {
14
+ return { username: 'admin', isAdmin: true };
15
+ }
16
+
17
+ // 2. Check DB users
18
+ try {
19
+ const supabase = $provideSupabaseForServer();
20
+ const { data: user, error } = await supabase
21
+ .from(await $getTableName('User'))
22
+ .select('*')
23
+ .eq('username', username)
24
+ .single();
25
+
26
+ if (error || !user) {
27
+ return null;
28
+ }
29
+
30
+ const userRow = user as AgentsServerDatabase['public']['Tables']['User']['Row'];
31
+ const isValid = await verifyPassword(password, userRow.passwordHash);
32
+
33
+ if (!isValid) {
34
+ return null;
35
+ }
36
+
37
+ return { username: userRow.username, isAdmin: userRow.isAdmin };
38
+ } catch (error) {
39
+ console.error('Authentication error:', error);
40
+ return null;
41
+ }
42
+ }
@@ -0,0 +1,55 @@
1
+ import { TODO_any } from '@promptbook-local/types';
2
+ import { $getTableName } from '../../database/$getTableName';
3
+ import { $provideSupabaseForServer } from '../../database/$provideSupabaseForServer';
4
+ import { Json } from '../../database/schema';
5
+
6
+ /**
7
+ * Storage for LLM cache using Supabase
8
+ */
9
+ export class SupabaseCacheStorage {
10
+ // implements PromptbookStorage<TODO_any>
11
+
12
+ /**
13
+ * Returns the current value associated with the given key, or null if the given key does not exist in the list associated with the object.
14
+ */
15
+ public async getItem(key: string): Promise<TODO_any | null> {
16
+ const supabase = $provideSupabaseForServer();
17
+ const tableName = await $getTableName('LlmCache');
18
+
19
+ const { data } = await supabase.from(tableName).select('value').eq('hash', key).maybeSingle();
20
+
21
+ if (!data) {
22
+ return null;
23
+ }
24
+
25
+ return data.value;
26
+ }
27
+
28
+ /**
29
+ * Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
30
+ */
31
+ public async setItem(key: string, value: TODO_any): Promise<void> {
32
+ const supabase = $provideSupabaseForServer();
33
+ const tableName = await $getTableName('LlmCache');
34
+
35
+ await supabase.from(tableName).upsert(
36
+ {
37
+ hash: key,
38
+ value: value as Json,
39
+ },
40
+ {
41
+ onConflict: 'hash',
42
+ },
43
+ );
44
+ }
45
+
46
+ /**
47
+ * Removes the key/value pair with the given key from the list associated with the object, if a key/value pair with the given key exists
48
+ */
49
+ public async removeItem(key: string): Promise<void> {
50
+ const supabase = $provideSupabaseForServer();
51
+ const tableName = await $getTableName('LlmCache');
52
+
53
+ await supabase.from(tableName).delete().eq('hash', key);
54
+ }
55
+ }
@@ -0,0 +1,119 @@
1
+ import { GetObjectCommand, PutObjectCommand, PutObjectCommandInput, S3Client } from '@aws-sdk/client-s3';
2
+ import { NotYetImplementedError } from '@promptbook-local/core';
3
+ import { gzip, ungzip } from 'node-gzip';
4
+ import { TODO_USE } from '../../../../../../src/utils/organization/TODO_USE';
5
+ import { validateMimeType } from '../../validators/validateMimeType';
6
+ import type { IFile, IIFilesStorageWithCdn } from '../interfaces/IFilesStorage';
7
+
8
+ type IDigitalOceanSpacesConfig = {
9
+ readonly bucket: string;
10
+ readonly pathPrefix: string;
11
+ readonly endpoint: string;
12
+ readonly accessKeyId: string;
13
+ readonly secretAccessKey: string;
14
+ readonly cdnPublicUrl: URL;
15
+ readonly gzip: boolean;
16
+
17
+ // TODO: [⛳️] Probbably prefix should be in this config not on the consumer side
18
+ };
19
+
20
+ export class DigitalOceanSpaces implements IIFilesStorageWithCdn {
21
+ public get cdnPublicUrl() {
22
+ return this.config.cdnPublicUrl;
23
+ }
24
+
25
+ private s3: S3Client;
26
+
27
+ public constructor(private readonly config: IDigitalOceanSpacesConfig) {
28
+ this.s3 = new S3Client({
29
+ region: 'auto',
30
+ endpoint: 'https://' + config.endpoint,
31
+ credentials: {
32
+ accessKeyId: config.accessKeyId,
33
+ secretAccessKey: config.secretAccessKey,
34
+ },
35
+ });
36
+ }
37
+
38
+ public getItemUrl(key: string): URL {
39
+ return new URL(this.config.pathPrefix + '/' + key, this.cdnPublicUrl);
40
+ }
41
+
42
+ public async getItem(key: string): Promise<IFile | null> {
43
+ const parameters = {
44
+ Bucket: this.config.bucket,
45
+ Key: this.config.pathPrefix + '/' + key,
46
+ };
47
+
48
+ try {
49
+ const { Body, ContentType, ContentEncoding } = await this.s3.send(new GetObjectCommand(parameters));
50
+
51
+ // const blob = new Blob([await Body?.transformToByteArray()!]);
52
+
53
+ if (ContentEncoding === 'gzip') {
54
+ return {
55
+ type: validateMimeType(ContentType),
56
+ data: await ungzip(await Body!.transformToByteArray()),
57
+ };
58
+ } else {
59
+ return {
60
+ type: validateMimeType(ContentType),
61
+ data: (await Body!.transformToByteArray()) as Buffer,
62
+ };
63
+ }
64
+ } catch (error) {
65
+ if (error instanceof Error && error.name.match(/^NoSuchKey/)) {
66
+ return null;
67
+ } else {
68
+ throw error;
69
+ }
70
+ }
71
+ }
72
+
73
+ public async removeItem(key: string): Promise<void> {
74
+ TODO_USE(key);
75
+ throw new NotYetImplementedError(`DigitalOceanSpaces.removeItem is not implemented yet`);
76
+ }
77
+
78
+ public async setItem(key: string, file: IFile): Promise<void> {
79
+ // TODO: Put putObjectRequestAdditional into processedFile
80
+ const putObjectRequestAdditional: Partial<PutObjectCommandInput> = {};
81
+
82
+ let processedFile: IFile;
83
+ if (this.config.gzip) {
84
+ const gzipped = await gzip(file.data);
85
+ const sizePercentageAfterCompression = gzipped.byteLength / file.data.byteLength;
86
+ if (sizePercentageAfterCompression < 0.7) {
87
+ // consolex.log(`Gzipping ${key} (${Math.floor(sizePercentageAfterCompression * 100)}%)`);
88
+ processedFile = { ...file, data: gzipped };
89
+ putObjectRequestAdditional.ContentEncoding = 'gzip';
90
+ } else {
91
+ processedFile = file;
92
+ // consolex.log(`NOT Gzipping ${key} (${Math.floor(sizePercentageAfterCompression * 100)}%)`);
93
+ }
94
+ } else {
95
+ processedFile = file;
96
+ }
97
+
98
+ const uploadResult = await this.s3.send(
99
+ new PutObjectCommand({
100
+ Bucket: this.config.bucket,
101
+ Key: this.config.pathPrefix + '/' + key,
102
+ ContentType: processedFile.type,
103
+ ...putObjectRequestAdditional,
104
+ Body: processedFile.data,
105
+ // TODO: Public read access / just private to extending class
106
+ ACL: 'public-read',
107
+ }),
108
+ );
109
+
110
+ if (!uploadResult.ETag) {
111
+ throw new Error(`Upload result does not contain ETag`);
112
+ }
113
+ }
114
+ }
115
+
116
+ /**
117
+ * TODO: Implement Read-only mode
118
+ * TODO: [☹️] Unite with `PromptbookStorage` and move to `/src/...`
119
+ */
@@ -0,0 +1,64 @@
1
+ import { del, put } from '@vercel/blob';
2
+ import { validateMimeType } from '../../validators/validateMimeType';
3
+ import type { IFile, IIFilesStorageWithCdn } from '../interfaces/IFilesStorage';
4
+
5
+ type IVercelBlobStorageConfig = {
6
+ readonly token: string;
7
+ readonly cdnPublicUrl: URL;
8
+ readonly pathPrefix?: string;
9
+ // Note: Vercel Blob automatically handles compression/serving
10
+ };
11
+
12
+ export class VercelBlobStorage implements IIFilesStorageWithCdn {
13
+ public get cdnPublicUrl() {
14
+ return this.config.cdnPublicUrl;
15
+ }
16
+
17
+ public constructor(private readonly config: IVercelBlobStorageConfig) {}
18
+
19
+ public getItemUrl(key: string): URL {
20
+ const path = this.config.pathPrefix ? `${this.config.pathPrefix}/${key}` : key;
21
+ return new URL(path, this.cdnPublicUrl);
22
+ }
23
+
24
+ public async getItem(key: string): Promise<IFile | null> {
25
+ const url = this.getItemUrl(key);
26
+
27
+ const response = await fetch(url);
28
+
29
+ if (response.status === 404) {
30
+ return null;
31
+ }
32
+
33
+ if (!response.ok) {
34
+ throw new Error(`Failed to fetch blob from ${url}: ${response.statusText}`);
35
+ }
36
+
37
+ const arrayBuffer = await response.arrayBuffer();
38
+ const buffer = Buffer.from(arrayBuffer);
39
+ const contentType = response.headers.get('content-type') || 'application/octet-stream';
40
+
41
+ return {
42
+ type: validateMimeType(contentType),
43
+ data: buffer,
44
+ };
45
+ }
46
+
47
+ public async removeItem(key: string): Promise<void> {
48
+ const url = this.getItemUrl(key).toString();
49
+ await del(url, { token: this.config.token });
50
+ }
51
+
52
+ public async setItem(key: string, file: IFile): Promise<void> {
53
+ const path = this.config.pathPrefix ? `${this.config.pathPrefix}/${key}` : key;
54
+
55
+ await put(path, file.data, {
56
+ access: 'public',
57
+ addRandomSuffix: false,
58
+ contentType: file.type,
59
+ token: this.config.token,
60
+ allowOverwrite: true, // <- TODO: This is inefficient, we should check first if the file exists and only then decide to overwrite or not
61
+ // Note: We rely on Vercel Blob for compression
62
+ });
63
+ }
64
+ }
@@ -0,0 +1,32 @@
1
+ import type { string_mime_type } from '../../../../../../src/types/typeAliases';
2
+ import type { IStorage } from './IStorage';
3
+
4
+ export type IFile = {
5
+ // Maybe TODO name: string_name;
6
+ type: string_mime_type;
7
+ data: Buffer;
8
+ };
9
+
10
+ /**
11
+ * Represents storage that will store each keypair in a separate file.
12
+ */
13
+ export type IFilesStorage = Omit<IStorage<IFile>, 'length' | 'clear' | 'key'>;
14
+
15
+ /**
16
+ * Represents storage that can give public deterministic URL for each file
17
+ */
18
+ export type IIFilesStorageWithCdn = IFilesStorage & {
19
+ readonly cdnPublicUrl: URL;
20
+ getItemUrl(key: string): URL;
21
+ };
22
+
23
+ /**
24
+ * TODO: Probably not deterministic and async getItemUrl
25
+ * TODO: Probably just createUrlMaker
26
+ * TODO: List method
27
+ * TODO: Glob method
28
+ * TODO: Subfolder (similar to PrefixStorage) method
29
+ * TODO: Subscribe, list, sub(folder) should be part of LIB everstorage
30
+ * TODO: Probably implement observe through RxJS
31
+ * TODO: [☹️] Unite with `PromptbookStorage` and move to `/src/...`
32
+ */
@@ -0,0 +1,14 @@
1
+ // Note: This is a simplified version of the IStorage interface based on the usage in the project.
2
+ export type IStorage<T> = {
3
+ readonly length: Promise<number>;
4
+ clear(): Promise<void>;
5
+ getItem(key: string): Promise<T | null>;
6
+ key(index: number): Promise<string | null>;
7
+ removeItem(key: string): Promise<void>;
8
+ setItem(key: string, value: T): Promise<void>;
9
+ };
10
+
11
+
12
+ /**
13
+ * TODO: [☹️] Unite with `PromptbookStorage` and move to `/src/...`
14
+ */
@@ -0,0 +1,28 @@
1
+ import hexEncoder from 'crypto-js/enc-hex';
2
+ import sha256 from 'crypto-js/sha256';
3
+ import type { string_uri } from '../../../../../../src/types/typeAliases';
4
+ import { titleToName } from '../../../../../../src/utils/normalization/titleToName';
5
+ import { nameToSubfolderPath } from './nameToSubfolderPath';
6
+
7
+ /**
8
+ * Generates a path for the user content
9
+ */
10
+ export function getUserFileCdnKey(file: Buffer, originalFilename: string): string_uri {
11
+ const hash = sha256(hexEncoder.parse(file.toString('hex'))).toString(/* hex */);
12
+ // <- TODO: [🥬] Encapsulate sha256 to some private utility function
13
+
14
+ const originalFilenameParts = originalFilename.split('.');
15
+ const extension = originalFilenameParts.pop();
16
+ const name = titleToName(originalFilenameParts.join('.'));
17
+
18
+ const filename = name + '.' + extension;
19
+ // <- Note: [⛳️] Preserving original file name
20
+
21
+ return `user/files/${nameToSubfolderPath(hash).join('/')}/${filename}`;
22
+ }
23
+
24
+ /**
25
+ * TODO: [🌍] Unite this logic in one place
26
+ * TODO: Way to garbage unused uploaded files
27
+ * TODO: Probably separate util countBufferHash
28
+ */