@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,286 @@
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>Admin Login - SuperBackend</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/dist/tabler-icons.min.css">
9
+ <style>
10
+ [v-cloak] { display: none; }
11
+ .auth-option { transition: all 0.3s ease; }
12
+ .auth-option.active {
13
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
14
+ color: white;
15
+ transform: translateY(-2px);
16
+ box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);
17
+ }
18
+ .floating-label {
19
+ transition: all 0.2s ease;
20
+ }
21
+ .input-group:focus-within .floating-label,
22
+ .input-group input:not(:placeholder-shown) ~ .floating-label {
23
+ transform: translateY(-1.5rem) scale(0.85);
24
+ color: #667eea;
25
+ }
26
+ </style>
27
+ </head>
28
+ <body class="min-h-screen bg-gradient-to-br from-blue-50 via-indigo-50 to-purple-50 flex items-center justify-center p-4">
29
+ <div id="app" class="w-full max-w-md" v-cloak>
30
+ <!-- Login Card -->
31
+ <div class="bg-white/80 backdrop-blur-lg rounded-2xl shadow-2xl border border-white/20 overflow-hidden">
32
+ <!-- Header -->
33
+ <div class="bg-gradient-to-r from-blue-600 to-indigo-600 p-6 text-center">
34
+ <div class="flex justify-center mb-3">
35
+ <div class="w-12 h-12 bg-white/20 rounded-full flex items-center justify-center">
36
+ <i class="ti ti-lock text-white text-xl"></i>
37
+ </div>
38
+ </div>
39
+ <h1 class="text-2xl font-bold text-white">Admin Login</h1>
40
+ <p class="text-blue-100 text-sm mt-1">SuperBackend Management Panel</p>
41
+ </div>
42
+
43
+ <!-- Alert Messages -->
44
+ <div v-if="alertMessage" class="m-4 p-3 rounded-lg text-sm flex items-center" :class="alertClass">
45
+ <i class="ti" :class="alertIcon" class="mr-2"></i>
46
+ <span>{{ alertMessage }}</span>
47
+ </div>
48
+
49
+ <!-- Authentication Type Selector -->
50
+ <div class="px-6 pt-4">
51
+ <p class="text-sm text-gray-600 mb-3 text-center">Choose authentication method:</p>
52
+ <div class="grid grid-cols-2 gap-3">
53
+ <button
54
+ @click="authType = 'basic'"
55
+ :class="['auth-option p-3 rounded-lg border-2 text-center transition-all', authType === 'basic' ? 'active border-blue-500' : 'border-gray-200 hover:border-gray-300']">
56
+ <i class="ti ti-key text-xl mb-1 block"></i>
57
+ <span class="text-sm font-medium">Basic Auth</span>
58
+ <span class="text-xs opacity-75 block">Username/Password</span>
59
+ </button>
60
+ <button
61
+ @click="authType = 'iam'"
62
+ :class="['auth-option p-3 rounded-lg border-2 text-center transition-all', authType === 'iam' ? 'active border-blue-500' : 'border-gray-200 hover:border-gray-300']">
63
+ <i class="ti ti-user text-xl mb-1 block"></i>
64
+ <span class="text-sm font-medium">IAM User</span>
65
+ <span class="text-xs opacity-75 block">Email/Password</span>
66
+ </button>
67
+ </div>
68
+ </div>
69
+
70
+ <!-- Login Form -->
71
+ <form @submit.prevent="handleSubmit" class="p-6 pt-4">
72
+ <!-- Identifier Field (Username or Email) -->
73
+ <div class="input-group relative mb-6">
74
+ <input
75
+ type="text"
76
+ id="identifier"
77
+ v-model="form.identifier"
78
+ :placeholder="authType === 'basic' ? 'Enter username' : 'Enter email'"
79
+ class="w-full px-4 py-3 border-2 border-gray-200 rounded-lg focus:border-blue-500 focus:outline-none transition-colors peer"
80
+ :class="{ 'border-red-300': errors.identifier }"
81
+ required>
82
+ <label
83
+ for="identifier"
84
+ class="floating-label absolute left-4 top-3 text-gray-500 pointer-events-none bg-white px-1">
85
+ {{ authType === 'basic' ? 'Username' : 'Email Address' }}
86
+ </label>
87
+ <div v-if="errors.identifier" class="text-red-500 text-xs mt-1">
88
+ <i class="ti ti-alert-circle"></i> {{ errors.identifier }}
89
+ </div>
90
+ </div>
91
+
92
+ <!-- Password Field -->
93
+ <div class="input-group relative mb-6">
94
+ <input
95
+ :type="showPassword ? 'text' : 'password'"
96
+ id="password"
97
+ v-model="form.password"
98
+ placeholder="Enter password"
99
+ class="w-full px-4 py-3 pr-12 border-2 border-gray-200 rounded-lg focus:border-blue-500 focus:outline-none transition-colors peer"
100
+ :class="{ 'border-red-300': errors.password }"
101
+ required>
102
+ <label
103
+ for="password"
104
+ class="floating-label absolute left-4 top-3 text-gray-500 pointer-events-none bg-white px-1">
105
+ Password
106
+ </label>
107
+ <button
108
+ type="button"
109
+ @click="showPassword = !showPassword"
110
+ class="absolute right-3 top-3.5 text-gray-400 hover:text-gray-600">
111
+ <i class="ti" :class="showPassword ? 'ti-eye-off' : 'ti-eye'"></i>
112
+ </button>
113
+ <div v-if="errors.password" class="text-red-500 text-xs mt-1">
114
+ <i class="ti ti-alert-circle"></i> {{ errors.password }}
115
+ </div>
116
+ </div>
117
+
118
+ <!-- Submit Button -->
119
+ <button
120
+ type="submit"
121
+ :disabled="loading"
122
+ class="w-full bg-gradient-to-r from-blue-600 to-indigo-600 text-white py-3 rounded-lg font-medium hover:from-blue-700 hover:to-indigo-700 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed transform hover:scale-[1.02] active:scale-[0.98]">
123
+ <span v-if="loading" class="flex items-center justify-center">
124
+ <svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
125
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
126
+ <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
127
+ </svg>
128
+ Signing in...
129
+ </span>
130
+ <span v-else class="flex items-center justify-center">
131
+ <i class="ti ti-login mr-2"></i>
132
+ Sign In
133
+ </span>
134
+ </button>
135
+ </form>
136
+
137
+ <!-- Help Section -->
138
+ <div class="px-6 pb-6">
139
+ <div class="bg-blue-50 rounded-lg p-4">
140
+ <h3 class="font-medium text-blue-900 mb-2 flex items-center">
141
+ <i class="ti ti-info-circle mr-2"></i>
142
+ Authentication Help
143
+ </h3>
144
+ <div v-if="authType === 'basic'" class="text-sm text-blue-700 space-y-1">
145
+ <p>• Use your admin username and password</p>
146
+ <p>• Default credentials: admin/admin</p>
147
+ <p>• Configure via ADMIN_USERNAME and ADMIN_PASSWORD environment variables</p>
148
+ </div>
149
+ <div v-else class="text-sm text-blue-700 space-y-1">
150
+ <p>• Use your IAM user email and password</p>
151
+ <p>• User must have 'admin' or 'superadmin' role</p>
152
+ <p>• First-time setup: Login with basic auth to create IAM users</p>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <!-- Footer -->
159
+ <div class="text-center mt-6 text-sm text-gray-500">
160
+ <p>SuperBackend v1.5.3 • Secure Admin Access</p>
161
+ </div>
162
+ </div>
163
+
164
+ <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
165
+ <script>
166
+ const { createApp } = Vue;
167
+
168
+ createApp({
169
+ data() {
170
+ return {
171
+ authType: 'basic',
172
+ loading: false,
173
+ showPassword: false,
174
+ form: {
175
+ identifier: '',
176
+ password: ''
177
+ },
178
+ errors: {},
179
+ alertMessage: '',
180
+ alertClass: '',
181
+ alertIcon: ''
182
+ };
183
+ },
184
+ mounted() {
185
+ this.checkForAlerts();
186
+ this.autoDetectAuthType();
187
+ },
188
+ methods: {
189
+ checkForAlerts() {
190
+ const urlParams = new URLSearchParams(window.location.search);
191
+ const error = urlParams.get('error');
192
+ const success = urlParams.get('success');
193
+
194
+ if (error) {
195
+ this.showAlert(error, 'error');
196
+ } else if (success) {
197
+ this.showAlert(success, 'success');
198
+ }
199
+ },
200
+ showAlert(message, type) {
201
+ this.alertMessage = message;
202
+ if (type === 'error') {
203
+ this.alertClass = 'bg-red-50 text-red-700 border border-red-200';
204
+ this.alertIcon = 'ti-alert-circle';
205
+ } else {
206
+ this.alertClass = 'bg-green-50 text-green-700 border border-green-200';
207
+ this.alertIcon = 'ti-check-circle';
208
+ }
209
+
210
+ // Auto-hide after 5 seconds
211
+ setTimeout(() => {
212
+ this.alertMessage = '';
213
+ }, 5000);
214
+ },
215
+ autoDetectAuthType() {
216
+ // Auto-detect based on input field content
217
+ if (this.form.identifier) {
218
+ this.authType = this.form.identifier.includes('@') ? 'iam' : 'basic';
219
+ }
220
+ },
221
+ validateForm() {
222
+ this.errors = {};
223
+
224
+ if (!this.form.identifier) {
225
+ this.errors.identifier = this.authType === 'basic' ? 'Username is required' : 'Email is required';
226
+ } else if (this.authType === 'iam' && !this.form.identifier.includes('@')) {
227
+ this.errors.identifier = 'Please enter a valid email address';
228
+ }
229
+
230
+ if (!this.form.password) {
231
+ this.errors.password = 'Password is required';
232
+ } else if (this.form.password.length < 1) {
233
+ this.errors.password = 'Password cannot be empty';
234
+ }
235
+
236
+ return Object.keys(this.errors).length === 0;
237
+ },
238
+ async handleSubmit() {
239
+ if (!this.validateForm()) {
240
+ return;
241
+ }
242
+
243
+ this.loading = true;
244
+
245
+ try {
246
+ const formData = new URLSearchParams();
247
+ formData.append('identifier', this.form.identifier);
248
+ formData.append('password', this.form.password);
249
+
250
+ const response = await fetch('<%= adminPath %>/login', {
251
+ method: 'POST',
252
+ headers: {
253
+ 'Content-Type': 'application/x-www-form-urlencoded',
254
+ },
255
+ body: formData.toString()
256
+ });
257
+
258
+ if (response.redirected) {
259
+ window.location.href = response.url;
260
+ } else {
261
+ // Handle error responses
262
+ const text = await response.text();
263
+ if (text.includes('error=')) {
264
+ const urlParams = new URLSearchParams(text.split('error=')[1].split('&')[0]);
265
+ this.showAlert(decodeURIComponent(urlParams.get('error') || 'Login failed'), 'error');
266
+ } else {
267
+ this.showAlert('Login failed', 'error');
268
+ }
269
+ }
270
+ } catch (error) {
271
+ console.error('Login error:', error);
272
+ this.showAlert('Network error. Please try again.', 'error');
273
+ } finally {
274
+ this.loading = false;
275
+ }
276
+ }
277
+ },
278
+ watch: {
279
+ 'form.identifier'() {
280
+ this.autoDetectAuthType();
281
+ }
282
+ }
283
+ }).mount('#app');
284
+ </script>
285
+ </body>
286
+ </html>