@profoundlogic/coderflow-server 0.7.7 → 0.7.9

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 (187) hide show
  1. package/dist/coder-server.js +1 -1
  2. package/dist/config.js +1 -1
  3. package/dist/lib/agent-keepalive.js +1 -1
  4. package/dist/lib/agent-models.js +1 -1
  5. package/dist/lib/api-keys.js +1 -1
  6. package/dist/lib/apiKeys.js +1 -1
  7. package/dist/lib/app-server-ports.js +1 -1
  8. package/dist/lib/auto-judge.js +1 -1
  9. package/dist/lib/automation-service.js +1 -1
  10. package/dist/lib/basic-auth.js +1 -1
  11. package/dist/lib/bindings.js +1 -1
  12. package/dist/lib/build-history.js +1 -1
  13. package/dist/lib/build-output-service.js +1 -1
  14. package/dist/lib/build-scheduler.js +1 -1
  15. package/dist/lib/build-service.js +1 -1
  16. package/dist/lib/ca-certificates.js +1 -1
  17. package/dist/lib/claude-oauth-refresh.js +1 -1
  18. package/dist/lib/cli/build.js +1 -1
  19. package/dist/lib/cli/cleanup-users.js +1 -1
  20. package/dist/lib/cli/config-command.js +1 -1
  21. package/dist/lib/cli/config.js +1 -1
  22. package/dist/lib/cli/create-user.js +1 -1
  23. package/dist/lib/cli/grant-admin.js +1 -1
  24. package/dist/lib/cli/init.js +1 -1
  25. package/dist/lib/cli/jira.js +1 -1
  26. package/dist/lib/cli/license.js +1 -1
  27. package/dist/lib/cli/list-roles.js +1 -1
  28. package/dist/lib/cli/list-users.js +1 -1
  29. package/dist/lib/cli/server-manager.js +1 -1
  30. package/dist/lib/cli/set-password.js +1 -1
  31. package/dist/lib/compression-filter.js +1 -0
  32. package/dist/lib/config-migration.js +1 -1
  33. package/dist/lib/container-credential-sync.js +1 -1
  34. package/dist/lib/container-tokens.js +1 -1
  35. package/dist/lib/data-dir.js +1 -1
  36. package/dist/lib/deployment-history.js +1 -1
  37. package/dist/lib/deployment-service.js +1 -1
  38. package/dist/lib/docker-utils.js +1 -1
  39. package/dist/lib/email.js +1 -1
  40. package/dist/lib/emailTemplates.js +1 -1
  41. package/dist/lib/entitlement.js +1 -1
  42. package/dist/lib/external-connections.js +1 -1
  43. package/dist/lib/fetch-utils.js +1 -1
  44. package/dist/lib/git-commit-details-route.js +1 -1
  45. package/dist/lib/git-history-diff-guardrails.js +1 -1
  46. package/dist/lib/git-provider-service.js +1 -1
  47. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  48. package/dist/lib/git-provider-setup/index.js +1 -1
  49. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  50. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  51. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  52. package/dist/lib/git-providers/github-app-provider.js +1 -1
  53. package/dist/lib/git-providers/index.js +1 -1
  54. package/dist/lib/git-providers/provider-factory.js +1 -1
  55. package/dist/lib/git-providers/provider-interface.js +1 -1
  56. package/dist/lib/github-urls.js +1 -1
  57. package/dist/lib/group-objective-linking.js +1 -1
  58. package/dist/lib/ibmi-sync.js +1 -1
  59. package/dist/lib/jira-client.js +1 -1
  60. package/dist/lib/judge-blinding.js +1 -1
  61. package/dist/lib/logger.js +1 -1
  62. package/dist/lib/memory-utils.js +1 -1
  63. package/dist/lib/migration-to-scoped-rbac.js +1 -1
  64. package/dist/lib/model-fetcher.js +1 -1
  65. package/dist/lib/notifications.js +1 -1
  66. package/dist/lib/objective-context.js +1 -1
  67. package/dist/lib/oidc-auth.js +1 -1
  68. package/dist/lib/oidc-device-flow.js +1 -1
  69. package/dist/lib/passwordTokens.js +1 -1
  70. package/dist/lib/permission-resolver.js +1 -1
  71. package/dist/lib/pin-cascade.js +1 -1
  72. package/dist/lib/provider-accounts.js +1 -1
  73. package/dist/lib/provider-oauth.js +1 -1
  74. package/dist/lib/provider-profile.js +1 -1
  75. package/dist/lib/provider-token-refresh.js +1 -1
  76. package/dist/lib/rbac-user-state.js +1 -1
  77. package/dist/lib/request-url.js +1 -1
  78. package/dist/lib/rewind.js +1 -1
  79. package/dist/lib/role-definitions.js +1 -1
  80. package/dist/lib/roles.js +1 -1
  81. package/dist/lib/secrets.js +1 -1
  82. package/dist/lib/setup-repo-git-auth.js +1 -1
  83. package/dist/lib/state-capture.js +1 -1
  84. package/dist/lib/static-files.js +1 -1
  85. package/dist/lib/task-aliases.js +1 -1
  86. package/dist/lib/task-name-format.js +1 -1
  87. package/dist/lib/task-name-generator.js +1 -1
  88. package/dist/lib/task-source-metadata.js +1 -1
  89. package/dist/lib/teams.js +1 -1
  90. package/dist/lib/user-git-oauth.js +1 -1
  91. package/dist/lib/user-git-tokens.js +1 -1
  92. package/dist/lib/users.js +1 -1
  93. package/dist/middleware/requireAuth.js +1 -1
  94. package/dist/middleware/requireInit.js +1 -1
  95. package/dist/middleware/requirePermission.js +1 -1
  96. package/dist/package.json +1 -1
  97. package/dist/playwright.config.js +1 -1
  98. package/dist/playwright.task-terminal.config.js +1 -1
  99. package/dist/routes/apiKeys.js +1 -1
  100. package/dist/routes/auth-oidc.js +1 -1
  101. package/dist/routes/auth.js +1 -1
  102. package/dist/routes/automations.js +1 -1
  103. package/dist/routes/bindings.js +1 -1
  104. package/dist/routes/build.js +1 -1
  105. package/dist/routes/containers.js +1 -1
  106. package/dist/routes/deploy-task.js +1 -1
  107. package/dist/routes/environment-management.js +1 -1
  108. package/dist/routes/environments.js +1 -1
  109. package/dist/routes/external-skills.js +1 -1
  110. package/dist/routes/git-credentials.js +1 -1
  111. package/dist/routes/git-oauth.js +1 -1
  112. package/dist/routes/git-provider-setup.js +1 -1
  113. package/dist/routes/health.js +1 -1
  114. package/dist/routes/jira.js +1 -1
  115. package/dist/routes/logs.js +1 -0
  116. package/dist/routes/objective-management.js +1 -1
  117. package/dist/routes/password.js +1 -1
  118. package/dist/routes/prompt.js +1 -1
  119. package/dist/routes/provider-auth.js +1 -1
  120. package/dist/routes/qa.js +1 -1
  121. package/dist/routes/roles.js +1 -1
  122. package/dist/routes/settings.js +1 -1
  123. package/dist/routes/skill-management.js +1 -1
  124. package/dist/routes/skills.js +1 -1
  125. package/dist/routes/stats.js +1 -0
  126. package/dist/routes/tasks.js +1 -1
  127. package/dist/routes/teams.js +1 -1
  128. package/dist/routes/templates.js +1 -1
  129. package/dist/routes/test-task.js +1 -1
  130. package/dist/routes/test.js +1 -1
  131. package/dist/routes/users.js +1 -1
  132. package/dist/routes/visualizations.js +1 -1
  133. package/dist/scripts/create-user.js +1 -1
  134. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  135. package/dist/start.js +1 -1
  136. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  137. package/dist/web-ui/public/activity-feed.js +1 -1
  138. package/dist/web-ui/public/activity-formatters.js +1 -1
  139. package/dist/web-ui/public/admin.css +682 -0
  140. package/dist/web-ui/public/admin.html +648 -0
  141. package/dist/web-ui/public/admin.js +1 -0
  142. package/dist/web-ui/public/agent-event-parser.js +1 -1
  143. package/dist/web-ui/public/app.js +1 -1
  144. package/dist/web-ui/public/approve-dialog.js +1 -1
  145. package/dist/web-ui/public/automation-links.js +1 -1
  146. package/dist/web-ui/public/automation-schedule.js +1 -1
  147. package/dist/web-ui/public/comments-widget.js +1 -1
  148. package/dist/web-ui/public/diff-utils.js +1 -1
  149. package/dist/web-ui/public/environments.html +3 -3
  150. package/dist/web-ui/public/environments.js +1 -1
  151. package/dist/web-ui/public/feedback-widget.js +1 -1
  152. package/dist/web-ui/public/file-selection-tree.js +1 -1
  153. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  154. package/dist/web-ui/public/git-history.html +2 -2
  155. package/dist/web-ui/public/git-history.js +1 -1
  156. package/dist/web-ui/public/git-status.js +1 -1
  157. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  158. package/dist/web-ui/public/index.html +2 -170
  159. package/dist/web-ui/public/index.js +1 -1
  160. package/dist/web-ui/public/login.js +1 -1
  161. package/dist/web-ui/public/markdown-editor.js +1 -1
  162. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  163. package/dist/web-ui/public/modal-maximize.js +1 -1
  164. package/dist/web-ui/public/notifications.js +1 -1
  165. package/dist/web-ui/public/permissions.js +1 -1
  166. package/dist/web-ui/public/pr-dialog.js +1 -1
  167. package/dist/web-ui/public/roles.html +2 -2
  168. package/dist/web-ui/public/roles.js +1 -1
  169. package/dist/web-ui/public/settings.html +66 -4
  170. package/dist/web-ui/public/settings.js +1 -1
  171. package/dist/web-ui/public/setup-password.js +1 -1
  172. package/dist/web-ui/public/skills.html +2 -2
  173. package/dist/web-ui/public/skills.js +1 -1
  174. package/dist/web-ui/public/sse-client.js +1 -1
  175. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  176. package/dist/web-ui/public/styles.css +10 -2
  177. package/dist/web-ui/public/task-judging-helpers.js +1 -1
  178. package/dist/web-ui/public/task.js +1 -1
  179. package/dist/web-ui/public/teams.html +2 -2
  180. package/dist/web-ui/public/teams.js +1 -1
  181. package/dist/web-ui/public/terminal.js +1 -1
  182. package/dist/web-ui/public/theme.js +1 -1
  183. package/dist/web-ui/public/users.html +2 -2
  184. package/dist/web-ui/public/users.js +1 -1
  185. package/dist/web-ui/public/variant-grouping.js +1 -1
  186. package/package.json +1 -1
  187. package/dist/web-ui/public/server-health.js +0 -1
