@intranefr/superbackend 1.5.2 → 1.6.3

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 (134) hide show
  1. package/cookies.txt +6 -0
  2. package/cookies1.txt +6 -0
  3. package/cookies2.txt +6 -0
  4. package/cookies3.txt +6 -0
  5. package/cookies4.txt +5 -0
  6. package/cookies_old.txt +5 -0
  7. package/cookies_old_test.txt +6 -0
  8. package/cookies_super.txt +5 -0
  9. package/cookies_super_test.txt +6 -0
  10. package/cookies_test.txt +6 -0
  11. package/index.js +9 -0
  12. package/manage.js +745 -0
  13. package/package.json +6 -2
  14. package/plugins/core-waiting-list-migration/README.md +118 -0
  15. package/plugins/core-waiting-list-migration/index.js +438 -0
  16. package/plugins/global-settings-presets/index.js +20 -0
  17. package/plugins/hello-cli/index.js +17 -0
  18. package/plugins/ui-components-seeder/components/suiAlert.js +212 -0
  19. package/plugins/ui-components-seeder/components/suiToast.js +186 -0
  20. package/plugins/ui-components-seeder/index.js +31 -0
  21. package/public/js/admin-ui-components-preview.js +281 -0
  22. package/public/js/admin-ui-components.js +408 -0
  23. package/public/js/llm-provider-model-picker.js +193 -0
  24. package/public/test-iframe-fix.html +63 -0
  25. package/public/test-iframe.html +14 -0
  26. package/src/admin/endpointRegistry.js +68 -0
  27. package/src/controllers/admin.controller.js +36 -10
  28. package/src/controllers/adminAgents.controller.js +37 -0
  29. package/src/controllers/adminDataCleanup.controller.js +45 -0
  30. package/src/controllers/adminLlm.controller.js +19 -8
  31. package/src/controllers/adminLogin.controller.js +269 -0
  32. package/src/controllers/adminMarkdowns.controller.js +157 -0
  33. package/src/controllers/adminPlugins.controller.js +55 -0
  34. package/src/controllers/adminRegistry.controller.js +106 -0
  35. package/src/controllers/adminScripts.controller.js +138 -0
  36. package/src/controllers/adminStats.controller.js +4 -4
  37. package/src/controllers/adminTelegram.controller.js +72 -0
  38. package/src/controllers/markdowns.controller.js +42 -0
  39. package/src/controllers/registry.controller.js +32 -0
  40. package/src/controllers/waitingList.controller.js +52 -74
  41. package/src/helpers/mongooseHelper.js +6 -6
  42. package/src/helpers/scriptBase.js +2 -2
  43. package/src/middleware/auth.js +71 -1
  44. package/src/middleware/rbac.js +62 -0
  45. package/src/middleware.js +584 -176
  46. package/src/models/Agent.js +105 -0
  47. package/src/models/AgentMessage.js +82 -0
  48. package/src/models/GlobalSetting.js +11 -1
  49. package/src/models/Markdown.js +75 -0
  50. package/src/models/ScriptRun.js +8 -0
  51. package/src/models/TelegramBot.js +42 -0
  52. package/src/models/UiComponent.js +2 -0
  53. package/src/models/User.js +1 -1
  54. package/src/routes/admin.routes.js +3 -3
  55. package/src/routes/adminAgents.routes.js +13 -0
  56. package/src/routes/adminAssets.routes.js +11 -11
  57. package/src/routes/adminBlog.routes.js +2 -2
  58. package/src/routes/adminBlogAi.routes.js +2 -2
  59. package/src/routes/adminBlogAutomation.routes.js +2 -2
  60. package/src/routes/adminCache.routes.js +2 -2
  61. package/src/routes/adminConsoleManager.routes.js +2 -2
  62. package/src/routes/adminCrons.routes.js +2 -2
  63. package/src/routes/adminDataCleanup.routes.js +26 -0
  64. package/src/routes/adminDbBrowser.routes.js +2 -2
  65. package/src/routes/adminEjsVirtual.routes.js +2 -2
  66. package/src/routes/adminFeatureFlags.routes.js +6 -6
  67. package/src/routes/adminHeadless.routes.js +2 -2
  68. package/src/routes/adminHealthChecks.routes.js +2 -2
  69. package/src/routes/adminI18n.routes.js +2 -2
  70. package/src/routes/adminJsonConfigs.routes.js +8 -8
  71. package/src/routes/adminLlm.routes.js +8 -7
  72. package/src/routes/adminLogin.routes.js +23 -0
  73. package/src/routes/adminMarkdowns.routes.js +10 -0
  74. package/src/routes/adminMigration.routes.js +12 -12
  75. package/src/routes/adminPages.routes.js +2 -2
  76. package/src/routes/adminPlugins.routes.js +15 -0
  77. package/src/routes/adminProxy.routes.js +2 -2
  78. package/src/routes/adminRateLimits.routes.js +8 -8
  79. package/src/routes/adminRbac.routes.js +2 -2
  80. package/src/routes/adminRegistry.routes.js +24 -0
  81. package/src/routes/adminScripts.routes.js +6 -3
  82. package/src/routes/adminSeoConfig.routes.js +10 -10
  83. package/src/routes/adminTelegram.routes.js +14 -0
  84. package/src/routes/adminTerminals.routes.js +2 -2
  85. package/src/routes/adminUiComponents.routes.js +2 -2
  86. package/src/routes/adminUploadNamespaces.routes.js +7 -7
  87. package/src/routes/blogInternal.routes.js +2 -2
  88. package/src/routes/experiments.routes.js +2 -2
  89. package/src/routes/formsAdmin.routes.js +6 -6
  90. package/src/routes/globalSettings.routes.js +8 -8
  91. package/src/routes/internalExperiments.routes.js +2 -2
  92. package/src/routes/markdowns.routes.js +16 -0
  93. package/src/routes/notificationAdmin.routes.js +7 -7
  94. package/src/routes/orgAdmin.routes.js +16 -16
  95. package/src/routes/pages.routes.js +3 -3
  96. package/src/routes/registry.routes.js +11 -0
  97. package/src/routes/stripeAdmin.routes.js +12 -12
  98. package/src/routes/userAdmin.routes.js +7 -7
  99. package/src/routes/waitingListAdmin.routes.js +2 -2
  100. package/src/routes/workflows.routes.js +3 -3
  101. package/src/services/agent.service.js +546 -0
  102. package/src/services/agentHistory.service.js +345 -0
  103. package/src/services/agentTools.service.js +578 -0
  104. package/src/services/dataCleanup.service.js +286 -0
  105. package/src/services/jsonConfigs.service.js +284 -10
  106. package/src/services/llm.service.js +219 -6
  107. package/src/services/markdowns.service.js +522 -0
  108. package/src/services/plugins.service.js +348 -0
  109. package/src/services/registry.service.js +452 -0
  110. package/src/services/scriptsRunner.service.js +328 -37
  111. package/src/services/telegram.service.js +130 -0
  112. package/src/services/uiComponents.service.js +180 -0
  113. package/src/services/waitingListJson.service.js +401 -0
  114. package/src/utils/rbac/rightsRegistry.js +118 -0
  115. package/test-access.js +63 -0
  116. package/test-iframe-fix.html +63 -0
  117. package/test-iframe.html +14 -0
  118. package/views/admin-403.ejs +92 -0
  119. package/views/admin-agents.ejs +273 -0
  120. package/views/admin-coolify-deploy.ejs +8 -8
  121. package/views/admin-dashboard-home.ejs +52 -2
  122. package/views/admin-dashboard.ejs +179 -7
  123. package/views/admin-data-cleanup.ejs +357 -0
  124. package/views/admin-experiments.ejs +1 -1
  125. package/views/admin-login.ejs +286 -0
  126. package/views/admin-markdowns.ejs +905 -0
  127. package/views/admin-plugins-system.ejs +223 -0
  128. package/views/admin-scripts.ejs +221 -4
  129. package/views/admin-telegram.ejs +269 -0
  130. package/views/admin-ui-components.ejs +82 -402
  131. package/views/admin-users.ejs +207 -11
  132. package/views/partials/dashboard/nav-items.ejs +5 -0
  133. package/views/partials/llm-provider-model-picker.ejs +0 -161
  134. package/analysis-only.skill +0 -0
