@sleep2agi/agent-network-dashboard 0.3.1 → 0.3.2

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 (170) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/diagnostics/route-bundle-stats.json +4 -4
  7. package/.next/fallback-build-manifest.json +3 -3
  8. package/.next/prerender-manifest.json +3 -3
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +2 -2
  18. package/.next/server/app/_not-found.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/admin.html +2 -2
  27. package/.next/server/app/admin.rsc +2 -2
  28. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  29. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  30. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  31. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  32. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  33. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  34. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/docs.html +2 -2
  36. package/.next/server/app/docs.rsc +3 -3
  37. package/.next/server/app/docs.segments/_full.segment.rsc +3 -3
  38. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  39. package/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  40. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  41. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  42. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  43. package/.next/server/app/index.html +2 -2
  44. package/.next/server/app/index.rsc +2 -2
  45. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  46. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  47. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  49. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  50. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/login.html +2 -2
  52. package/.next/server/app/login.rsc +3 -3
  53. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  54. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  55. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  56. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  57. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  58. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  59. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/logs.html +2 -2
  61. package/.next/server/app/logs.rsc +2 -2
  62. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  63. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  65. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  66. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  68. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/messages.html +2 -2
  70. package/.next/server/app/messages.rsc +2 -2
  71. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  72. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  73. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  74. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  75. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  76. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  77. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/node.html +2 -2
  79. package/.next/server/app/node.rsc +2 -2
  80. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  81. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  83. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  84. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  86. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  87. package/.next/server/app/nodes.html +2 -2
  88. package/.next/server/app/nodes.rsc +2 -2
  89. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  90. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  91. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  92. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  93. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  94. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  95. package/.next/server/app/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  97. package/.next/server/app/server-logs.html +2 -2
  98. package/.next/server/app/server-logs.rsc +2 -2
  99. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  100. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  101. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  102. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  103. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  104. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  105. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/settings/networks.html +2 -2
  107. package/.next/server/app/settings/networks.rsc +2 -2
  108. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  109. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  110. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  111. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  112. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  114. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  115. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  116. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  117. package/.next/server/app/settings/tokens.html +2 -2
  118. package/.next/server/app/settings/tokens.rsc +2 -2
  119. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  120. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  121. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  122. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  123. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  124. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  125. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  126. package/.next/server/app/settings.html +2 -2
  127. package/.next/server/app/settings.rsc +2 -2
  128. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  129. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  130. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  131. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  132. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  133. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  134. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  136. package/.next/server/app/tasks.html +2 -2
  137. package/.next/server/app/tasks.rsc +2 -2
  138. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  139. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  140. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  141. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  142. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  143. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  144. package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js +1 -1
  145. package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js.map +1 -1
  146. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
  147. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +1 -1
  148. package/.next/server/middleware-build-manifest.js +3 -3
  149. package/.next/server/pages/404.html +2 -2
  150. package/.next/server/pages/500.html +1 -1
  151. package/.next/server/server-reference-manifest.js +1 -1
  152. package/.next/server/server-reference-manifest.json +1 -1
  153. package/.next/static/chunks/{063eleenll4ri.js → 06.gd_vlnz5n0.js} +6 -6
  154. package/.next/static/chunks/{0yecbikzk4e1m.css → 0mz9c6--6di2j.css} +1 -1
  155. package/.next/static/chunks/{0afxijuigt-49.js → 0o5zj~5vjeks3.js} +1 -1
  156. package/.next/trace +2 -2
  157. package/.next/trace-build +1 -1
  158. package/app/docs/page.tsx +1 -1
  159. package/app/globals.css +85 -0
  160. package/app/login/page.tsx +1 -1
  161. package/package.json +1 -1
  162. package/test-results/.last-run.json +2 -7
  163. package/test-results/e2e-Dashboard-E2E-Tests-nodes-page-shows-demo-nodes/error-context.md +0 -149
  164. package/test-results/e2e-Dashboard-E2E-Tests-overview-page-shows-stats/error-context.md +0 -149
  165. package/test-results/e2e-Dashboard-E2E-Tests-settings-page-shows-license-config/error-context.md +0 -149
  166. package/test-results/e2e-Dashboard-E2E-Tests-sidebar-navigation-works/error-context.md +0 -149
  167. package/tsconfig.tsbuildinfo +0 -1
  168. /package/.next/static/{w3FFQojHKbi2FsiXfCIUC → dR3GSMnwa4k46SIbP3PaK}/_buildManifest.js +0 -0
  169. /package/.next/static/{w3FFQojHKbi2FsiXfCIUC → dR3GSMnwa4k46SIbP3PaK}/_clientMiddlewareManifest.js +0 -0
  170. /package/.next/static/{w3FFQojHKbi2FsiXfCIUC → dR3GSMnwa4k46SIbP3PaK}/_ssgManifest.js +0 -0