@@ -0,0 +1,648 @@
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>Server Administration - CoderFlow</title>
7
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
8
+ <link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
9
+ <link rel="icon" href="/favicon-16.png" type="image/png" sizes="16x16">
10
+ <link rel="icon" href="/favicon.ico">
11
+ <script>
12
+ (() => {
13
+ const key = 'profound-coder-theme';
14
+ try {
15
+ const stored = localStorage.getItem(key);
16
+ const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
17
+ const theme = stored === 'dark' || stored === 'light' ? stored : (prefersDark ? 'dark' : 'light');
18
+ document.documentElement.dataset.theme = theme;
19
+ document.documentElement.style.colorScheme = theme === 'dark' ? 'dark' : 'light';
20
+ } catch (error) {
21
+ document.documentElement.dataset.theme = 'light';
22
+ }
23
+ })();
24
+ </script>
25
+ <link rel="stylesheet" href="styles.css?v=85">
26
+ <link rel="stylesheet" href="settings.css?v=8">
27
+ <link rel="stylesheet" href="admin.css?v=2">
28
+ <script src="permissions.js"></script>
29
+ <script type="module" src="app.js?v=71"></script>
30
+ <script type="module" src="admin.js?v=2"></script>
31
+ </head>
32
+ <body>
33
+ <main class="task-detail">
34
+ <div class="task-hero">
35
+ <div class="hero-top">
36
+ <nav class="breadcrumb" aria-label="Breadcrumb">
37
+ <a class="breadcrumb-link" href="index.html">
38
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
39
+ <path d="M3 11.5L12 4l9 7.5"></path>
40
+ <path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
41
+ </svg>
42
+ <span>Home</span>
43
+ </a>
44
+ <span class="breadcrumb-separator" aria-hidden="true">/</span>
45
+ <span class="breadcrumb-current">Server Administration</span>
46
+ </nav>
47
+ <span class="task-context">Administration</span>
48
+ <div class="admin-menu-container" id="admin-menu-container" hidden>
49
+ <button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
50
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
51
+ <circle cx="12" cy="12" r="3"></circle>
52
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
53
+ </svg>
54
+ </button>
55
+ <div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
56
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='users.html'">
57
+ <svg class="option-icon icon-users" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
58
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
59
+ <circle cx="9" cy="7" r="4"></circle>
60
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
61
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
62
+ </svg>
63
+ <span class="option-text">Users</span>
64
+ </button>
65
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='teams.html'">
66
+ <svg class="option-icon icon-teams" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
67
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
68
+ <circle cx="9" cy="7" r="4"></circle>
69
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
70
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
71
+ </svg>
72
+ <span class="option-text">Teams</span>
73
+ </button>
74
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='environments.html'">
75
+ <svg class="option-icon icon-environments" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
76
+ <circle cx="12" cy="12" r="10"></circle>
77
+ <line x1="2" y1="12" x2="22" y2="12"></line>
78
+ <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
79
+ </svg>
80
+ <span class="option-text">Environments</span>
81
+ </button>
82
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='roles.html'">
83
+ <svg class="option-icon icon-roles" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
84
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
85
+ </svg>
86
+ <span class="option-text">Roles</span>
87
+ </button>
88
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
89
+ <svg class="option-icon icon-skills" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
90
+ <path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
91
+ </svg>
92
+ <span class="option-text">Skills</span>
93
+ </button>
94
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
95
+ <svg class="option-icon icon-server-settings" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
96
+ <line x1="4" y1="21" x2="4" y2="14"></line>
97
+ <line x1="4" y1="10" x2="4" y2="3"></line>
98
+ <line x1="12" y1="21" x2="12" y2="12"></line>
99
+ <line x1="12" y1="8" x2="12" y2="3"></line>
100
+ <line x1="20" y1="21" x2="20" y2="16"></line>
101
+ <line x1="20" y1="12" x2="20" y2="3"></line>
102
+ <line x1="1" y1="14" x2="7" y2="14"></line>
103
+ <line x1="9" y1="8" x2="15" y2="8"></line>
104
+ <line x1="17" y1="16" x2="23" y2="16"></line>
105
+ </svg>
106
+ <span class="option-text">Server Settings</span>
107
+ </button>
108
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='admin.html'">
109
+ <svg class="option-icon icon-health" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
110
+ <path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
111
+ </svg>
112
+ <span class="option-text">Server Administration</span>
113
+ </button>
114
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
115
+ <svg class="option-icon icon-git-history" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
116
+ <circle cx="6" cy="6" r="2"></circle>
117
+ <circle cx="6" cy="18" r="2"></circle>
118
+ <circle cx="18" cy="12" r="2"></circle>
119
+ <path d="M6 8v8"></path>
120
+ <path d="M6 12h10"></path>
121
+ </svg>
122
+ <span class="option-text">Git History</span>
123
+ </button>
124
+ </div>
125
+ </div>
126
+ <div id="theme-toggle-container"></div>
127
+ </div>
128
+ <div class="status-hero">
129
+ <div class="status-copy">
130
+ <h1>Server Administration</h1>
131
+ <p class="task-subtitle">Monitor server health, inspect logs, and review usage trends in one place.</p>
132
+ </div>
133
+ </div>
134
+ </div>
135
+
136
+ <div id="admin-loading" class="loading">
137
+ <svg class="loading-spinner" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
138
+ <path d="M21 12a9 9 0 1 1-6.219-8.56"></path>
139
+ </svg>
140
+ <span>Loading administration tools...</span>
141
+ </div>
142
+
143
+ <div id="admin-error" class="empty-state-card" hidden>
144
+ <div class="empty-state-icon">!</div>
145
+ <h2>Unable to open Server Administration</h2>
146
+ <p id="admin-error-message" class="text-muted"></p>
147
+ <button class="btn-primary" id="retry-admin-btn">Try Again</button>
148
+ </div>
149
+
150
+ <div id="admin-content" class="settings-layout" hidden>
151
+ <aside class="settings-sidebar">
152
+ <nav class="settings-nav" role="tablist" aria-label="Server Administration sections">
153
+ <button class="settings-nav-item active" data-section="health" role="tab" aria-controls="section-health">
154
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
155
+ <path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
156
+ </svg>
157
+ Health
158
+ </button>
159
+ <button class="settings-nav-item" data-section="logs" role="tab" aria-controls="section-logs">
160
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
161
+ <path d="M3 6h18"></path>
162
+ <path d="M3 12h18"></path>
163
+ <path d="M3 18h18"></path>
164
+ </svg>
165
+ Logs
166
+ </button>
167
+ <button class="settings-nav-item" data-section="usage" role="tab" aria-controls="section-usage">
168
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
169
+ <line x1="12" y1="20" x2="12" y2="10"></line>
170
+ <line x1="18" y1="20" x2="18" y2="4"></line>
171
+ <line x1="6" y1="20" x2="6" y2="16"></line>
172
+ </svg>
173
+ Usage
174
+ </button>
175
+ </nav>
176
+ </aside>
177
+
178
+ <section class="settings-panels">
179
+ <div id="section-health" class="settings-panel active" role="tabpanel">
180
+ <div class="content-card">
181
+ <div class="card-header admin-panel-header">
182
+ <div>
183
+ <h3>Server Health</h3>
184
+ <p class="admin-panel-subtitle">Infrastructure metrics, Docker cleanup actions, and version checks.</p>
185
+ </div>
186
+ <div class="admin-panel-actions">
187
+ <label class="admin-toggle-row" for="health-auto-refresh">
188
+ <input type="checkbox" id="health-auto-refresh" checked>
189
+ <span>Auto-refresh every 30 seconds</span>
190
+ </label>
191
+ <button type="button" class="btn-secondary btn-small" id="health-refresh-btn">Refresh</button>
192
+ </div>
193
+ </div>
194
+ <div class="card-body">
195
+ <div id="health-inline-message" class="inline-message" hidden></div>
196
+ <div id="health-loading" class="loading">Loading server metrics...</div>
197
+ <div id="health-error" class="empty-state-card" hidden>
198
+ <div class="empty-state-icon">!</div>
199
+ <h2>Unable to load server health</h2>
200
+ <p id="health-error-message" class="text-muted"></p>
201
+ <button class="btn-primary" id="retry-health-btn">Try Again</button>
202
+ </div>
203
+ <div id="health-content" hidden>
204
+ <div class="admin-version-card">
205
+ <div>
206
+ <div class="metric-label">Server Version</div>
207
+ <div class="admin-version-values">
208
+ <span id="health-version-current">-</span>
209
+ <span class="admin-version-arrow" aria-hidden="true">→</span>
210
+ <span id="health-version-latest">Not checked</span>
211
+ </div>
212
+ <div class="metric-sub" id="health-version-status">Update status has not been checked yet.</div>
213
+ </div>
214
+ <div class="admin-version-actions">
215
+ <button type="button" class="btn-secondary btn-small" id="health-check-updates-btn">Check for Updates</button>
216
+ <button type="button" class="btn-ghost btn-small" id="health-copy-install-btn" hidden>Copy Install Command</button>
217
+ <button type="button" class="btn-primary btn-small" id="health-update-btn" hidden>Update Server</button>
218
+ <button type="button" class="btn-secondary btn-small" id="health-restart-btn" hidden>Restart Server</button>
219
+ </div>
220
+ </div>
221
+ <div id="health-install-command-wrap" class="admin-install-command" hidden>
222
+ <code id="health-install-command"></code>
223
+ </div>
224
+ <div id="health-update-output-wrap" class="admin-update-output" hidden>
225
+ <div class="admin-update-output-header">
226
+ <span class="admin-update-output-label">Update Output</span>
227
+ <span id="health-update-status" class="admin-update-status"></span>
228
+ </div>
229
+ <pre id="health-update-output" class="admin-update-output-pre"></pre>
230
+ </div>
231
+
232
+ <div class="health-metrics">
233
+ <div class="metric-card">
234
+ <div class="metric-icon">💻</div>
235
+ <div class="metric-details">
236
+ <div class="metric-label">CPU Usage</div>
237
+ <div class="metric-value" id="cpu-usage">-</div>
238
+ <div class="metric-progress" role="progressbar" aria-label="CPU usage" aria-valuemin="0" aria-valuemax="100">
239
+ <div class="metric-progress-fill" id="cpu-progress"></div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+ <div class="metric-card">
244
+ <div class="metric-icon">🧠</div>
245
+ <div class="metric-details">
246
+ <div class="metric-label">Memory Usage</div>
247
+ <div class="metric-value" id="memory-usage">-</div>
248
+ <div class="metric-progress" role="progressbar" aria-label="Memory usage" aria-valuemin="0" aria-valuemax="100">
249
+ <div class="metric-progress-fill" id="memory-progress"></div>
250
+ </div>
251
+ </div>
252
+ </div>
253
+ <div class="metric-card">
254
+ <div class="metric-icon">💾</div>
255
+ <div class="metric-details">
256
+ <div class="metric-label">Disk Usage</div>
257
+ <div class="metric-value" id="disk-usage">-</div>
258
+ <div class="metric-progress" role="progressbar" aria-label="Disk usage" aria-valuemin="0" aria-valuemax="100">
259
+ <div class="metric-progress-fill" id="disk-progress"></div>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ <div class="metric-card">
264
+ <div class="metric-icon">🐳</div>
265
+ <div class="metric-details">
266
+ <div class="metric-label">Docker Containers</div>
267
+ <div class="metric-value" id="docker-containers">-</div>
268
+ <div class="metric-progress" role="progressbar" aria-label="Running containers ratio" aria-valuemin="0" aria-valuemax="100">
269
+ <div class="metric-progress-fill" id="docker-progress"></div>
270
+ </div>
271
+ </div>
272
+ </div>
273
+ <div class="metric-card metric-card-wide" id="docker-storage-card">
274
+ <div class="metric-icon">📦</div>
275
+ <div class="metric-details">
276
+ <div class="metric-label">Docker Storage</div>
277
+ <div class="metric-value" id="docker-storage-total">-</div>
278
+ <div class="metric-progress" role="progressbar" aria-label="Docker storage usage" aria-valuemin="0" aria-valuemax="100">
279
+ <div class="metric-progress-fill" id="docker-storage-progress"></div>
280
+ </div>
281
+ <div class="metric-sub" id="docker-storage-available"></div>
282
+ <div class="metric-sub" id="docker-storage-reclaimable"></div>
283
+ <div class="docker-storage-breakdown">
284
+ <div class="storage-item">
285
+ <span class="storage-label">Images</span>
286
+ <span class="storage-value" id="docker-storage-images">-</span>
287
+ </div>
288
+ <div class="storage-item">
289
+ <span class="storage-label">Containers</span>
290
+ <span class="storage-value" id="docker-storage-containers">-</span>
291
+ </div>
292
+ <div class="storage-item">
293
+ <span class="storage-label">Volumes</span>
294
+ <span class="storage-value" id="docker-storage-volumes">-</span>
295
+ </div>
296
+ <div class="storage-item">
297
+ <span class="storage-label">Build Cache</span>
298
+ <span class="storage-value" id="docker-storage-buildcache">-</span>
299
+ </div>
300
+ </div>
301
+ </div>
302
+ </div>
303
+ <div class="metric-card">
304
+ <div class="metric-icon">⏱️</div>
305
+ <div class="metric-details">
306
+ <div class="metric-label">Server Uptime</div>
307
+ <div class="metric-value" id="server-uptime">-</div>
308
+ </div>
309
+ </div>
310
+ <div class="metric-card">
311
+ <div class="metric-icon">📡</div>
312
+ <div class="metric-details">
313
+ <div class="metric-label">Active Sessions</div>
314
+ <div class="metric-value" id="active-sessions">-</div>
315
+ </div>
316
+ </div>
317
+ </div>
318
+
319
+ <div class="health-actions collapsible-section" id="cleanup-section">
320
+ <button type="button" class="health-actions-header collapsible-toggle" id="cleanup-toggle" aria-expanded="false" aria-controls="cleanup-content">
321
+ <div class="health-actions-title">
322
+ <svg class="collapse-chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
323
+ <polyline points="9 18 15 12 9 6"></polyline>
324
+ </svg>
325
+ Clean Up
326
+ </div>
327
+ <div id="server-health-action-status" class="health-action-status" aria-live="polite" hidden></div>
328
+ </button>
329
+ <div class="collapsible-content" id="cleanup-content" hidden>
330
+ <div class="cleanup-cards">
331
+ <div class="cleanup-card">
332
+ <div class="cleanup-card-icon">
333
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
334
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
335
+ <line x1="9" y1="9" x2="15" y2="15"></line>
336
+ <line x1="15" y1="9" x2="9" y2="15"></line>
337
+ </svg>
338
+ </div>
339
+ <div class="cleanup-card-content">
340
+ <div class="cleanup-card-title">Stop All Containers</div>
341
+ <div class="cleanup-card-description">Gracefully stop all running Docker containers. Active coding sessions will be terminated.</div>
342
+ </div>
343
+ <button type="button" class="btn-secondary cleanup-card-btn" id="server-stop-containers">Stop</button>
344
+ </div>
345
+ <div class="cleanup-card">
346
+ <div class="cleanup-card-icon">
347
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
348
+ <polyline points="3 6 5 6 21 6"></polyline>
349
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>
350
+ </svg>
351
+ </div>
352
+ <div class="cleanup-card-content">
353
+ <div class="cleanup-card-title">Remove Stopped Containers</div>
354
+ <div class="cleanup-card-description">Delete all stopped containers to free up disk space. This cannot be undone.</div>
355
+ </div>
356
+ <button type="button" class="btn-secondary cleanup-card-btn" id="server-remove-stopped">Remove</button>
357
+ </div>
358
+ <div class="cleanup-card cleanup-card-danger">
359
+ <div class="cleanup-card-icon">
360
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
361
+ <path d="M12 2L2 7l10 5 10-5-10-5z"></path>
362
+ <path d="M2 17l10 5 10-5"></path>
363
+ <path d="M2 12l10 5 10-5"></path>
364
+ </svg>
365
+ </div>
366
+ <div class="cleanup-card-content">
367
+ <div class="cleanup-card-title">Docker System Prune</div>
368
+ <div class="cleanup-card-description">Remove all stopped containers, unused networks, dangling images, and build cache.</div>
369
+ </div>
370
+ <button type="button" class="btn-danger cleanup-card-btn" id="server-prune-docker">Prune</button>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </div>
375
+
376
+ <div id="health-restart-overlay" class="admin-restart-overlay" hidden>
377
+ <div class="admin-restart-overlay-content">
378
+ <svg class="loading-spinner" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
379
+ <path d="M21 12a9 9 0 1 1-6.219-8.56"></path>
380
+ </svg>
381
+ <h3 id="restart-overlay-title">Waiting for server to restart...</h3>
382
+ <p id="restart-overlay-message" class="text-muted">The page will automatically refresh when the server is back online.</p>
383
+ <button type="button" class="btn-secondary btn-small" id="restart-overlay-retry" hidden>Retry Connection</button>
384
+ </div>
385
+ </div>
386
+ </div>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
391
+ <div id="section-logs" class="settings-panel" role="tabpanel" hidden>
392
+ <div class="content-card">
393
+ <div class="card-header admin-panel-header">
394
+ <div>
395
+ <h3>Server Logs</h3>
396
+ <p class="admin-panel-subtitle">Buffered server output with live tailing, level filters, and text search.</p>
397
+ </div>
398
+ <div class="admin-panel-actions">
399
+ <span class="admin-stream-indicator" id="logs-stream-status">Paused</span>
400
+ <button type="button" class="btn-secondary btn-small" id="logs-live-toggle">Start Live</button>
401
+ <button type="button" class="btn-secondary btn-small" id="logs-refresh-btn">Refresh</button>
402
+ </div>
403
+ </div>
404
+ <div class="card-body">
405
+ <div class="admin-toolbar">
406
+ <div class="admin-toolbar-group" id="logs-level-filters" role="group" aria-label="Filter logs by level">
407
+ <button type="button" class="admin-filter-btn active" data-level="ALL">All</button>
408
+ <button type="button" class="admin-filter-btn" data-level="DEBUG">Debug</button>
409
+ <button type="button" class="admin-filter-btn" data-level="INFO">Info</button>
410
+ <button type="button" class="admin-filter-btn" data-level="WARN">Warn</button>
411
+ <button type="button" class="admin-filter-btn" data-level="ERROR">Error</button>
412
+ </div>
413
+ <div class="admin-toolbar-search">
414
+ <input type="search" id="logs-search-input" class="form-input" placeholder="Search messages and context..." autocomplete="off">
415
+ </div>
416
+ <div class="admin-toolbar-group">
417
+ <button type="button" class="btn-ghost btn-small" id="logs-clear-btn">Clear Display</button>
418
+ </div>
419
+ </div>
420
+ <div class="admin-log-meta text-muted" id="logs-meta">No logs loaded yet.</div>
421
+ <div id="logs-loading" class="loading" hidden>Loading logs...</div>
422
+ <div id="logs-error" class="empty-state-card" hidden>
423
+ <div class="empty-state-icon">!</div>
424
+ <h2>Unable to load server logs</h2>
425
+ <p id="logs-error-message" class="text-muted"></p>
426
+ <button class="btn-primary" id="retry-logs-btn">Try Again</button>
427
+ </div>
428
+ <div id="logs-empty" class="empty-state-card" hidden>
429
+ <div class="empty-state-icon">…</div>
430
+ <h2>No matching log entries</h2>
431
+ <p class="text-muted">Adjust the filters or wait for new live output.</p>
432
+ </div>
433
+ <div id="logs-container" class="admin-log-container" hidden></div>
434
+ </div>
435
+ </div>
436
+ </div>
437
+
438
+ <div id="section-usage" class="settings-panel" role="tabpanel" hidden>
439
+ <div class="content-card">
440
+ <div class="card-header admin-panel-header">
441
+ <div>
442
+ <h3>Usage Statistics</h3>
443
+ <p class="admin-panel-subtitle">Task volume, success rates, code impact, and operator activity by time period.</p>
444
+ </div>
445
+ <div class="admin-panel-actions">
446
+ <button type="button" class="btn-secondary btn-small" id="usage-refresh-btn">Refresh</button>
447
+ </div>
448
+ </div>
449
+ <div class="card-body">
450
+ <div class="admin-toolbar">
451
+ <div class="admin-toolbar-group" id="usage-period-buttons" role="group" aria-label="Select time period">
452
+ <button type="button" class="admin-filter-btn" data-days="7">7 days</button>
453
+ <button type="button" class="admin-filter-btn active" data-days="30">30 days</button>
454
+ <button type="button" class="admin-filter-btn" data-days="90">90 days</button>
455
+ <button type="button" class="admin-filter-btn" data-days="all">All time</button>
456
+ </div>
457
+ <div class="admin-toolbar-select">
458
+ <label for="usage-environment-filter">Environment</label>
459
+ <select id="usage-environment-filter" class="form-input">
460
+ <option value="">All environments</option>
461
+ </select>
462
+ </div>
463
+ </div>
464
+ <div id="usage-loading" class="loading" hidden>Loading usage statistics...</div>
465
+ <div id="usage-error" class="empty-state-card" hidden>
466
+ <div class="empty-state-icon">!</div>
467
+ <h2>Unable to load usage statistics</h2>
468
+ <p id="usage-error-message" class="text-muted"></p>
469
+ <button class="btn-primary" id="retry-usage-btn">Try Again</button>
470
+ </div>
471
+ <div id="usage-empty" class="empty-state-card" hidden>
472
+ <div class="empty-state-icon">∅</div>
473
+ <h2>No tasks found for this filter</h2>
474
+ <p class="text-muted">Choose a different time period or environment.</p>
475
+ </div>
476
+ <div id="usage-content" hidden>
477
+ <div class="admin-usage-period text-muted" id="usage-period-summary"></div>
478
+ <div class="admin-summary-grid">
479
+ <div class="admin-summary-card">
480
+ <div class="admin-summary-label">Total Tasks</div>
481
+ <div class="admin-summary-value" id="usage-total-tasks">0</div>
482
+ <div class="admin-summary-meta" id="usage-approved-summary">Selected period</div>
483
+ </div>
484
+ <div class="admin-summary-card">
485
+ <div class="admin-summary-label">Success Rate</div>
486
+ <div class="admin-summary-value" id="usage-success-rate">0%</div>
487
+ <div class="admin-summary-meta" id="usage-success-detail">Completed vs failed/interrupted</div>
488
+ </div>
489
+ <div class="admin-summary-card">
490
+ <div class="admin-summary-label">Net Lines</div>
491
+ <div class="admin-summary-value" id="usage-net-lines">0</div>
492
+ <div class="admin-summary-meta" id="usage-net-lines-detail">Added minus deleted</div>
493
+ </div>
494
+ <div class="admin-summary-card">
495
+ <div class="admin-summary-label">Duration</div>
496
+ <div class="admin-summary-value" id="usage-average-duration">0m</div>
497
+ <div class="admin-summary-meta" id="usage-average-duration-detail">Completed tasks only</div>
498
+ </div>
499
+ </div>
500
+
501
+ <div class="admin-usage-grid">
502
+ <section class="admin-usage-section">
503
+ <div class="section-header">
504
+ <h3>By Status</h3>
505
+ </div>
506
+ <div id="usage-status-bars" class="admin-bar-list"></div>
507
+ </section>
508
+
509
+ <section class="admin-usage-section">
510
+ <div class="section-header">
511
+ <h3>By Type</h3>
512
+ </div>
513
+ <div class="admin-table-wrap">
514
+ <table class="admin-data-table">
515
+ <thead>
516
+ <tr>
517
+ <th>Type</th>
518
+ <th>Count</th>
519
+ <th>Share</th>
520
+ </tr>
521
+ </thead>
522
+ <tbody id="usage-type-body"></tbody>
523
+ </table>
524
+ </div>
525
+ </section>
526
+
527
+ <section class="admin-usage-section">
528
+ <div class="section-header">
529
+ <h3>By Environment</h3>
530
+ </div>
531
+ <div class="admin-table-wrap">
532
+ <table class="admin-data-table">
533
+ <thead>
534
+ <tr>
535
+ <th>Environment</th>
536
+ <th>Tasks</th>
537
+ </tr>
538
+ </thead>
539
+ <tbody id="usage-environment-body"></tbody>
540
+ </table>
541
+ </div>
542
+ </section>
543
+
544
+ <section class="admin-usage-section">
545
+ <div class="section-header">
546
+ <h3>By User</h3>
547
+ </div>
548
+ <div class="admin-table-wrap">
549
+ <table class="admin-data-table">
550
+ <thead>
551
+ <tr>
552
+ <th>User</th>
553
+ <th>Tasks</th>
554
+ </tr>
555
+ </thead>
556
+ <tbody id="usage-user-body"></tbody>
557
+ </table>
558
+ </div>
559
+ </section>
560
+
561
+ <section class="admin-usage-section">
562
+ <div class="section-header">
563
+ <h3>By Source</h3>
564
+ </div>
565
+ <div class="admin-table-wrap">
566
+ <table class="admin-data-table">
567
+ <thead>
568
+ <tr>
569
+ <th>Source</th>
570
+ <th>Tasks</th>
571
+ </tr>
572
+ </thead>
573
+ <tbody id="usage-source-body"></tbody>
574
+ </table>
575
+ </div>
576
+ </section>
577
+
578
+ <section class="admin-usage-section">
579
+ <div class="section-header">
580
+ <h3>Code Impact</h3>
581
+ </div>
582
+ <div class="admin-impact-cards">
583
+ <div class="admin-impact-card">
584
+ <div class="admin-impact-card-label">Lines Added</div>
585
+ <div class="admin-impact-card-values">
586
+ <span class="admin-impact-card-all" id="usage-lines-added">0</span>
587
+ <span class="admin-impact-card-approved" id="usage-approved-lines-added">0</span>
588
+ </div>
589
+ <div class="admin-impact-bar-track"><div class="admin-impact-bar-fill" id="usage-added-pct"></div></div>
590
+ </div>
591
+ <div class="admin-impact-card">
592
+ <div class="admin-impact-card-label">Lines Deleted</div>
593
+ <div class="admin-impact-card-values">
594
+ <span class="admin-impact-card-all" id="usage-lines-deleted">0</span>
595
+ <span class="admin-impact-card-approved" id="usage-approved-lines-deleted">0</span>
596
+ </div>
597
+ <div class="admin-impact-bar-track"><div class="admin-impact-bar-fill" id="usage-deleted-pct"></div></div>
598
+ </div>
599
+ <div class="admin-impact-card">
600
+ <div class="admin-impact-card-label">File Changes</div>
601
+ <div class="admin-impact-card-values">
602
+ <span class="admin-impact-card-all" id="usage-files-changed">0</span>
603
+ <span class="admin-impact-card-approved" id="usage-approved-files-changed">0</span>
604
+ </div>
605
+ <div class="admin-impact-bar-track"><div class="admin-impact-bar-fill" id="usage-files-pct"></div></div>
606
+ </div>
607
+ <div class="admin-impact-card">
608
+ <div class="admin-impact-card-label">Repositories</div>
609
+ <div class="admin-impact-card-values">
610
+ <span class="admin-impact-card-all" id="usage-repositories-affected">0</span>
611
+ <span class="admin-impact-card-approved" id="usage-approved-repositories-affected">0</span>
612
+ </div>
613
+ <div class="admin-impact-bar-track"><div class="admin-impact-bar-fill" id="usage-repos-pct"></div></div>
614
+ </div>
615
+ </div>
616
+ <div class="admin-impact-legend">
617
+ <span class="admin-impact-legend-item"><span class="admin-impact-legend-dot admin-impact-legend-all"></span>All changes</span>
618
+ <span class="admin-impact-legend-item"><span class="admin-impact-legend-dot admin-impact-legend-approved"></span>Approved</span>
619
+ </div>
620
+ </section>
621
+ </div>
622
+ </div>
623
+ </div>
624
+ </div>
625
+ </div>
626
+ </section>
627
+ </div>
628
+ </main>
629
+
630
+ <div id="restart-modal" class="modal" hidden>
631
+ <div class="modal-overlay"></div>
632
+ <div class="modal-content">
633
+ <div class="modal-header">
634
+ <h2>Restart Server</h2>
635
+ <button class="modal-close" id="close-restart-modal" aria-label="Close">&times;</button>
636
+ </div>
637
+ <div class="modal-body">
638
+ <p>Are you sure you want to restart the server?</p>
639
+ <p class="field-hint">All active connections will be temporarily disconnected. The page will automatically reconnect when the server is back online.</p>
640
+ </div>
641
+ <div class="modal-footer">
642
+ <button class="btn-ghost" id="cancel-restart-btn">Cancel</button>
643
+ <button class="btn-primary" id="confirm-restart-btn" style="background: var(--color-warning, #f59e0b);">Restart Server</button>
644
+ </div>
645
+ </div>
646
+ </div>
647
+ </body>
648
+ </html>