@promptbook/cli 0.104.0-0 → 0.104.0-10

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 (204) hide show
  1. package/apps/agents-server/config.ts +1 -3
  2. package/apps/agents-server/next.config.ts +2 -2
  3. package/apps/agents-server/package.json +7 -3
  4. package/apps/agents-server/public/fonts/OpenMoji-color-cbdt.woff2 +0 -0
  5. package/apps/agents-server/public/swagger.json +115 -0
  6. package/apps/agents-server/scripts/generate-reserved-paths/generate-reserved-paths.ts +54 -0
  7. package/apps/agents-server/scripts/generate-reserved-paths/tsconfig.json +19 -0
  8. package/apps/agents-server/src/app/AddAgentButton.tsx +47 -21
  9. package/apps/agents-server/src/app/actions.ts +22 -5
  10. package/apps/agents-server/src/app/admin/browser-test/BrowserTestClient.tsx +211 -0
  11. package/apps/agents-server/src/app/admin/browser-test/page.tsx +13 -0
  12. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +221 -274
  13. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +94 -137
  14. package/apps/agents-server/src/app/admin/messages/MessagesClient.tsx +294 -0
  15. package/apps/agents-server/src/app/admin/messages/page.tsx +13 -0
  16. package/apps/agents-server/src/app/admin/messages/send-email/SendEmailClient.tsx +104 -0
  17. package/apps/agents-server/src/app/admin/messages/send-email/actions.ts +35 -0
  18. package/apps/agents-server/src/app/admin/messages/send-email/page.tsx +13 -0
  19. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +23 -19
  20. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +15 -1
  21. package/apps/agents-server/src/app/agents/[agentName]/AgentOptionsMenu.tsx +51 -9
  22. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +47 -4
  23. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileWrapper.tsx +53 -11
  24. package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +23 -3
  25. package/apps/agents-server/src/app/agents/[agentName]/agentLinks.tsx +8 -8
  26. package/apps/agents-server/src/app/agents/[agentName]/api/agents/route.ts +17 -26
  27. package/apps/agents-server/src/app/agents/[agentName]/api/book/route.ts +4 -2
  28. package/apps/agents-server/src/app/agents/[agentName]/api/chat/route.ts +20 -0
  29. package/apps/agents-server/src/app/agents/[agentName]/api/mcp/route.ts +6 -11
  30. package/apps/agents-server/src/app/agents/[agentName]/api/profile/route.ts +5 -1
  31. package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +5 -2
  32. package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +20 -16
  33. package/apps/agents-server/src/app/agents/[agentName]/book/page.tsx +15 -2
  34. package/apps/agents-server/src/app/agents/[agentName]/book+chat/page.tsx +15 -2
  35. package/apps/agents-server/src/app/agents/[agentName]/chat/page.tsx +12 -0
  36. package/apps/agents-server/src/app/agents/[agentName]/code/api/route.ts +68 -0
  37. package/apps/agents-server/src/app/agents/[agentName]/code/page.tsx +223 -0
  38. package/apps/agents-server/src/app/agents/[agentName]/generateAgentMetadata.ts +5 -0
  39. package/apps/agents-server/src/app/agents/[agentName]/history/actions.ts +2 -2
  40. package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +10 -3
  41. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/getAgentDefaultAvatarPrompt.ts +31 -0
  42. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/route.ts +194 -0
  43. package/apps/agents-server/src/app/agents/[agentName]/images/icon-256.png/route.tsx +14 -2
  44. package/apps/agents-server/src/app/agents/[agentName]/images/page.tsx +200 -0
  45. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-fullhd.png/route.tsx +4 -3
  46. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-phone.png/route.tsx +4 -3
  47. package/apps/agents-server/src/app/agents/[agentName]/integration/WebsiteIntegrationTabs.tsx +26 -0
  48. package/apps/agents-server/src/app/agents/[agentName]/integration/page.tsx +32 -8
  49. package/apps/agents-server/src/app/agents/[agentName]/links/page.tsx +11 -4
  50. package/apps/agents-server/src/app/agents/[agentName]/opengraph-image.tsx +11 -2
  51. package/apps/agents-server/src/app/agents/[agentName]/page.tsx +18 -10
  52. package/apps/agents-server/src/app/agents/[agentName]/system-message/page.tsx +100 -0
  53. package/apps/agents-server/src/app/agents/[agentName]/website-integration/page.tsx +35 -18
  54. package/apps/agents-server/src/app/api/admin-email/route.ts +12 -0
  55. package/apps/agents-server/src/app/api/agents/[agentName]/clone/route.ts +13 -14
  56. package/apps/agents-server/src/app/api/agents/[agentName]/restore/route.ts +20 -0
  57. package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +43 -1
  58. package/apps/agents-server/src/app/api/agents/route.ts +28 -3
  59. package/apps/agents-server/src/app/api/api-tokens/route.ts +6 -7
  60. package/apps/agents-server/src/app/api/browser-test/act/route.ts +141 -0
  61. package/apps/agents-server/src/app/api/browser-test/screenshot/route.ts +30 -0
  62. package/apps/agents-server/src/app/api/browser-test/scroll-facebook/route.ts +62 -0
  63. package/apps/agents-server/src/app/api/docs/book.md/route.ts +61 -0
  64. package/apps/agents-server/src/app/api/emails/incoming/sendgrid/route.ts +48 -0
  65. package/apps/agents-server/src/app/api/embed.js/route.ts +87 -67
  66. package/apps/agents-server/src/app/api/federated-agents/route.ts +12 -0
  67. package/apps/agents-server/src/app/api/images/[filename]/route.ts +107 -0
  68. package/apps/agents-server/src/app/api/messages/route.ts +102 -0
  69. package/apps/agents-server/src/app/api/metadata/route.ts +5 -6
  70. package/apps/agents-server/src/app/api/upload/route.ts +128 -45
  71. package/apps/agents-server/src/app/docs/[docId]/page.tsx +2 -3
  72. package/apps/agents-server/src/app/docs/page.tsx +12 -12
  73. package/apps/agents-server/src/app/embed/layout.tsx +31 -0
  74. package/apps/agents-server/src/app/embed/page.tsx +22 -9
  75. package/apps/agents-server/src/app/globals.css +140 -33
  76. package/apps/agents-server/src/app/humans.txt/route.ts +1 -1
  77. package/apps/agents-server/src/app/layout.tsx +27 -22
  78. package/apps/agents-server/src/app/page.tsx +54 -6
  79. package/apps/agents-server/src/app/recycle-bin/actions.ts +20 -14
  80. package/apps/agents-server/src/app/recycle-bin/page.tsx +27 -41
  81. package/apps/agents-server/src/app/robots.txt/route.ts +1 -1
  82. package/apps/agents-server/src/app/security.txt/route.ts +1 -1
  83. package/apps/agents-server/src/app/sitemap.xml/route.ts +9 -7
  84. package/apps/agents-server/src/app/swagger/page.tsx +14 -0
  85. package/apps/agents-server/src/components/AgentProfile/AgentProfile.tsx +41 -116
  86. package/apps/agents-server/src/components/AgentProfile/AgentProfileImage.tsx +92 -0
  87. package/apps/agents-server/src/components/AgentProfile/QrCodeModal.tsx +0 -1
  88. package/apps/agents-server/src/components/AgentProfile/useAgentBackground.ts +97 -0
  89. package/apps/agents-server/src/components/Auth/AuthControls.tsx +5 -4
  90. package/apps/agents-server/src/components/DeletedAgentBanner.tsx +26 -0
  91. package/apps/agents-server/src/components/DocsToolbar/DocsToolbar.tsx +38 -0
  92. package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +11 -9
  93. package/apps/agents-server/src/components/Footer/Footer.tsx +5 -5
  94. package/apps/agents-server/src/components/ForgottenPasswordDialog/ForgottenPasswordDialog.tsx +61 -0
  95. package/apps/agents-server/src/components/Header/Header.tsx +114 -40
  96. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +145 -23
  97. package/apps/agents-server/src/components/Homepage/AgentsList.tsx +93 -15
  98. package/apps/agents-server/src/components/Homepage/DeletedAgentsList.tsx +66 -0
  99. package/apps/agents-server/src/components/Homepage/ExternalAgentsSection.tsx +12 -3
  100. package/apps/agents-server/src/components/Homepage/ExternalAgentsSectionClient.tsx +19 -10
  101. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +3 -2
  102. package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +50 -1
  103. package/apps/agents-server/src/components/NewAgentDialog/NewAgentDialog.tsx +88 -0
  104. package/apps/agents-server/src/components/NotFoundPage/NotFoundPage.tsx +7 -2
  105. package/apps/agents-server/src/components/OpenMojiIcon/OpenMojiIcon.tsx +16 -7
  106. package/apps/agents-server/src/components/PrintHeader/PrintHeader.tsx +4 -4
  107. package/apps/agents-server/src/components/RegisterUserDialog/RegisterUserDialog.tsx +61 -0
  108. package/apps/agents-server/src/components/VercelDeploymentCard/VercelDeploymentCard.tsx +2 -0
  109. package/apps/agents-server/src/components/_utils/generateMetaTxt.ts +12 -10
  110. package/apps/agents-server/src/components/_utils/headlessParam.tsx +7 -3
  111. package/apps/agents-server/src/database/$provideSupabaseForBrowser.ts +3 -3
  112. package/apps/agents-server/src/database/$provideSupabaseForServer.ts +1 -1
  113. package/apps/agents-server/src/database/$provideSupabaseForWorker.ts +3 -3
  114. package/apps/agents-server/src/database/metadataDefaults.ts +19 -1
  115. package/apps/agents-server/src/database/migrate.ts +34 -1
  116. package/apps/agents-server/src/database/migrations/2025-11-0001-initial-schema.sql +1 -3
  117. package/apps/agents-server/src/database/migrations/2025-11-0002-metadata-table.sql +1 -3
  118. package/apps/agents-server/src/database/migrations/2025-12-0240-agent-public-id.sql +3 -0
  119. package/apps/agents-server/src/database/migrations/2025-12-0360-agent-deleted-at.sql +1 -0
  120. package/apps/agents-server/src/database/migrations/2025-12-0370-image-table.sql +19 -0
  121. package/apps/agents-server/src/database/migrations/2025-12-0380-agent-visibility.sql +1 -0
  122. package/apps/agents-server/src/database/migrations/2025-12-0390-upload-tracking.sql +20 -0
  123. package/apps/agents-server/src/database/migrations/2025-12-0401-file-upload-status.sql +13 -0
  124. package/apps/agents-server/src/database/migrations/2025-12-0402-message-table.sql +42 -0
  125. package/apps/agents-server/src/database/migrations/2025-12-0403-generation-lock-table.sql +15 -0
  126. package/apps/agents-server/src/database/migrations/2025-12-0640-openai-assistant-cache.sql +12 -0
  127. package/apps/agents-server/src/database/migrations/2025-12-0820-agent-history-permanent-id.sql +29 -0
  128. package/apps/agents-server/src/database/schema.ts +231 -4
  129. package/apps/agents-server/src/generated/reservedPaths.ts +32 -0
  130. package/apps/agents-server/src/message-providers/email/_common/Email.ts +73 -0
  131. package/apps/agents-server/src/message-providers/email/_common/utils/TODO.txt +1 -0
  132. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.test.ts.todo +108 -0
  133. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.ts +62 -0
  134. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.test.ts.todo +117 -0
  135. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.ts +19 -0
  136. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.test.ts.todo +119 -0
  137. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.ts +19 -0
  138. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.test.ts.todo +74 -0
  139. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.ts +14 -0
  140. package/apps/agents-server/src/message-providers/email/sendgrid/SendgridMessageProvider.ts +44 -0
  141. package/apps/agents-server/src/message-providers/email/sendgrid/parseInboundSendgridEmail.ts +49 -0
  142. package/apps/agents-server/src/message-providers/email/zeptomail/ZeptomailMessageProvider.ts +51 -0
  143. package/apps/agents-server/src/message-providers/index.ts +13 -0
  144. package/apps/agents-server/src/message-providers/interfaces/MessageProvider.ts +11 -0
  145. package/apps/agents-server/src/middleware.ts +19 -23
  146. package/apps/agents-server/src/tools/$provideBrowserForServer.ts +32 -0
  147. package/apps/agents-server/src/tools/$provideCdnForServer.ts +7 -2
  148. package/apps/agents-server/src/utils/auth.ts +117 -17
  149. package/apps/agents-server/src/utils/cdn/classes/TrackedFilesStorage.ts +57 -0
  150. package/apps/agents-server/src/utils/cdn/classes/VercelBlobStorage.ts +4 -0
  151. package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +18 -0
  152. package/apps/agents-server/src/utils/content/extractBodyContentFromHtml.ts +19 -0
  153. package/apps/agents-server/src/utils/getUserIdFromRequest.ts +35 -0
  154. package/apps/agents-server/src/utils/handleChatCompletion.ts +65 -5
  155. package/apps/agents-server/src/utils/messages/sendMessage.ts +91 -0
  156. package/apps/agents-server/src/utils/messagesAdmin.ts +72 -0
  157. package/apps/agents-server/src/utils/normalization/filenameToPrompt.test.ts +36 -0
  158. package/apps/agents-server/src/utils/normalization/filenameToPrompt.ts +25 -0
  159. package/apps/agents-server/src/utils/validateApiKey.ts +7 -11
  160. package/esm/index.es.js +2890 -2737
  161. package/esm/index.es.js.map +1 -1
  162. package/esm/typings/servers.d.ts +8 -0
  163. package/esm/typings/src/_packages/core.index.d.ts +2 -0
  164. package/esm/typings/src/_packages/types.index.d.ts +10 -2
  165. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +6 -1
  166. package/esm/typings/src/book-2.0/agent-source/createAgentModelRequirements.d.ts +6 -6
  167. package/esm/typings/src/book-2.0/agent-source/createAgentModelRequirementsWithCommitments.closed.test.d.ts +1 -0
  168. package/esm/typings/src/book-2.0/utils/generatePlaceholderAgentProfileImageUrl.d.ts +3 -3
  169. package/esm/typings/src/book-components/Chat/Chat/ChatMessageItem.d.ts +5 -1
  170. package/esm/typings/src/book-components/Chat/Chat/ChatProps.d.ts +5 -0
  171. package/esm/typings/src/book-components/Chat/CodeBlock/CodeBlock.d.ts +13 -0
  172. package/esm/typings/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  173. package/esm/typings/src/book-components/Chat/types/ChatMessage.d.ts +7 -11
  174. package/esm/typings/src/book-components/_common/Dropdown/Dropdown.d.ts +2 -2
  175. package/esm/typings/src/book-components/_common/MenuHoisting/MenuHoistingContext.d.ts +56 -0
  176. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +21 -11
  177. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentsDatabaseSchema.d.ts +80 -14
  178. package/esm/typings/src/commitments/DICTIONARY/DICTIONARY.d.ts +46 -0
  179. package/esm/typings/src/commitments/index.d.ts +2 -1
  180. package/esm/typings/src/llm-providers/_multiple/MultipleLlmExecutionTools.d.ts +6 -2
  181. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +1 -1
  182. package/esm/typings/src/llm-providers/ollama/OllamaExecutionTools.d.ts +1 -1
  183. package/esm/typings/src/llm-providers/openai/createOpenAiCompatibleExecutionTools.d.ts +1 -1
  184. package/esm/typings/src/llm-providers/remote/RemoteLlmExecutionTools.d.ts +1 -0
  185. package/esm/typings/src/types/Message.d.ts +49 -0
  186. package/esm/typings/src/types/ModelRequirements.d.ts +38 -14
  187. package/esm/typings/src/types/typeAliases.d.ts +23 -1
  188. package/esm/typings/src/utils/color/utils/colorToDataUrl.d.ts +2 -1
  189. package/esm/typings/src/utils/environment/$detectRuntimeEnvironment.d.ts +4 -4
  190. package/esm/typings/src/utils/environment/$isRunningInBrowser.d.ts +1 -1
  191. package/esm/typings/src/utils/environment/$isRunningInJest.d.ts +1 -1
  192. package/esm/typings/src/utils/environment/$isRunningInNode.d.ts +1 -1
  193. package/esm/typings/src/utils/environment/$isRunningInWebWorker.d.ts +1 -1
  194. package/esm/typings/src/utils/markdown/extractAllBlocksFromMarkdown.d.ts +2 -2
  195. package/esm/typings/src/utils/markdown/extractOneBlockFromMarkdown.d.ts +2 -2
  196. package/esm/typings/src/utils/random/$randomBase58.d.ts +12 -0
  197. package/esm/typings/src/version.d.ts +1 -1
  198. package/package.json +1 -1
  199. package/umd/index.umd.js +4018 -3865
  200. package/umd/index.umd.js.map +1 -1
  201. package/apps/agents-server/package-lock.json +0 -27
  202. package/apps/agents-server/public/fonts/download-font.js +0 -22
  203. package/apps/agents-server/src/components/PrintButton/PrintButton.tsx +0 -18
  204. package/esm/typings/src/book-2.0/utils/generateGravatarUrl.d.ts +0 -10