package/app/globals.css CHANGED
@@ -146,15 +146,100 @@ body {
146
146
  migrated.
147
147
  ──────────────────────────────────────────────────── */
148
148
 
149
+ /* page-level dark backgrounds → use --bg */
150
+ [data-theme="light"] .bg-\[\#050510\],
151
+ [data-theme="light"] .bg-\[\#080814\],
152
+ [data-theme="light"] .bg-\[\#0a0a14\],
153
+ [data-theme="light"] .bg-\[\#0a0a15\],
149
154
  [data-theme="light"] .bg-\[\#0a0a1a\],
155
+ [data-theme="light"] .bg-\[\#0d0d1a\],
150
156
  [data-theme="light"] .bg-\[\#11112a\],
157
+ [data-theme="light"] .bg-\[\#11111c\],
158
+ [data-theme="light"] .bg-\[\#161630\],
151
159
  [data-theme="light"] .bg-\[\#161640\],
160
+ [data-theme="mint"] .bg-\[\#050510\],
161
+ [data-theme="mint"] .bg-\[\#080814\],
162
+ [data-theme="mint"] .bg-\[\#0a0a14\],
163
+ [data-theme="mint"] .bg-\[\#0a0a15\],
152
164
  [data-theme="mint"] .bg-\[\#0a0a1a\],
165
+ [data-theme="mint"] .bg-\[\#0d0d1a\],
153
166
  [data-theme="mint"] .bg-\[\#11112a\],
167
+ [data-theme="mint"] .bg-\[\#11111c\],
168
+ [data-theme="mint"] .bg-\[\#161630\],
154
169
  [data-theme="mint"] .bg-\[\#161640\] {
155
170
  background-color: var(--bg) !important;
156
171
  }
157
172
 
173
+ /* card / elevated backgrounds (incl. opacity variants) */
174
+ [data-theme="light"] .bg-\[\#111128\],
175
+ [data-theme="light"] .bg-\[\#111128\]\/80,
176
+ [data-theme="light"] .bg-\[\#1a1a2a\],
177
+ [data-theme="light"] .bg-\[\#1a1a3a\],
178
+ [data-theme="mint"] .bg-\[\#111128\],
179
+ [data-theme="mint"] .bg-\[\#111128\]\/80,
180
+ [data-theme="mint"] .bg-\[\#1a1a2a\],
181
+ [data-theme="mint"] .bg-\[\#1a1a3a\] {
182
+ background-color: var(--bg-secondary) !important;
183
+ }
184
+
185
+ /* hover / input field backgrounds */
186
+ [data-theme="light"] .bg-\[\#2a2a4a\],
187
+ [data-theme="mint"] .bg-\[\#2a2a4a\] {
188
+ background-color: var(--bg-elevated) !important;
189
+ }
190
+
191
+ /* hardcoded borders */
192
+ [data-theme="light"] .border-\[\#111128\],
193
+ [data-theme="light"] .border-\[\#1a1a2a\],
194
+ [data-theme="light"] .border-\[\#2a2a4a\],
195
+ [data-theme="light"] .border-\[\#3a3a5a\],
196
+ [data-theme="mint"] .border-\[\#111128\],
197
+ [data-theme="mint"] .border-\[\#1a1a2a\],
198
+ [data-theme="mint"] .border-\[\#2a2a4a\],
199
+ [data-theme="mint"] .border-\[\#3a3a5a\] {
200
+ border-color: var(--border) !important;
201
+ }
202
+
203
+ /* dark-tuned gradient buttons → flat brand color in light themes */
204
+ [data-theme="light"] [class*="from-cyan-"][class*="to-blue-"],
205
+ [data-theme="light"] [class*="from-cyan-"][class*="to-emerald-"],
206
+ [data-theme="light"] [class*="from-emerald-"][class*="to-cyan-"],
207
+ [data-theme="light"] [class*="from-blue-"][class*="to-cyan-"] {
208
+ background: var(--accent) !important;
209
+ color: var(--accent-fg) !important;
210
+ }
211
+ [data-theme="light"] [class*="from-cyan-"][class*="to-blue-"]:hover,
212
+ [data-theme="light"] [class*="from-cyan-"][class*="to-emerald-"]:hover,
213
+ [data-theme="light"] [class*="from-emerald-"][class*="to-cyan-"]:hover,
214
+ [data-theme="light"] [class*="from-blue-"][class*="to-cyan-"]:hover {
215
+ background: #00b894 !important;
216
+ filter: brightness(1.05);
217
+ }
218
+ [data-theme="light"] .text-gray-100,
219
+ [data-theme="light"] .text-gray-200,
220
+ [data-theme="light"] .text-gray-300,
221
+ [data-theme="light"] .text-gray-100\/90,
222
+ [data-theme="mint"] .text-gray-100,
223
+ [data-theme="mint"] .text-gray-200,
224
+ [data-theme="mint"] .text-gray-300,
225
+ [data-theme="mint"] .text-gray-100\/90 {
226
+ color: var(--fg) !important;
227
+ }
228
+ [data-theme="light"] .text-gray-400,
229
+ [data-theme="light"] .text-gray-500,
230
+ [data-theme="light"] .text-gray-600,
231
+ [data-theme="light"] .placeholder-gray-600::placeholder,
232
+ [data-theme="mint"] .text-gray-400,
233
+ [data-theme="mint"] .text-gray-500,
234
+ [data-theme="mint"] .text-gray-600,
235
+ [data-theme="mint"] .placeholder-gray-600::placeholder {
236
+ color: var(--fg-muted) !important;
237
+ }
238
+ [data-theme="light"] .text-white,
239
+ [data-theme="mint"] .text-white {
240
+ color: var(--fg) !important;
241
+ }
242
+
158
243
  [data-theme="light"] .text-zinc-100,
159
244
  [data-theme="light"] .text-zinc-200,
160
245
  [data-theme="light"] .text-white,
@@ -96,7 +96,7 @@ export default function LoginPage() {
96
96
  </button>
97
97
  </form>
98
98
 
99
- <p className="text-center text-xs text-gray-700 mt-6">Powered by CommHub V3</p>
99
+ <p className="text-center text-xs text-gray-700 mt-6">Powered by Sleep2AGI</p>
100
100
  </div>
101
101
  </main>
102
102
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -1,9 +1,4 @@
1
1
  {
2
- "status": "failed",
3
- "failedTests": [
4
- "b1c7859d981cc20c96be-e493bf85af29f662ad60",
5
- "b1c7859d981cc20c96be-88663d8dba6d4fa27ce4",
6
- "b1c7859d981cc20c96be-394fec2622f87f6c4d7b",
7
- "b1c7859d981cc20c96be-62233707f9e2da538134"
8
- ]
2
+ "status": "passed",
3
+ "failedTests": []
9
4
  }
@@ -1,149 +0,0 @@
1
- # Instructions
2
-
3
- - Following Playwright test failed.
4
- - Explain why, be concise, respect Playwright best practices.
5
- - Provide a snippet of code with the fix, if possible.
6
-
7
- # Test info
8
-
9
- - Name: e2e.spec.ts >> Dashboard E2E Tests >> nodes page shows demo nodes
10
- - Location: tests/e2e.spec.ts:69:7
11
-
12
- # Error details
13
-
14
- ```
15
- TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
16
- =========================== logs ===========================
17
- waiting for navigation to "http://localhost:3000/" until "load"
18
- ============================================================
19
- ```
20
-
21
- # Page snapshot
22
-
23
- ```yaml
24
- - generic [ref=e1]:
25
- - main [ref=e2]:
26
- - generic [ref=e3]:
27
- - generic [ref=e4]:
28
- - img [ref=e6]
29
- - heading "Agent Network" [level=1] [ref=e8]
30
- - paragraph [ref=e9]: Dashboard
31
- - generic [ref=e10]:
32
- - button "Sign in" [active] [ref=e11]
33
- - button "Register" [ref=e12]
34
- - generic [ref=e13]:
35
- - generic [ref=e14]: Username
36
- - textbox "Username" [ref=e15]:
37
- - /placeholder: Enter username
38
- - text: admin
39
- - generic [ref=e16]: Password
40
- - textbox "Password" [ref=e17]:
41
- - /placeholder: Enter password
42
- - text: admin123
43
- - button "Sign in" [ref=e18]
44
- - paragraph [ref=e19]: Powered by CommHub V3
45
- - button "Open Next.js Dev Tools" [ref=e25] [cursor=pointer]:
46
- - img [ref=e26]
47
- - alert [ref=e29]
48
- ```
49
-
50
- # Test source
51
-
52
- ```ts
53
- 1 | import { test, expect } from '@playwright/test';
54
- 2 |
55
- 3 | const BASE = process.env.TEST_URL || 'http://localhost:3000';
56
- 4 | const ADMIN_USER = 'admin';
57
- 5 | const ADMIN_PASS = 'admin123';
58
- 6 |
59
- 7 | test.describe('Dashboard E2E Tests', () => {
60
- 8 | test('login page loads', async ({ page }) => {
61
- 9 | await page.goto(`${BASE}/login`);
62
- 10 | await expect(page.locator('text=Agent Network')).toBeVisible();
63
- 11 | await expect(page.locator('input[type="text"]')).toBeVisible();
64
- 12 | await expect(page.locator('input[type="password"]')).toBeVisible();
65
- 13 | });
66
- 14 |
67
- 15 | test('V3 register + login flow', async ({ page }) => {
68
- 16 | await page.goto(`${BASE}/login`);
69
- 17 | // Switch to register
70
- 18 | await page.click('text=Register');
71
- 19 | await page.fill('input[type="text"]', `test_${Date.now()}`);
72
- 20 | await page.fill('input[type="password"]', 'test123456');
73
- 21 | await page.click('button:has-text("Create account")');
74
- 22 | // Should redirect to dashboard
75
- 23 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
76
- 24 | await expect(page.locator('text=Agent Network')).toBeVisible();
77
- 25 | });
78
- 26 |
79
- 27 | test('overview page shows stats', async ({ page }) => {
80
- 28 | // Login first
81
- 29 | await page.goto(`${BASE}/login`);
82
- 30 | await page.fill('input[type="text"]', ADMIN_USER);
83
- 31 | await page.fill('input[type="password"]', ADMIN_PASS);
84
- 32 | await page.click('button:has-text("Sign in")');
85
- 33 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
86
- 34 |
87
- 35 | // Check stats bar
88
- 36 | await expect(page.locator('text=Online')).toBeVisible();
89
- 37 | await expect(page.locator('text=Working')).toBeVisible();
90
- 38 | await expect(page.locator('text=Total')).toBeVisible();
91
- 39 | });
92
- 40 |
93
- 41 | test('sidebar navigation works', async ({ page }) => {
94
- 42 | await page.goto(`${BASE}/login`);
95
- 43 | await page.fill('input[type="text"]', ADMIN_USER);
96
- 44 | await page.fill('input[type="password"]', ADMIN_PASS);
97
- 45 | await page.click('button:has-text("Sign in")');
98
- 46 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
99
- 47 |
100
- 48 | // Navigate to Tasks
101
- 49 | await page.click('a:has-text("Tasks")');
102
- 50 | await page.waitForURL(`${BASE}/tasks`);
103
- 51 | await expect(page.locator('h1:has-text("Tasks")')).toBeVisible();
104
- 52 |
105
- 53 | // Navigate to Nodes
106
- 54 | await page.click('a:has-text("Nodes")');
107
- 55 | await page.waitForURL(`${BASE}/nodes`);
108
- 56 | await expect(page.locator('h1:has-text("Nodes")')).toBeVisible();
109
- 57 |
110
- 58 | // Navigate to Messages
111
- 59 | await page.click('a:has-text("Messages")');
112
- 60 | await page.waitForURL(`${BASE}/messages`);
113
- 61 | await expect(page.locator('h1:has-text("Messages")')).toBeVisible();
114
- 62 |
115
- 63 | // Navigate to Settings
116
- 64 | await page.click('a:has-text("Settings")');
117
- 65 | await page.waitForURL(`${BASE}/settings`);
118
- 66 | await expect(page.locator('h1:has-text("Settings")')).toBeVisible();
119
- 67 | });
120
- 68 |
121
- 69 | test('nodes page shows demo nodes', async ({ page }) => {
122
- 70 | await page.goto(`${BASE}/login`);
123
- 71 | await page.fill('input[type="text"]', ADMIN_USER);
124
- 72 | await page.fill('input[type="password"]', ADMIN_PASS);
125
- 73 | await page.click('button:has-text("Sign in")');
126
- > 74 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
127
- | ^ TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
128
- 75 |
129
- 76 | await page.goto(`${BASE}/nodes`);
130
- 77 | await page.waitForTimeout(3000);
131
- 78 | // Should see demo nodes
132
- 79 | const content = await page.textContent('body');
133
- 80 | expect(content).toContain('online');
134
- 81 | });
135
- 82 |
136
- 83 | test('settings page shows license + config', async ({ page }) => {
137
- 84 | await page.goto(`${BASE}/login`);
138
- 85 | await page.fill('input[type="text"]', ADMIN_USER);
139
- 86 | await page.fill('input[type="password"]', ADMIN_PASS);
140
- 87 | await page.click('button:has-text("Sign in")');
141
- 88 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
142
- 89 |
143
- 90 | await page.goto(`${BASE}/settings`);
144
- 91 | await expect(page.locator('text=CommHub Connection')).toBeVisible();
145
- 92 | await expect(page.locator('text=License')).toBeVisible();
146
- 93 | });
147
- 94 | });
148
- 95 |
149
- ```
@@ -1,149 +0,0 @@
1
- # Instructions
2
-
3
- - Following Playwright test failed.
4
- - Explain why, be concise, respect Playwright best practices.
5
- - Provide a snippet of code with the fix, if possible.
6
-
7
- # Test info
8
-
9
- - Name: e2e.spec.ts >> Dashboard E2E Tests >> overview page shows stats
10
- - Location: tests/e2e.spec.ts:27:7
11
-
12
- # Error details
13
-
14
- ```
15
- TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
16
- =========================== logs ===========================
17
- waiting for navigation to "http://localhost:3000/" until "load"
18
- ============================================================
19
- ```
20
-
21
- # Page snapshot
22
-
23
- ```yaml
24
- - generic [ref=e1]:
25
- - main [ref=e2]:
26
- - generic [ref=e3]:
27
- - generic [ref=e4]:
28
- - img [ref=e6]
29
- - heading "Agent Network" [level=1] [ref=e8]
30
- - paragraph [ref=e9]: Dashboard
31
- - generic [ref=e10]:
32
- - button "Sign in" [active] [ref=e11]
33
- - button "Register" [ref=e12]
34
- - generic [ref=e13]:
35
- - generic [ref=e14]: Username
36
- - textbox "Username" [ref=e15]:
37
- - /placeholder: Enter username
38
- - text: admin
39
- - generic [ref=e16]: Password
40
- - textbox "Password" [ref=e17]:
41
- - /placeholder: Enter password
42
- - text: admin123
43
- - button "Sign in" [ref=e18]
44
- - paragraph [ref=e19]: Powered by CommHub V3
45
- - button "Open Next.js Dev Tools" [ref=e25] [cursor=pointer]:
46
- - img [ref=e26]
47
- - alert [ref=e29]
48
- ```
49
-
50
- # Test source
51
-
52
- ```ts
53
- 1 | import { test, expect } from '@playwright/test';
54
- 2 |
55
- 3 | const BASE = process.env.TEST_URL || 'http://localhost:3000';
56
- 4 | const ADMIN_USER = 'admin';
57
- 5 | const ADMIN_PASS = 'admin123';
58
- 6 |
59
- 7 | test.describe('Dashboard E2E Tests', () => {
60
- 8 | test('login page loads', async ({ page }) => {
61
- 9 | await page.goto(`${BASE}/login`);
62
- 10 | await expect(page.locator('text=Agent Network')).toBeVisible();
63
- 11 | await expect(page.locator('input[type="text"]')).toBeVisible();
64
- 12 | await expect(page.locator('input[type="password"]')).toBeVisible();
65
- 13 | });
66
- 14 |
67
- 15 | test('V3 register + login flow', async ({ page }) => {
68
- 16 | await page.goto(`${BASE}/login`);
69
- 17 | // Switch to register
70
- 18 | await page.click('text=Register');
71
- 19 | await page.fill('input[type="text"]', `test_${Date.now()}`);
72
- 20 | await page.fill('input[type="password"]', 'test123456');
73
- 21 | await page.click('button:has-text("Create account")');
74
- 22 | // Should redirect to dashboard
75
- 23 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
76
- 24 | await expect(page.locator('text=Agent Network')).toBeVisible();
77
- 25 | });
78
- 26 |
79
- 27 | test('overview page shows stats', async ({ page }) => {
80
- 28 | // Login first
81
- 29 | await page.goto(`${BASE}/login`);
82
- 30 | await page.fill('input[type="text"]', ADMIN_USER);
83
- 31 | await page.fill('input[type="password"]', ADMIN_PASS);
84
- 32 | await page.click('button:has-text("Sign in")');
85
- > 33 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
86
- | ^ TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
87
- 34 |
88
- 35 | // Check stats bar
89
- 36 | await expect(page.locator('text=Online')).toBeVisible();
90
- 37 | await expect(page.locator('text=Working')).toBeVisible();
91
- 38 | await expect(page.locator('text=Total')).toBeVisible();
92
- 39 | });
93
- 40 |
94
- 41 | test('sidebar navigation works', async ({ page }) => {
95
- 42 | await page.goto(`${BASE}/login`);
96
- 43 | await page.fill('input[type="text"]', ADMIN_USER);
97
- 44 | await page.fill('input[type="password"]', ADMIN_PASS);
98
- 45 | await page.click('button:has-text("Sign in")');
99
- 46 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
100
- 47 |
101
- 48 | // Navigate to Tasks
102
- 49 | await page.click('a:has-text("Tasks")');
103
- 50 | await page.waitForURL(`${BASE}/tasks`);
104
- 51 | await expect(page.locator('h1:has-text("Tasks")')).toBeVisible();
105
- 52 |
106
- 53 | // Navigate to Nodes
107
- 54 | await page.click('a:has-text("Nodes")');
108
- 55 | await page.waitForURL(`${BASE}/nodes`);
109
- 56 | await expect(page.locator('h1:has-text("Nodes")')).toBeVisible();
110
- 57 |
111
- 58 | // Navigate to Messages
112
- 59 | await page.click('a:has-text("Messages")');
113
- 60 | await page.waitForURL(`${BASE}/messages`);
114
- 61 | await expect(page.locator('h1:has-text("Messages")')).toBeVisible();
115
- 62 |
116
- 63 | // Navigate to Settings
117
- 64 | await page.click('a:has-text("Settings")');
118
- 65 | await page.waitForURL(`${BASE}/settings`);
119
- 66 | await expect(page.locator('h1:has-text("Settings")')).toBeVisible();
120
- 67 | });
121
- 68 |
122
- 69 | test('nodes page shows demo nodes', async ({ page }) => {
123
- 70 | await page.goto(`${BASE}/login`);
124
- 71 | await page.fill('input[type="text"]', ADMIN_USER);
125
- 72 | await page.fill('input[type="password"]', ADMIN_PASS);
126
- 73 | await page.click('button:has-text("Sign in")');
127
- 74 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
128
- 75 |
129
- 76 | await page.goto(`${BASE}/nodes`);
130
- 77 | await page.waitForTimeout(3000);
131
- 78 | // Should see demo nodes
132
- 79 | const content = await page.textContent('body');
133
- 80 | expect(content).toContain('online');
134
- 81 | });
135
- 82 |
136
- 83 | test('settings page shows license + config', async ({ page }) => {
137
- 84 | await page.goto(`${BASE}/login`);
138
- 85 | await page.fill('input[type="text"]', ADMIN_USER);
139
- 86 | await page.fill('input[type="password"]', ADMIN_PASS);
140
- 87 | await page.click('button:has-text("Sign in")');
141
- 88 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
142
- 89 |
143
- 90 | await page.goto(`${BASE}/settings`);
144
- 91 | await expect(page.locator('text=CommHub Connection')).toBeVisible();
145
- 92 | await expect(page.locator('text=License')).toBeVisible();
146
- 93 | });
147
- 94 | });
148
- 95 |
149
- ```
@@ -1,149 +0,0 @@
1
- # Instructions
2
-
3
- - Following Playwright test failed.
4
- - Explain why, be concise, respect Playwright best practices.
5
- - Provide a snippet of code with the fix, if possible.
6
-
7
- # Test info
8
-
9
- - Name: e2e.spec.ts >> Dashboard E2E Tests >> settings page shows license + config
10
- - Location: tests/e2e.spec.ts:83:7
11
-
12
- # Error details
13
-
14
- ```
15
- TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
16
- =========================== logs ===========================
17
- waiting for navigation to "http://localhost:3000/" until "load"
18
- ============================================================
19
- ```
20
-
21
- # Page snapshot
22
-
23
- ```yaml
24
- - generic [ref=e1]:
25
- - main [ref=e2]:
26
- - generic [ref=e3]:
27
- - generic [ref=e4]:
28
- - img [ref=e6]
29
- - heading "Agent Network" [level=1] [ref=e8]
30
- - paragraph [ref=e9]: Dashboard
31
- - generic [ref=e10]:
32
- - button "Sign in" [active] [ref=e11]
33
- - button "Register" [ref=e12]
34
- - generic [ref=e13]:
35
- - generic [ref=e14]: Username
36
- - textbox "Username" [ref=e15]:
37
- - /placeholder: Enter username
38
- - text: admin
39
- - generic [ref=e16]: Password
40
- - textbox "Password" [ref=e17]:
41
- - /placeholder: Enter password
42
- - text: admin123
43
- - button "Sign in" [ref=e18]
44
- - paragraph [ref=e19]: Powered by CommHub V3
45
- - button "Open Next.js Dev Tools" [ref=e25] [cursor=pointer]:
46
- - img [ref=e26]
47
- - alert [ref=e29]
48
- ```
49
-
50
- # Test source
51
-
52
- ```ts
53
- 1 | import { test, expect } from '@playwright/test';
54
- 2 |
55
- 3 | const BASE = process.env.TEST_URL || 'http://localhost:3000';
56
- 4 | const ADMIN_USER = 'admin';
57
- 5 | const ADMIN_PASS = 'admin123';
58
- 6 |
59
- 7 | test.describe('Dashboard E2E Tests', () => {
60
- 8 | test('login page loads', async ({ page }) => {
61
- 9 | await page.goto(`${BASE}/login`);
62
- 10 | await expect(page.locator('text=Agent Network')).toBeVisible();
63
- 11 | await expect(page.locator('input[type="text"]')).toBeVisible();
64
- 12 | await expect(page.locator('input[type="password"]')).toBeVisible();
65
- 13 | });
66
- 14 |
67
- 15 | test('V3 register + login flow', async ({ page }) => {
68
- 16 | await page.goto(`${BASE}/login`);
69
- 17 | // Switch to register
70
- 18 | await page.click('text=Register');
71
- 19 | await page.fill('input[type="text"]', `test_${Date.now()}`);
72
- 20 | await page.fill('input[type="password"]', 'test123456');
73
- 21 | await page.click('button:has-text("Create account")');
74
- 22 | // Should redirect to dashboard
75
- 23 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
76
- 24 | await expect(page.locator('text=Agent Network')).toBeVisible();
77
- 25 | });
78
- 26 |
79
- 27 | test('overview page shows stats', async ({ page }) => {
80
- 28 | // Login first
81
- 29 | await page.goto(`${BASE}/login`);
82
- 30 | await page.fill('input[type="text"]', ADMIN_USER);
83
- 31 | await page.fill('input[type="password"]', ADMIN_PASS);
84
- 32 | await page.click('button:has-text("Sign in")');
85
- 33 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
86
- 34 |
87
- 35 | // Check stats bar
88
- 36 | await expect(page.locator('text=Online')).toBeVisible();
89
- 37 | await expect(page.locator('text=Working')).toBeVisible();
90
- 38 | await expect(page.locator('text=Total')).toBeVisible();
91
- 39 | });
92
- 40 |
93
- 41 | test('sidebar navigation works', async ({ page }) => {
94
- 42 | await page.goto(`${BASE}/login`);
95
- 43 | await page.fill('input[type="text"]', ADMIN_USER);
96
- 44 | await page.fill('input[type="password"]', ADMIN_PASS);
97
- 45 | await page.click('button:has-text("Sign in")');
98
- 46 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
99
- 47 |
100
- 48 | // Navigate to Tasks
101
- 49 | await page.click('a:has-text("Tasks")');
102
- 50 | await page.waitForURL(`${BASE}/tasks`);
103
- 51 | await expect(page.locator('h1:has-text("Tasks")')).toBeVisible();
104
- 52 |
105
- 53 | // Navigate to Nodes
106
- 54 | await page.click('a:has-text("Nodes")');
107
- 55 | await page.waitForURL(`${BASE}/nodes`);
108
- 56 | await expect(page.locator('h1:has-text("Nodes")')).toBeVisible();
109
- 57 |
110
- 58 | // Navigate to Messages
111
- 59 | await page.click('a:has-text("Messages")');
112
- 60 | await page.waitForURL(`${BASE}/messages`);
113
- 61 | await expect(page.locator('h1:has-text("Messages")')).toBeVisible();
114
- 62 |
115
- 63 | // Navigate to Settings
116
- 64 | await page.click('a:has-text("Settings")');
117
- 65 | await page.waitForURL(`${BASE}/settings`);
118
- 66 | await expect(page.locator('h1:has-text("Settings")')).toBeVisible();
119
- 67 | });
120
- 68 |
121
- 69 | test('nodes page shows demo nodes', async ({ page }) => {
122
- 70 | await page.goto(`${BASE}/login`);
123
- 71 | await page.fill('input[type="text"]', ADMIN_USER);
124
- 72 | await page.fill('input[type="password"]', ADMIN_PASS);
125
- 73 | await page.click('button:has-text("Sign in")');
126
- 74 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
127
- 75 |
128
- 76 | await page.goto(`${BASE}/nodes`);
129
- 77 | await page.waitForTimeout(3000);
130
- 78 | // Should see demo nodes
131
- 79 | const content = await page.textContent('body');
132
- 80 | expect(content).toContain('online');
133
- 81 | });
134
- 82 |
135
- 83 | test('settings page shows license + config', async ({ page }) => {
136
- 84 | await page.goto(`${BASE}/login`);
137
- 85 | await page.fill('input[type="text"]', ADMIN_USER);
138
- 86 | await page.fill('input[type="password"]', ADMIN_PASS);
139
- 87 | await page.click('button:has-text("Sign in")');
140
- > 88 | await page.waitForURL(`${BASE}/`, { timeout: 10000 });
141
- | ^ TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
142
- 89 |
143
- 90 | await page.goto(`${BASE}/settings`);
144
- 91 | await expect(page.locator('text=CommHub Connection')).toBeVisible();
145
- 92 | await expect(page.locator('text=License')).toBeVisible();
146
- 93 | });
147
- 94 | });
148
- 95 |
149
- ```