@promptbook/cli 0.103.0-52 → 0.103.0-54

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 (142) hide show
  1. package/apps/agents-server/README.md +1 -1
  2. package/apps/agents-server/config.ts +3 -3
  3. package/apps/agents-server/next.config.ts +1 -1
  4. package/apps/agents-server/public/sw.js +16 -0
  5. package/apps/agents-server/src/app/AddAgentButton.tsx +24 -4
  6. package/apps/agents-server/src/app/actions.ts +15 -13
  7. package/apps/agents-server/src/app/admin/api-tokens/ApiTokensClient.tsx +186 -0
  8. package/apps/agents-server/src/app/admin/api-tokens/page.tsx +13 -0
  9. package/apps/agents-server/src/app/admin/chat-feedback/ChatFeedbackClient.tsx +541 -0
  10. package/apps/agents-server/src/app/admin/chat-feedback/page.tsx +22 -0
  11. package/apps/agents-server/src/app/admin/chat-history/ChatHistoryClient.tsx +532 -0
  12. package/apps/agents-server/src/app/admin/chat-history/page.tsx +21 -0
  13. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +241 -27
  14. package/apps/agents-server/src/app/admin/models/page.tsx +22 -0
  15. package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +131 -0
  16. package/apps/agents-server/src/app/admin/users/[userId]/page.tsx +21 -0
  17. package/apps/agents-server/src/app/admin/users/page.tsx +18 -0
  18. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +10 -2
  19. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatFeedbackButton.tsx +63 -0
  20. package/apps/agents-server/src/app/agents/[agentName]/ClearAgentChatHistoryButton.tsx +63 -0
  21. package/apps/agents-server/src/app/agents/[agentName]/CloneAgentButton.tsx +41 -0
  22. package/apps/agents-server/src/app/agents/[agentName]/InstallPwaButton.tsx +74 -0
  23. package/apps/agents-server/src/app/agents/[agentName]/ServiceWorkerRegister.tsx +24 -0
  24. package/apps/agents-server/src/app/agents/[agentName]/_utils.ts +19 -0
  25. package/apps/agents-server/src/app/agents/[agentName]/api/agents/route.ts +67 -0
  26. package/apps/agents-server/src/app/agents/[agentName]/api/openai/chat/completions/route.ts +176 -0
  27. package/apps/agents-server/src/app/agents/[agentName]/api/profile/route.ts +3 -0
  28. package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +177 -0
  29. package/apps/agents-server/src/app/agents/[agentName]/book/page.tsx +3 -0
  30. package/apps/agents-server/src/app/agents/[agentName]/book+chat/AgentBookAndChat.tsx +53 -1
  31. package/apps/agents-server/src/app/agents/[agentName]/generateAgentMetadata.ts +11 -11
  32. package/apps/agents-server/src/app/agents/[agentName]/history/RestoreVersionButton.tsx +46 -0
  33. package/apps/agents-server/src/app/agents/[agentName]/history/actions.ts +12 -0
  34. package/apps/agents-server/src/app/agents/[agentName]/history/page.tsx +62 -0
  35. package/apps/agents-server/src/app/agents/[agentName]/images/icon-256.png/route.tsx +80 -0
  36. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-fullhd.png/route.tsx +92 -0
  37. package/apps/agents-server/src/app/agents/[agentName]/images/screenshot-phone.png/route.tsx +92 -0
  38. package/apps/agents-server/src/app/agents/[agentName]/integration/page.tsx +61 -0
  39. package/apps/agents-server/src/app/agents/[agentName]/opengraph-image.tsx +102 -0
  40. package/apps/agents-server/src/app/agents/[agentName]/page.tsx +64 -24
  41. package/apps/agents-server/src/app/api/agents/[agentName]/clone/route.ts +47 -0
  42. package/apps/agents-server/src/app/api/agents/[agentName]/route.ts +19 -0
  43. package/apps/agents-server/src/app/api/agents/route.ts +22 -13
  44. package/apps/agents-server/src/app/api/api-tokens/route.ts +76 -0
  45. package/apps/agents-server/src/app/api/auth/login/route.ts +6 -44
  46. package/apps/agents-server/src/app/api/chat-feedback/[id]/route.ts +38 -0
  47. package/apps/agents-server/src/app/api/chat-feedback/route.ts +157 -0
  48. package/apps/agents-server/src/app/api/chat-history/[id]/route.ts +37 -0
  49. package/apps/agents-server/src/app/api/chat-history/route.ts +147 -0
  50. package/apps/agents-server/src/app/api/federated-agents/route.ts +17 -0
  51. package/apps/agents-server/src/app/api/upload/route.ts +9 -1
  52. package/apps/agents-server/src/app/docs/[docId]/page.tsx +63 -0
  53. package/apps/agents-server/src/app/docs/page.tsx +34 -0
  54. package/apps/agents-server/src/app/layout.tsx +29 -3
  55. package/apps/agents-server/src/app/manifest.ts +109 -0
  56. package/apps/agents-server/src/app/page.tsx +8 -45
  57. package/apps/agents-server/src/app/recycle-bin/RestoreAgentButton.tsx +40 -0
  58. package/apps/agents-server/src/app/recycle-bin/actions.ts +27 -0
  59. package/apps/agents-server/src/app/recycle-bin/page.tsx +58 -0
  60. package/apps/agents-server/src/app/restricted/page.tsx +33 -0
  61. package/apps/agents-server/src/app/test/og-image/README.md +1 -0
  62. package/apps/agents-server/src/app/test/og-image/opengraph-image.tsx +37 -0
  63. package/apps/agents-server/src/app/test/og-image/page.tsx +22 -0
  64. package/apps/agents-server/src/components/Footer/Footer.tsx +175 -0
  65. package/apps/agents-server/src/components/Header/Header.tsx +450 -79
  66. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +46 -14
  67. package/apps/agents-server/src/components/Homepage/AgentsList.tsx +58 -0
  68. package/apps/agents-server/src/components/Homepage/Card.tsx +1 -1
  69. package/apps/agents-server/src/components/Homepage/ExternalAgentsSection.tsx +21 -0
  70. package/apps/agents-server/src/components/Homepage/ExternalAgentsSectionClient.tsx +183 -0
  71. package/apps/agents-server/src/components/Homepage/ModelsSection.tsx +75 -0
  72. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +29 -3
  73. package/apps/agents-server/src/components/LoginDialog/LoginDialog.tsx +18 -17
  74. package/apps/agents-server/src/components/Portal/Portal.tsx +38 -0
  75. package/apps/agents-server/src/components/UsersList/UsersList.tsx +82 -131
  76. package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +139 -0
  77. package/apps/agents-server/src/database/metadataDefaults.ts +38 -6
  78. package/apps/agents-server/src/database/migrations/2025-12-0010-llm-cache.sql +12 -0
  79. package/apps/agents-server/src/database/migrations/2025-12-0060-api-tokens.sql +13 -0
  80. package/apps/agents-server/src/database/schema.ts +51 -0
  81. package/apps/agents-server/src/middleware.ts +193 -92
  82. package/apps/agents-server/src/tools/$provideCdnForServer.ts +3 -7
  83. package/apps/agents-server/src/tools/$provideExecutionToolsForServer.ts +10 -1
  84. package/apps/agents-server/src/tools/$provideServer.ts +2 -2
  85. package/apps/agents-server/src/utils/authenticateUser.ts +42 -0
  86. package/apps/agents-server/src/utils/cache/SupabaseCacheStorage.ts +55 -0
  87. package/apps/agents-server/src/utils/cdn/classes/VercelBlobStorage.ts +63 -0
  88. package/apps/agents-server/src/utils/chatFeedbackAdmin.ts +96 -0
  89. package/apps/agents-server/src/utils/chatHistoryAdmin.ts +96 -0
  90. package/apps/agents-server/src/utils/getEffectiveFederatedServers.ts +22 -0
  91. package/apps/agents-server/src/utils/getFederatedAgents.ts +31 -8
  92. package/apps/agents-server/src/utils/getFederatedServersFromMetadata.ts +10 -0
  93. package/apps/agents-server/src/utils/getVisibleCommitmentDefinitions.ts +12 -0
  94. package/apps/agents-server/src/utils/isUserAdmin.ts +2 -2
  95. package/apps/agents-server/vercel.json +7 -0
  96. package/esm/index.es.js +279 -2
  97. package/esm/index.es.js.map +1 -1
  98. package/esm/typings/servers.d.ts +8 -1
  99. package/esm/typings/src/_packages/components.index.d.ts +2 -0
  100. package/esm/typings/src/_packages/core.index.d.ts +6 -0
  101. package/esm/typings/src/_packages/types.index.d.ts +2 -0
  102. package/esm/typings/src/_packages/utils.index.d.ts +2 -0
  103. package/esm/typings/src/book-2.0/agent-source/AgentModelRequirements.d.ts +7 -0
  104. package/esm/typings/src/book-components/Chat/Chat/ChatProps.d.ts +4 -0
  105. package/esm/typings/src/book-components/_common/HamburgerMenu/HamburgerMenu.d.ts +12 -0
  106. package/esm/typings/src/book-components/icons/MicIcon.d.ts +8 -0
  107. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +17 -0
  108. package/esm/typings/src/commitments/ACTION/ACTION.d.ts +4 -0
  109. package/esm/typings/src/commitments/DELETE/DELETE.d.ts +4 -0
  110. package/esm/typings/src/commitments/FORMAT/FORMAT.d.ts +4 -0
  111. package/esm/typings/src/commitments/GOAL/GOAL.d.ts +4 -0
  112. package/esm/typings/src/commitments/KNOWLEDGE/KNOWLEDGE.d.ts +4 -0
  113. package/esm/typings/src/commitments/MEMORY/MEMORY.d.ts +4 -0
  114. package/esm/typings/src/commitments/MESSAGE/AgentMessageCommitmentDefinition.d.ts +32 -0
  115. package/esm/typings/src/commitments/MESSAGE/InitialMessageCommitmentDefinition.d.ts +4 -0
  116. package/esm/typings/src/commitments/MESSAGE/MESSAGE.d.ts +4 -0
  117. package/esm/typings/src/commitments/MESSAGE/UserMessageCommitmentDefinition.d.ts +32 -0
  118. package/esm/typings/src/commitments/META/META.d.ts +4 -0
  119. package/esm/typings/src/commitments/META_COLOR/META_COLOR.d.ts +4 -0
  120. package/esm/typings/src/commitments/META_IMAGE/META_IMAGE.d.ts +4 -0
  121. package/esm/typings/src/commitments/META_LINK/META_LINK.d.ts +4 -0
  122. package/esm/typings/src/commitments/MODEL/MODEL.d.ts +4 -0
  123. package/esm/typings/src/commitments/NOTE/NOTE.d.ts +4 -0
  124. package/esm/typings/src/commitments/PERSONA/PERSONA.d.ts +4 -0
  125. package/esm/typings/src/commitments/RULE/RULE.d.ts +4 -0
  126. package/esm/typings/src/commitments/SAMPLE/SAMPLE.d.ts +4 -0
  127. package/esm/typings/src/commitments/SCENARIO/SCENARIO.d.ts +4 -0
  128. package/esm/typings/src/commitments/STYLE/STYLE.d.ts +4 -0
  129. package/esm/typings/src/commitments/_base/BaseCommitmentDefinition.d.ts +5 -0
  130. package/esm/typings/src/commitments/_base/CommitmentDefinition.d.ts +5 -0
  131. package/esm/typings/src/commitments/_base/NotYetImplementedCommitmentDefinition.d.ts +4 -0
  132. package/esm/typings/src/commitments/index.d.ts +20 -1
  133. package/esm/typings/src/execution/LlmExecutionTools.d.ts +9 -0
  134. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +2 -1
  135. package/esm/typings/src/llm-providers/agent/RemoteAgent.d.ts +10 -1
  136. package/esm/typings/src/utils/normalization/normalizeMessageText.d.ts +9 -0
  137. package/esm/typings/src/utils/normalization/normalizeMessageText.test.d.ts +1 -0
  138. package/esm/typings/src/version.d.ts +1 -1
  139. package/package.json +2 -2
  140. package/umd/index.umd.js +279 -2
  141. package/umd/index.umd.js.map +1 -1
  142. package/apps/agents-server/src/utils/cdn/classes/DigitalOceanSpaces.ts +0 -119