@@ -3,7 +3,7 @@
3
3
  * Source of truth: `schema.sql` *(do not edit table structure here manually)*
4
4
  *
5
5
  * [💽] Prompt:
6
- * Re-generate supabase typescript schema from the `./schema.sql`
6
+ * Re-generate supabase typescript schema from `./migrations/*.sql`
7
7
  */
8
8
 
9
9
  // Json helper (Supabase style)
@@ -47,6 +47,7 @@ export type AgentsServerDatabase = {
47
47
  agentName: string;
48
48
  createdAt: string;
49
49
  updatedAt: string | null;
50
+ permanentId: string | null;
50
51
  agentHash: string;
51
52
  agentSource: string;
52
53
  agentProfile: Json;
@@ -54,12 +55,15 @@ export type AgentsServerDatabase = {
54
55
  usage: Json | null;
55
56
  preparedModelRequirements: Json | null;
56
57
  preparedExternals: Json | null;
58
+ deletedAt: string | null;
59
+ visibility: 'PUBLIC' | 'PRIVATE';
57
60
  };
58
61
  Insert: {
59
62
  id?: number;
60
63
  agentName: string;
61
64
  createdAt: string;
62
65
  updatedAt?: string | null;
66
+ permanentId?: string | null;
63
67
  agentHash: string;
64
68
  agentSource: string;
65
69
  agentProfile: Json;
@@ -67,12 +71,15 @@ export type AgentsServerDatabase = {
67
71
  usage?: Json | null;
68
72
  preparedModelRequirements?: Json | null;
69
73
  preparedExternals?: Json | null;
74
+ deletedAt?: string | null;
75
+ visibility?: 'PUBLIC' | 'PRIVATE';
70
76
  };
71
77
  Update: {
72
78
  id?: number;
73
79
  agentName?: string;
74
80
  createdAt?: string;
75
81
  updatedAt?: string | null;
82
+ permanentId?: string | null;
76
83
  agentHash?: string;
77
84
  agentSource?: string;
78
85
  agentProfile?: Json;
@@ -80,6 +87,8 @@ export type AgentsServerDatabase = {
80
87
  usage?: Json | null;
81
88
  preparedModelRequirements?: Json | null;
82
89
  preparedExternals?: Json | null;
90
+ deletedAt?: string | null;
91
+ visibility?: 'PUBLIC' | 'PRIVATE';
83
92
  };
84
93
  Relationships: [];
85
94
  };
@@ -88,6 +97,7 @@ export type AgentsServerDatabase = {
88
97
  id: number;
89
98
  createdAt: string;
90
99
  agentName: string;
100
+ permanentId: string;
91
101
  agentHash: string;
92
102
  previousAgentHash: string | null;
93
103
  agentSource: string;
@@ -97,6 +107,7 @@ export type AgentsServerDatabase = {
97
107
  id?: number;
98
108
  createdAt: string;
99
109
  agentName: string;
110
+ permanentId: string;
100
111
  agentHash: string;
101
112
  previousAgentHash?: string | null;
102
113
  agentSource: string;
@@ -106,12 +117,20 @@ export type AgentsServerDatabase = {
106
117
  id?: number;
107
118
  createdAt?: string;
108
119
  agentName?: string;
120
+ permanentId?: string;
109
121
  agentHash?: string;
110
122
  previousAgentHash?: string | null;
111
123
  agentSource?: string;
112
124
  promptbookEngineVersion?: string;
113
125
  };
114
- Relationships: [];
126
+ Relationships: [
127
+ {
128
+ foreignKeyName: 'AgentHistory_permanentId_fkey';
129
+ columns: ['permanentId'];
130
+ referencedRelation: 'Agent';
131
+ referencedColumns: ['permanentId'];
132
+ },
133
+ ];
115
134
  };
116
135
  ChatHistory: {
117
136
  Row: {
@@ -165,7 +184,14 @@ export type AgentsServerDatabase = {
165
184
  source?: 'AGENT_PAGE_CHAT' | 'OPENAI_API_COMPATIBILITY' | null;
166
185
  apiKey?: string | null;
167
186
  };
168
- Relationships: [];
187
+ Relationships: [
188
+ {
189
+ foreignKeyName: 'ChatHistory_agentName_fkey';
190
+ columns: ['agentName'];
191
+ referencedRelation: 'Agent';
192
+ referencedColumns: ['agentName'];
193
+ },
194
+ ];
169
195
  };
170
196
  ChatFeedback: {
171
197
  Row: {
@@ -219,7 +245,14 @@ export type AgentsServerDatabase = {
219
245
  language?: string | null;
220
246
  platform?: string | null;
221
247
  };
222
- Relationships: [];
248
+ Relationships: [
249
+ {
250
+ foreignKeyName: 'ChatFeedback_agentName_fkey';
251
+ columns: ['agentName'];
252
+ referencedRelation: 'Agent';
253
+ referencedColumns: ['agentName'];
254
+ },
255
+ ];
223
256
  };
224
257
  User: {
225
258
  Row: {
@@ -272,6 +305,30 @@ export type AgentsServerDatabase = {
272
305
  };
273
306
  Relationships: [];
274
307
  };
308
+ OpenAiAssistantCache: {
309
+ Row: {
310
+ id: number;
311
+ createdAt: string;
312
+ updatedAt: string;
313
+ agentHash: string;
314
+ assistantId: string;
315
+ };
316
+ Insert: {
317
+ id?: number;
318
+ createdAt?: string;
319
+ updatedAt?: string;
320
+ agentHash: string;
321
+ assistantId: string;
322
+ };
323
+ Update: {
324
+ id?: number;
325
+ createdAt?: string;
326
+ updatedAt?: string;
327
+ agentHash?: string;
328
+ assistantId?: string;
329
+ };
330
+ Relationships: [];
331
+ };
275
332
  ApiTokens: {
276
333
  Row: {
277
334
  id: number;
@@ -299,6 +356,176 @@ export type AgentsServerDatabase = {
299
356
  };
300
357
  Relationships: [];
301
358
  };
359
+ GenerationLock: {
360
+ Row: {
361
+ id: number;
362
+ createdAt: string;
363
+ updatedAt: string;
364
+ lockKey: string;
365
+ expiresAt: string;
366
+ };
367
+ Insert: {
368
+ id?: number;
369
+ createdAt?: string;
370
+ updatedAt?: string;
371
+ lockKey: string;
372
+ expiresAt: string;
373
+ };
374
+ Update: {
375
+ id?: number;
376
+ createdAt?: string;
377
+ updatedAt?: string;
378
+ lockKey?: string;
379
+ expiresAt?: string;
380
+ };
381
+ Relationships: [];
382
+ };
383
+ Image: {
384
+ Row: {
385
+ id: number;
386
+ createdAt: string;
387
+ updatedAt: string;
388
+ filename: string;
389
+ prompt: string;
390
+ cdnUrl: string;
391
+ cdnKey: string;
392
+ };
393
+ Insert: {
394
+ id?: number;
395
+ createdAt?: string;
396
+ updatedAt?: string;
397
+ filename: string;
398
+ prompt: string;
399
+ cdnUrl: string;
400
+ cdnKey: string;
401
+ };
402
+ Update: {
403
+ id?: number;
404
+ createdAt?: string;
405
+ updatedAt?: string;
406
+ filename?: string;
407
+ prompt?: string;
408
+ cdnUrl?: string;
409
+ cdnKey?: string;
410
+ };
411
+ Relationships: [];
412
+ };
413
+ File: {
414
+ Row: {
415
+ id: number;
416
+ createdAt: string;
417
+ userId: number | null;
418
+ fileName: string;
419
+ fileSize: number;
420
+ fileType: string;
421
+ storageUrl: string | null;
422
+ shortUrl: string | null;
423
+ purpose: string;
424
+ status: 'UPLOADING' | 'COMPLETED' | 'FAILED';
425
+ };
426
+ Insert: {
427
+ id?: number;
428
+ createdAt?: string;
429
+ userId?: number | null;
430
+ fileName: string;
431
+ fileSize: number;
432
+ fileType: string;
433
+ storageUrl?: string | null;
434
+ shortUrl?: string | null;
435
+ purpose: string;
436
+ status?: 'UPLOADING' | 'COMPLETED' | 'FAILED';
437
+ };
438
+ Update: {
439
+ id?: number;
440
+ createdAt?: string;
441
+ userId?: number | null;
442
+ fileName?: string;
443
+ fileSize?: number;
444
+ fileType?: string;
445
+ storageUrl?: string | null;
446
+ shortUrl?: string | null;
447
+ purpose?: string;
448
+ status?: 'UPLOADING' | 'COMPLETED' | 'FAILED';
449
+ };
450
+ Relationships: [
451
+ {
452
+ foreignKeyName: 'File_userId_fkey';
453
+ columns: ['userId'];
454
+ referencedRelation: 'User';
455
+ referencedColumns: ['id'];
456
+ },
457
+ ];
458
+ };
459
+ Message: {
460
+ Row: {
461
+ id: number;
462
+ createdAt: string;
463
+ channel: string;
464
+ direction: string;
465
+ sender: Json;
466
+ recipients: Json | null;
467
+ content: string;
468
+ threadId: string | null;
469
+ metadata: Json | null;
470
+ };
471
+ Insert: {
472
+ id?: number;
473
+ createdAt?: string;
474
+ channel: string;
475
+ direction: string;
476
+ sender: Json;
477
+ recipients?: Json | null;
478
+ content: string;
479
+ threadId?: string | null;
480
+ metadata?: Json | null;
481
+ };
482
+ Update: {
483
+ id?: number;
484
+ createdAt?: string;
485
+ channel?: string;
486
+ direction?: string;
487
+ sender?: Json;
488
+ recipients?: Json | null;
489
+ content?: string;
490
+ threadId?: string | null;
491
+ metadata?: Json | null;
492
+ };
493
+ Relationships: [];
494
+ };
495
+ MessageSendAttempt: {
496
+ Row: {
497
+ id: number;
498
+ createdAt: string;
499
+ messageId: number;
500
+ providerName: string;
501
+ isSuccessful: boolean;
502
+ raw: Json | null;
503
+ };
504
+ Insert: {
505
+ id?: number;
506
+ createdAt?: string;
507
+ messageId: number;
508
+ providerName: string;
509
+ isSuccessful: boolean;
510
+ raw?: Json | null;
511
+ };
512
+ Update: {
513
+ id?: number;
514
+ createdAt?: string;
515
+ messageId?: number;
516
+ providerName?: string;
517
+ isSuccessful?: boolean;
518
+ raw?: Json | null;
519
+ };
520
+ Relationships: [
521
+ {
522
+ foreignKeyName: 'MessageSendAttempt_messageId_fkey';
523
+ columns: ['messageId'];
524
+ referencedRelation: 'Message';
525
+ referencedColumns: ['id'];
526
+ },
527
+ ];
528
+ };
302
529
  };
303
530
  Views: Record<string, never>;
304
531
  Functions: Record<string, never>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Reserved paths that should not be treated as agent names.
3
+ * This file is auto-generated by scripts/generate-reserved-paths.js
4
+ *
5
+ * ⚠️ WARNING: This code has been generated so that any manual changes will be overwritten
6
+ *
7
+ * @see /apps/agents-server/src/app - source directory for routes
8
+ * @see /apps/agents-server/public - source directory for static files
9
+ * @see /apps/agents-server/src/middleware.ts - where this is used
10
+ */
11
+ export const RESERVED_PATHS: readonly string[] = [
12
+ "_next",
13
+ "admin",
14
+ "agents",
15
+ "api",
16
+ "docs",
17
+ "embed",
18
+ "favicon.ico",
19
+ "fonts",
20
+ "humans.txt",
21
+ "logo-blue-white-256.png",
22
+ "manifest.webmanifest",
23
+ "recycle-bin",
24
+ "restricted",
25
+ "robots.txt",
26
+ "security.txt",
27
+ "sitemap.xml",
28
+ "sw.js",
29
+ "swagger",
30
+ "swagger.json",
31
+ "test"
32
+ ] as const;
@@ -0,0 +1,73 @@
1
+ import type { Message, string_email, string_person_fullname } from '@promptbook-local/types';
2
+
3
+ /**
4
+ * Single email which was received by the application
5
+ */
6
+ export type InboundEmail = Email & { direction: 'INBOUND' };
7
+
8
+ /**
9
+ * Single email which was sended from the application
10
+ */
11
+ export type OutboundEmail = Email & { direction: 'OUTBOUND' };
12
+
13
+ /**
14
+ * Single email
15
+ */
16
+ type Email = Message<string_email> & {
17
+ /**
18
+ * Channel of the message
19
+ *
20
+ * @default 'EMAIL'
21
+ */
22
+ readonly channel?: 'EMAIL';
23
+
24
+ /**
25
+ * Carbon copy email addresses
26
+ *
27
+ * Note: Not working with BCC (Blind Carbon Copy) because we want to have all emails in the same thread
28
+ * and for hidden emails we can just call $sendEmail multiple times
29
+ */
30
+ readonly cc: Array<EmailAddress>;
31
+
32
+ /**
33
+ * Email subject
34
+ */
35
+ readonly subject: string;
36
+
37
+ /**
38
+ * Email attachments
39
+ */
40
+ readonly attachments: Array<File>;
41
+ };
42
+
43
+ export type EmailAddress = {
44
+ /**
45
+ * Everything outside of `<>` in email address
46
+ *
47
+ * @example "Pavol Hejný <pavol@hejny.cz>" -> "Pavol Hejný"
48
+ * @example "\"Pavol Hejný\" <pavol@hejny.cz>" -> "Pavol Hejný"
49
+ */
50
+ fullName: string_person_fullname | string | null;
51
+
52
+ /**
53
+ * Everything after `+` in email address
54
+ *
55
+ * @example "pavol+spam@webgpt.cz" -> ["spam"]
56
+ * @example "pavol+spam+debug@webgpt.cz" -> ["spam","debug"]
57
+ */
58
+ plus: Array<string>;
59
+
60
+ /**
61
+ * Pure email address
62
+ *
63
+ * @example "pavol@webgpt.cz"
64
+ */
65
+ baseEmail: string_email;
66
+
67
+ /**
68
+ * Full email address without the name but with +
69
+ *
70
+ * @example "pavol+test@webgpt.cz"
71
+ */
72
+ fullEmail: string_email;
73
+ };
@@ -0,0 +1 @@
1
+ TODO: [🧠][🏰] Maybe move all of theese functions into `@promptbook/utils`
@@ -0,0 +1,108 @@
1
+ import { describe, expect, it } from '@jest/globals';
2
+ import { parseEmailAddress } from './parseEmailAddress';
3
+
4
+ describe('how parseEmailAddress works', () => {
5
+ it('should work with simple email', () => {
6
+ expect(parseEmailAddress('pavol@webgpt.cz')).toEqual({
7
+ fullName: null,
8
+ baseEmail: 'pavol@webgpt.cz',
9
+ fullEmail: 'pavol@webgpt.cz',
10
+ plus: [],
11
+ });
12
+ expect(parseEmailAddress('jirka@webgpt.cz')).toEqual({
13
+ fullName: null,
14
+ baseEmail: 'jirka@webgpt.cz',
15
+ fullEmail: 'jirka@webgpt.cz',
16
+ plus: [],
17
+ });
18
+ expect(parseEmailAddress('tomas@webgpt.cz')).toEqual({
19
+ fullName: null,
20
+ baseEmail: 'tomas@webgpt.cz',
21
+ fullEmail: 'tomas@webgpt.cz',
22
+ plus: [],
23
+ });
24
+ });
25
+
26
+ it('should work with fullname', () => {
27
+ expect(parseEmailAddress('Pavol Hejný <pavol@webgpt.cz>')).toEqual({
28
+ fullName: 'Pavol Hejný',
29
+ baseEmail: 'pavol@webgpt.cz',
30
+ fullEmail: 'pavol@webgpt.cz',
31
+ plus: [],
32
+ });
33
+ expect(parseEmailAddress('Jirka <jirka@webgpt.cz>')).toEqual({
34
+ fullName: 'Jirka',
35
+ baseEmail: 'jirka@webgpt.cz',
36
+ fullEmail: 'jirka@webgpt.cz',
37
+ plus: [],
38
+ });
39
+ expect(parseEmailAddress('"Tomáš Studeník" <tomas@webgpt.cz>')).toEqual({
40
+ fullName: 'Tomáš Studeník',
41
+ baseEmail: 'tomas@webgpt.cz',
42
+ fullEmail: 'tomas@webgpt.cz',
43
+ plus: [],
44
+ });
45
+ });
46
+
47
+ it('should work with plus', () => {
48
+ expect(parseEmailAddress('pavol+test@webgpt.cz')).toEqual({
49
+ fullName: null,
50
+ baseEmail: 'pavol@webgpt.cz',
51
+ fullEmail: 'pavol+test@webgpt.cz',
52
+ plus: ['test'],
53
+ });
54
+ expect(parseEmailAddress('jirka+test@webgpt.cz')).toEqual({
55
+ fullName: null,
56
+ baseEmail: 'jirka@webgpt.cz',
57
+ fullEmail: 'jirka+test@webgpt.cz',
58
+ plus: ['test'],
59
+ });
60
+ expect(parseEmailAddress('tomas+test+ainautes@webgpt.cz')).toEqual({
61
+ fullName: null,
62
+ baseEmail: 'tomas@webgpt.cz',
63
+ fullEmail: 'tomas+test+ainautes@webgpt.cz',
64
+ plus: ['test', 'ainautes'],
65
+ });
66
+ });
67
+
68
+ it('should work with both fullname and plus', () => {
69
+ expect(parseEmailAddress('Pavol Hejný <pavol+foo@webgpt.cz>')).toEqual({
70
+ fullName: 'Pavol Hejný',
71
+ baseEmail: 'pavol@webgpt.cz',
72
+ fullEmail: 'pavol+foo@webgpt.cz',
73
+ plus: ['foo'],
74
+ });
75
+ expect(parseEmailAddress('Jirka <jirka+test@webgpt.cz>')).toEqual({
76
+ fullName: 'Jirka',
77
+ baseEmail: 'jirka@webgpt.cz',
78
+ fullEmail: 'jirka+test@webgpt.cz',
79
+ plus: ['test'],
80
+ });
81
+ expect(parseEmailAddress('"Tomáš Studeník" <tomas+test+ainautes@webgpt.cz>')).toEqual({
82
+ fullName: 'Tomáš Studeník',
83
+ baseEmail: 'tomas@webgpt.cz',
84
+ fullEmail: 'tomas+test+ainautes@webgpt.cz',
85
+ plus: ['test', 'ainautes'],
86
+ });
87
+ });
88
+
89
+ it('throws on multiple adresses', () => {
90
+ expect(() => parseEmailAddress('Pavol <pavol@webgpt.cz>, Jirka <jirka@webgpt.cz>')).toThrowError(
91
+ /Seems like you are trying to parse multiple email addresses/,
92
+ );
93
+ });
94
+
95
+ it('throws on invalid email adresses', () => {
96
+ expect(() => parseEmailAddress('')).toThrowError(/Invalid email address/);
97
+ expect(() => parseEmailAddress('Pavol Hejný')).toThrowError(/Invalid email address/);
98
+ expect(() => parseEmailAddress('Pavol Hejný <>')).toThrowError(/Invalid email address/);
99
+ expect(() => parseEmailAddress('Pavol Hejný <@webgpt.cz>')).toThrowError(/Invalid email address/);
100
+ expect(() => parseEmailAddress('Pavol Hejný <webgpt.cz>')).toThrowError(/Invalid email address/);
101
+ expect(() => parseEmailAddress('Pavol Hejný <pavol@>')).toThrowError(/Invalid email address/);
102
+ expect(() => parseEmailAddress('Pavol Hejný <a@b>')).toThrowError(/Invalid email address/);
103
+ });
104
+ });
105
+
106
+ /**
107
+ * TODO: [🐫] This test fails because of aliased imports `import type { string_emails } from '@promptbook-local/types';`, fix it
108
+ */
@@ -0,0 +1,62 @@
1
+ import type { string_email } from '@promptbook-local/types';
2
+ import { isValidEmail, spaceTrim } from '@promptbook-local/utils';
3
+ import { EmailAddress } from '../Email';
4
+
5
+ /**
6
+ * Parses the email address into its components
7
+ */
8
+ export function parseEmailAddress(value: string_email): EmailAddress {
9
+ if (value.includes(',')) {
10
+ throw new Error('Seems like you are trying to parse multiple email addresses, use parseEmailAddresses instead');
11
+ }
12
+
13
+ let fullName = value.match(/^(?:"?([^"]+)"?|[^<]+)\s*</)?.[1] ?? null;
14
+
15
+ if (fullName !== null) {
16
+ fullName = fullName.trim();
17
+ }
18
+
19
+ const fullEmail = value.match(/<([^>]+)>/)?.[1] ?? value;
20
+ const plus: Array<string> = [];
21
+
22
+ if (!isValidEmail(fullEmail)) {
23
+ throw new Error(
24
+ spaceTrim(
25
+ (block) => `
26
+ Invalid email address "${fullEmail}"
27
+
28
+ Parsed:
29
+ ${block(JSON.stringify({ fullName, fullEmail, plus }, null, 4))}
30
+
31
+ `,
32
+ ),
33
+ );
34
+ }
35
+
36
+ if (fullEmail.includes('+')) {
37
+ const [user, domain] = fullEmail.split('@');
38
+
39
+ if (!user || !domain) {
40
+ throw new Error('Can not parse email address');
41
+ // <- TODO: ShouldNeverHappenError
42
+ }
43
+
44
+ const userParts = user.split('+');
45
+ userParts.shift();
46
+
47
+ plus.push(...userParts);
48
+ }
49
+
50
+ let baseEmail = fullEmail;
51
+
52
+ for (const plusItem of plus) {
53
+ baseEmail = baseEmail.replace(`+${plusItem}`, '');
54
+ }
55
+
56
+ return {
57
+ fullName,
58
+ baseEmail,
59
+ fullEmail,
60
+ plus,
61
+ };
62
+ }