@profoundlogic/coderflow-server 0.2.1

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 (202) hide show
  1. package/LICENSE.txt +322 -0
  2. package/README.md +158 -0
  3. package/dist/LICENSE.txt +322 -0
  4. package/dist/README.md +158 -0
  5. package/dist/base-image/Dockerfile +184 -0
  6. package/dist/base-image/agent-wrapper.sh +143 -0
  7. package/dist/base-image/apply-local-state.sh +357 -0
  8. package/dist/base-image/coder-git-credential-helper +307 -0
  9. package/dist/base-image/entrypoint.sh +942 -0
  10. package/dist/base-image/ssh_config_template +41 -0
  11. package/dist/base-image/start-code-server.sh +76 -0
  12. package/dist/base-image/sync-repos.sh +170 -0
  13. package/dist/base-image/vscode-extensions.txt +10 -0
  14. package/dist/base-image/vscode-settings.json +41 -0
  15. package/dist/coder-server.js +2 -0
  16. package/dist/config/cli-models.json +45 -0
  17. package/dist/config/imported-skills.schema.json +83 -0
  18. package/dist/config/skill-catalog.json +18 -0
  19. package/dist/config/skill-catalog.schema.json +140 -0
  20. package/dist/config.js +1 -0
  21. package/dist/examples/oidc.json.example +11 -0
  22. package/dist/lib/agent-keepalive.js +1 -0
  23. package/dist/lib/api-keys.js +1 -0
  24. package/dist/lib/apiKeys.js +1 -0
  25. package/dist/lib/auto-judge.js +1 -0
  26. package/dist/lib/basic-auth.js +1 -0
  27. package/dist/lib/build-history.js +1 -0
  28. package/dist/lib/build-output-service.js +1 -0
  29. package/dist/lib/build-scheduler.js +1 -0
  30. package/dist/lib/build-service.js +1 -0
  31. package/dist/lib/claude-oauth-refresh.js +1 -0
  32. package/dist/lib/cli/build.js +1 -0
  33. package/dist/lib/cli/config-command.js +1 -0
  34. package/dist/lib/cli/config.js +1 -0
  35. package/dist/lib/cli/create-user.js +1 -0
  36. package/dist/lib/cli/init.js +1 -0
  37. package/dist/lib/cli/jira.js +1 -0
  38. package/dist/lib/cli/license.js +1 -0
  39. package/dist/lib/cli/server-manager.js +1 -0
  40. package/dist/lib/container-tokens.js +1 -0
  41. package/dist/lib/data-dir.js +1 -0
  42. package/dist/lib/deployment-history.js +1 -0
  43. package/dist/lib/deployment-service.js +1 -0
  44. package/dist/lib/docker-utils.js +1 -0
  45. package/dist/lib/email.js +1 -0
  46. package/dist/lib/emailTemplates.js +1 -0
  47. package/dist/lib/entitlement.js +1 -0
  48. package/dist/lib/fetch-utils.js +1 -0
  49. package/dist/lib/git-provider-service.js +1 -0
  50. package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
  51. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
  52. package/dist/lib/git-provider-setup/index.js +1 -0
  53. package/dist/lib/git-provider-setup/setup-factory.js +1 -0
  54. package/dist/lib/git-provider-setup/setup-interface.js +1 -0
  55. package/dist/lib/git-providers/azure-devops-provider.js +1 -0
  56. package/dist/lib/git-providers/github-app-provider.js +1 -0
  57. package/dist/lib/git-providers/index.js +1 -0
  58. package/dist/lib/git-providers/provider-factory.js +1 -0
  59. package/dist/lib/git-providers/provider-interface.js +1 -0
  60. package/dist/lib/jira-client.js +1 -0
  61. package/dist/lib/logger.js +1 -0
  62. package/dist/lib/model-fetcher.js +1 -0
  63. package/dist/lib/notifications.js +1 -0
  64. package/dist/lib/oidc-auth.js +1 -0
  65. package/dist/lib/oidc-device-flow.js +1 -0
  66. package/dist/lib/passwordTokens.js +1 -0
  67. package/dist/lib/pin-cascade.js +1 -0
  68. package/dist/lib/provider-accounts.js +1 -0
  69. package/dist/lib/provider-oauth.js +1 -0
  70. package/dist/lib/provider-profile.js +1 -0
  71. package/dist/lib/provider-token-refresh.js +1 -0
  72. package/dist/lib/roles.js +1 -0
  73. package/dist/lib/secrets.js +1 -0
  74. package/dist/lib/state-capture.js +1 -0
  75. package/dist/lib/static-files.js +1 -0
  76. package/dist/lib/task-name-generator.js +1 -0
  77. package/dist/lib/users.js +1 -0
  78. package/dist/middleware/requireAuth.js +1 -0
  79. package/dist/middleware/requireInit.js +1 -0
  80. package/dist/middleware/requirePermission.js +1 -0
  81. package/dist/package-lock.json +4151 -0
  82. package/dist/package.json +50 -0
  83. package/dist/routes/apiKeys.js +1 -0
  84. package/dist/routes/auth-oidc.js +1 -0
  85. package/dist/routes/auth.js +1 -0
  86. package/dist/routes/build.js +1 -0
  87. package/dist/routes/containers.js +1 -0
  88. package/dist/routes/deploy-task.js +1 -0
  89. package/dist/routes/environment-management.js +1 -0
  90. package/dist/routes/environments.js +1 -0
  91. package/dist/routes/external-skills.js +1 -0
  92. package/dist/routes/git-credentials.js +1 -0
  93. package/dist/routes/git-provider-setup.js +1 -0
  94. package/dist/routes/health.js +1 -0
  95. package/dist/routes/jira.js +1 -0
  96. package/dist/routes/objective-management.js +1 -0
  97. package/dist/routes/password.js +1 -0
  98. package/dist/routes/prompt.js +1 -0
  99. package/dist/routes/provider-auth.js +1 -0
  100. package/dist/routes/qa.js +1 -0
  101. package/dist/routes/settings.js +1 -0
  102. package/dist/routes/skill-management.js +1 -0
  103. package/dist/routes/skills.js +1 -0
  104. package/dist/routes/tasks.js +2 -0
  105. package/dist/routes/templates.js +1 -0
  106. package/dist/routes/test-task.js +1 -0
  107. package/dist/routes/test.js +1 -0
  108. package/dist/routes/users.js +1 -0
  109. package/dist/routes/visualizations.js +1 -0
  110. package/dist/schemas/template-metadata.schema.json +178 -0
  111. package/dist/scripts/create-user.js +2 -0
  112. package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
  113. package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
  114. package/dist/shipped-skills/objective-management/SKILL.md +238 -0
  115. package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
  116. package/dist/start.js +2 -0
  117. package/dist/web-ui/public/activity-detail-modal.js +1 -0
  118. package/dist/web-ui/public/activity-feed.js +1 -0
  119. package/dist/web-ui/public/activity-formatters.js +1 -0
  120. package/dist/web-ui/public/agent-event-parser.js +1 -0
  121. package/dist/web-ui/public/app.js +1 -0
  122. package/dist/web-ui/public/approve-dialog.js +1 -0
  123. package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
  124. package/dist/web-ui/public/coderflow-logo.svg +46 -0
  125. package/dist/web-ui/public/comments-widget.js +1 -0
  126. package/dist/web-ui/public/docs/.nojekyll +0 -0
  127. package/dist/web-ui/public/docs/README.md +26 -0
  128. package/dist/web-ui/public/docs/_sidebar.md +47 -0
  129. package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
  130. package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
  131. package/dist/web-ui/public/docs/admin/environments.md +215 -0
  132. package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
  133. package/dist/web-ui/public/docs/admin/installation.md +313 -0
  134. package/dist/web-ui/public/docs/admin/skills.md +35 -0
  135. package/dist/web-ui/public/docs/admin/sso.md +241 -0
  136. package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
  137. package/dist/web-ui/public/docs/code/cli.md +102 -0
  138. package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
  139. package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
  140. package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
  141. package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
  142. package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
  143. package/dist/web-ui/public/docs/index.html +151 -0
  144. package/dist/web-ui/public/docs/integrations/custom.md +58 -0
  145. package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
  146. package/dist/web-ui/public/docs/integrations/overview.md +48 -0
  147. package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
  148. package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
  149. package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
  150. package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
  151. package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
  152. package/dist/web-ui/public/docs/tasks/judging.md +114 -0
  153. package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
  154. package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
  155. package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
  156. package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
  157. package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
  158. package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
  159. package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
  160. package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
  161. package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
  162. package/dist/web-ui/public/environments.css +3942 -0
  163. package/dist/web-ui/public/environments.html +1791 -0
  164. package/dist/web-ui/public/environments.js +1 -0
  165. package/dist/web-ui/public/favicon-16.png +0 -0
  166. package/dist/web-ui/public/favicon-32.png +0 -0
  167. package/dist/web-ui/public/favicon.ico +0 -0
  168. package/dist/web-ui/public/feedback-widget.css +3133 -0
  169. package/dist/web-ui/public/feedback-widget.js +1 -0
  170. package/dist/web-ui/public/git-history.css +2663 -0
  171. package/dist/web-ui/public/git-history.html +272 -0
  172. package/dist/web-ui/public/git-history.js +1 -0
  173. package/dist/web-ui/public/git-status.js +1 -0
  174. package/dist/web-ui/public/index.html +1459 -0
  175. package/dist/web-ui/public/index.js +1 -0
  176. package/dist/web-ui/public/login.html +346 -0
  177. package/dist/web-ui/public/login.js +1 -0
  178. package/dist/web-ui/public/markdown-editor.js +1 -0
  179. package/dist/web-ui/public/markdown-file-editor.js +1 -0
  180. package/dist/web-ui/public/modal-maximize.js +1 -0
  181. package/dist/web-ui/public/notifications.js +1 -0
  182. package/dist/web-ui/public/server-health.js +1 -0
  183. package/dist/web-ui/public/settings.css +761 -0
  184. package/dist/web-ui/public/settings.html +1044 -0
  185. package/dist/web-ui/public/settings.js +1 -0
  186. package/dist/web-ui/public/setup-password.html +355 -0
  187. package/dist/web-ui/public/setup-password.js +1 -0
  188. package/dist/web-ui/public/skills.css +1949 -0
  189. package/dist/web-ui/public/skills.html +820 -0
  190. package/dist/web-ui/public/skills.js +1 -0
  191. package/dist/web-ui/public/sse-client.js +1 -0
  192. package/dist/web-ui/public/sse-shared-worker.js +1 -0
  193. package/dist/web-ui/public/styles.css +18614 -0
  194. package/dist/web-ui/public/task.html +1779 -0
  195. package/dist/web-ui/public/task.js +1 -0
  196. package/dist/web-ui/public/terminal.html +45 -0
  197. package/dist/web-ui/public/terminal.js +1 -0
  198. package/dist/web-ui/public/theme.js +1 -0
  199. package/dist/web-ui/public/users.html +298 -0
  200. package/dist/web-ui/public/users.js +1 -0
  201. package/dist/web-ui/public/variant-grouping.js +1 -0
  202. package/package.json +63 -0
