@promptbook/cli 0.103.0-1 → 0.103.0-100
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.
- package/README.md +153 -89
- package/apps/agents-server/README.md +3 -0
- package/apps/agents-server/TODO.txt +7 -0
- package/apps/agents-server/config.ts +128 -0
- package/apps/agents-server/next.config.ts +45 -0
- package/apps/agents-server/package-lock.json +1163 -0
- package/apps/agents-server/package.json +18 -0
- package/apps/agents-server/postcss.config.mjs +8 -0
- package/apps/agents-server/public/.gitkeep +0 -0
- package/apps/agents-server/public/favicon.ico +0 -0
- package/apps/agents-server/public/fonts/OpenMoji-black-glyf.woff2 +0 -0
- package/apps/agents-server/public/fonts/download-font.js +22 -0
- package/apps/agents-server/public/logo-blue-white-256.png +0 -0
- package/apps/agents-server/public/sw.js +16 -0
- package/apps/agents-server/src/app/AddAgentButton.tsx +41 -0
- package/apps/agents-server/src/app/[agentName]/[...rest]/page.tsx +11 -0
- package/apps/agents-server/src/app/[agentName]/page.tsx +1 -0
- package/apps/agents-server/src/app/actions.ts +51 -0
- package/apps/agents-server/src/app/admin/api-tokens/ApiTokensClient.tsx +186 -0
- package/apps/agents-server/src/app/admin/api-tokens/page.tsx +13 -0
- package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +614 -0
- package/apps/agents-server/src/app/admin/chat-feedback/page.tsx +22 -0
- package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +634 -0
- package/apps/agents-server/src/app/admin/chat-history/page.tsx +21 -0
- package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +477 -0
- package/apps/agents-server/src/app/admin/metadata/page.tsx +13 -0
- package/apps/agents-server/src/app/admin/models/page.tsx +22 -0
- package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +131 -0
- package/apps/agents-server/src/app/admin/users/[userId]/page.tsx +21 -0
- package/apps/agents-server/src/app/admin/users/page.tsx +18 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +78 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentOptionsMenu.tsx +216 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +78 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentProfileView.tsx +233 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentQrCode.tsx +55 -0
- package/apps/agents-server/src/app/agents/[agentName]/AgentUrlCopy.tsx +40 -0
- package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatFeedbackButton.tsx +63 -0
- package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatHistoryButton.tsx +63 -0
- package/apps/agents-server/src/app/agents/[agentName]/CloneAgentButton.tsx +41 -0
- package/apps/agents-server/src/app/agents/[agentName]/CopyField.tsx +44 -0
- package/apps/agents-server/src/app/agents/[agentName]/InstallPwaButton.tsx +74 -0
- package/apps/agents-server/src/app/agents/[agentName]/QrCodeModal.tsx +90 -0
- package/apps/agents-server/src/app/agents/[agentName]/ServiceWorkerRegister.tsx +24 -0
- package/apps/agents-server/src/app/agents/[agentName]/TODO.txt +1 -0
- package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +19 -0
- package/apps/agents-server/src/app/agents/[agentName]/agentLinks.tsx +80 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/agents/route.ts +67 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/book/route.ts +88 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/book/test.http +37 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/chat/route.ts +174 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/feedback/route.ts +54 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/mcp/route.ts +203 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/TODO.txt +1 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/route.ts +55 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/modelRequirements/systemMessage/route.ts +47 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/openai/chat/completions/route.ts +10 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/openai/models/route.ts +93 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/chat/completions/route.ts +10 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/openai/v1/models/route.ts +93 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/openrouter/chat/completions/route.ts +10 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/profile/route.ts +76 -0
- package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +181 -0
- package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +139 -0
- package/apps/agents-server/src/app/agents/[agentName]/book/page.tsx +35 -0
- package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChat.tsx +75 -0
- package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChatComponent.tsx.todo +160 -0
- package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx +32 -0
- package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx.todo +21 -0
- package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatWrapper.tsx +68 -0
- package/apps/agents-server/src/app/agents/[agentName]/chat/page.tsx +33 -0
- package/apps/agents-server/src/app/agents/[agentName]/generateAgentMetadata.ts +42 -0
- package/apps/agents-server/src/app/agents/[agentName]/history/RestoreVersionButton.tsx +46 -0
- package/apps/agents-server/src/app/agents/[agentName]/history/actions.ts +12 -0
- package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +62 -0
- package/apps/agents-server/src/app/agents/[agentName]/images/icon-256.png/route.tsx +80 -0
- package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-fullhd.png/route.tsx +92 -0
- package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-phone.png/route.tsx +92 -0
- package/apps/agents-server/src/app/agents/[agentName]/integration/SdkCodeTabs.tsx +31 -0
- package/apps/agents-server/src/app/agents/[agentName]/integration/page.tsx +302 -0
- package/apps/agents-server/src/app/agents/[agentName]/links/page.tsx +182 -0
- package/apps/agents-server/src/app/agents/[agentName]/opengraph-image.tsx +102 -0
- package/apps/agents-server/src/app/agents/[agentName]/page.tsx +159 -0
- package/apps/agents-server/src/app/agents/[agentName]/website-integration/page.tsx +61 -0
- package/apps/agents-server/src/app/agents/page.tsx +11 -0
- package/apps/agents-server/src/app/api/agents/[agentName]/clone/route.ts +47 -0
- package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +19 -0
- package/apps/agents-server/src/app/api/agents/route.ts +43 -0
- package/apps/agents-server/src/app/api/api-tokens/route.ts +76 -0
- package/apps/agents-server/src/app/api/auth/change-password/route.ts +75 -0
- package/apps/agents-server/src/app/api/auth/login/route.ts +27 -0
- package/apps/agents-server/src/app/api/auth/logout/route.ts +7 -0
- package/apps/agents-server/src/app/api/chat/route.ts +32 -0
- package/apps/agents-server/src/app/api/chat-feedback/[id]/route.ts +38 -0
- package/apps/agents-server/src/app/api/chat-feedback/export/route.ts +55 -0
- package/apps/agents-server/src/app/api/chat-feedback/route.ts +157 -0
- package/apps/agents-server/src/app/api/chat-history/[id]/route.ts +37 -0
- package/apps/agents-server/src/app/api/chat-history/export/route.ts +55 -0
- package/apps/agents-server/src/app/api/chat-history/route.ts +147 -0
- package/apps/agents-server/src/app/api/chat-streaming/route.ts +48 -0
- package/apps/agents-server/src/app/api/embed.js/route.ts +93 -0
- package/apps/agents-server/src/app/api/federated-agents/route.ts +17 -0
- package/apps/agents-server/src/app/api/long-running-task/route.ts +7 -0
- package/apps/agents-server/src/app/api/long-streaming/route.ts +20 -0
- package/apps/agents-server/src/app/api/metadata/route.ts +116 -0
- package/apps/agents-server/src/app/api/openai/v1/chat/completions/route.ts +6 -0
- package/apps/agents-server/src/app/api/openai/v1/models/route.ts +65 -0
- package/apps/agents-server/src/app/api/upload/route.ts +83 -0
- package/apps/agents-server/src/app/api/users/[username]/route.ts +75 -0
- package/apps/agents-server/src/app/api/users/route.ts +71 -0
- package/apps/agents-server/src/app/docs/[docId]/page.tsx +43 -0
- package/apps/agents-server/src/app/docs/page.tsx +59 -0
- package/apps/agents-server/src/app/embed/page.tsx +24 -0
- package/apps/agents-server/src/app/globals.css +276 -0
- package/apps/agents-server/src/app/layout.tsx +124 -0
- package/apps/agents-server/src/app/manifest.ts +109 -0
- package/apps/agents-server/src/app/not-found.tsx +5 -0
- package/apps/agents-server/src/app/page.tsx +96 -0
- package/apps/agents-server/src/app/recycle-bin/RestoreAgentButton.tsx +40 -0
- package/apps/agents-server/src/app/recycle-bin/actions.ts +27 -0
- package/apps/agents-server/src/app/recycle-bin/page.tsx +58 -0
- package/apps/agents-server/src/app/restricted/page.tsx +33 -0
- package/apps/agents-server/src/app/test/og-image/README.md +1 -0
- package/apps/agents-server/src/app/test/og-image/opengraph-image.tsx +37 -0
- package/apps/agents-server/src/app/test/og-image/page.tsx +22 -0
- package/apps/agents-server/src/components/Auth/AuthControls.tsx +123 -0
- package/apps/agents-server/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx +41 -0
- package/apps/agents-server/src/components/ChangePasswordForm/ChangePasswordForm.tsx +159 -0
- package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +87 -0
- package/apps/agents-server/src/components/ErrorPage/ErrorPage.tsx +33 -0
- package/apps/agents-server/src/components/Footer/Footer.tsx +175 -0
- package/apps/agents-server/src/components/ForbiddenPage/ForbiddenPage.tsx +15 -0
- package/apps/agents-server/src/components/Header/Header.tsx +593 -0
- package/apps/agents-server/src/components/Homepage/AgentCard.tsx +60 -0
- package/apps/agents-server/src/components/Homepage/AgentsList.tsx +58 -0
- package/apps/agents-server/src/components/Homepage/Card.tsx +18 -0
- package/apps/agents-server/src/components/Homepage/ExternalAgentsSection.tsx +21 -0
- package/apps/agents-server/src/components/Homepage/ExternalAgentsSectionClient.tsx +183 -0
- package/apps/agents-server/src/components/Homepage/ModelCard.tsx +29 -0
- package/apps/agents-server/src/components/Homepage/ModelsSection.tsx +75 -0
- package/apps/agents-server/src/components/Homepage/Section.tsx +17 -0
- package/apps/agents-server/src/components/Homepage/TechInfoCard.tsx +20 -0
- package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +53 -0
- package/apps/agents-server/src/components/LoginDialog/LoginDialog.tsx +41 -0
- package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +109 -0
- package/apps/agents-server/src/components/NotFoundPage/NotFoundPage.tsx +17 -0
- package/apps/agents-server/src/components/OpenMojiIcon/OpenMojiIcon.tsx +20 -0
- package/apps/agents-server/src/components/Portal/Portal.tsx +38 -0
- package/apps/agents-server/src/components/PrintButton/PrintButton.tsx +18 -0
- package/apps/agents-server/src/components/PrintHeader/PrintHeader.tsx +18 -0
- package/apps/agents-server/src/components/UsersList/UsersList.tsx +141 -0
- package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +139 -0
- package/apps/agents-server/src/components/VercelDeploymentCard/VercelDeploymentCard.tsx +55 -0
- package/apps/agents-server/src/database/$getTableName.ts +18 -0
- package/apps/agents-server/src/database/$provideSupabase.ts +29 -0
- package/apps/agents-server/src/database/$provideSupabaseForBrowser.ts +41 -0
- package/apps/agents-server/src/database/$provideSupabaseForServer.ts +48 -0
- package/apps/agents-server/src/database/$provideSupabaseForWorker.ts +43 -0
- package/apps/agents-server/src/database/getMetadata.ts +31 -0
- package/apps/agents-server/src/database/metadataDefaults.ts +69 -0
- package/apps/agents-server/src/database/migrate.ts +131 -0
- package/apps/agents-server/src/database/migrations/2025-11-0001-initial-schema.sql +163 -0
- package/apps/agents-server/src/database/migrations/2025-11-0002-metadata-table.sql +16 -0
- package/apps/agents-server/src/database/migrations/2025-12-0010-llm-cache.sql +12 -0
- package/apps/agents-server/src/database/migrations/2025-12-0060-api-tokens.sql +13 -0
- package/apps/agents-server/src/database/migrations/2025-12-0070-chat-history-source.sql +2 -0
- package/apps/agents-server/src/database/schema.ts +308 -0
- package/apps/agents-server/src/deamons/longRunningTask.ts +37 -0
- package/apps/agents-server/src/middleware.ts +301 -0
- package/apps/agents-server/src/tools/$provideAgentCollectionForServer.ts +54 -0
- package/apps/agents-server/src/tools/$provideCdnForServer.ts +24 -0
- package/apps/agents-server/src/tools/$provideExecutionToolsForServer.ts +117 -0
- package/apps/agents-server/src/tools/$provideOpenAiAssistantExecutionToolsForServer.ts +35 -0
- package/apps/agents-server/src/tools/$provideServer.ts +39 -0
- package/apps/agents-server/src/utils/auth.ts +33 -0
- package/apps/agents-server/src/utils/authenticateUser.ts +42 -0
- package/apps/agents-server/src/utils/cache/SupabaseCacheStorage.ts +55 -0
- package/apps/agents-server/src/utils/cdn/classes/VercelBlobStorage.ts +63 -0
- package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +32 -0
- package/apps/agents-server/src/utils/cdn/interfaces/IStorage.ts +14 -0
- package/apps/agents-server/src/utils/cdn/utils/getUserFileCdnKey.ts +28 -0
- package/apps/agents-server/src/utils/cdn/utils/nameToSubfolderPath.ts +9 -0
- package/apps/agents-server/src/utils/cdn/utils/nextRequestToNodeRequest.ts +27 -0
- package/apps/agents-server/src/utils/chatFeedbackAdmin.ts +96 -0
- package/apps/agents-server/src/utils/chatHistoryAdmin.ts +96 -0
- package/apps/agents-server/src/utils/convertToCsv.ts +31 -0
- package/apps/agents-server/src/utils/getCurrentUser.ts +32 -0
- package/apps/agents-server/src/utils/getEffectiveFederatedServers.ts +22 -0
- package/apps/agents-server/src/utils/getFederatedAgents.ts +89 -0
- package/apps/agents-server/src/utils/getFederatedServersFromMetadata.ts +10 -0
- package/apps/agents-server/src/utils/getVisibleCommitmentDefinitions.ts +12 -0
- package/apps/agents-server/src/utils/handleChatCompletion.ts +355 -0
- package/apps/agents-server/src/utils/isIpAllowed.ts +101 -0
- package/apps/agents-server/src/utils/isUserAdmin.ts +31 -0
- package/apps/agents-server/src/utils/resolveInheritedAgentSource.ts +100 -0
- package/apps/agents-server/src/utils/session.ts +50 -0
- package/apps/agents-server/src/utils/validateApiKey.ts +128 -0
- package/apps/agents-server/src/utils/validators/validateMimeType.ts +24 -0
- package/apps/agents-server/tailwind.config.ts +26 -0
- package/apps/agents-server/tsconfig.json +29 -0
- package/apps/agents-server/vercel.json +7 -0
- package/esm/index.es.js +5114 -383
- package/esm/index.es.js.map +1 -1
- package/esm/typings/books/index.d.ts +0 -81
- package/esm/typings/servers.d.ts +9 -7
- package/esm/typings/src/_packages/browser.index.d.ts +6 -0
- package/esm/typings/src/_packages/cli.index.d.ts +4 -0
- package/esm/typings/src/_packages/components.index.d.ts +20 -8
- package/esm/typings/src/_packages/core.index.d.ts +58 -18
- package/esm/typings/src/_packages/node.index.d.ts +2 -2
- package/esm/typings/src/_packages/remote-server.index.d.ts +2 -0
- package/esm/typings/src/_packages/types.index.d.ts +58 -8
- package/esm/typings/src/_packages/utils.index.d.ts +6 -0
- package/esm/typings/src/_packages/wizard.index.d.ts +4 -0
- package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +19 -5
- package/esm/typings/src/book-2.0/agent-source/AgentModelRequirements.d.ts +17 -1
- package/esm/typings/src/book-2.0/agent-source/AgentSourceParseResult.d.ts +3 -2
- package/esm/typings/src/book-2.0/agent-source/computeAgentHash.d.ts +8 -0
- package/esm/typings/src/book-2.0/agent-source/createCommitmentRegex.d.ts +3 -3
- package/esm/typings/src/book-2.0/agent-source/createDefaultAgentName.d.ts +8 -0
- package/esm/typings/src/book-2.0/agent-source/normalizeAgentName.d.ts +9 -0
- package/esm/typings/src/book-2.0/agent-source/padBook.d.ts +18 -0
- package/esm/typings/src/book-2.0/agent-source/parseAgentSourceWithCommitments.d.ts +1 -1
- package/esm/typings/src/book-2.0/agent-source/string_book.d.ts +3 -0
- package/esm/typings/src/book-components/AvatarProfile/AvatarProfile/AvatarProfile.d.ts +10 -0
- package/esm/typings/src/book-components/AvatarProfile/AvatarProfile/AvatarProfileTooltip.d.ts +15 -0
- package/esm/typings/src/book-components/BookEditor/BookEditor.d.ts +83 -8
- package/esm/typings/src/book-components/BookEditor/BookEditorActionbar.d.ts +14 -0
- package/esm/typings/src/book-components/BookEditor/BookEditorMonaco.d.ts +5 -0
- package/esm/typings/src/book-components/Chat/AgentChat/AgentChat.d.ts +14 -0
- package/esm/typings/src/book-components/Chat/AgentChat/AgentChatProps.d.ts +13 -0
- package/esm/typings/src/book-components/Chat/Chat/ChatProps.d.ts +10 -0
- package/esm/typings/src/book-components/Chat/LlmChat/LlmChatProps.d.ts +5 -0
- package/esm/typings/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +15 -0
- package/esm/typings/src/book-components/Chat/MockedChat/MockedChat.d.ts +5 -0
- package/esm/typings/src/book-components/Chat/save/_common/ChatSaveFormatDefinition.d.ts +1 -1
- package/esm/typings/src/book-components/Chat/save/html/htmlSaveFormatDefinition.d.ts +1 -0
- package/esm/typings/src/book-components/Chat/save/pdf/pdfSaveFormatDefinition.d.ts +4 -0
- package/esm/typings/src/book-components/Chat/types/ChatParticipant.d.ts +5 -0
- package/esm/typings/src/book-components/PromptbookAgent/PromptbookAgent.d.ts +29 -0
- package/esm/typings/src/book-components/Qr/BrandedQrCode.d.ts +18 -0
- package/esm/typings/src/book-components/Qr/GenericQrCode.d.ts +10 -0
- package/esm/typings/src/book-components/Qr/PromptbookQrCode.d.ts +18 -0
- package/esm/typings/src/book-components/Qr/useQrCode.d.ts +15 -0
- package/esm/typings/src/book-components/_common/Dropdown/Dropdown.d.ts +15 -0
- package/esm/typings/src/book-components/_common/HamburgerMenu/HamburgerMenu.d.ts +12 -0
- package/esm/typings/src/book-components/_common/Modal/Modal.d.ts +13 -0
- package/esm/typings/src/book-components/_common/Tooltip/Tooltip.d.ts +47 -0
- package/esm/typings/src/book-components/_common/react-utils/classNames.d.ts +1 -1
- package/esm/typings/src/book-components/icons/AboutIcon.d.ts +9 -0
- package/esm/typings/src/book-components/icons/CloseIcon.d.ts +4 -8
- package/esm/typings/src/book-components/icons/DownloadIcon.d.ts +9 -0
- package/esm/typings/src/book-components/icons/ExitFullscreenIcon.d.ts +7 -0
- package/esm/typings/src/book-components/icons/FullscreenIcon.d.ts +7 -0
- package/esm/typings/src/book-components/icons/MenuIcon.d.ts +12 -0
- package/esm/typings/src/book-components/icons/MicIcon.d.ts +8 -0
- package/esm/typings/src/cli/cli-commands/_boilerplate.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/about.d.ts +3 -1
- package/esm/typings/src/cli/cli-commands/hello.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/list-models.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/list-scrapers.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/login.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/make.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/prettify.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/run.d.ts +2 -1
- package/esm/typings/src/cli/cli-commands/{start-server.d.ts → start-agents-server.d.ts} +3 -2
- package/esm/typings/src/cli/cli-commands/start-pipelines-server.d.ts +15 -0
- package/esm/typings/src/cli/cli-commands/test-command.d.ts +2 -1
- package/esm/typings/src/cli/common/$addGlobalOptionsToCommand.d.ts +2 -1
- package/esm/typings/src/collection/agent-collection/AgentCollection.d.ts +12 -0
- package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +75 -0
- package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabaseOptions.d.ts +10 -0
- package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentsDatabaseSchema.d.ts +154 -0
- package/esm/typings/src/collection/{PipelineCollection.d.ts → pipeline-collection/PipelineCollection.d.ts} +7 -3
- package/esm/typings/src/collection/{SimplePipelineCollection.d.ts → pipeline-collection/SimplePipelineCollection.d.ts} +5 -5
- package/esm/typings/src/collection/{constructors/createCollectionFromDirectory.d.ts → pipeline-collection/constructors/createPipelineCollectionFromDirectory.d.ts} +8 -11
- package/esm/typings/src/collection/pipeline-collection/constructors/createPipelineCollectionFromJson.d.ts +13 -0
- package/esm/typings/src/collection/{constructors/createCollectionFromPromise.d.ts → pipeline-collection/constructors/createPipelineCollectionFromPromise.d.ts} +6 -5
- package/esm/typings/src/collection/pipeline-collection/constructors/createPipelineCollectionFromPromise.test.d.ts +1 -0
- package/esm/typings/src/collection/{constructors/createCollectionFromUrl.d.ts → pipeline-collection/constructors/createPipelineCollectionFromUrl.d.ts} +3 -3
- package/esm/typings/src/collection/{constructors/createSubcollection.d.ts → pipeline-collection/constructors/createPipelineSubcollection.d.ts} +3 -3
- package/esm/typings/src/collection/pipeline-collection/pipelineCollectionToJson.d.ts +13 -0
- package/esm/typings/src/commands/_common/types/CommandParser.d.ts +4 -5
- package/esm/typings/src/{book-2.0/commitments → commitments}/ACTION/ACTION.d.ts +5 -1
- package/esm/typings/src/commitments/CLOSED/CLOSED.d.ts +35 -0
- package/esm/typings/src/commitments/COMPONENT/COMPONENT.d.ts +28 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/DELETE/DELETE.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/FORMAT/FORMAT.d.ts +5 -1
- package/esm/typings/src/commitments/FROM/FROM.d.ts +34 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/GOAL/GOAL.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/KNOWLEDGE/KNOWLEDGE.d.ts +5 -5
- package/esm/typings/src/commitments/LANGUAGE/LANGUAGE.d.ts +35 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/MEMORY/MEMORY.d.ts +5 -1
- package/esm/typings/src/commitments/MESSAGE/AgentMessageCommitmentDefinition.d.ts +32 -0
- package/esm/typings/src/commitments/MESSAGE/InitialMessageCommitmentDefinition.d.ts +32 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/MESSAGE/MESSAGE.d.ts +5 -1
- package/esm/typings/src/commitments/MESSAGE/UserMessageCommitmentDefinition.d.ts +32 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/META/META.d.ts +5 -1
- package/esm/typings/src/commitments/META_COLOR/META_COLOR.d.ts +48 -0
- package/esm/typings/src/commitments/META_FONT/META_FONT.d.ts +42 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/META_IMAGE/META_IMAGE.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/META_LINK/META_LINK.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/MODEL/MODEL.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/NOTE/NOTE.d.ts +5 -1
- package/esm/typings/src/commitments/OPEN/OPEN.d.ts +35 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/PERSONA/PERSONA.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/RULE/RULE.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/SAMPLE/SAMPLE.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/SCENARIO/SCENARIO.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/STYLE/STYLE.d.ts +5 -1
- package/esm/typings/src/commitments/USE/USE.d.ts +53 -0
- package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.d.ts +38 -0
- package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.test.d.ts +1 -0
- package/esm/typings/src/commitments/USE_MCP/USE_MCP.d.ts +37 -0
- package/esm/typings/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +38 -0
- package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BaseCommitmentDefinition.d.ts +8 -2
- package/esm/typings/src/{book-2.0/commitments → commitments}/_base/CommitmentDefinition.d.ts +6 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/_base/NotYetImplementedCommitmentDefinition.d.ts +5 -1
- package/esm/typings/src/{book-2.0/commitments → commitments}/_base/createEmptyAgentModelRequirements.d.ts +1 -1
- package/esm/typings/src/commitments/index.d.ts +93 -0
- package/esm/typings/src/config.d.ts +24 -3
- package/esm/typings/src/conversion/validation/validatePipeline.d.ts +2 -0
- package/esm/typings/src/errors/0-index.d.ts +6 -0
- package/esm/typings/src/errors/DatabaseError.d.ts +12 -0
- package/esm/typings/src/errors/NotAllowed.d.ts +9 -0
- package/esm/typings/src/errors/WrappedError.d.ts +2 -2
- package/esm/typings/src/execution/AvailableModel.d.ts +1 -0
- package/esm/typings/src/execution/Executables.d.ts +3 -0
- package/esm/typings/src/execution/ExecutionTask.d.ts +12 -3
- package/esm/typings/src/execution/ExecutionTools.d.ts +5 -0
- package/esm/typings/src/execution/FilesystemTools.d.ts +1 -1
- package/esm/typings/src/execution/LlmExecutionTools.d.ts +21 -1
- package/esm/typings/src/execution/createPipelineExecutor/10-executePipeline.d.ts +5 -0
- package/esm/typings/src/execution/createPipelineExecutor/20-executeTask.d.ts +5 -0
- package/esm/typings/src/execution/createPipelineExecutor/30-executeFormatSubvalues.d.ts +5 -0
- package/esm/typings/src/execution/createPipelineExecutor/40-executeAttempts.d.ts +5 -0
- package/esm/typings/src/execution/utils/usage-constants.d.ts +4 -124
- package/esm/typings/src/execution/utils/validatePromptResult.d.ts +2 -0
- package/esm/typings/src/high-level-abstractions/_common/HighLevelAbstraction.d.ts +2 -1
- package/esm/typings/src/llm-providers/_common/register/$provideLlmToolsForWizardOrCli.d.ts +2 -2
- package/esm/typings/src/llm-providers/_common/register/$registeredLlmToolsMessage.d.ts +2 -1
- package/esm/typings/src/llm-providers/_common/register/LlmToolsMetadata.d.ts +1 -1
- package/esm/typings/src/llm-providers/_common/utils/assertUniqueModels.d.ts +12 -0
- package/esm/typings/src/llm-providers/_multiple/getSingleLlmExecutionTools.d.ts +1 -0
- package/esm/typings/src/llm-providers/_multiple/joinLlmExecutionTools.d.ts +1 -0
- package/esm/typings/src/llm-providers/agent/Agent.d.ts +70 -0
- package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +26 -4
- package/esm/typings/src/llm-providers/agent/AgentOptions.d.ts +19 -0
- package/esm/typings/src/llm-providers/agent/CreateAgentLlmExecutionToolsOptions.d.ts +17 -0
- package/esm/typings/src/llm-providers/agent/RemoteAgent.d.ts +50 -0
- package/esm/typings/src/llm-providers/agent/RemoteAgentOptions.d.ts +11 -0
- package/esm/typings/src/llm-providers/agent/createAgentLlmExecutionTools.d.ts +1 -19
- package/esm/typings/src/llm-providers/anthropic-claude/anthropic-claude-models.d.ts +1 -1
- package/esm/typings/src/llm-providers/google/google-models.d.ts +1 -1
- package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionTools.d.ts +60 -2
- package/esm/typings/src/llm-providers/openai/OpenAiAssistantExecutionToolsOptions.d.ts +7 -1
- package/esm/typings/src/llm-providers/openai/openai-models.d.ts +1 -1
- package/esm/typings/src/llm-providers/openai/openai-models.test.d.ts +4 -0
- package/esm/typings/src/other/templates/getTemplatesPipelineCollection.d.ts +1 -1
- package/esm/typings/src/pipeline/validatePipelineString.d.ts +2 -0
- package/esm/typings/src/playground/permanent/_boilerplate.d.ts +5 -0
- package/esm/typings/src/playground/permanent/agent-with-browser-playground.d.ts +5 -0
- package/esm/typings/src/prepare/PrepareAndScrapeOptions.d.ts +1 -0
- package/esm/typings/src/remote-server/startAgentServer.d.ts +26 -0
- package/esm/typings/src/remote-server/startRemoteServer.d.ts +4 -1
- package/esm/typings/src/remote-server/types/RemoteServerOptions.d.ts +3 -8
- package/esm/typings/src/scrapers/_boilerplate/createBoilerplateScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/_boilerplate/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/document/createDocumentScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/document/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/document-legacy/createLegacyDocumentScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/document-legacy/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/markdown/createMarkdownScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/markdown/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/markitdown/createMarkitdownScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/markitdown/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/pdf/createPdfScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/pdf/register-metadata.d.ts +1 -9
- package/esm/typings/src/scrapers/website/createWebsiteScraper.d.ts +1 -12
- package/esm/typings/src/scrapers/website/register-metadata.d.ts +1 -9
- package/esm/typings/src/storage/_common/PromptbookStorage.d.ts +1 -0
- package/esm/typings/src/storage/env-storage/$EnvStorage.d.ts +2 -1
- package/esm/typings/src/transpilers/_common/BookTranspiler.d.ts +33 -0
- package/esm/typings/src/transpilers/_common/BookTranspilerOptions.d.ts +18 -0
- package/esm/typings/src/transpilers/_common/register/$bookTranspilersRegister.d.ts +15 -0
- package/esm/typings/src/transpilers/formatted-book-in-markdown/FormattedBookInMarkdownTranspiler.d.ts +16 -0
- package/esm/typings/src/transpilers/formatted-book-in-markdown/register.d.ts +15 -0
- package/esm/typings/src/transpilers/openai-sdk/OpenAiSdkTranspiler.d.ts +16 -0
- package/esm/typings/src/transpilers/openai-sdk/OpenAiSdkTranspiler.test.d.ts +1 -0
- package/esm/typings/src/transpilers/openai-sdk/playground/playground.d.ts +5 -0
- package/esm/typings/src/transpilers/openai-sdk/register.d.ts +15 -0
- package/esm/typings/src/types/LlmCall.d.ts +20 -0
- package/esm/typings/src/types/Updatable.d.ts +19 -0
- package/esm/typings/src/types/typeAliases.d.ts +32 -2
- package/esm/typings/src/utils/color/$randomColor.d.ts +1 -0
- package/esm/typings/src/utils/color/Color.d.ts +15 -0
- package/esm/typings/src/utils/color/Color.test.d.ts +1 -0
- package/esm/typings/src/utils/color/css-colors.d.ts +1 -0
- package/esm/typings/src/utils/color/internal-utils/checkChannelValue.d.ts +0 -3
- package/esm/typings/src/utils/color/operators/darken.d.ts +1 -1
- package/esm/typings/src/utils/color/operators/grayscale.d.ts +1 -1
- package/esm/typings/src/utils/color/operators/lighten.d.ts +1 -1
- package/esm/typings/src/utils/color/operators/mixWithColor.d.ts +1 -1
- package/esm/typings/src/utils/color/operators/saturate.d.ts +1 -1
- package/esm/typings/src/utils/environment/$detectRuntimeEnvironment.d.ts +16 -0
- package/esm/typings/src/utils/environment/$getGlobalScope.d.ts +2 -2
- package/esm/typings/src/utils/execCommand/$execCommand.d.ts +2 -1
- package/esm/typings/src/utils/execCommand/$execCommands.d.ts +2 -1
- package/esm/typings/src/utils/files/$induceBookDownload.d.ts +13 -0
- package/esm/typings/src/utils/files/$induceFileDownload.d.ts +13 -0
- package/esm/typings/src/utils/files/ObjectUrl.d.ts +46 -0
- package/esm/typings/src/utils/files/listAllFiles.d.ts +2 -3
- package/esm/typings/src/utils/misc/aboutPromptbookInformation.d.ts +27 -0
- package/esm/typings/src/utils/misc/computeHash.d.ts +11 -0
- package/esm/typings/src/utils/misc/computeHash.test.d.ts +1 -0
- package/esm/typings/src/utils/misc/injectCssModuleIntoShadowRoot.d.ts +1 -0
- package/esm/typings/src/utils/misc/xAboutPromptbookInformation.d.ts +13 -0
- package/esm/typings/src/utils/normalization/normalize-to-kebab-case.d.ts +2 -0
- package/esm/typings/src/utils/normalization/normalizeMessageText.d.ts +9 -0
- package/esm/typings/src/utils/normalization/normalizeMessageText.test.d.ts +1 -0
- package/esm/typings/src/utils/normalization/normalizeTo_PascalCase.d.ts +3 -0
- package/esm/typings/src/utils/normalization/normalizeTo_camelCase.d.ts +2 -0
- package/esm/typings/src/utils/normalization/titleToName.d.ts +2 -0
- package/esm/typings/src/utils/organization/$sideEffect.d.ts +2 -2
- package/esm/typings/src/utils/organization/$side_effect.d.ts +7 -0
- package/esm/typings/src/utils/organization/TODO_USE.d.ts +2 -2
- package/esm/typings/src/utils/organization/keepUnused.d.ts +2 -2
- package/esm/typings/src/utils/organization/preserve.d.ts +3 -3
- package/esm/typings/src/utils/organization/really_any.d.ts +7 -0
- package/esm/typings/src/utils/random/$generateBookBoilerplate.d.ts +25 -0
- package/esm/typings/src/utils/random/$randomAgentPersona.d.ts +9 -0
- package/esm/typings/src/utils/random/$randomFullnameWithColor.d.ts +13 -0
- package/esm/typings/src/utils/random/$randomItem.d.ts +9 -0
- package/esm/typings/src/utils/random/$randomSeed.d.ts +3 -0
- package/esm/typings/src/utils/random/$randomToken.d.ts +2 -0
- package/esm/typings/src/utils/serialization/$deepFreeze.d.ts +2 -1
- package/esm/typings/src/utils/serialization/asSerializable.d.ts +2 -2
- package/esm/typings/src/utils/serialization/serializeToPromptbookJavascript.d.ts +2 -2
- package/esm/typings/src/utils/validators/parameterName/validateParameterName.d.ts +2 -0
- package/esm/typings/src/version.d.ts +1 -1
- package/esm/typings/src/wizard/$getCompiledBook.d.ts +1 -2
- package/package.json +15 -15
- package/umd/index.umd.js +5089 -356
- package/umd/index.umd.js.map +1 -1
- package/esm/typings/src/book-2.0/commitments/index.d.ts +0 -60
- package/esm/typings/src/book-components/BookEditor/BookEditorInner.d.ts +0 -5
- package/esm/typings/src/book-components/BookEditor/config.d.ts +0 -10
- package/esm/typings/src/book-components/Chat/utils/renderMarkdown.d.ts +0 -21
- package/esm/typings/src/collection/collectionToJson.d.ts +0 -13
- package/esm/typings/src/collection/constructors/createCollectionFromJson.d.ts +0 -13
- /package/esm/typings/src/{book-components/Chat/utils/renderMarkdown.test.d.ts → book-2.0/agent-source/computeAgentHash.test.d.ts} +0 -0
- /package/esm/typings/src/{collection/constructors/createCollectionFromDirectory.test.d.ts → book-2.0/agent-source/normalizeAgentName.test.d.ts} +0 -0
- /package/esm/typings/src/{collection/constructors/createCollectionFromJson.test.d.ts → book-components/Chat/AgentChat/AgentChat.test.d.ts} +0 -0
- /package/esm/typings/src/collection/{constructors/createCollectionFromPromise.test.d.ts → pipeline-collection/constructors/createPipelineCollectionFromDirectory.test.d.ts} +0 -0
- /package/esm/typings/src/{commands/_common/parseCommand.test.d.ts → collection/pipeline-collection/constructors/createPipelineCollectionFromJson.test.d.ts} +0 -0
- /package/esm/typings/src/collection/{collectionToJson.test.d.ts → pipeline-collection/pipelineCollectionToJson.test.d.ts} +0 -0
- /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/BookCommitment.d.ts +0 -0
- /package/esm/typings/src/{book-2.0/commitments → commitments}/_base/ParsedCommitment.d.ts +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
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.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
|
+
return cdn;
|
|
24
|
+
}
|
|
@@ -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,63 @@
|
|
|
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
|
+
// Note: We rely on Vercel Blob for compression
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -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
|
+
*/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { string_name } from '../../../../../../src/types/typeAliases';
|
|
2
|
+
|
|
3
|
+
export function nameToSubfolderPath(name: string_name): Array<string> {
|
|
4
|
+
return [name.substr(0, 2).toLowerCase(), name.substr(2, 5).toLowerCase()];
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* TODO: [🐱🚀] Use `nameToSubfolderPath` from src
|
|
9
|
+
*/
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TODO_any } from '@promptbook-local/types';
|
|
2
|
+
import { NextRequest } from 'next/server';
|
|
3
|
+
import { Readable } from 'node:stream';
|
|
4
|
+
|
|
5
|
+
export async function nextRequestToNodeRequest(nextRequest: NextRequest): Promise<Readable> {
|
|
6
|
+
const reader = nextRequest.body?.getReader();
|
|
7
|
+
|
|
8
|
+
if (!reader) {
|
|
9
|
+
throw new Error(`Can not get nextRequest.body.getReader()`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const nodeStream = new Readable({
|
|
13
|
+
async read() {
|
|
14
|
+
const { done, value } = await reader.read();
|
|
15
|
+
if (done) this.push(null);
|
|
16
|
+
else this.push(Buffer.from(value));
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Fake IncomingMessage with headers
|
|
21
|
+
(nodeStream as TODO_any).headers = Object.fromEntries(nextRequest.headers.entries());
|
|
22
|
+
(nodeStream as TODO_any).method = nextRequest.method;
|
|
23
|
+
(nodeStream as TODO_any).url = nextRequest.url;
|
|
24
|
+
(nodeStream as TODO_any).socket = {}; // required by formidable
|
|
25
|
+
|
|
26
|
+
return nodeStream;
|
|
27
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { AgentsServerDatabase } from '../database/schema';
|
|
2
|
+
|
|
3
|
+
export type ChatFeedbackRow = AgentsServerDatabase['public']['Tables']['ChatFeedback']['Row'];
|
|
4
|
+
export type ChatFeedbackSortField = 'createdAt' | 'agentName' | 'id';
|
|
5
|
+
export type ChatFeedbackSortOrder = 'asc' | 'desc';
|
|
6
|
+
|
|
7
|
+
export type ChatFeedbackListResponse = {
|
|
8
|
+
items: ChatFeedbackRow[];
|
|
9
|
+
total: number;
|
|
10
|
+
page: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
sortBy: ChatFeedbackSortField;
|
|
13
|
+
sortOrder: ChatFeedbackSortOrder;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type ChatFeedbackListParams = {
|
|
17
|
+
page?: number;
|
|
18
|
+
pageSize?: number;
|
|
19
|
+
agentName?: string;
|
|
20
|
+
search?: string;
|
|
21
|
+
sortBy?: ChatFeedbackSortField;
|
|
22
|
+
sortOrder?: ChatFeedbackSortOrder;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build query string for chat feedback listing.
|
|
27
|
+
*
|
|
28
|
+
* Kept in a dedicated helper so it can be shared between the
|
|
29
|
+
* admin feedback page and other admin UIs (per-agent tools, etc.).
|
|
30
|
+
*/
|
|
31
|
+
function buildQuery(params: ChatFeedbackListParams): string {
|
|
32
|
+
const searchParams = new URLSearchParams();
|
|
33
|
+
|
|
34
|
+
if (params.page && params.page > 0) searchParams.set('page', String(params.page));
|
|
35
|
+
if (params.pageSize && params.pageSize > 0) searchParams.set('pageSize', String(params.pageSize));
|
|
36
|
+
if (params.agentName) searchParams.set('agentName', params.agentName);
|
|
37
|
+
if (params.search) searchParams.set('search', params.search);
|
|
38
|
+
if (params.sortBy) searchParams.set('sortBy', params.sortBy);
|
|
39
|
+
if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
|
|
40
|
+
|
|
41
|
+
const qs = searchParams.toString();
|
|
42
|
+
return qs ? `?${qs}` : '';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Fetch chat feedback from the admin API.
|
|
47
|
+
*/
|
|
48
|
+
export async function $fetchChatFeedback(params: ChatFeedbackListParams = {}): Promise<ChatFeedbackListResponse> {
|
|
49
|
+
const qs = buildQuery(params);
|
|
50
|
+
const response = await fetch(`/api/chat-feedback${qs}`, {
|
|
51
|
+
method: 'GET',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
const data = await response.json().catch(() => ({}));
|
|
56
|
+
throw new Error(data.error || 'Failed to load chat feedback');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return (await response.json()) as ChatFeedbackListResponse;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Clear chat feedback for a specific agent.
|
|
64
|
+
*/
|
|
65
|
+
export async function $clearAgentChatFeedback(agentName: string): Promise<void> {
|
|
66
|
+
if (!agentName) {
|
|
67
|
+
throw new Error('agentName is required to clear chat feedback');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const response = await fetch(`/api/chat-feedback?agentName=${encodeURIComponent(agentName)}`, {
|
|
71
|
+
method: 'DELETE',
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
const data = await response.json().catch(() => ({}));
|
|
76
|
+
throw new Error(data.error || 'Failed to clear chat feedback');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Delete a single chat feedback row by ID.
|
|
82
|
+
*/
|
|
83
|
+
export async function $deleteChatFeedbackRow(id: number): Promise<void> {
|
|
84
|
+
if (!id || id <= 0) {
|
|
85
|
+
throw new Error('Valid id is required to delete chat feedback row');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const response = await fetch(`/api/chat-feedback/${encodeURIComponent(String(id))}`, {
|
|
89
|
+
method: 'DELETE',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const data = await response.json().catch(() => ({}));
|
|
94
|
+
throw new Error(data.error || 'Failed to delete chat feedback row');
|
|
95
|
+
}
|
|
96
|
+
}
|