@sleep2agi/agent-network-dashboard 0.3.0 → 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 (211) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +19 -0
  4. package/.next/BUILD_ID +1 -1
  5. package/.next/build-manifest.json +3 -3
  6. package/.next/cache/.previewinfo +1 -1
  7. package/.next/cache/.rscinfo +1 -1
  8. package/.next/cache/.tsbuildinfo +1 -1
  9. package/.next/diagnostics/route-bundle-stats.json +4 -4
  10. package/.next/fallback-build-manifest.json +3 -3
  11. package/.next/prerender-manifest.json +3 -3
  12. package/.next/server/app/_global-error.html +1 -1
  13. package/.next/server/app/_global-error.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +2 -2
  21. package/.next/server/app/_not-found.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/admin.html +2 -2
  30. package/.next/server/app/admin.rsc +2 -2
  31. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  34. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  35. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  36. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  37. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/docs.html +2 -2
  39. package/.next/server/app/docs.rsc +3 -3
  40. package/.next/server/app/docs.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  46. package/.next/server/app/index.html +2 -2
  47. package/.next/server/app/index.rsc +2 -2
  48. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  49. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/login.html +2 -2
  55. package/.next/server/app/login.rsc +3 -3
  56. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  57. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  59. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  60. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  61. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  62. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/logs.html +2 -2
  64. package/.next/server/app/logs.rsc +2 -2
  65. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  66. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  67. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  68. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  69. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  70. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  71. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/messages.html +2 -2
  73. package/.next/server/app/messages.rsc +2 -2
  74. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  75. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  76. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  77. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  78. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  79. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  80. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/node.html +2 -2
  82. package/.next/server/app/node.rsc +2 -2
  83. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  84. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  85. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  86. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  87. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  88. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  89. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/nodes.html +2 -2
  91. package/.next/server/app/nodes.rsc +2 -2
  92. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  93. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  94. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  95. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  96. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  97. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  98. package/.next/server/app/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  100. package/.next/server/app/server-logs.html +2 -2
  101. package/.next/server/app/server-logs.rsc +2 -2
  102. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  103. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  104. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  105. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  106. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  107. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  108. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/settings/networks.html +2 -2
  110. package/.next/server/app/settings/networks.rsc +2 -2
  111. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  112. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  113. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  114. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  115. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  116. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  117. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  118. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  119. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  120. package/.next/server/app/settings/tokens.html +2 -2
  121. package/.next/server/app/settings/tokens.rsc +2 -2
  122. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  123. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  124. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  125. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  126. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  127. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  128. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  129. package/.next/server/app/settings.html +2 -2
  130. package/.next/server/app/settings.rsc +2 -2
  131. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  132. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  133. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  134. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  135. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  136. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  137. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  138. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app/tasks.html +2 -2
  140. package/.next/server/app/tasks.rsc +2 -2
  141. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  142. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  143. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  144. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  145. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  146. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  147. package/.next/server/chunks/[root-of-the-server]__0.r9hpx._.js.map +1 -1
  148. package/.next/server/chunks/[root-of-the-server]__0.~awwb._.js.map +1 -1
  149. package/.next/server/chunks/[root-of-the-server]__011ghni._.js.map +1 -1
  150. package/.next/server/chunks/[root-of-the-server]__0_roltz._.js.map +1 -1
  151. package/.next/server/chunks/[root-of-the-server]__0ak3zmb._.js.map +1 -1
  152. package/.next/server/chunks/[root-of-the-server]__0c0_p0v._.js.map +1 -1
  153. package/.next/server/chunks/[root-of-the-server]__0c5h0a~._.js.map +1 -1
  154. package/.next/server/chunks/[root-of-the-server]__0cfodg2._.js.map +1 -1
  155. package/.next/server/chunks/[root-of-the-server]__0fo7jlh._.js.map +1 -1
  156. package/.next/server/chunks/[root-of-the-server]__0h-9kwu._.js +1 -1
  157. package/.next/server/chunks/[root-of-the-server]__0h-9kwu._.js.map +1 -1
  158. package/.next/server/chunks/[root-of-the-server]__0hj~i84._.js +1 -1
  159. package/.next/server/chunks/[root-of-the-server]__0hj~i84._.js.map +1 -1
  160. package/.next/server/chunks/[root-of-the-server]__0hxwf9u._.js.map +1 -1
  161. package/.next/server/chunks/[root-of-the-server]__0k3eytp._.js.map +1 -1
  162. package/.next/server/chunks/[root-of-the-server]__0khwewd._.js.map +1 -1
  163. package/.next/server/chunks/[root-of-the-server]__0ku8l.~._.js +1 -1
  164. package/.next/server/chunks/[root-of-the-server]__0ku8l.~._.js.map +1 -1
  165. package/.next/server/chunks/[root-of-the-server]__0lu__6g._.js.map +1 -1
  166. package/.next/server/chunks/[root-of-the-server]__0nsfjkb._.js +1 -1
  167. package/.next/server/chunks/[root-of-the-server]__0nsfjkb._.js.map +1 -1
  168. package/.next/server/chunks/[root-of-the-server]__0wpe~w2._.js.map +1 -1
  169. package/.next/server/chunks/[root-of-the-server]__10ducxb._.js.map +1 -1
  170. package/.next/server/chunks/[root-of-the-server]__114809t._.js +1 -1
  171. package/.next/server/chunks/[root-of-the-server]__114809t._.js.map +1 -1
  172. package/.next/server/chunks/[root-of-the-server]__11yl3c.._.js.map +1 -1
  173. package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js +1 -1
  174. package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js.map +1 -1
  175. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
  176. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +1 -1
  177. package/.next/server/middleware-build-manifest.js +3 -3
  178. package/.next/server/pages/404.html +2 -2
  179. package/.next/server/pages/500.html +1 -1
  180. package/.next/server/server-reference-manifest.js +1 -1
  181. package/.next/server/server-reference-manifest.json +1 -1
  182. package/.next/static/chunks/{063eleenll4ri.js → 06.gd_vlnz5n0.js} +6 -6
  183. package/.next/static/chunks/0mz9c6--6di2j.css +2 -0
  184. package/.next/static/chunks/{0afxijuigt-49.js → 0o5zj~5vjeks3.js} +1 -1
  185. package/.next/trace +2 -2
  186. package/.next/trace-build +1 -1
  187. package/CODE_OF_CONDUCT.md +43 -0
  188. package/CONTRIBUTING.md +67 -0
  189. package/LICENSE +202 -0
  190. package/NOTICE +17 -0
  191. package/SECURITY.md +41 -0
  192. package/app/api/hub/events/route.ts +1 -1
  193. package/app/api/hub/nodes/route.ts +1 -1
  194. package/app/api/hub/send/route.ts +1 -1
  195. package/app/api/hub/server-logs/route.ts +1 -1
  196. package/app/api/hub/tasks/route.ts +1 -1
  197. package/app/docs/page.tsx +1 -1
  198. package/app/globals.css +158 -12
  199. package/app/lib/hub.ts +0 -3
  200. package/app/login/page.tsx +1 -1
  201. package/package.json +9 -3
  202. package/test-results/.last-run.json +2 -7
  203. package/.next/static/chunks/0f7op3pijuqfp.css +0 -2
  204. package/test-results/e2e-Dashboard-E2E-Tests-nodes-page-shows-demo-nodes/error-context.md +0 -149
  205. package/test-results/e2e-Dashboard-E2E-Tests-overview-page-shows-stats/error-context.md +0 -149
  206. package/test-results/e2e-Dashboard-E2E-Tests-settings-page-shows-license-config/error-context.md +0 -149
  207. package/test-results/e2e-Dashboard-E2E-Tests-sidebar-navigation-works/error-context.md +0 -149
  208. package/tsconfig.tsbuildinfo +0 -1
  209. /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_buildManifest.js +0 -0
  210. /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_clientMiddlewareManifest.js +0 -0
  211. /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_ssgManifest.js +0 -0
@@ -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
- ```
@@ -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 >> sidebar navigation works
10
- - Location: tests/e2e.spec.ts:41: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
- | ^ TimeoutError: page.waitForURL: Timeout 10000ms exceeded.
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
- ```