@intranefr/superbackend 1.5.1 → 1.5.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 (73) hide show
  1. package/.env.example +10 -0
  2. package/index.js +2 -0
  3. package/manage.js +745 -0
  4. package/package.json +5 -2
  5. package/src/controllers/admin.controller.js +79 -6
  6. package/src/controllers/adminAgents.controller.js +37 -0
  7. package/src/controllers/adminExperiments.controller.js +200 -0
  8. package/src/controllers/adminLlm.controller.js +19 -0
  9. package/src/controllers/adminMarkdowns.controller.js +157 -0
  10. package/src/controllers/adminScripts.controller.js +243 -74
  11. package/src/controllers/adminTelegram.controller.js +72 -0
  12. package/src/controllers/experiments.controller.js +85 -0
  13. package/src/controllers/internalExperiments.controller.js +17 -0
  14. package/src/controllers/markdowns.controller.js +42 -0
  15. package/src/helpers/mongooseHelper.js +258 -0
  16. package/src/helpers/scriptBase.js +230 -0
  17. package/src/helpers/scriptRunner.js +335 -0
  18. package/src/middleware.js +195 -34
  19. package/src/models/Agent.js +105 -0
  20. package/src/models/AgentMessage.js +82 -0
  21. package/src/models/CacheEntry.js +1 -1
  22. package/src/models/ConsoleLog.js +1 -1
  23. package/src/models/Experiment.js +75 -0
  24. package/src/models/ExperimentAssignment.js +23 -0
  25. package/src/models/ExperimentEvent.js +26 -0
  26. package/src/models/ExperimentMetricBucket.js +30 -0
  27. package/src/models/GlobalSetting.js +1 -2
  28. package/src/models/Markdown.js +75 -0
  29. package/src/models/RateLimitCounter.js +1 -1
  30. package/src/models/ScriptDefinition.js +1 -0
  31. package/src/models/ScriptRun.js +8 -0
  32. package/src/models/TelegramBot.js +42 -0
  33. package/src/models/Webhook.js +2 -0
  34. package/src/routes/admin.routes.js +2 -0
  35. package/src/routes/adminAgents.routes.js +13 -0
  36. package/src/routes/adminConsoleManager.routes.js +1 -1
  37. package/src/routes/adminExperiments.routes.js +29 -0
  38. package/src/routes/adminLlm.routes.js +1 -0
  39. package/src/routes/adminMarkdowns.routes.js +16 -0
  40. package/src/routes/adminScripts.routes.js +4 -1
  41. package/src/routes/adminTelegram.routes.js +14 -0
  42. package/src/routes/blogInternal.routes.js +2 -2
  43. package/src/routes/experiments.routes.js +30 -0
  44. package/src/routes/internalExperiments.routes.js +15 -0
  45. package/src/routes/markdowns.routes.js +16 -0
  46. package/src/services/agent.service.js +546 -0
  47. package/src/services/agentHistory.service.js +345 -0
  48. package/src/services/agentTools.service.js +578 -0
  49. package/src/services/blogCronsBootstrap.service.js +7 -6
  50. package/src/services/consoleManager.service.js +56 -18
  51. package/src/services/consoleOverride.service.js +1 -0
  52. package/src/services/experiments.service.js +273 -0
  53. package/src/services/experimentsAggregation.service.js +308 -0
  54. package/src/services/experimentsCronsBootstrap.service.js +118 -0
  55. package/src/services/experimentsRetention.service.js +43 -0
  56. package/src/services/experimentsWs.service.js +134 -0
  57. package/src/services/globalSettings.service.js +15 -0
  58. package/src/services/jsonConfigs.service.js +24 -12
  59. package/src/services/llm.service.js +219 -6
  60. package/src/services/markdowns.service.js +522 -0
  61. package/src/services/scriptsRunner.service.js +514 -23
  62. package/src/services/telegram.service.js +130 -0
  63. package/src/utils/rbac/rightsRegistry.js +4 -0
  64. package/views/admin-agents.ejs +273 -0
  65. package/views/admin-coolify-deploy.ejs +8 -8
  66. package/views/admin-dashboard.ejs +63 -12
  67. package/views/admin-experiments.ejs +91 -0
  68. package/views/admin-markdowns.ejs +905 -0
  69. package/views/admin-scripts.ejs +817 -6
  70. package/views/admin-telegram.ejs +269 -0
  71. package/views/partials/dashboard/nav-items.ejs +4 -0
  72. package/views/partials/dashboard/palette.ejs +5 -3
  73. package/src/middleware/internalCronAuth.js +0 -29