@@ -0,0 +1,269 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Telegram Bots - SuperBackend</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
9
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/dist/tabler-icons.min.css">
10
+ </head>
11
+ <body class="bg-gray-50 min-h-screen">
12
+ <div id="app" class="p-6 max-w-6xl mx-auto" v-cloak>
13
+ <div class="flex justify-between items-center mb-8">
14
+ <div>
15
+ <h1 class="text-2xl font-bold text-gray-800">Telegram Bots</h1>
16
+ <p class="text-gray-500">Manage your Telegram bot integrations</p>
17
+ </div>
18
+ <button @click="openCreateModal" class="bg-blue-600 text-white px-4 py-2 rounded-lg flex items-center gap-2 hover:bg-blue-700 transition">
19
+ <i class="ti ti-plus"></i>
20
+ Add New Bot
21
+ </button>
22
+ </div>
23
+
24
+ <!-- Bot List -->
25
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
26
+ <div v-for="bot in bots" :key="bot._id" class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden">
27
+ <div class="p-6">
28
+ <div class="flex justify-between items-start mb-4">
29
+ <div class="flex items-center gap-3">
30
+ <div :class="['w-12 h-12 rounded-full flex items-center justify-center text-2xl', bot.status === 'running' ? 'bg-green-100 text-green-600' : 'bg-gray-100 text-gray-400']">
31
+ <i class="ti ti-brand-telegram"></i>
32
+ </div>
33
+ <div>
34
+ <h3 class="font-bold text-gray-800">{{ bot.name }}</h3>
35
+ <span :class="['text-xs px-2 py-0.5 rounded-full', statusBadgeClass(bot.status)]">
36
+ {{ bot.status }}
37
+ </span>
38
+ </div>
39
+ </div>
40
+ <div class="flex gap-2">
41
+ <button @click="toggleBot(bot)" :title="bot.isActive ? 'Stop' : 'Start'" :class="['p-2 rounded-lg border transition', bot.isActive ? 'bg-red-50 text-red-600 border-red-100 hover:bg-red-100' : 'bg-green-50 text-green-600 border-green-100 hover:bg-green-100']">
42
+ <i :class="['ti', bot.isActive ? 'ti-player-stop' : 'ti-player-play']"></i>
43
+ </button>
44
+ <button @click="editBot(bot)" class="p-2 text-gray-500 hover:bg-gray-100 rounded-lg border border-gray-200 transition">
45
+ <i class="ti ti-edit"></i>
46
+ </button>
47
+ <button @click="confirmDelete(bot)" class="p-2 text-red-500 hover:bg-red-50 rounded-lg border border-red-100 transition">
48
+ <i class="ti ti-trash"></i>
49
+ </button>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="space-y-3 text-sm">
54
+ <div class="flex justify-between">
55
+ <span class="text-gray-500">Agent:</span>
56
+ <span :class="['font-medium', !bot.defaultAgentId ? 'text-amber-600' : '']">
57
+ {{ bot.defaultAgentId?.name || 'Unassigned' }}
58
+ </span>
59
+ </div>
60
+ <div class="flex justify-between">
61
+ <span class="text-gray-500">Allowed Users:</span>
62
+ <span class="font-medium">{{ bot.allowedUserIds?.length || 'Any' }}</span>
63
+ </div>
64
+ <div v-if="bot.lastError" class="mt-4 p-3 bg-red-50 text-red-700 rounded-lg border border-red-100 break-all">
65
+ <p class="font-bold mb-1">Last Error:</p>
66
+ {{ bot.lastError }}
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ <!-- Empty State -->
74
+ <div v-if="bots.length === 0" class="bg-white rounded-xl border-2 border-dashed border-gray-200 p-12 text-center">
75
+ <i class="ti ti-brand-telegram text-6xl text-gray-200 mb-4 inline-block"></i>
76
+ <h3 class="text-lg font-medium text-gray-800">No bots configured</h3>
77
+ <p class="text-gray-500 mb-6">Start by adding your first Telegram bot</p>
78
+ <button @click="openCreateModal" class="bg-blue-600 text-white px-6 py-2 rounded-lg hover:bg-blue-700 transition">
79
+ Add Bot
80
+ </button>
81
+ </div>
82
+
83
+ <!-- Modal -->
84
+ <div v-if="showModal" class="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
85
+ <div class="bg-white rounded-xl shadow-xl w-full max-w-md overflow-hidden">
86
+ <div class="px-6 py-4 border-b border-gray-100 flex justify-between items-center">
87
+ <h3 class="font-bold text-gray-800">{{ editingBot ? 'Edit Bot' : 'Add New Bot' }}</h3>
88
+ <button @click="showModal = false" class="text-gray-400 hover:text-gray-600">
89
+ <i class="ti ti-x"></i>
90
+ </button>
91
+ </div>
92
+ <form @submit.prevent="saveBot" class="p-6 space-y-4">
93
+ <div>
94
+ <label class="block text-sm font-medium text-gray-700 mb-1">Friendly Name</label>
95
+ <input v-model="formData.name" type="text" required class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none" placeholder="My Support Bot">
96
+ </div>
97
+ <div>
98
+ <label class="block text-sm font-medium text-gray-700 mb-1">Bot Token</label>
99
+ <input v-model="formData.token" type="password" required class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none" placeholder="123456:ABC-DEF...">
100
+ </div>
101
+ <div>
102
+ <label class="block text-sm font-medium text-gray-700 mb-1">Default Agent <span class="text-xs text-gray-400 font-normal">(Optional)</span></label>
103
+ <select v-model="formData.defaultAgentId" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none">
104
+ <option value="">No Agent (Idle)</option>
105
+ <option v-for="agent in agents" :key="agent._id" :value="agent._id">{{ agent.name }}</option>
106
+ </select>
107
+ </div>
108
+ <div>
109
+ <label class="block text-sm font-medium text-gray-700 mb-1">Allowed Telegram User IDs (comma separated)</label>
110
+ <input v-model="allowedUsersInput" type="text" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none" placeholder="123456, 789012">
111
+ <p class="text-xs text-gray-400 mt-1">Leave empty to allow any user (be careful!)</p>
112
+ </div>
113
+ <div class="flex items-center gap-2 pt-2">
114
+ <input v-model="formData.isActive" type="checkbox" id="isActive" class="w-4 h-4 text-blue-600 rounded">
115
+ <label for="isActive" class="text-sm font-medium text-gray-700">Enable bot on save</label>
116
+ </div>
117
+
118
+ <div class="flex gap-3 pt-4">
119
+ <button type="button" @click="showModal = false" class="flex-1 px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition">
120
+ Cancel
121
+ </button>
122
+ <button type="submit" :disabled="saving" class="flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition disabled:opacity-50">
123
+ {{ saving ? 'Saving...' : (editingBot ? 'Update' : 'Create') }}
124
+ </button>
125
+ </div>
126
+ </form>
127
+ </div>
128
+ </div>
129
+ </div>
130
+
131
+ <script>
132
+ const { createApp, ref, onMounted } = Vue;
133
+
134
+ createApp({
135
+ setup() {
136
+ const bots = ref([]);
137
+ const agents = ref([]);
138
+ const showModal = ref(false);
139
+ const editingBot = ref(null);
140
+ const saving = ref(false);
141
+ const allowedUsersInput = ref('');
142
+
143
+ const formData = ref({
144
+ name: '',
145
+ token: '',
146
+ defaultAgentId: '',
147
+ isActive: false,
148
+ allowedUserIds: []
149
+ });
150
+
151
+ const baseUrl = '<%= baseUrl %>';
152
+
153
+ const fetchBots = async () => {
154
+ const res = await fetch(`${baseUrl}/api/admin/telegram`);
155
+ const data = await res.json();
156
+ bots.value = data.items;
157
+ };
158
+
159
+ const fetchAgents = async () => {
160
+ const res = await fetch(`${baseUrl}/api/admin/agents`);
161
+ const data = await res.json();
162
+ agents.value = data.items;
163
+ };
164
+
165
+ const openCreateModal = () => {
166
+ editingBot.value = null;
167
+ allowedUsersInput.value = '';
168
+ formData.value = {
169
+ name: '',
170
+ token: '',
171
+ defaultAgentId: '',
172
+ isActive: false,
173
+ allowedUserIds: []
174
+ };
175
+ showModal.value = true;
176
+ };
177
+
178
+ const editBot = (bot) => {
179
+ editingBot.value = bot;
180
+ allowedUsersInput.value = (bot.allowedUserIds || []).join(', ');
181
+ formData.value = {
182
+ name: bot.name,
183
+ token: bot.token,
184
+ defaultAgentId: bot.defaultAgentId?._id || bot.defaultAgentId || '',
185
+ isActive: bot.isActive,
186
+ allowedUserIds: bot.allowedUserIds || []
187
+ };
188
+ showModal.value = true;
189
+ };
190
+
191
+ const toggleBot = async (bot) => {
192
+ await fetch(`${baseUrl}/api/admin/telegram/${bot._id}/toggle`, { method: 'POST' });
193
+ fetchBots();
194
+ };
195
+
196
+ const confirmDelete = async (bot) => {
197
+ if (confirm(`Are you sure you want to delete ${bot.name}?`)) {
198
+ await fetch(`${baseUrl}/api/admin/telegram/${bot._id}`, { method: 'DELETE' });
199
+ fetchBots();
200
+ }
201
+ };
202
+
203
+ const saveBot = async () => {
204
+ saving.value = true;
205
+ try {
206
+ formData.value.allowedUserIds = allowedUsersInput.value
207
+ .split(',')
208
+ .map(s => s.trim())
209
+ .filter(s => s.length > 0);
210
+
211
+ const url = editingBot.value
212
+ ? `${baseUrl}/api/admin/telegram/${editingBot.value._id}`
213
+ : `${baseUrl}/api/admin/telegram`;
214
+
215
+ const method = editingBot.value ? 'PUT' : 'POST';
216
+
217
+ const res = await fetch(url, {
218
+ method,
219
+ headers: { 'Content-Type': 'application/json' },
220
+ body: JSON.stringify(formData.value)
221
+ });
222
+
223
+ if (res.ok) {
224
+ showModal.value = false;
225
+ fetchBots();
226
+ } else {
227
+ const data = await res.json();
228
+ alert(data.error || 'Failed to save bot');
229
+ }
230
+ } catch (err) {
231
+ alert(err.message);
232
+ } finally {
233
+ saving.value = false;
234
+ }
235
+ };
236
+
237
+ const statusBadgeClass = (status) => {
238
+ switch (status) {
239
+ case 'running': return 'bg-green-100 text-green-700';
240
+ case 'error': return 'bg-red-100 text-red-700';
241
+ default: return 'bg-gray-100 text-gray-700';
242
+ }
243
+ };
244
+
245
+ onMounted(() => {
246
+ fetchBots();
247
+ fetchAgents();
248
+ });
249
+
250
+ return {
251
+ bots,
252
+ agents,
253
+ showModal,
254
+ editingBot,
255
+ formData,
256
+ allowedUsersInput,
257
+ saving,
258
+ openCreateModal,
259
+ editBot,
260
+ toggleBot,
261
+ confirmDelete,
262
+ saveBot,
263
+ statusBadgeClass
264
+ };
265
+ }
266
+ }).mount('#app');
267
+ </script>
268
+ </body>
269
+ </html>