@@ -0,0 +1,761 @@
1
+ /* Settings Page Styles */
2
+
3
+ /* ============================================================
4
+ CONTENT CARDS (shared with environments)
5
+ ============================================================ */
6
+
7
+ .content-card {
8
+ background: var(--color-surface);
9
+ border-radius: var(--radius-large);
10
+ box-shadow: var(--shadow-card);
11
+ overflow: visible;
12
+ }
13
+
14
+ .card-header {
15
+ padding: 20px 24px;
16
+ border-bottom: 1px solid var(--color-border);
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ }
21
+
22
+ .card-header h3,
23
+ .card-header h4 {
24
+ margin: 0;
25
+ font-size: 16px;
26
+ font-weight: 600;
27
+ color: var(--color-text);
28
+ }
29
+
30
+ .card-body {
31
+ padding: 24px;
32
+ }
33
+
34
+ /* ============================================================
35
+ FORM ELEMENTS
36
+ ============================================================ */
37
+
38
+ .form-single-column {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 20px;
42
+ max-width: 700px;
43
+ }
44
+
45
+ .form-row {
46
+ display: grid;
47
+ grid-template-columns: 200px 1fr;
48
+ gap: 16px;
49
+ align-items: center;
50
+ }
51
+
52
+ .form-row label {
53
+ font-size: 13px;
54
+ font-weight: 500;
55
+ color: var(--color-text);
56
+ text-align: left;
57
+ }
58
+
59
+ .form-row .form-input,
60
+ .form-row .form-textarea {
61
+ margin: 0;
62
+ }
63
+
64
+ .form-hint {
65
+ grid-column: 2;
66
+ font-size: 12px;
67
+ color: var(--color-text-muted);
68
+ margin-top: -12px;
69
+ line-height: 1.4;
70
+ }
71
+
72
+ .form-hint code {
73
+ background: var(--color-surface-elevated);
74
+ padding: 1px 4px;
75
+ border-radius: 3px;
76
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
77
+ font-size: 11px;
78
+ }
79
+
80
+ /* Subsections within cards */
81
+ .subsection {
82
+ padding: 16px 0;
83
+ border-top: 1px solid var(--color-border);
84
+ }
85
+
86
+ .subsection:first-child {
87
+ padding-top: 0;
88
+ border-top: none;
89
+ }
90
+
91
+ .subsection-header {
92
+ display: flex;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ margin-bottom: 12px;
96
+ }
97
+
98
+ .subsection-header h4 {
99
+ margin: 0;
100
+ font-size: 14px;
101
+ font-weight: 600;
102
+ color: var(--color-text);
103
+ }
104
+
105
+ .subsection-header .toggle-switch {
106
+ flex-shrink: 0;
107
+ }
108
+
109
+ /* Keepalive agent sections */
110
+ #keepalive-agents-container {
111
+ display: flex;
112
+ flex-direction: column;
113
+ max-width: 500px;
114
+ }
115
+
116
+ .keepalive-agent-section {
117
+ padding: 16px 0;
118
+ border-bottom: 1px solid var(--color-border);
119
+ }
120
+
121
+ .keepalive-agent-section:first-child {
122
+ padding-top: 0;
123
+ }
124
+
125
+ .keepalive-agent-section:last-child {
126
+ border-bottom: none;
127
+ padding-bottom: 0;
128
+ }
129
+
130
+ .keepalive-agent-header,
131
+ .keepalive-agent-row {
132
+ display: grid;
133
+ grid-template-columns: 180px 120px;
134
+ align-items: center;
135
+ }
136
+
137
+ .keepalive-agent-header {
138
+ margin-bottom: 10px;
139
+ }
140
+
141
+ .keepalive-agent-header h4 {
142
+ margin: 0;
143
+ font-size: 14px;
144
+ font-weight: 600;
145
+ color: var(--color-text);
146
+ }
147
+
148
+ .keepalive-agent-row {
149
+ margin-bottom: 6px;
150
+ }
151
+
152
+ .keepalive-agent-row label {
153
+ font-size: 13px;
154
+ color: var(--color-text-muted);
155
+ }
156
+
157
+ .keepalive-agent-row .form-input {
158
+ width: 100%;
159
+ }
160
+
161
+ .keepalive-agent-status {
162
+ margin-left: 180px;
163
+ font-size: 12px;
164
+ color: var(--color-text-muted);
165
+ }
166
+
167
+ /* ============================================================
168
+ LAYOUT
169
+ ============================================================ */
170
+
171
+ .settings-layout {
172
+ display: grid;
173
+ grid-template-columns: 240px 1fr;
174
+ gap: 32px;
175
+ min-height: calc(100vh - 200px);
176
+ }
177
+
178
+ @media (max-width: 768px) {
179
+ .settings-layout {
180
+ grid-template-columns: 1fr;
181
+ }
182
+
183
+ .settings-sidebar {
184
+ position: sticky;
185
+ top: 0;
186
+ z-index: 10;
187
+ background: var(--color-surface);
188
+ padding-bottom: 12px;
189
+ border-bottom: 1px solid var(--color-border);
190
+ }
191
+
192
+ .settings-nav {
193
+ display: flex;
194
+ flex-wrap: wrap;
195
+ gap: 8px;
196
+ }
197
+
198
+ .settings-nav-item {
199
+ flex: 0 0 auto;
200
+ }
201
+ }
202
+
203
+ /* ============================================================
204
+ SIDEBAR NAVIGATION
205
+ ============================================================ */
206
+
207
+ .settings-sidebar {
208
+ position: sticky;
209
+ top: 24px;
210
+ align-self: start;
211
+ }
212
+
213
+ .settings-nav {
214
+ display: flex;
215
+ flex-direction: column;
216
+ gap: 4px;
217
+ }
218
+
219
+ .settings-nav-item {
220
+ display: flex;
221
+ align-items: center;
222
+ gap: 10px;
223
+ padding: 10px 14px;
224
+ background: none;
225
+ border: none;
226
+ border-radius: var(--radius-medium);
227
+ color: var(--color-text-muted);
228
+ font-size: 14px;
229
+ font-weight: 500;
230
+ cursor: pointer;
231
+ transition: all 0.2s ease;
232
+ text-align: left;
233
+ width: 100%;
234
+ }
235
+
236
+ .settings-nav-item:hover {
237
+ background: var(--color-surface-muted);
238
+ color: var(--color-text);
239
+ }
240
+
241
+ .settings-nav-item.active {
242
+ background: var(--color-accent);
243
+ color: white;
244
+ }
245
+
246
+ .settings-nav-item.active svg {
247
+ stroke: white;
248
+ }
249
+
250
+ .settings-nav-item svg {
251
+ flex-shrink: 0;
252
+ transition: stroke 0.2s ease;
253
+ }
254
+
255
+ /* ============================================================
256
+ PANELS
257
+ ============================================================ */
258
+
259
+ .settings-panels {
260
+ min-width: 0;
261
+ }
262
+
263
+ .settings-panel {
264
+ display: none;
265
+ }
266
+
267
+ .settings-panel.active {
268
+ display: block;
269
+ }
270
+
271
+ /* ============================================================
272
+ CARD ACTIONS
273
+ ============================================================ */
274
+
275
+ .card-actions {
276
+ display: flex;
277
+ justify-content: flex-end;
278
+ gap: 12px;
279
+ padding: 16px 24px;
280
+ border-top: 1px solid var(--color-border);
281
+ background: var(--color-surface-muted);
282
+ }
283
+
284
+ /* Responsive form layout */
285
+ @media (max-width: 640px) {
286
+ .form-row {
287
+ grid-template-columns: 1fr;
288
+ gap: 8px;
289
+ }
290
+
291
+ .form-hint {
292
+ grid-column: 1;
293
+ margin-top: 0;
294
+ }
295
+ }
296
+
297
+ /* ============================================================
298
+ PROVIDER AUTHENTICATION
299
+ ============================================================ */
300
+
301
+ .provider-auth-list {
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 20px;
305
+ }
306
+
307
+ .provider-section {
308
+ border: 1px solid var(--color-border);
309
+ border-radius: var(--radius-medium);
310
+ overflow: hidden;
311
+ }
312
+
313
+ .provider-header {
314
+ display: flex;
315
+ justify-content: space-between;
316
+ align-items: center;
317
+ padding: 12px 16px;
318
+ background: var(--color-surface-muted);
319
+ border-bottom: 1px solid var(--color-border);
320
+ }
321
+
322
+ .provider-header .provider-name {
323
+ font-weight: 600;
324
+ font-size: 14px;
325
+ }
326
+
327
+ .provider-accounts {
328
+ padding: 12px 16px;
329
+ }
330
+
331
+ .provider-account-item {
332
+ display: flex;
333
+ align-items: center;
334
+ gap: 12px;
335
+ padding: 8px 0;
336
+ border-bottom: 1px solid var(--color-border);
337
+ }
338
+
339
+ .provider-account-item:last-child {
340
+ border-bottom: none;
341
+ }
342
+
343
+ .provider-account-item .account-name {
344
+ font-weight: 500;
345
+ font-size: 14px;
346
+ }
347
+
348
+ .provider-account-item .account-email {
349
+ color: var(--color-text-muted);
350
+ font-size: 13px;
351
+ flex: 1;
352
+ }
353
+
354
+ .provider-account-item .account-actions {
355
+ display: flex;
356
+ gap: 4px;
357
+ }
358
+
359
+ /* Provider sign-in modal */
360
+ .provider-signin-options {
361
+ display: flex;
362
+ flex-direction: column;
363
+ gap: 8px;
364
+ }
365
+
366
+ .provider-signin-btn {
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ padding: 12px 16px;
371
+ background: var(--color-surface-muted);
372
+ border: 1px solid var(--color-border);
373
+ border-radius: var(--radius-medium);
374
+ cursor: pointer;
375
+ transition: all 0.2s ease;
376
+ font-size: 14px;
377
+ font-weight: 500;
378
+ }
379
+
380
+ .provider-signin-btn:hover {
381
+ background: var(--color-accent);
382
+ border-color: var(--color-accent);
383
+ color: white;
384
+ }
385
+
386
+ /* ============================================================
387
+ GIT PROVIDERS
388
+ ============================================================ */
389
+
390
+ .git-providers-list {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 8px;
394
+ }
395
+
396
+ .git-provider-item {
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: space-between;
400
+ padding: 12px 16px;
401
+ background: var(--color-surface-muted);
402
+ border: 1px solid var(--color-border);
403
+ border-radius: var(--radius-medium);
404
+ }
405
+
406
+ .git-provider-info {
407
+ display: flex;
408
+ align-items: center;
409
+ gap: 12px;
410
+ }
411
+
412
+ .git-provider-name {
413
+ font-weight: 500;
414
+ font-size: 14px;
415
+ }
416
+
417
+ .git-provider-type {
418
+ color: var(--color-text-muted);
419
+ font-size: 13px;
420
+ padding: 2px 8px;
421
+ background: var(--color-surface);
422
+ border-radius: var(--radius-small);
423
+ }
424
+
425
+ .git-provider-actions {
426
+ display: flex;
427
+ gap: 4px;
428
+ }
429
+
430
+ /* ============================================================
431
+ LOADING STATE
432
+ ============================================================ */
433
+
434
+ .loading {
435
+ display: flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ gap: 12px;
439
+ padding: 48px;
440
+ color: var(--color-text-muted);
441
+ }
442
+
443
+ .loading-spinner {
444
+ animation: spin 1s linear infinite;
445
+ }
446
+
447
+ @keyframes spin {
448
+ from {
449
+ transform: rotate(0deg);
450
+ }
451
+ to {
452
+ transform: rotate(360deg);
453
+ }
454
+ }
455
+
456
+ /* ============================================================
457
+ FORM ENHANCEMENTS
458
+ ============================================================ */
459
+
460
+ .checkbox-label {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 8px;
464
+ cursor: pointer;
465
+ font-size: 14px;
466
+ }
467
+
468
+ .checkbox-label input[type="checkbox"] {
469
+ width: 16px;
470
+ height: 16px;
471
+ cursor: pointer;
472
+ }
473
+
474
+ /* ============================================================
475
+ TEXT UTILITIES
476
+ ============================================================ */
477
+
478
+ .text-muted {
479
+ color: var(--color-text-muted);
480
+ font-size: 13px;
481
+ line-height: 1.5;
482
+ }
483
+
484
+ /* ============================================================
485
+ KEEPALIVE STATUS
486
+ ============================================================ */
487
+
488
+ .keepalive-status-row {
489
+ display: flex;
490
+ align-items: center;
491
+ gap: 8px;
492
+ }
493
+
494
+ .keepalive-status-row span {
495
+ font-size: 12px;
496
+ color: var(--color-text-muted);
497
+ }
498
+
499
+ /* ============================================================
500
+ TOKEN EXPIRY CONTROLS
501
+ ============================================================ */
502
+
503
+ .token-expiry-controls {
504
+ display: flex;
505
+ align-items: center;
506
+ gap: 8px;
507
+ }
508
+
509
+ .token-expiry-suffix {
510
+ font-size: 14px;
511
+ color: var(--color-text-muted);
512
+ }
513
+
514
+ /* ============================================================
515
+ EMAIL TEST RESULT
516
+ ============================================================ */
517
+
518
+ .email-test-result {
519
+ margin-top: 12px;
520
+ padding: 10px 14px;
521
+ border-radius: var(--radius-medium);
522
+ font-size: 13px;
523
+ background: var(--color-surface-muted);
524
+ border: 1px solid var(--color-border);
525
+ }
526
+
527
+ .email-test-result.success {
528
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
529
+ border-color: var(--color-success, #22c55e);
530
+ color: var(--color-success, #22c55e);
531
+ }
532
+
533
+ .email-test-result.error {
534
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
535
+ border-color: var(--color-error, #ef4444);
536
+ color: var(--color-error, #ef4444);
537
+ }
538
+
539
+ /* ============================================================
540
+ CODE FONT
541
+ ============================================================ */
542
+
543
+ .code-font {
544
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
545
+ font-size: 13px;
546
+ }
547
+
548
+ /* ============================================================
549
+ MODAL OVERFLOW FIX FOR DROPDOWNS
550
+ ============================================================ */
551
+
552
+ #git-provider-modal .modal-body {
553
+ overflow: visible;
554
+ }
555
+
556
+ #git-provider-modal .modal-content {
557
+ overflow: visible;
558
+ }
559
+
560
+ /* ============================================================
561
+ INLINE ERROR/SUCCESS MESSAGES
562
+ ============================================================ */
563
+
564
+ .inline-message {
565
+ padding: 10px 14px;
566
+ border-radius: var(--radius-medium);
567
+ font-size: 13px;
568
+ margin-bottom: 16px;
569
+ }
570
+
571
+ .inline-message.error {
572
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
573
+ border: 1px solid var(--color-error, #ef4444);
574
+ color: var(--color-error, #ef4444);
575
+ }
576
+
577
+ .inline-message.success {
578
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
579
+ border: 1px solid var(--color-success, #22c55e);
580
+ color: var(--color-success, #22c55e);
581
+ }
582
+
583
+ .inline-message.info {
584
+ background: var(--color-accent-muted, rgba(59, 130, 246, 0.1));
585
+ border: 1px solid var(--color-accent, #3b82f6);
586
+ color: var(--color-accent, #3b82f6);
587
+ }
588
+
589
+ /* ============================================================
590
+ SSO TABS
591
+ ============================================================ */
592
+
593
+ .sso-tabs {
594
+ display: flex;
595
+ gap: 4px;
596
+ margin-bottom: 20px;
597
+ border-bottom: 1px solid var(--color-border);
598
+ padding-bottom: 0;
599
+ }
600
+
601
+ .sso-tab {
602
+ padding: 10px 16px;
603
+ background: none;
604
+ border: none;
605
+ border-radius: 0;
606
+ border-bottom: 2px solid transparent;
607
+ color: var(--color-text-muted);
608
+ font-size: 14px;
609
+ font-weight: 500;
610
+ cursor: pointer;
611
+ margin-bottom: -1px;
612
+ transition: all 0.2s ease;
613
+ }
614
+
615
+ .sso-tab:hover {
616
+ color: var(--color-text);
617
+ }
618
+
619
+ .sso-tab.active {
620
+ color: var(--color-accent);
621
+ border-bottom-color: var(--color-accent);
622
+ }
623
+
624
+ .sso-tab-content {
625
+ display: none;
626
+ }
627
+
628
+ .sso-tab-content.active {
629
+ display: block;
630
+ }
631
+
632
+ .sso-field-description {
633
+ font-size: 12px;
634
+ color: var(--color-text-muted);
635
+ margin: -12px 0 16px 0;
636
+ padding-left: 216px; /* 200px label + 16px gap */
637
+ line-height: 1.4;
638
+ }
639
+
640
+ @media (max-width: 640px) {
641
+ .sso-field-description {
642
+ padding-left: 0;
643
+ margin-top: -4px;
644
+ }
645
+ }
646
+
647
+ /* SSO Test Result */
648
+ .sso-test-result {
649
+ margin-top: 12px;
650
+ padding: 10px 14px;
651
+ border-radius: var(--radius-medium);
652
+ font-size: 13px;
653
+ background: var(--color-surface-muted);
654
+ border: 1px solid var(--color-border);
655
+ }
656
+
657
+ .sso-test-result.success {
658
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
659
+ border-color: var(--color-success, #22c55e);
660
+ color: var(--color-success, #22c55e);
661
+ }
662
+
663
+ .sso-test-result.error {
664
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
665
+ border-color: var(--color-error, #ef4444);
666
+ color: var(--color-error, #ef4444);
667
+ }
668
+
669
+ /* ============================================================
670
+ PROVIDER TYPE SELECTION
671
+ ============================================================ */
672
+
673
+ .provider-type-options {
674
+ display: flex;
675
+ flex-direction: column;
676
+ gap: 12px;
677
+ margin-top: 16px;
678
+ }
679
+
680
+ .provider-type-option {
681
+ display: flex;
682
+ align-items: center;
683
+ gap: 16px;
684
+ padding: 16px 20px;
685
+ background: var(--color-surface);
686
+ border: 1px solid var(--color-border);
687
+ border-radius: var(--radius-medium);
688
+ cursor: pointer;
689
+ transition: all 0.15s ease;
690
+ text-align: left;
691
+ width: 100%;
692
+ }
693
+
694
+ .provider-type-option:hover {
695
+ background: var(--color-surface-muted);
696
+ border-color: var(--color-border-strong);
697
+ }
698
+
699
+ .provider-type-option:active {
700
+ transform: scale(0.98);
701
+ }
702
+
703
+ .provider-type-icon {
704
+ display: flex;
705
+ align-items: center;
706
+ justify-content: center;
707
+ width: 40px;
708
+ height: 40px;
709
+ background: var(--color-surface-muted);
710
+ border-radius: var(--radius-medium);
711
+ color: var(--color-text);
712
+ }
713
+
714
+ .provider-type-icon svg {
715
+ width: 24px;
716
+ height: 24px;
717
+ }
718
+
719
+ .provider-type-info {
720
+ display: flex;
721
+ flex-direction: column;
722
+ gap: 2px;
723
+ }
724
+
725
+ .provider-type-info strong {
726
+ font-size: 14px;
727
+ color: var(--color-text);
728
+ }
729
+
730
+ .provider-type-desc {
731
+ font-size: 12px;
732
+ color: var(--color-text-muted);
733
+ }
734
+
735
+ /* Medium modal size for wizards */
736
+ .modal-content.modal-medium {
737
+ max-width: 560px;
738
+ }
739
+
740
+ /* ============================================================
741
+ MODAL INLINE MESSAGES
742
+ ============================================================ */
743
+
744
+ .modal-inline-message {
745
+ padding: 10px 14px;
746
+ border-radius: var(--radius-medium);
747
+ font-size: 13px;
748
+ margin-bottom: 16px;
749
+ }
750
+
751
+ .modal-inline-message.error {
752
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
753
+ border: 1px solid var(--color-error, #ef4444);
754
+ color: var(--color-error, #ef4444);
755
+ }
756
+
757
+ .modal-inline-message.success {
758
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
759
+ border: 1px solid var(--color-success, #22c55e);
760
+ color: var(--color-success, #22c55e);
761
+ }