@@ -0,0 +1,91 @@
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>Experiments</title>
7
+ <link rel="stylesheet" href="<%= baseUrl %><%= adminPath %>/assets/css/styles.css" />
8
+ <style>
9
+ body { font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; padding: 16px; }
10
+ .row { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
11
+ input, select, button { padding: 8px 10px; }
12
+ table { width: 100%; border-collapse: collapse; margin-top: 12px; }
13
+ th, td { border-bottom: 1px solid #e5e7eb; padding: 10px; text-align: left; }
14
+ .muted { color: #6b7280; }
15
+ .pill { display: inline-block; padding: 2px 8px; border-radius: 999px; background: #f3f4f6; }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <h1>Experiments</h1>
20
+
21
+ <div class="row">
22
+ <label>
23
+ orgId
24
+ <input id="orgId" placeholder="(required for RBAC)" style="min-width: 320px" />
25
+ </label>
26
+ <button id="refresh">Refresh</button>
27
+ <span id="status" class="muted"></span>
28
+ </div>
29
+
30
+ <table>
31
+ <thead>
32
+ <tr>
33
+ <th>Code</th>
34
+ <th>Status</th>
35
+ <th>Org</th>
36
+ <th>Winner</th>
37
+ <th>Updated</th>
38
+ </tr>
39
+ </thead>
40
+ <tbody id="tbody"></tbody>
41
+ </table>
42
+
43
+ <script>
44
+ const statusEl = document.getElementById('status');
45
+ const tbody = document.getElementById('tbody');
46
+ const orgIdEl = document.getElementById('orgId');
47
+
48
+ function esc(s) {
49
+ return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
50
+ }
51
+
52
+ async function load() {
53
+ const orgId = orgIdEl.value.trim();
54
+ statusEl.textContent = 'Loading...';
55
+ tbody.innerHTML = '';
56
+
57
+ const url = new URL('<%= baseUrl %>/api/admin/experiments', window.location.origin);
58
+ if (orgId) url.searchParams.set('orgId', orgId);
59
+
60
+ const res = await fetch(url.toString(), { headers: { 'Content-Type': 'application/json' } });
61
+ const json = await res.json().catch(() => ({}));
62
+
63
+ if (!res.ok) {
64
+ statusEl.textContent = `Error: ${json.error || res.status}`;
65
+ return;
66
+ }
67
+
68
+ const items = Array.isArray(json.items) ? json.items : [];
69
+ statusEl.textContent = `${items.length} experiments`;
70
+
71
+ tbody.innerHTML = items
72
+ .map((e) => {
73
+ const winner = e.winnerVariantKey ? esc(e.winnerVariantKey) : '<span class="muted">-</span>';
74
+ return `
75
+ <tr>
76
+ <td><span class="pill">${esc(e.code)}</span></td>
77
+ <td>${esc(e.status)}</td>
78
+ <td class="muted">${esc(e.organizationId || '')}</td>
79
+ <td>${winner}</td>
80
+ <td class="muted">${esc(e.updatedAt || '')}</td>
81
+ </tr>
82
+ `;
83
+ })
84
+ .join('');
85
+ }
86
+
87
+ document.getElementById('refresh').addEventListener('click', () => load());
88
+ load();
89
+ </script>
90
+ </body>
91
+ </html>