@@ -0,0 +1,58 @@
1
+ import { $provideAgentCollectionForServer } from '@/src/tools/$provideAgentCollectionForServer';
2
+ import { TrashIcon } from 'lucide-react';
3
+ import Link from 'next/link';
4
+ import { RestoreAgentButton } from './RestoreAgentButton';
5
+
6
+ export const metadata = {
7
+ title: 'Recycle Bin',
8
+ };
9
+
10
+ export default async function RecycleBinPage() {
11
+ const collection = await $provideAgentCollectionForServer();
12
+ const deletedAgents = await collection.listDeletedAgents();
13
+
14
+ return (
15
+ <div className="container mx-auto p-6 max-w-4xl">
16
+ <header className="flex items-center gap-4 mb-8">
17
+ <div className="bg-red-100 p-3 rounded-full">
18
+ <TrashIcon className="w-8 h-8 text-red-600" />
19
+ </div>
20
+ <div>
21
+ <h1 className="text-3xl font-bold text-gray-900">Recycle Bin</h1>
22
+ <p className="text-gray-600">Restore deleted agents from here.</p>
23
+ </div>
24
+ </header>
25
+
26
+ {deletedAgents.length === 0 ? (
27
+ <div className="text-center py-12 bg-gray-50 rounded-lg border border-dashed border-gray-300">
28
+ <p className="text-gray-500 text-lg">Recycle bin is empty</p>
29
+ <Link href="/" className="text-blue-600 hover:underline mt-2 inline-block">
30
+ Go back to agents
31
+ </Link>
32
+ </div>
33
+ ) : (
34
+ <div className="grid gap-4">
35
+ {deletedAgents.map((agentName) => (
36
+ <div
37
+ key={agentName}
38
+ className="bg-white p-4 rounded-lg shadow-sm border border-gray-200 flex items-center justify-between hover:shadow-md transition-shadow"
39
+ >
40
+ <div className="flex items-center gap-3">
41
+ <div className="w-10 h-10 bg-gray-100 rounded-full flex items-center justify-center text-gray-500 font-bold text-lg">
42
+ {agentName.charAt(0).toUpperCase()}
43
+ </div>
44
+ <div>
45
+ <h3 className="font-semibold text-lg text-gray-900">{agentName}</h3>
46
+ <p className="text-sm text-gray-500">Deleted agent</p>
47
+ </div>
48
+ </div>
49
+ <div className="flex gap-2">
50
+ <RestoreAgentButton agentName={agentName} />
51
+ </div>
52
+ </div>
53
+ ))}
54
+ </div>
55
+ )}
56
+ </div>
57
+ );
58
+ }
@@ -0,0 +1,33 @@
1
+ import { ShieldAlert } from 'lucide-react';
2
+ import Link from 'next/link';
3
+
4
+ export default function RestrictedPage() {
5
+ return (
6
+ <div className="flex flex-col items-center justify-center min-h-[calc(100vh-4rem)] p-4 text-center">
7
+ <div className="bg-red-50 p-6 rounded-full mb-6">
8
+ <ShieldAlert className="w-12 h-12 text-red-600" />
9
+ </div>
10
+ <h1 className="text-2xl font-bold text-gray-900 mb-2">Access Restricted</h1>
11
+ <p className="text-gray-600 max-w-md mb-8">
12
+ This server is restricted to authorized users or specific IP addresses.
13
+ Please log in to continue or contact the administrator if you believe this is an error.
14
+ </p>
15
+
16
+ {/* The Login button in the header is available, so we can just point to it or instruct the user */}
17
+ <div className="p-4 bg-blue-50 text-blue-800 rounded-lg max-w-md text-sm">
18
+ <p>
19
+ <strong>Tip:</strong> Use the <strong>Log in</strong> button in the top right corner to access your account.
20
+ </p>
21
+ </div>
22
+
23
+ <div className="mt-8 flex gap-4">
24
+ <Link
25
+ href="/"
26
+ className="px-4 py-2 bg-gray-100 hover:bg-gray-200 text-gray-700 rounded-md transition-colors"
27
+ >
28
+ Go Home
29
+ </Link>
30
+ </div>
31
+ </div>
32
+ );
33
+ }
@@ -0,0 +1 @@
1
+ In this folder we are testing miscellaneous things related to Promptbook Agents Server
@@ -0,0 +1,37 @@
1
+ import { ImageResponse } from 'next/og';
2
+
3
+ export const runtime = 'edge';
4
+
5
+ export const alt = 'Agent Profile';
6
+ export const size = {
7
+ width: 1200,
8
+ height: 630,
9
+ };
10
+
11
+ export const contentType = 'image/png';
12
+
13
+ export default async function Image() {
14
+ return new ImageResponse(
15
+ (
16
+ <div
17
+ style={{
18
+ display: 'flex',
19
+ flexDirection: 'row',
20
+ width: '100%',
21
+ height: '100%',
22
+ backgroundColor: 'white',
23
+ }}
24
+ >
25
+ <h1>Hello</h1>
26
+ </div>
27
+ ),
28
+ {
29
+ ...size,
30
+ emoji: 'openmoji',
31
+ },
32
+ );
33
+ }
34
+
35
+ /**
36
+ * TODO: [webpack.cache.PackFileCacheStrategy] Serializing big strings (126kiB) impacts deserialization performance (consider using Buffer instead and decode when needed)
37
+ */
@@ -0,0 +1,22 @@
1
+ import { NEXT_PUBLIC_SITE_URL } from '@/config';
2
+ import type { Metadata } from 'next';
3
+
4
+ export const metadata: Metadata = {
5
+ metadataBase: NEXT_PUBLIC_SITE_URL,
6
+ title: 'Test OG Image',
7
+ description: 'Testing og-image',
8
+ };
9
+
10
+ export default function TestPage() {
11
+ return (
12
+ <div className="min-h-screen flex items-center justify-center bg-gray-100">
13
+ <div className="bg-white p-8 rounded-lg shadow-md max-w-md w-full">
14
+ <h1 className="text-3xl font-bold text-red-600 mb-4 text-center">Test page</h1>
15
+ <p className="text-gray-700 mb-6 text-center">Testing og-image</p>
16
+ <p className="text-gray-600 text-sm text-center mt-4">
17
+ View page source or share this URL to see the OG image in action
18
+ </p>
19
+ </div>
20
+ </div>
21
+ );
22
+ }
@@ -0,0 +1,175 @@
1
+ import Link from 'next/link';
2
+
3
+ export type FooterLink = {
4
+ title: string;
5
+ url: string;
6
+ };
7
+
8
+ type FooterProps = {
9
+ extraLinks?: FooterLink[];
10
+ };
11
+
12
+ export function Footer(props: FooterProps) {
13
+ const { extraLinks = [] } = props;
14
+
15
+ return (
16
+ <footer className="border-t bg-white">
17
+ <div className="container mx-auto px-6 py-12">
18
+ <div className="grid grid-cols-1 md:grid-cols-5 gap-8">
19
+ {/* Company Info */}
20
+ <div className="space-y-4">
21
+ <h3 className="font-bold">
22
+ Prompt<b>Book</b>
23
+ </h3>
24
+ <p className="text-sm text-muted-foreground text-gray-500">
25
+ {`It's time for a paradigm shift!`}
26
+ <br />
27
+ {`The future of software is in plain English ✨`}
28
+ </p>
29
+ </div>
30
+
31
+ {/* Products */}
32
+ <div className="space-y-4">
33
+ <h3 className="font-bold">Product</h3>
34
+ <ul className="space-y-2 text-sm">
35
+ <li>
36
+ <Link href="/get-started" className="text-gray-500 hover:text-gray-900">
37
+ Get started
38
+ </Link>
39
+ </li>
40
+ <li>
41
+ <Link href="/manifest" className="text-gray-500 hover:text-gray-900">
42
+ Manifest
43
+ </Link>
44
+ </li>
45
+ <li>
46
+ <a
47
+ href="https://github.com/webgptorg/promptbook"
48
+ className="text-gray-500 hover:text-gray-900"
49
+ >
50
+ Documentation
51
+ </a>
52
+ </li>
53
+ <li>
54
+ <Link href="/terms" className="text-gray-500 hover:text-gray-900">
55
+ Terms of Service
56
+ </Link>
57
+ </li>
58
+ <li>
59
+ <Link href="/privacy" className="text-gray-500 hover:text-gray-900">
60
+ Privacy Policy
61
+ </Link>
62
+ </li>
63
+ </ul>
64
+ </div>
65
+
66
+ {/* Company */}
67
+ <div className="space-y-4">
68
+ <h3 className="font-bold">Company</h3>
69
+ <ul className="space-y-2 text-sm">
70
+ <li>
71
+ <a
72
+ href="https://or-justice-cz.translate.goog/ias/ui/rejstrik-firma.vysledky?subjektId=1223693&typ=UPLNY&_x_tr_sl=cs&_x_tr_tl=en&_x_tr_hl=en-US&_x_tr_pto=wapp"
73
+ className="text-gray-500 hover:text-gray-900"
74
+ >
75
+ AI Web, LLC
76
+ </a>
77
+ </li>
78
+ <li>
79
+ <a href="https://ptbk.io/#about-us" className="text-gray-500 hover:text-gray-900">
80
+ About Us
81
+ </a>
82
+ </li>
83
+ <li>
84
+ <a href="https://ptbk.io/blog" className="text-gray-500 hover:text-gray-900">
85
+ Blog
86
+ </a>
87
+ </li>
88
+ <li>
89
+ <Link href="/design" className="text-gray-500 hover:text-gray-900">
90
+ Logos & Branding
91
+ </Link>
92
+ </li>
93
+ </ul>
94
+ </div>
95
+
96
+ {/* Social */}
97
+ <div className="space-y-4">
98
+ <h3 className="font-bold">Connect</h3>
99
+ <ul className="space-y-2 text-sm">
100
+ <li>
101
+ <a
102
+ href="https://github.com/webgptorg/promptbook"
103
+ className="text-gray-500 hover:text-gray-900"
104
+ >
105
+ GitHub
106
+ </a>
107
+ </li>
108
+ <li>
109
+ <a
110
+ href="https://linkedin.com/company/promptbook"
111
+ className="text-gray-500 hover:text-gray-900"
112
+ >
113
+ LinkedIn
114
+ </a>
115
+ </li>
116
+ <li>
117
+ <a
118
+ href="https://discord.gg/x3QWNaa89N"
119
+ className="text-gray-500 hover:text-gray-900"
120
+ >
121
+ Discord
122
+ </a>
123
+ </li>
124
+ <li>
125
+ <Link href="/contact" className="text-gray-500 hover:text-gray-900">
126
+ More
127
+ </Link>
128
+ </li>
129
+ </ul>
130
+ </div>
131
+
132
+ {/* Extra Links from Metadata */}
133
+ {extraLinks.length > 0 && (
134
+ <div className="space-y-4">
135
+ <h3 className="font-bold">Links</h3>
136
+ <ul className="space-y-2 text-sm">
137
+ {extraLinks.map((link, index) => (
138
+ <li key={index}>
139
+ <a
140
+ href={link.url}
141
+ className="text-gray-500 hover:text-gray-900"
142
+ target="_blank"
143
+ rel="noopener noreferrer"
144
+ >
145
+ {link.title}
146
+ </a>
147
+ </li>
148
+ ))}
149
+ </ul>
150
+ </div>
151
+ )}
152
+ </div>
153
+
154
+ <div className="border-t mt-8 pt-8 text-center text-sm text-gray-500">
155
+ <p>
156
+ &copy; {new Date().getFullYear()} Promptbook
157
+ <br />
158
+ All rights reserved.
159
+ <br />
160
+ 💜
161
+ </p>
162
+ </div>
163
+ <div className="flex flex-col items-center mt-8">
164
+ {/* <Image src={TechnologyIncubation} alt="Our Sponsor" className="h-32 w-auto" /> */}
165
+ <p className="text-center text-sm text-gray-500 mt-4 max-w-lg">
166
+ This project was implemented with funding from the national budget
167
+ <br />
168
+ via the Ministry of Industry and Trade of the Czech Republic within the CzechInvest Technology
169
+ Incubation programme.
170
+ </p>
171
+ </div>
172
+ </div>
173
+ </footer>
174
+ );
175
+ }