@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.
- package/LICENSE.txt +322 -0
- package/README.md +158 -0
- package/dist/LICENSE.txt +322 -0
- package/dist/README.md +158 -0
- package/dist/base-image/Dockerfile +184 -0
- package/dist/base-image/agent-wrapper.sh +143 -0
- package/dist/base-image/apply-local-state.sh +357 -0
- package/dist/base-image/coder-git-credential-helper +307 -0
- package/dist/base-image/entrypoint.sh +942 -0
- package/dist/base-image/ssh_config_template +41 -0
- package/dist/base-image/start-code-server.sh +76 -0
- package/dist/base-image/sync-repos.sh +170 -0
- package/dist/base-image/vscode-extensions.txt +10 -0
- package/dist/base-image/vscode-settings.json +41 -0
- package/dist/coder-server.js +2 -0
- package/dist/config/cli-models.json +45 -0
- package/dist/config/imported-skills.schema.json +83 -0
- package/dist/config/skill-catalog.json +18 -0
- package/dist/config/skill-catalog.schema.json +140 -0
- package/dist/config.js +1 -0
- package/dist/examples/oidc.json.example +11 -0
- package/dist/lib/agent-keepalive.js +1 -0
- package/dist/lib/api-keys.js +1 -0
- package/dist/lib/apiKeys.js +1 -0
- package/dist/lib/auto-judge.js +1 -0
- package/dist/lib/basic-auth.js +1 -0
- package/dist/lib/build-history.js +1 -0
- package/dist/lib/build-output-service.js +1 -0
- package/dist/lib/build-scheduler.js +1 -0
- package/dist/lib/build-service.js +1 -0
- package/dist/lib/claude-oauth-refresh.js +1 -0
- package/dist/lib/cli/build.js +1 -0
- package/dist/lib/cli/config-command.js +1 -0
- package/dist/lib/cli/config.js +1 -0
- package/dist/lib/cli/create-user.js +1 -0
- package/dist/lib/cli/init.js +1 -0
- package/dist/lib/cli/jira.js +1 -0
- package/dist/lib/cli/license.js +1 -0
- package/dist/lib/cli/server-manager.js +1 -0
- package/dist/lib/container-tokens.js +1 -0
- package/dist/lib/data-dir.js +1 -0
- package/dist/lib/deployment-history.js +1 -0
- package/dist/lib/deployment-service.js +1 -0
- package/dist/lib/docker-utils.js +1 -0
- package/dist/lib/email.js +1 -0
- package/dist/lib/emailTemplates.js +1 -0
- package/dist/lib/entitlement.js +1 -0
- package/dist/lib/fetch-utils.js +1 -0
- package/dist/lib/git-provider-service.js +1 -0
- package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
- package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
- package/dist/lib/git-provider-setup/index.js +1 -0
- package/dist/lib/git-provider-setup/setup-factory.js +1 -0
- package/dist/lib/git-provider-setup/setup-interface.js +1 -0
- package/dist/lib/git-providers/azure-devops-provider.js +1 -0
- package/dist/lib/git-providers/github-app-provider.js +1 -0
- package/dist/lib/git-providers/index.js +1 -0
- package/dist/lib/git-providers/provider-factory.js +1 -0
- package/dist/lib/git-providers/provider-interface.js +1 -0
- package/dist/lib/jira-client.js +1 -0
- package/dist/lib/logger.js +1 -0
- package/dist/lib/model-fetcher.js +1 -0
- package/dist/lib/notifications.js +1 -0
- package/dist/lib/oidc-auth.js +1 -0
- package/dist/lib/oidc-device-flow.js +1 -0
- package/dist/lib/passwordTokens.js +1 -0
- package/dist/lib/pin-cascade.js +1 -0
- package/dist/lib/provider-accounts.js +1 -0
- package/dist/lib/provider-oauth.js +1 -0
- package/dist/lib/provider-profile.js +1 -0
- package/dist/lib/provider-token-refresh.js +1 -0
- package/dist/lib/roles.js +1 -0
- package/dist/lib/secrets.js +1 -0
- package/dist/lib/state-capture.js +1 -0
- package/dist/lib/static-files.js +1 -0
- package/dist/lib/task-name-generator.js +1 -0
- package/dist/lib/users.js +1 -0
- package/dist/middleware/requireAuth.js +1 -0
- package/dist/middleware/requireInit.js +1 -0
- package/dist/middleware/requirePermission.js +1 -0
- package/dist/package-lock.json +4151 -0
- package/dist/package.json +50 -0
- package/dist/routes/apiKeys.js +1 -0
- package/dist/routes/auth-oidc.js +1 -0
- package/dist/routes/auth.js +1 -0
- package/dist/routes/build.js +1 -0
- package/dist/routes/containers.js +1 -0
- package/dist/routes/deploy-task.js +1 -0
- package/dist/routes/environment-management.js +1 -0
- package/dist/routes/environments.js +1 -0
- package/dist/routes/external-skills.js +1 -0
- package/dist/routes/git-credentials.js +1 -0
- package/dist/routes/git-provider-setup.js +1 -0
- package/dist/routes/health.js +1 -0
- package/dist/routes/jira.js +1 -0
- package/dist/routes/objective-management.js +1 -0
- package/dist/routes/password.js +1 -0
- package/dist/routes/prompt.js +1 -0
- package/dist/routes/provider-auth.js +1 -0
- package/dist/routes/qa.js +1 -0
- package/dist/routes/settings.js +1 -0
- package/dist/routes/skill-management.js +1 -0
- package/dist/routes/skills.js +1 -0
- package/dist/routes/tasks.js +2 -0
- package/dist/routes/templates.js +1 -0
- package/dist/routes/test-task.js +1 -0
- package/dist/routes/test.js +1 -0
- package/dist/routes/users.js +1 -0
- package/dist/routes/visualizations.js +1 -0
- package/dist/schemas/template-metadata.schema.json +178 -0
- package/dist/scripts/create-user.js +2 -0
- package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
- package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
- package/dist/shipped-skills/objective-management/SKILL.md +238 -0
- package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
- package/dist/start.js +2 -0
- package/dist/web-ui/public/activity-detail-modal.js +1 -0
- package/dist/web-ui/public/activity-feed.js +1 -0
- package/dist/web-ui/public/activity-formatters.js +1 -0
- package/dist/web-ui/public/agent-event-parser.js +1 -0
- package/dist/web-ui/public/app.js +1 -0
- package/dist/web-ui/public/approve-dialog.js +1 -0
- package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
- package/dist/web-ui/public/coderflow-logo.svg +46 -0
- package/dist/web-ui/public/comments-widget.js +1 -0
- package/dist/web-ui/public/docs/.nojekyll +0 -0
- package/dist/web-ui/public/docs/README.md +26 -0
- package/dist/web-ui/public/docs/_sidebar.md +47 -0
- package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
- package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
- package/dist/web-ui/public/docs/admin/environments.md +215 -0
- package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
- package/dist/web-ui/public/docs/admin/installation.md +313 -0
- package/dist/web-ui/public/docs/admin/skills.md +35 -0
- package/dist/web-ui/public/docs/admin/sso.md +241 -0
- package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
- package/dist/web-ui/public/docs/code/cli.md +102 -0
- package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
- package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
- package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
- package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
- package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
- package/dist/web-ui/public/docs/index.html +151 -0
- package/dist/web-ui/public/docs/integrations/custom.md +58 -0
- package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
- package/dist/web-ui/public/docs/integrations/overview.md +48 -0
- package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
- package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
- package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
- package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
- package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
- package/dist/web-ui/public/docs/tasks/judging.md +114 -0
- package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
- package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
- package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
- package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
- package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
- package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
- package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
- package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
- package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
- package/dist/web-ui/public/environments.css +3942 -0
- package/dist/web-ui/public/environments.html +1791 -0
- package/dist/web-ui/public/environments.js +1 -0
- package/dist/web-ui/public/favicon-16.png +0 -0
- package/dist/web-ui/public/favicon-32.png +0 -0
- package/dist/web-ui/public/favicon.ico +0 -0
- package/dist/web-ui/public/feedback-widget.css +3133 -0
- package/dist/web-ui/public/feedback-widget.js +1 -0
- package/dist/web-ui/public/git-history.css +2663 -0
- package/dist/web-ui/public/git-history.html +272 -0
- package/dist/web-ui/public/git-history.js +1 -0
- package/dist/web-ui/public/git-status.js +1 -0
- package/dist/web-ui/public/index.html +1459 -0
- package/dist/web-ui/public/index.js +1 -0
- package/dist/web-ui/public/login.html +346 -0
- package/dist/web-ui/public/login.js +1 -0
- package/dist/web-ui/public/markdown-editor.js +1 -0
- package/dist/web-ui/public/markdown-file-editor.js +1 -0
- package/dist/web-ui/public/modal-maximize.js +1 -0
- package/dist/web-ui/public/notifications.js +1 -0
- package/dist/web-ui/public/server-health.js +1 -0
- package/dist/web-ui/public/settings.css +761 -0
- package/dist/web-ui/public/settings.html +1044 -0
- package/dist/web-ui/public/settings.js +1 -0
- package/dist/web-ui/public/setup-password.html +355 -0
- package/dist/web-ui/public/setup-password.js +1 -0
- package/dist/web-ui/public/skills.css +1949 -0
- package/dist/web-ui/public/skills.html +820 -0
- package/dist/web-ui/public/skills.js +1 -0
- package/dist/web-ui/public/sse-client.js +1 -0
- package/dist/web-ui/public/sse-shared-worker.js +1 -0
- package/dist/web-ui/public/styles.css +18614 -0
- package/dist/web-ui/public/task.html +1779 -0
- package/dist/web-ui/public/task.js +1 -0
- package/dist/web-ui/public/terminal.html +45 -0
- package/dist/web-ui/public/terminal.js +1 -0
- package/dist/web-ui/public/theme.js +1 -0
- package/dist/web-ui/public/users.html +298 -0
- package/dist/web-ui/public/users.js +1 -0
- package/dist/web-ui/public/variant-grouping.js +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,1459 @@
|
|
|
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>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=83">
|
|
26
|
+
<link rel="stylesheet" href="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.css">
|
|
27
|
+
<link rel="stylesheet" href="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.css">
|
|
28
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js"></script>
|
|
29
|
+
<script src="https://cdn.jsdelivr.net/npm/turndown@7.1.2/dist/turndown.js"></script>
|
|
30
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.3.0/fabric.min.js"></script>
|
|
31
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/cropperjs@1.6.1/dist/cropper.min.css">
|
|
32
|
+
<script src="https://cdn.jsdelivr.net/npm/cropperjs@1.6.1/dist/cropper.min.js"></script>
|
|
33
|
+
<script src="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.js"></script>
|
|
34
|
+
<script src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script>
|
|
35
|
+
<script type="module" src="markdown-editor.js?v=1"></script>
|
|
36
|
+
<script type="module" src="comments-widget.js?v=1"></script>
|
|
37
|
+
<script type="module" src="index.js?v=83"></script>
|
|
38
|
+
<!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<main class="layout">
|
|
42
|
+
<!-- Notification Permission Banner -->
|
|
43
|
+
<div id="notification-banner" class="notification-banner" hidden>
|
|
44
|
+
<div class="notification-banner-content">
|
|
45
|
+
<div class="notification-banner-icon">
|
|
46
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
47
|
+
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path>
|
|
48
|
+
<path d="M13.73 21a2 2 0 0 1-3.46 0"></path>
|
|
49
|
+
</svg>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="notification-banner-text">
|
|
52
|
+
<strong>Enable Desktop Notifications</strong>
|
|
53
|
+
<span>Stay informed when your tasks complete</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="notification-banner-actions">
|
|
56
|
+
<button type="button" class="btn-ghost btn-small" id="dismiss-notifications-btn">Dismiss</button>
|
|
57
|
+
<button type="button" class="btn-primary btn-small" id="enable-notifications-btn">Enable Notifications</button>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="top-bar">
|
|
63
|
+
<div class="brand">
|
|
64
|
+
<img src="coderflow-logo.svg" alt="CoderFlow" class="brand-logo brand-logo-light" style="height: 40px; width: auto;">
|
|
65
|
+
<img src="coderflow-logo-reversed.svg" alt="CoderFlow" class="brand-logo brand-logo-dark" style="height: 40px; width: auto;">
|
|
66
|
+
</div>
|
|
67
|
+
<div class="header-actions">
|
|
68
|
+
<div class="user-filter-group">
|
|
69
|
+
<select id="user-filter-select" aria-label="User filter" hidden>
|
|
70
|
+
<option value="me">My Tasks</option>
|
|
71
|
+
<option value="all">All Tasks</option>
|
|
72
|
+
</select>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="admin-menu-container" id="admin-menu-container" hidden>
|
|
75
|
+
<button class="btn-icon-admin" id="admin-menu-btn" title="Admin">
|
|
76
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
77
|
+
<circle cx="12" cy="12" r="3"></circle>
|
|
78
|
+
<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>
|
|
79
|
+
</svg>
|
|
80
|
+
</button>
|
|
81
|
+
<div class="dropdown-menu admin-dropdown" id="admin-menu" hidden>
|
|
82
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='users.html'">
|
|
83
|
+
<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">
|
|
84
|
+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
|
|
85
|
+
<circle cx="9" cy="7" r="4"></circle>
|
|
86
|
+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
|
|
87
|
+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
|
|
88
|
+
</svg>
|
|
89
|
+
<span class="option-text">Users</span>
|
|
90
|
+
</button>
|
|
91
|
+
<button type="button" class="dropdown-item admin-menu-item" id="environments-btn">
|
|
92
|
+
<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">
|
|
93
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
94
|
+
<line x1="2" y1="12" x2="22" y2="12"></line>
|
|
95
|
+
<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>
|
|
96
|
+
</svg>
|
|
97
|
+
<span class="option-text">Environments</span>
|
|
98
|
+
</button>
|
|
99
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
|
|
100
|
+
<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">
|
|
101
|
+
<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>
|
|
102
|
+
</svg>
|
|
103
|
+
<span class="option-text">Skills</span>
|
|
104
|
+
</button>
|
|
105
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='settings.html'">
|
|
106
|
+
<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">
|
|
107
|
+
<line x1="4" y1="21" x2="4" y2="14"></line>
|
|
108
|
+
<line x1="4" y1="10" x2="4" y2="3"></line>
|
|
109
|
+
<line x1="12" y1="21" x2="12" y2="12"></line>
|
|
110
|
+
<line x1="12" y1="8" x2="12" y2="3"></line>
|
|
111
|
+
<line x1="20" y1="21" x2="20" y2="16"></line>
|
|
112
|
+
<line x1="20" y1="12" x2="20" y2="3"></line>
|
|
113
|
+
<line x1="1" y1="14" x2="7" y2="14"></line>
|
|
114
|
+
<line x1="9" y1="8" x2="15" y2="8"></line>
|
|
115
|
+
<line x1="17" y1="16" x2="23" y2="16"></line>
|
|
116
|
+
</svg>
|
|
117
|
+
<span class="option-text">Server Settings</span>
|
|
118
|
+
</button>
|
|
119
|
+
<button type="button" class="dropdown-item admin-menu-item" id="server-health-btn">
|
|
120
|
+
<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">
|
|
121
|
+
<path d="M22 12h-4l-3 9L9 3l-3 9H2"></path>
|
|
122
|
+
</svg>
|
|
123
|
+
<span class="option-text">Server Health</span>
|
|
124
|
+
</button>
|
|
125
|
+
<button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='git-history.html'">
|
|
126
|
+
<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">
|
|
127
|
+
<circle cx="6" cy="6" r="2"></circle>
|
|
128
|
+
<circle cx="6" cy="18" r="2"></circle>
|
|
129
|
+
<circle cx="18" cy="12" r="2"></circle>
|
|
130
|
+
<path d="M6 8v8"></path>
|
|
131
|
+
<path d="M6 12h10"></path>
|
|
132
|
+
</svg>
|
|
133
|
+
<span class="option-text">Git History</span>
|
|
134
|
+
</button>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
<!-- User Menu Dropdown -->
|
|
138
|
+
<div class="user-menu-container" id="user-menu-container">
|
|
139
|
+
<button class="user-avatar-btn" id="user-avatar-btn" title="User menu">
|
|
140
|
+
<span class="user-avatar" id="user-avatar">
|
|
141
|
+
<span class="user-avatar-initials" id="user-avatar-initials">--</span>
|
|
142
|
+
<img class="user-avatar-image" id="user-avatar-image" alt="Avatar" hidden>
|
|
143
|
+
</span>
|
|
144
|
+
<svg class="avatar-chevron" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
|
|
145
|
+
<polyline points="6 9 12 15 18 9"></polyline>
|
|
146
|
+
</svg>
|
|
147
|
+
</button>
|
|
148
|
+
<div class="dropdown-menu user-dropdown" id="user-menu" hidden>
|
|
149
|
+
<div class="user-menu-header">
|
|
150
|
+
<span class="user-menu-name" id="user-menu-name">User</span>
|
|
151
|
+
<span class="user-menu-email" id="user-menu-email"></span>
|
|
152
|
+
</div>
|
|
153
|
+
<button type="button" class="dropdown-item user-menu-item" id="profile-settings-btn">
|
|
154
|
+
<svg class="menu-icon" 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="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
|
|
156
|
+
<circle cx="12" cy="7" r="4"></circle>
|
|
157
|
+
</svg>
|
|
158
|
+
<span>Profile Settings</span>
|
|
159
|
+
</button>
|
|
160
|
+
<div class="dropdown-divider"></div>
|
|
161
|
+
<div class="user-menu-item preference-row">
|
|
162
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
163
|
+
<circle cx="12" cy="12" r="5"></circle>
|
|
164
|
+
<line x1="12" y1="1" x2="12" y2="3"></line>
|
|
165
|
+
<line x1="12" y1="21" x2="12" y2="23"></line>
|
|
166
|
+
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
|
167
|
+
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
|
168
|
+
<line x1="1" y1="12" x2="3" y2="12"></line>
|
|
169
|
+
<line x1="21" y1="12" x2="23" y2="12"></line>
|
|
170
|
+
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
|
171
|
+
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
|
172
|
+
</svg>
|
|
173
|
+
<span>Theme</span>
|
|
174
|
+
<div id="theme-toggle-container" class="preference-toggle-slot"></div>
|
|
175
|
+
</div>
|
|
176
|
+
<label class="user-menu-item preference-row notification-row" id="notification-toggle" title="Desktop notifications when tasks complete">
|
|
177
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
178
|
+
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path>
|
|
179
|
+
<path d="M13.73 21a2 2 0 0 1-3.46 0"></path>
|
|
180
|
+
</svg>
|
|
181
|
+
<span>Notifications</span>
|
|
182
|
+
<div class="preference-toggle-slot">
|
|
183
|
+
<input type="checkbox" id="notification-checkbox" class="toggle-switch">
|
|
184
|
+
</div>
|
|
185
|
+
</label>
|
|
186
|
+
<a href="/docs/" target="_blank" rel="noopener" class="dropdown-item user-menu-item" id="docs-link">
|
|
187
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
188
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
189
|
+
<path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
|
|
190
|
+
<line x1="12" y1="17" x2="12.01" y2="17"></line>
|
|
191
|
+
</svg>
|
|
192
|
+
<span>Documentation</span>
|
|
193
|
+
</a>
|
|
194
|
+
<a href="/dev-docs/" target="_blank" rel="noopener" class="dropdown-item user-menu-item" id="dev-docs-link" hidden>
|
|
195
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
196
|
+
<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>
|
|
197
|
+
</svg>
|
|
198
|
+
<span>Dev Docs</span>
|
|
199
|
+
</a>
|
|
200
|
+
<div class="dropdown-divider"></div>
|
|
201
|
+
<button type="button" class="dropdown-item user-menu-item" id="about-coderflow-btn">
|
|
202
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
203
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
204
|
+
<line x1="12" y1="16" x2="12" y2="12"></line>
|
|
205
|
+
<line x1="12" y1="8" x2="12.01" y2="8"></line>
|
|
206
|
+
</svg>
|
|
207
|
+
<span>About CoderFlow</span>
|
|
208
|
+
</button>
|
|
209
|
+
<button type="button" class="dropdown-item user-menu-item" id="logout-btn">
|
|
210
|
+
<svg class="menu-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
211
|
+
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
|
|
212
|
+
<polyline points="16 17 21 12 16 7"></polyline>
|
|
213
|
+
<line x1="21" y1="12" x2="9" y2="12"></line>
|
|
214
|
+
</svg>
|
|
215
|
+
<span>Logout</span>
|
|
216
|
+
</button>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<section class="task-launcher" aria-label="Task launcher">
|
|
223
|
+
<form id="task-form" novalidate>
|
|
224
|
+
<!-- Environment, Template, and Quick Actions -->
|
|
225
|
+
<div class="control-row single-row-controls">
|
|
226
|
+
<div class="field-group compact flex-item">
|
|
227
|
+
<select id="environment-select" required aria-label="Environment">
|
|
228
|
+
<option value="" disabled selected hidden>Select environment</option>
|
|
229
|
+
</select>
|
|
230
|
+
</div>
|
|
231
|
+
<div class="field-group compact flex-item" id="template-field-wrapper" hidden>
|
|
232
|
+
<select id="template-select" aria-label="Headless task">
|
|
233
|
+
<option value="" disabled selected hidden>Select task template</option>
|
|
234
|
+
</select>
|
|
235
|
+
</div>
|
|
236
|
+
<div class="dropdown-container">
|
|
237
|
+
<button type="button" class="btn-ghost btn-small btn-dropdown" id="start-actions-btn" title="Quick Actions">
|
|
238
|
+
☰
|
|
239
|
+
</button>
|
|
240
|
+
<div class="dropdown-menu" id="start-actions-menu" hidden>
|
|
241
|
+
<button type="button" class="dropdown-item quick-action-item" id="branch-options-menu-item" data-action="branch-options" hidden>
|
|
242
|
+
<svg class="option-icon icon-branch" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
243
|
+
<line x1="6" y1="3" x2="6" y2="15"></line>
|
|
244
|
+
<circle cx="18" cy="6" r="3"></circle>
|
|
245
|
+
<circle cx="6" cy="18" r="3"></circle>
|
|
246
|
+
<path d="M18 9a9 9 0 0 1-9 9"></path>
|
|
247
|
+
</svg>
|
|
248
|
+
<span class="option-text">Branch Options...</span>
|
|
249
|
+
</button>
|
|
250
|
+
<button type="button" class="dropdown-item quick-action-item" id="run-test-menu-item" data-action="run-test" hidden>
|
|
251
|
+
<svg class="option-icon icon-test" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
252
|
+
<polyline points="9 11 12 14 22 4"></polyline>
|
|
253
|
+
<path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path>
|
|
254
|
+
</svg>
|
|
255
|
+
<span class="option-text">Run Tests...</span>
|
|
256
|
+
</button>
|
|
257
|
+
<button type="button" class="dropdown-item quick-action-item" id="run-deploy-menu-item" data-action="run-deploy" hidden>
|
|
258
|
+
<svg class="option-icon icon-deploy" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
259
|
+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
260
|
+
<polyline points="17 8 12 3 7 8"></polyline>
|
|
261
|
+
<line x1="12" y1="3" x2="12" y2="15"></line>
|
|
262
|
+
</svg>
|
|
263
|
+
<span class="option-text">Deploy...</span>
|
|
264
|
+
</button>
|
|
265
|
+
<button type="button" class="dropdown-item quick-action-item" data-action="claude">
|
|
266
|
+
<svg class="option-icon icon-claude" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
267
|
+
<path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 4.212z"/>
|
|
268
|
+
</svg>
|
|
269
|
+
<span class="option-text">New Claude Session</span>
|
|
270
|
+
</button>
|
|
271
|
+
<button type="button" class="dropdown-item quick-action-item" data-action="codex">
|
|
272
|
+
<svg class="option-icon icon-codex" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
273
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/>
|
|
274
|
+
</svg>
|
|
275
|
+
<span class="option-text">New Codex Session</span>
|
|
276
|
+
</button>
|
|
277
|
+
<button type="button" class="dropdown-item quick-action-item" data-action="gemini">
|
|
278
|
+
<svg class="option-icon icon-gemini" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
279
|
+
<path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
|
|
280
|
+
</svg>
|
|
281
|
+
<span class="option-text">New Gemini Session</span>
|
|
282
|
+
</button>
|
|
283
|
+
<button type="button" class="dropdown-item quick-action-item" data-action="terminal">
|
|
284
|
+
<svg class="option-icon icon-terminal" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
285
|
+
<polyline points="4 17 10 11 4 5"></polyline>
|
|
286
|
+
<line x1="12" y1="19" x2="20" y2="19"></line>
|
|
287
|
+
</svg>
|
|
288
|
+
<span class="option-text">Terminal (New Container)</span>
|
|
289
|
+
</button>
|
|
290
|
+
<div class="dropdown-divider qa-divider" id="qa-divider" hidden></div>
|
|
291
|
+
<div id="qa-menu-items">
|
|
292
|
+
<!-- QA menu items will be populated dynamically based on environment config -->
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<div id="parameter-fields" class="parameter-fields" hidden></div>
|
|
299
|
+
|
|
300
|
+
<div class="instructions-container">
|
|
301
|
+
<!-- Jira Link Badge (hidden by default) -->
|
|
302
|
+
<div id="jiraLinkBadge" class="jira-link-badge" style="display: none;">
|
|
303
|
+
<span class="jira-icon">📋</span>
|
|
304
|
+
<span>Linked to <a id="jiraBadgeLink" href="" target="_blank" rel="noopener"></a></span>
|
|
305
|
+
<button type="button" id="unlinkJiraBtn" class="btn-icon" title="Unlink Jira issue">×</button>
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
<textarea id="instructions" rows="2" placeholder="Additional Instructions" aria-label="Additional Instructions"></textarea>
|
|
309
|
+
|
|
310
|
+
<div id="task-name-row" class="task-name-row" hidden>
|
|
311
|
+
<input type="text" id="task-name-input" placeholder="Name this task" aria-label="Task name" maxlength="120">
|
|
312
|
+
<div class="save-options-group">
|
|
313
|
+
<button type="button" class="btn-save-options" id="save-options-btn" title="Stage task or save as objective" aria-haspopup="true" aria-expanded="false">
|
|
314
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
315
|
+
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
|
|
316
|
+
<polyline points="17 21 17 13 7 13 7 21"></polyline>
|
|
317
|
+
<polyline points="7 3 7 8 15 8"></polyline>
|
|
318
|
+
</svg>
|
|
319
|
+
<svg class="dropdown-chevron" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
|
|
320
|
+
<polyline points="6 9 12 15 18 9"></polyline>
|
|
321
|
+
</svg>
|
|
322
|
+
</button>
|
|
323
|
+
<div class="save-options-menu" id="save-options-menu" hidden>
|
|
324
|
+
<button type="button" class="save-options-item" id="stage-task-btn" data-action="stage" title="Stage Task (Ctrl+Shift+Enter)">
|
|
325
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
326
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
327
|
+
<line x1="9" y1="9" x2="15" y2="9"></line>
|
|
328
|
+
<line x1="9" y1="15" x2="15" y2="15"></line>
|
|
329
|
+
</svg>
|
|
330
|
+
<span>Stage Task</span>
|
|
331
|
+
</button>
|
|
332
|
+
<button type="button" class="save-options-item" id="save-objective-btn" data-action="save-objective" title="Save as Objective (Ctrl+S)">
|
|
333
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
334
|
+
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
|
|
335
|
+
<polyline points="17 21 17 13 7 13 7 21"></polyline>
|
|
336
|
+
<polyline points="7 3 7 8 15 8"></polyline>
|
|
337
|
+
</svg>
|
|
338
|
+
<span>Save as Objective</span>
|
|
339
|
+
</button>
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
<button type="button" class="btn-icon-mini" id="clear-task-name-btn" title="Clear task name">
|
|
343
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
|
|
344
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
345
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
346
|
+
</svg>
|
|
347
|
+
</button>
|
|
348
|
+
</div>
|
|
349
|
+
|
|
350
|
+
<!-- Hidden file input -->
|
|
351
|
+
<input type="file" id="file-attachments" multiple accept="*/*" hidden aria-label="Attach files">
|
|
352
|
+
|
|
353
|
+
<!-- Attached files list (shown when files are selected) -->
|
|
354
|
+
<div id="attached-files-list" class="attached-files-list" hidden></div>
|
|
355
|
+
|
|
356
|
+
<div class="textarea-controls">
|
|
357
|
+
<div class="textarea-controls-left">
|
|
358
|
+
<!-- Options Menu -->
|
|
359
|
+
<div class="options-menu-container">
|
|
360
|
+
<button type="button" class="btn-icon-mini" id="options-menu-btn" title="Settings">
|
|
361
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
362
|
+
<circle cx="12" cy="12" r="3"></circle>
|
|
363
|
+
<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>
|
|
364
|
+
</svg>
|
|
365
|
+
</button>
|
|
366
|
+
<div class="dropdown-menu" id="options-menu" hidden>
|
|
367
|
+
<button type="button" class="dropdown-item options-menu-item" id="auto-pin-btn">
|
|
368
|
+
<span class="option-icon pin-icon">📌</span>
|
|
369
|
+
<span class="option-text">Auto-pin new tasks</span>
|
|
370
|
+
<span class="setting-badge" id="auto-pin-badge" hidden>✓</span>
|
|
371
|
+
</button>
|
|
372
|
+
<button type="button" class="dropdown-item options-menu-item" id="auto-judge-settings-btn">
|
|
373
|
+
<svg class="option-icon" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="#b8860b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
374
|
+
<path d="M6 6h12"></path>
|
|
375
|
+
<path d="M12 6v12"></path>
|
|
376
|
+
<path d="M8 18h8"></path>
|
|
377
|
+
<path d="M6 6l-3 5h6l-3-5z"></path>
|
|
378
|
+
<path d="M18 6l-3 5h6l-3-5z"></path>
|
|
379
|
+
</svg>
|
|
380
|
+
<span class="option-text">Auto-judge group tasks...</span>
|
|
381
|
+
<span class="setting-badge" id="auto-judge-badge" hidden>✓</span>
|
|
382
|
+
</button>
|
|
383
|
+
<button type="button" class="dropdown-item options-menu-item" id="open-new-tab-btn">
|
|
384
|
+
<svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#3b82f6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
385
|
+
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
|
386
|
+
<polyline points="15 3 21 3 21 9"></polyline>
|
|
387
|
+
<line x1="10" y1="14" x2="21" y2="3"></line>
|
|
388
|
+
</svg>
|
|
389
|
+
<span class="option-text">Open tasks in new tab</span>
|
|
390
|
+
<span class="setting-badge" id="open-new-tab-badge" hidden>✓</span>
|
|
391
|
+
</button>
|
|
392
|
+
<button type="button" class="dropdown-item options-menu-item" id="importFromJiraBtn" style="display: none;">
|
|
393
|
+
<svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
|
|
394
|
+
<path d="M11.53 2c0 2.4 1.97 4.35 4.35 4.35h1.78v1.7c0 2.4 1.94 4.34 4.34 4.35V2.84a.84.84 0 0 0-.84-.84h-9.63Z" fill="#2684FF"/>
|
|
395
|
+
<path d="M6.77 6.8a4.36 4.36 0 0 0 4.34 4.34h1.8v1.72a4.36 4.36 0 0 0 4.34 4.34V7.63a.84.84 0 0 0-.83-.83H6.77Z" fill="url(#jira-grad-1)"/>
|
|
396
|
+
<path d="M2 11.6a4.35 4.35 0 0 0 4.35 4.34h1.78v1.72A4.35 4.35 0 0 0 12.47 22v-9.57a.84.84 0 0 0-.84-.83H2Z" fill="url(#jira-grad-2)"/>
|
|
397
|
+
<defs>
|
|
398
|
+
<linearGradient id="jira-grad-1" x1="12.82" y1="6.83" x2="9.2" y2="10.55" gradientUnits="userSpaceOnUse">
|
|
399
|
+
<stop stop-color="#0052CC"/>
|
|
400
|
+
<stop offset="1" stop-color="#2684FF"/>
|
|
401
|
+
</linearGradient>
|
|
402
|
+
<linearGradient id="jira-grad-2" x1="8.06" y1="11.64" x2="4.34" y2="15.44" gradientUnits="userSpaceOnUse">
|
|
403
|
+
<stop stop-color="#0052CC"/>
|
|
404
|
+
<stop offset="1" stop-color="#2684FF"/>
|
|
405
|
+
</linearGradient>
|
|
406
|
+
</defs>
|
|
407
|
+
</svg>
|
|
408
|
+
<span class="option-text">Import from Jira...</span>
|
|
409
|
+
</button>
|
|
410
|
+
</div>
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
<button type="button" class="btn-icon-mini" id="toggle-task-name-btn" title="Name and save (F2)">
|
|
414
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
415
|
+
<path d="M20.59 13.41a2 2 0 0 0 0-2.82l-7.18-7.18A2 2 0 0 0 11 3H5a2 2 0 0 0-2 2v6a2 2 0 0 0 .59 1.41l7.18 7.18a2 2 0 0 0 2.82 0Z"></path>
|
|
416
|
+
<path d="M7 7h.01"></path>
|
|
417
|
+
</svg>
|
|
418
|
+
</button>
|
|
419
|
+
<!-- File Attachment Icons -->
|
|
420
|
+
<button type="button" class="btn-icon-mini" id="attach-files-btn" title="Attach files">
|
|
421
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
422
|
+
<path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
|
|
423
|
+
</svg>
|
|
424
|
+
</button>
|
|
425
|
+
<button type="button" class="btn-icon-mini" id="capture-screenshot-btn" title="Capture screenshot">
|
|
426
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
427
|
+
<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path>
|
|
428
|
+
<circle cx="12" cy="13" r="4"></circle>
|
|
429
|
+
</svg>
|
|
430
|
+
</button>
|
|
431
|
+
|
|
432
|
+
<!-- Separator -->
|
|
433
|
+
<div class="control-separator"></div>
|
|
434
|
+
|
|
435
|
+
<!-- Agent Selection -->
|
|
436
|
+
<div class="agent-selector" role="group" aria-label="Agent selection">
|
|
437
|
+
<div class="agent-card" data-agent="claude" data-count="0">
|
|
438
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Claude count" title="Remove Claude">−</button>
|
|
439
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Claude" title="Claude (Alt+1) (click to add, right-click to remove)">
|
|
440
|
+
<svg viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
441
|
+
<path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 4.212z"/>
|
|
442
|
+
</svg>
|
|
443
|
+
</div>
|
|
444
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Claude count" title="Add Claude">+</button>
|
|
445
|
+
<div class="agent-count-badge" id="claude-count-display">0</div>
|
|
446
|
+
<input type="number" min="0" max="5" step="1" id="claude-count" value="0" hidden readonly aria-label="Number of Claude containers">
|
|
447
|
+
</div>
|
|
448
|
+
<div class="agent-card" data-agent="codex" data-count="0">
|
|
449
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Codex count" title="Remove Codex">−</button>
|
|
450
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Codex" title="Codex (Alt+2) (click to add, right-click to remove)">
|
|
451
|
+
<svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
452
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/>
|
|
453
|
+
</svg>
|
|
454
|
+
</div>
|
|
455
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Codex count" title="Add Codex">+</button>
|
|
456
|
+
<div class="agent-count-badge" id="codex-count-display">0</div>
|
|
457
|
+
<input type="number" min="0" max="5" step="1" id="codex-count" value="0" hidden readonly aria-label="Number of Codex containers">
|
|
458
|
+
</div>
|
|
459
|
+
<div class="agent-card" data-agent="gemini" data-count="0">
|
|
460
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Gemini count" title="Remove Gemini">−</button>
|
|
461
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Gemini" title="Gemini (Alt+3) (click to add, right-click to remove)">
|
|
462
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
463
|
+
<path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
|
|
464
|
+
</svg>
|
|
465
|
+
</div>
|
|
466
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Gemini count" title="Add Gemini">+</button>
|
|
467
|
+
<div class="agent-count-badge" id="gemini-count-display">0</div>
|
|
468
|
+
<input type="number" min="0" max="5" step="1" id="gemini-count" value="0" hidden readonly aria-label="Number of Gemini containers">
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
|
|
472
|
+
<!-- Agent Selection Hint -->
|
|
473
|
+
<div class="agent-hint" data-visible="false">
|
|
474
|
+
<span class="agent-hint-arrow">←</span>
|
|
475
|
+
<span class="agent-hint-text">Select Agents</span>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
|
|
479
|
+
<button type="submit" class="btn-icon-launch" id="submit-task-btn" title="Launch task (Ctrl+Enter)">➤</button>
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
|
|
483
|
+
<div class="form-footer" id="form-footer" hidden>
|
|
484
|
+
<div id="form-message" class="form-message" role="status" aria-live="polite"></div>
|
|
485
|
+
</div>
|
|
486
|
+
</form>
|
|
487
|
+
</section>
|
|
488
|
+
|
|
489
|
+
<section class="task-board" aria-labelledby="tasks-heading">
|
|
490
|
+
<div class="task-board-header">
|
|
491
|
+
<div class="task-board-header-actions">
|
|
492
|
+
<!-- Search -->
|
|
493
|
+
<div class="task-search-wrapper">
|
|
494
|
+
<button type="button" class="btn-ghost btn-small" id="toggle-search-btn" title="Search tasks (Ctrl+F)">
|
|
495
|
+
<svg class="search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
496
|
+
<circle cx="11" cy="11" r="8"></circle>
|
|
497
|
+
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
|
498
|
+
</svg>
|
|
499
|
+
</button>
|
|
500
|
+
<div class="task-search-container" id="task-search-container" hidden>
|
|
501
|
+
<svg class="task-search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
502
|
+
<circle cx="11" cy="11" r="8"></circle>
|
|
503
|
+
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
|
504
|
+
</svg>
|
|
505
|
+
<input type="text" id="task-search-input" placeholder="Search name or instructions..." autocomplete="off" />
|
|
506
|
+
<button type="button" class="task-search-close" id="close-search-btn" title="Close search">
|
|
507
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
508
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
509
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
510
|
+
</svg>
|
|
511
|
+
</button>
|
|
512
|
+
</div>
|
|
513
|
+
</div>
|
|
514
|
+
<!-- Filter -->
|
|
515
|
+
<div class="task-filter-wrapper">
|
|
516
|
+
<button type="button" class="btn-ghost btn-small" id="toggle-filter-btn" title="Filter tasks">
|
|
517
|
+
<svg class="filter-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
518
|
+
<polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"></polygon>
|
|
519
|
+
</svg>
|
|
520
|
+
<span class="filter-badge" id="filter-badge" hidden>0</span>
|
|
521
|
+
</button>
|
|
522
|
+
<div class="task-filter-dropdown" id="task-filter-dropdown" hidden>
|
|
523
|
+
<div class="filter-section">
|
|
524
|
+
<div class="filter-section-title">Status</div>
|
|
525
|
+
<div class="filter-options filter-options-pills">
|
|
526
|
+
<button type="button" class="filter-pill" data-status="objective">Objective</button>
|
|
527
|
+
<button type="button" class="filter-pill" data-status="staged">Staged</button>
|
|
528
|
+
<button type="button" class="filter-pill" data-status="running">Running</button>
|
|
529
|
+
<button type="button" class="filter-pill" data-status="completed">Completed</button>
|
|
530
|
+
<button type="button" class="filter-pill" data-status="failed">Failed</button>
|
|
531
|
+
</div>
|
|
532
|
+
</div>
|
|
533
|
+
<div class="filter-section">
|
|
534
|
+
<div class="filter-section-title">Agent</div>
|
|
535
|
+
<div class="filter-options filter-options-pills">
|
|
536
|
+
<button type="button" class="filter-pill" data-agent="claude">
|
|
537
|
+
<svg class="filter-pill-icon" viewBox="0 0 16 16" fill="currentColor" width="14" height="14">
|
|
538
|
+
<path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 4.212z"/>
|
|
539
|
+
</svg>
|
|
540
|
+
Claude
|
|
541
|
+
</button>
|
|
542
|
+
<button type="button" class="filter-pill" data-agent="codex">
|
|
543
|
+
<svg class="filter-pill-icon" viewBox="0 0 24 24" fill="currentColor" width="14" height="14">
|
|
544
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/>
|
|
545
|
+
</svg>
|
|
546
|
+
Codex
|
|
547
|
+
</button>
|
|
548
|
+
<button type="button" class="filter-pill" data-agent="gemini">
|
|
549
|
+
<svg class="filter-pill-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14">
|
|
550
|
+
<path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
|
|
551
|
+
</svg>
|
|
552
|
+
Gemini
|
|
553
|
+
</button>
|
|
554
|
+
</div>
|
|
555
|
+
</div>
|
|
556
|
+
<div class="filter-section">
|
|
557
|
+
<div class="filter-section-title">Environment</div>
|
|
558
|
+
<div class="filter-options">
|
|
559
|
+
<select id="filter-environment" class="filter-select">
|
|
560
|
+
<option value="">All environments</option>
|
|
561
|
+
<!-- Options populated dynamically from state.templatesSummary.environments -->
|
|
562
|
+
</select>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
<div class="filter-actions">
|
|
566
|
+
<button type="button" class="btn-ghost btn-small" id="clear-filters-btn">Clear all</button>
|
|
567
|
+
</div>
|
|
568
|
+
</div>
|
|
569
|
+
</div>
|
|
570
|
+
<!-- Refresh -->
|
|
571
|
+
<button type="button" class="btn-ghost btn-small" id="refresh-tasks-btn" title="Refresh tasks">
|
|
572
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
573
|
+
<polyline points="23 4 23 10 17 10"></polyline>
|
|
574
|
+
<polyline points="1 20 1 14 7 14"></polyline>
|
|
575
|
+
<path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path>
|
|
576
|
+
</svg>
|
|
577
|
+
</button>
|
|
578
|
+
<!-- Existing actions -->
|
|
579
|
+
<button type="button" class="btn-ghost btn-small" id="toggle-selection-mode-btn" title="Select tasks">
|
|
580
|
+
<span class="selection-icon">☑</span>
|
|
581
|
+
</button>
|
|
582
|
+
<!-- Collapse/Expand All buttons (only visible in Objectives view) -->
|
|
583
|
+
<button type="button" class="btn-ghost btn-small objectives-only-btn" id="collapse-all-objectives-btn" title="Collapse all objectives" hidden>
|
|
584
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
585
|
+
<polyline points="4 14 10 14 10 20"></polyline>
|
|
586
|
+
<polyline points="20 10 14 10 14 4"></polyline>
|
|
587
|
+
<line x1="14" y1="10" x2="21" y2="3"></line>
|
|
588
|
+
<line x1="3" y1="21" x2="10" y2="14"></line>
|
|
589
|
+
</svg>
|
|
590
|
+
</button>
|
|
591
|
+
<button type="button" class="btn-ghost btn-small objectives-only-btn" id="expand-all-objectives-btn" title="Expand all objectives" hidden>
|
|
592
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
593
|
+
<polyline points="15 3 21 3 21 9"></polyline>
|
|
594
|
+
<polyline points="9 21 3 21 3 15"></polyline>
|
|
595
|
+
<line x1="21" y1="3" x2="14" y2="10"></line>
|
|
596
|
+
<line x1="3" y1="21" x2="10" y2="14"></line>
|
|
597
|
+
</svg>
|
|
598
|
+
</button>
|
|
599
|
+
<div class="view-mode-tabs" role="tablist" aria-label="Task board view">
|
|
600
|
+
<button type="button" class="view-mode-tab" id="view-mode-tasks" data-view-mode="tasks" role="tab" aria-selected="true" title="Tasks view">
|
|
601
|
+
<span class="view-icon" aria-hidden="true">
|
|
602
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
603
|
+
<path d="M9 6h12"></path>
|
|
604
|
+
<path d="M9 12h12"></path>
|
|
605
|
+
<path d="M9 18h12"></path>
|
|
606
|
+
<path d="M3 6l1.5 1.5L7 5"></path>
|
|
607
|
+
<path d="M3 12l1.5 1.5L7 11"></path>
|
|
608
|
+
<path d="M3 18l1.5 1.5L7 17"></path>
|
|
609
|
+
</svg>
|
|
610
|
+
</span>
|
|
611
|
+
<span class="view-label">Tasks</span>
|
|
612
|
+
</button>
|
|
613
|
+
<button type="button" class="view-mode-tab" id="view-mode-objectives" data-view-mode="objectives" role="tab" aria-selected="false" title="Objectives view">
|
|
614
|
+
<span class="view-icon" aria-hidden="true">
|
|
615
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
616
|
+
<circle cx="12" cy="12" r="9"></circle>
|
|
617
|
+
<circle cx="12" cy="12" r="5"></circle>
|
|
618
|
+
<circle cx="12" cy="12" r="1.5" fill="currentColor" stroke="none"></circle>
|
|
619
|
+
</svg>
|
|
620
|
+
</span>
|
|
621
|
+
<span class="view-label">Objectives</span>
|
|
622
|
+
</button>
|
|
623
|
+
</div>
|
|
624
|
+
<!-- New Objective -->
|
|
625
|
+
<button type="button" class="btn-ghost btn-small" id="new-objective-btn" title="Create new objective">
|
|
626
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
627
|
+
<line x1="12" y1="5" x2="12" y2="19"></line>
|
|
628
|
+
<line x1="5" y1="12" x2="19" y2="12"></line>
|
|
629
|
+
</svg>
|
|
630
|
+
</button>
|
|
631
|
+
</div>
|
|
632
|
+
</div>
|
|
633
|
+
<div class="task-filter-summary" id="task-filter-summary" hidden>
|
|
634
|
+
<span class="task-filter-summary-label">Active filters</span>
|
|
635
|
+
<div class="task-filter-chips" id="task-filter-chips"></div>
|
|
636
|
+
<button type="button" class="btn-ghost btn-small task-filter-clear" id="task-filter-clear">Clear all</button>
|
|
637
|
+
</div>
|
|
638
|
+
<div class="task-board-content">
|
|
639
|
+
<div id="task-loading" class="loading">Loading tasks…</div>
|
|
640
|
+
<div id="task-error" class="empty-state" hidden>
|
|
641
|
+
<p id="task-error-message"></p>
|
|
642
|
+
<button class="btn-secondary btn-small" id="retry-tasks-btn">Try again</button>
|
|
643
|
+
</div>
|
|
644
|
+
<div id="task-empty" class="empty-state" hidden>
|
|
645
|
+
<p>No tasks yet. Submit one above to get started.</p>
|
|
646
|
+
</div>
|
|
647
|
+
<div id="task-grid" class="task-grid" hidden></div>
|
|
648
|
+
</div>
|
|
649
|
+
|
|
650
|
+
<!-- Floating action bar for bulk operations -->
|
|
651
|
+
<div id="bulk-actions-bar" class="bulk-actions-bar" hidden>
|
|
652
|
+
<div class="bulk-actions-content">
|
|
653
|
+
<span id="bulk-selected-count" class="bulk-selected-count">0 selected</span>
|
|
654
|
+
<div class="bulk-actions-buttons">
|
|
655
|
+
<button type="button" class="btn-secondary btn-small" id="bulk-select-all-btn">
|
|
656
|
+
Select All
|
|
657
|
+
</button>
|
|
658
|
+
<button type="button" class="btn-secondary btn-small" id="bulk-pin-btn">
|
|
659
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px;">
|
|
660
|
+
<path d="M12 17v5"></path>
|
|
661
|
+
<path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z"></path>
|
|
662
|
+
</svg>
|
|
663
|
+
Pin
|
|
664
|
+
</button>
|
|
665
|
+
<button type="button" class="btn-secondary btn-small" id="bulk-unpin-btn">
|
|
666
|
+
<span style="margin-right: 4px;">📌</span> Unpin
|
|
667
|
+
</button>
|
|
668
|
+
<button type="button" class="btn-danger btn-small" id="bulk-delete-btn">
|
|
669
|
+
Delete
|
|
670
|
+
</button>
|
|
671
|
+
<button type="button" class="btn-ghost btn-small" id="exit-selection-mode-btn">
|
|
672
|
+
Cancel
|
|
673
|
+
</button>
|
|
674
|
+
</div>
|
|
675
|
+
</div>
|
|
676
|
+
</div>
|
|
677
|
+
</section>
|
|
678
|
+
|
|
679
|
+
<!-- Delete Confirmation Modal -->
|
|
680
|
+
<div id="delete-modal" class="modal" hidden>
|
|
681
|
+
<div class="modal-overlay"></div>
|
|
682
|
+
<div class="modal-content">
|
|
683
|
+
<div class="modal-header">
|
|
684
|
+
<h2 id="delete-modal-title">Delete Task</h2>
|
|
685
|
+
</div>
|
|
686
|
+
<div class="modal-body">
|
|
687
|
+
<p id="delete-modal-message">Are you sure you want to delete this task?</p>
|
|
688
|
+
</div>
|
|
689
|
+
<div class="modal-actions">
|
|
690
|
+
<button type="button" class="btn-secondary" id="delete-cancel-btn">Cancel</button>
|
|
691
|
+
<button type="button" class="btn-danger" id="delete-confirm-btn">Delete</button>
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
</div>
|
|
695
|
+
|
|
696
|
+
<!-- Branch Selection Modal -->
|
|
697
|
+
<div id="branch-modal" class="modal" hidden>
|
|
698
|
+
<div class="modal-overlay"></div>
|
|
699
|
+
<div class="modal-content">
|
|
700
|
+
<div class="modal-header">
|
|
701
|
+
<h2>Branch Options</h2>
|
|
702
|
+
</div>
|
|
703
|
+
<div class="modal-body">
|
|
704
|
+
<div id="branch-modal-fields"></div>
|
|
705
|
+
</div>
|
|
706
|
+
<div class="modal-actions">
|
|
707
|
+
<button type="button" class="btn-secondary" id="branch-cancel-btn">Cancel</button>
|
|
708
|
+
<button type="button" class="btn-primary" id="branch-apply-btn">Apply</button>
|
|
709
|
+
</div>
|
|
710
|
+
</div>
|
|
711
|
+
</div>
|
|
712
|
+
|
|
713
|
+
<!-- Test Selection Modal -->
|
|
714
|
+
<div id="test-modal" class="modal" hidden>
|
|
715
|
+
<div class="modal-overlay"></div>
|
|
716
|
+
<div class="modal-content">
|
|
717
|
+
<div class="modal-header">
|
|
718
|
+
<h2>Run Tests</h2>
|
|
719
|
+
<div class="modal-header-actions">
|
|
720
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
721
|
+
</div>
|
|
722
|
+
</div>
|
|
723
|
+
<div class="modal-body">
|
|
724
|
+
<div id="test-search-container">
|
|
725
|
+
<input type="text" id="test-search-input" placeholder="Search tests..." class="test-search-input" autocomplete="off" />
|
|
726
|
+
</div>
|
|
727
|
+
<p class="modal-description">Select one or more tests to run:</p>
|
|
728
|
+
<div id="test-modal-list" class="test-choices"></div>
|
|
729
|
+
</div>
|
|
730
|
+
<div class="modal-actions">
|
|
731
|
+
<button type="button" class="btn-secondary" id="test-cancel-btn">Cancel</button>
|
|
732
|
+
<button type="button" class="btn-primary" id="test-confirm-btn" disabled>Run Selected</button>
|
|
733
|
+
</div>
|
|
734
|
+
</div>
|
|
735
|
+
</div>
|
|
736
|
+
|
|
737
|
+
<!-- Test Parameters Modal -->
|
|
738
|
+
<div id="test-param-modal" class="modal" hidden>
|
|
739
|
+
<div class="modal-overlay"></div>
|
|
740
|
+
<div class="modal-content">
|
|
741
|
+
<div class="modal-header">
|
|
742
|
+
<h2>Test Parameters</h2>
|
|
743
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
744
|
+
</div>
|
|
745
|
+
<div class="modal-body">
|
|
746
|
+
<p class="modal-description">The selected tests require the following parameters:</p>
|
|
747
|
+
<div id="test-param-fields" class="parameter-fields"></div>
|
|
748
|
+
</div>
|
|
749
|
+
<div class="modal-actions">
|
|
750
|
+
<button type="button" class="btn-secondary" id="test-param-cancel-btn">Cancel</button>
|
|
751
|
+
<button type="button" class="btn-primary" id="test-param-confirm-btn" disabled>Run Test</button>
|
|
752
|
+
</div>
|
|
753
|
+
</div>
|
|
754
|
+
</div>
|
|
755
|
+
|
|
756
|
+
<!-- Deploy Selection Modal -->
|
|
757
|
+
<div id="deploy-modal" class="modal" hidden>
|
|
758
|
+
<div class="modal-overlay"></div>
|
|
759
|
+
<div class="modal-content">
|
|
760
|
+
<div class="modal-header">
|
|
761
|
+
<h2>Deploy</h2>
|
|
762
|
+
<div class="modal-header-actions">
|
|
763
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
764
|
+
</div>
|
|
765
|
+
</div>
|
|
766
|
+
<div class="modal-body">
|
|
767
|
+
<div id="deploy-search-container">
|
|
768
|
+
<input type="text" id="deploy-search-input" placeholder="Search deployment profiles..." class="test-search-input" autocomplete="off" />
|
|
769
|
+
</div>
|
|
770
|
+
<p class="modal-description">Select a deployment profile to run:</p>
|
|
771
|
+
<div id="deploy-modal-list" class="test-choices"></div>
|
|
772
|
+
</div>
|
|
773
|
+
<div class="modal-actions">
|
|
774
|
+
<button type="button" class="btn-secondary" id="deploy-cancel-btn">Cancel</button>
|
|
775
|
+
<button type="button" class="btn-primary" id="deploy-confirm-btn" disabled>Deploy</button>
|
|
776
|
+
</div>
|
|
777
|
+
</div>
|
|
778
|
+
</div>
|
|
779
|
+
|
|
780
|
+
<!-- Deploy Parameters Modal -->
|
|
781
|
+
<div id="deploy-param-modal" class="modal" hidden>
|
|
782
|
+
<div class="modal-overlay"></div>
|
|
783
|
+
<div class="modal-content">
|
|
784
|
+
<div class="modal-header">
|
|
785
|
+
<h2>Deployment Parameters</h2>
|
|
786
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
787
|
+
</div>
|
|
788
|
+
<div class="modal-body">
|
|
789
|
+
<p class="modal-description">The selected deployment profile requires the following parameters:</p>
|
|
790
|
+
<div id="deploy-param-fields" class="parameter-fields"></div>
|
|
791
|
+
</div>
|
|
792
|
+
<div class="modal-actions">
|
|
793
|
+
<button type="button" class="btn-secondary" id="deploy-param-cancel-btn">Cancel</button>
|
|
794
|
+
<button type="button" class="btn-primary" id="deploy-param-confirm-btn" disabled>Deploy</button>
|
|
795
|
+
</div>
|
|
796
|
+
</div>
|
|
797
|
+
</div>
|
|
798
|
+
|
|
799
|
+
<!-- Jira Import Modal -->
|
|
800
|
+
<div id="jiraImportModal" class="modal" style="display: none;">
|
|
801
|
+
<div class="modal-overlay"></div>
|
|
802
|
+
<div class="modal-content modal-large">
|
|
803
|
+
<div class="modal-header">
|
|
804
|
+
<h2>Import from Jira</h2>
|
|
805
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
806
|
+
</div>
|
|
807
|
+
|
|
808
|
+
<div class="modal-body">
|
|
809
|
+
<!-- Search Step -->
|
|
810
|
+
<div id="jiraSearchStep">
|
|
811
|
+
<div class="search-box">
|
|
812
|
+
<input
|
|
813
|
+
type="text"
|
|
814
|
+
id="jiraSearchInput"
|
|
815
|
+
placeholder="Type to search issues (by key, summary, or keywords)..."
|
|
816
|
+
class="search-input"
|
|
817
|
+
autocomplete="off"
|
|
818
|
+
aria-label="Search Jira issues"
|
|
819
|
+
/>
|
|
820
|
+
</div>
|
|
821
|
+
|
|
822
|
+
<div id="jiraSearchStatus" class="search-status" aria-live="polite"></div>
|
|
823
|
+
|
|
824
|
+
<!-- Search Results -->
|
|
825
|
+
<div id="jiraSearchResults" class="search-results" style="display: none;">
|
|
826
|
+
<div class="results-header">
|
|
827
|
+
<span id="resultsCount"></span>
|
|
828
|
+
</div>
|
|
829
|
+
<div id="resultsList" class="results-list"></div>
|
|
830
|
+
</div>
|
|
831
|
+
</div>
|
|
832
|
+
|
|
833
|
+
<!-- Preview Step (hidden initially) -->
|
|
834
|
+
<div id="jiraPreviewStep" style="display: none;">
|
|
835
|
+
<div class="preview-header">
|
|
836
|
+
<button type="button" id="backToSearchBtn" class="btn-secondary">← Back to Search</button>
|
|
837
|
+
</div>
|
|
838
|
+
|
|
839
|
+
<div id="jiraIssuePreview" class="issue-preview"></div>
|
|
840
|
+
|
|
841
|
+
<div class="preview-actions">
|
|
842
|
+
<button type="button" id="confirmImportBtn" class="btn-primary">
|
|
843
|
+
Import Issue
|
|
844
|
+
</button>
|
|
845
|
+
<button type="button" id="cancelImportBtn" class="btn-secondary">
|
|
846
|
+
Cancel
|
|
847
|
+
</button>
|
|
848
|
+
</div>
|
|
849
|
+
</div>
|
|
850
|
+
</div>
|
|
851
|
+
</div>
|
|
852
|
+
</div>
|
|
853
|
+
|
|
854
|
+
<!-- Prompt Parameter Selection Modal -->
|
|
855
|
+
<div id="prompt-modal" class="modal" hidden>
|
|
856
|
+
<div class="modal-overlay"></div>
|
|
857
|
+
<div class="modal-content">
|
|
858
|
+
<div class="modal-header">
|
|
859
|
+
<h2 id="prompt-modal-title">Select Value</h2>
|
|
860
|
+
<div class="modal-header-actions">
|
|
861
|
+
<button type="button" id="prompt-refresh-btn" class="icon-btn" aria-label="Refresh" title="Refresh list" hidden>
|
|
862
|
+
↻
|
|
863
|
+
</button>
|
|
864
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
865
|
+
</div>
|
|
866
|
+
</div>
|
|
867
|
+
<div class="modal-body">
|
|
868
|
+
<div id="prompt-progress-container" class="prompt-progress-container" hidden>
|
|
869
|
+
<div id="prompt-progress-log" class="prompt-progress-log"></div>
|
|
870
|
+
</div>
|
|
871
|
+
<div id="prompt-error" class="error-message" hidden></div>
|
|
872
|
+
<div id="prompt-search-container" hidden>
|
|
873
|
+
<input type="text" id="prompt-search-input" placeholder="Search..." class="prompt-search-input" autocomplete="off" />
|
|
874
|
+
</div>
|
|
875
|
+
<div id="prompt-choices" class="prompt-choices"></div>
|
|
876
|
+
</div>
|
|
877
|
+
<div class="modal-actions">
|
|
878
|
+
<button type="button" id="prompt-cancel-btn" class="btn-secondary">Cancel</button>
|
|
879
|
+
<button type="button" id="prompt-confirm-btn" class="btn-primary" disabled>Confirm</button>
|
|
880
|
+
</div>
|
|
881
|
+
</div>
|
|
882
|
+
</div>
|
|
883
|
+
|
|
884
|
+
<!-- Multi-select Confirmation Modal -->
|
|
885
|
+
<div id="multiselect-confirm-modal" class="modal" hidden>
|
|
886
|
+
<div class="modal-overlay"></div>
|
|
887
|
+
<div class="modal-content">
|
|
888
|
+
<div class="modal-header">
|
|
889
|
+
<h2>Confirm Multiple Tasks</h2>
|
|
890
|
+
</div>
|
|
891
|
+
<div class="modal-body">
|
|
892
|
+
<p id="multiselect-warning"></p>
|
|
893
|
+
<div id="multiselect-preview" class="multiselect-preview"></div>
|
|
894
|
+
</div>
|
|
895
|
+
<div class="modal-actions">
|
|
896
|
+
<button type="button" id="multiselect-cancel-btn" class="btn-secondary">Cancel</button>
|
|
897
|
+
<button type="button" id="multiselect-confirm-btn" class="btn-primary">Create Tasks</button>
|
|
898
|
+
</div>
|
|
899
|
+
</div>
|
|
900
|
+
</div>
|
|
901
|
+
|
|
902
|
+
<!-- Image Editor Modal -->
|
|
903
|
+
<div id="image-editor-modal" class="modal modal-fullscreen" hidden>
|
|
904
|
+
<div class="modal-overlay"></div>
|
|
905
|
+
<div class="modal-content">
|
|
906
|
+
<div class="modal-header">
|
|
907
|
+
<h2>Edit Image</h2>
|
|
908
|
+
<button type="button" class="modal-close" id="image-editor-close" aria-label="Close">×</button>
|
|
909
|
+
</div>
|
|
910
|
+
<div class="modal-body" style="padding: 0; overflow: hidden;">
|
|
911
|
+
<div id="image-editor-container"></div>
|
|
912
|
+
</div>
|
|
913
|
+
<div class="modal-actions">
|
|
914
|
+
<button type="button" id="image-editor-cancel" class="btn-secondary">Cancel</button>
|
|
915
|
+
<button type="button" id="image-editor-save" class="btn-primary">Save</button>
|
|
916
|
+
</div>
|
|
917
|
+
</div>
|
|
918
|
+
</div>
|
|
919
|
+
|
|
920
|
+
<!-- Objective Editor Modal -->
|
|
921
|
+
<div id="objective-modal" class="modal" hidden>
|
|
922
|
+
<div class="modal-overlay"></div>
|
|
923
|
+
<div class="modal-content modal-objective">
|
|
924
|
+
<div class="modal-header">
|
|
925
|
+
<h2 id="objective-modal-title">Edit Objective</h2>
|
|
926
|
+
<div class="header-actions">
|
|
927
|
+
<button type="button" class="btn-ghost btn-small icon-btn" id="objective-modal-maximize" title="Maximize" tabindex="-1">
|
|
928
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
929
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
930
|
+
</svg>
|
|
931
|
+
</button>
|
|
932
|
+
<button type="button" class="modal-close" id="objective-modal-close" aria-label="Close">
|
|
933
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
934
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
935
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
936
|
+
</svg>
|
|
937
|
+
</button>
|
|
938
|
+
</div>
|
|
939
|
+
</div>
|
|
940
|
+
<div class="modal-body">
|
|
941
|
+
<div class="objective-form">
|
|
942
|
+
<div class="objective-field" id="objective-name-field">
|
|
943
|
+
<label for="objective-name-input" class="objective-label">Name</label>
|
|
944
|
+
<input type="text" id="objective-name-input" class="objective-name-input" placeholder="Enter a name for this objective" maxlength="100" required>
|
|
945
|
+
<div class="objective-field-error" id="objective-name-error" hidden></div>
|
|
946
|
+
</div>
|
|
947
|
+
|
|
948
|
+
<!-- Jira Link Badge for Objective (hidden by default) -->
|
|
949
|
+
<div id="objectiveJiraLinkBadge" class="jira-link-badge objective-jira-badge" style="display: none;">
|
|
950
|
+
<span class="jira-icon">📋</span>
|
|
951
|
+
<span>Linked to <a id="objectiveJiraBadgeLink" href="" target="_blank" rel="noopener"></a></span>
|
|
952
|
+
<button type="button" id="objectiveUnlinkJiraBtn" class="btn-icon" title="Unlink Jira issue">×</button>
|
|
953
|
+
</div>
|
|
954
|
+
|
|
955
|
+
<div class="objective-field objective-field-grow" id="objective-instructions-field">
|
|
956
|
+
<div class="objective-field-header">
|
|
957
|
+
<label for="objective-instructions-input" class="objective-label">Instructions</label>
|
|
958
|
+
<button type="button" class="btn-ghost btn-small icon-btn" id="objective-instructions-maximize" title="Expand instructions" aria-label="Expand instructions" tabindex="-1">
|
|
959
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
960
|
+
<polyline points="15 3 21 3 21 9"></polyline>
|
|
961
|
+
<polyline points="9 21 3 21 3 15"></polyline>
|
|
962
|
+
<line x1="21" y1="3" x2="14" y2="10"></line>
|
|
963
|
+
<line x1="3" y1="21" x2="10" y2="14"></line>
|
|
964
|
+
</svg>
|
|
965
|
+
</button>
|
|
966
|
+
</div>
|
|
967
|
+
<div class="objective-markdown-editor-container">
|
|
968
|
+
<div id="objective-markdown-editor" class="markdown-editor-wrapper"></div>
|
|
969
|
+
</div>
|
|
970
|
+
<div class="objective-field-error" id="objective-instructions-error" hidden></div>
|
|
971
|
+
</div>
|
|
972
|
+
|
|
973
|
+
<div class="objective-field" id="objective-attachments-field">
|
|
974
|
+
<label class="objective-label">Attachments</label>
|
|
975
|
+
<div class="objective-attachments-wrapper" style="display: flex; flex-direction: column; gap: 8px;">
|
|
976
|
+
<div class="objective-attachments-toolbar" style="display: flex; gap: 8px;">
|
|
977
|
+
<button type="button" class="btn-icon-mini" id="objective-attach-files-btn" title="Attach files" style="width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--color-border); border-radius: 4px; background: var(--color-bg-secondary); cursor: pointer; color: var(--color-text);">
|
|
978
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
979
|
+
<path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
|
|
980
|
+
</svg>
|
|
981
|
+
</button>
|
|
982
|
+
<button type="button" class="btn-icon-mini" id="objective-screenshot-btn" title="Take Screenshot" style="width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--color-border); border-radius: 4px; background: var(--color-bg-secondary); cursor: pointer; color: var(--color-text);">
|
|
983
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
984
|
+
<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path>
|
|
985
|
+
<circle cx="12" cy="13" r="4"></circle>
|
|
986
|
+
</svg>
|
|
987
|
+
</button>
|
|
988
|
+
</div>
|
|
989
|
+
<input type="file" id="objective-file-attachments" multiple accept="*/*" hidden aria-label="Attach files for objective">
|
|
990
|
+
<div id="objective-attached-files-list" class="attached-files-list" hidden></div>
|
|
991
|
+
</div>
|
|
992
|
+
</div>
|
|
993
|
+
|
|
994
|
+
<div class="objective-field" id="objective-environment-field">
|
|
995
|
+
<label for="objective-environment-select" class="objective-label">Environment</label>
|
|
996
|
+
<div class="objective-environment-row">
|
|
997
|
+
<select id="objective-environment-select" class="objective-environment-select" required>
|
|
998
|
+
<option value="" disabled selected hidden>Select environment</option>
|
|
999
|
+
</select>
|
|
1000
|
+
<button type="button" class="btn-icon-mini objective-branch-btn" id="objective-branch-options-btn" title="Branch Options" aria-label="Branch options" hidden>
|
|
1001
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1002
|
+
<line x1="6" y1="3" x2="6" y2="15"></line>
|
|
1003
|
+
<circle cx="18" cy="6" r="3"></circle>
|
|
1004
|
+
<circle cx="6" cy="18" r="3"></circle>
|
|
1005
|
+
<path d="M18 9a9 9 0 0 1-9 9"></path>
|
|
1006
|
+
</svg>
|
|
1007
|
+
</button>
|
|
1008
|
+
</div>
|
|
1009
|
+
<div class="objective-field-error" id="objective-environment-error" hidden></div>
|
|
1010
|
+
</div>
|
|
1011
|
+
|
|
1012
|
+
<div class="objective-field objective-field-agents" id="objective-agents-field">
|
|
1013
|
+
<label class="objective-label objective-agents-label">Agents</label>
|
|
1014
|
+
<div class="agent-selector objective-agent-selector" role="group" aria-label="Agent selection">
|
|
1015
|
+
<div class="agent-card" data-agent="claude" data-count="0">
|
|
1016
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Claude count" title="Remove Claude">−</button>
|
|
1017
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Claude" title="Claude (Alt+1) (click to add, right-click to remove)">
|
|
1018
|
+
<svg viewBox="0 0 16 16" fill="currentColor">
|
|
1019
|
+
<path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 4.212z"/>
|
|
1020
|
+
</svg>
|
|
1021
|
+
</div>
|
|
1022
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Claude count" title="Add Claude">+</button>
|
|
1023
|
+
<div class="agent-count-badge" id="objective-claude-count-display">0</div>
|
|
1024
|
+
<input type="number" min="0" max="5" step="1" id="objective-claude-count" value="0" hidden readonly>
|
|
1025
|
+
</div>
|
|
1026
|
+
<div class="agent-card" data-agent="codex" data-count="0">
|
|
1027
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Codex count" title="Remove Codex">−</button>
|
|
1028
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Codex" title="Codex (Alt+2) (click to add, right-click to remove)">
|
|
1029
|
+
<svg viewBox="0 0 24 24" fill="currentColor">
|
|
1030
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/>
|
|
1031
|
+
</svg>
|
|
1032
|
+
</div>
|
|
1033
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Codex count" title="Add Codex">+</button>
|
|
1034
|
+
<div class="agent-count-badge" id="objective-codex-count-display">0</div>
|
|
1035
|
+
<input type="number" min="0" max="5" step="1" id="objective-codex-count" value="0" hidden readonly>
|
|
1036
|
+
</div>
|
|
1037
|
+
<div class="agent-card" data-agent="gemini" data-count="0">
|
|
1038
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Gemini count" title="Remove Gemini">−</button>
|
|
1039
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Gemini" title="Gemini (Alt+3) (click to add, right-click to remove)">
|
|
1040
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1041
|
+
<path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
|
|
1042
|
+
</svg>
|
|
1043
|
+
</div>
|
|
1044
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Gemini count" title="Add Gemini">+</button>
|
|
1045
|
+
<div class="agent-count-badge" id="objective-gemini-count-display">0</div>
|
|
1046
|
+
<input type="number" min="0" max="5" step="1" id="objective-gemini-count" value="0" hidden readonly>
|
|
1047
|
+
</div>
|
|
1048
|
+
</div>
|
|
1049
|
+
<div class="objective-field-error" id="objective-agents-error" hidden></div>
|
|
1050
|
+
</div>
|
|
1051
|
+
|
|
1052
|
+
<!-- Comments Section (compact mode for objectives) -->
|
|
1053
|
+
<div class="objective-field objective-comments-field" id="objective-comments-field">
|
|
1054
|
+
<div id="objective-comments-container" class="comments-container"></div>
|
|
1055
|
+
</div>
|
|
1056
|
+
</div>
|
|
1057
|
+
</div>
|
|
1058
|
+
<div class="modal-actions objective-modal-actions">
|
|
1059
|
+
<div class="objective-modal-actions-left">
|
|
1060
|
+
<button type="button" id="objective-delete-btn" class="btn-danger btn-small">
|
|
1061
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1062
|
+
<polyline points="3 6 5 6 21 6"></polyline>
|
|
1063
|
+
<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>
|
|
1064
|
+
</svg>
|
|
1065
|
+
Delete
|
|
1066
|
+
</button>
|
|
1067
|
+
<label class="checkbox-inline" title="Discard this objective after the task is created">
|
|
1068
|
+
<input type="checkbox" id="delete-objective-checkbox">
|
|
1069
|
+
<span>Discard after task creation</span>
|
|
1070
|
+
</label>
|
|
1071
|
+
</div>
|
|
1072
|
+
<div class="objective-modal-actions-right">
|
|
1073
|
+
<button type="button" id="objective-save-btn" class="btn-secondary" title="Save (Ctrl+S)">
|
|
1074
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1075
|
+
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
|
|
1076
|
+
<polyline points="17 21 17 13 7 13 7 21"></polyline>
|
|
1077
|
+
<polyline points="7 3 7 8 15 8"></polyline>
|
|
1078
|
+
</svg>
|
|
1079
|
+
Save
|
|
1080
|
+
</button>
|
|
1081
|
+
<button type="button" id="objective-stage-btn" class="btn-secondary" title="Stage as task (Ctrl+Shift+Enter)">
|
|
1082
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1083
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
1084
|
+
<line x1="9" y1="9" x2="15" y2="9"></line>
|
|
1085
|
+
<line x1="9" y1="15" x2="15" y2="15"></line>
|
|
1086
|
+
</svg>
|
|
1087
|
+
Stage
|
|
1088
|
+
</button>
|
|
1089
|
+
<button type="button" id="objective-run-btn" class="btn-primary" title="Launch task (Ctrl+Enter)">
|
|
1090
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1091
|
+
<polygon points="5 3 19 12 5 21 5 3"></polygon>
|
|
1092
|
+
</svg>
|
|
1093
|
+
Launch
|
|
1094
|
+
</button>
|
|
1095
|
+
</div>
|
|
1096
|
+
</div>
|
|
1097
|
+
</div>
|
|
1098
|
+
</div>
|
|
1099
|
+
|
|
1100
|
+
<!-- Server Health Modal -->
|
|
1101
|
+
<div id="server-health-modal" class="modal" hidden>
|
|
1102
|
+
<div class="modal-overlay"></div>
|
|
1103
|
+
<div class="modal-content">
|
|
1104
|
+
<div class="modal-header">
|
|
1105
|
+
<h2>Server Health</h2>
|
|
1106
|
+
<button type="button" class="modal-close" id="server-health-close" aria-label="Close">
|
|
1107
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1108
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
1109
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
1110
|
+
</svg>
|
|
1111
|
+
</button>
|
|
1112
|
+
</div>
|
|
1113
|
+
<div class="modal-body">
|
|
1114
|
+
<div id="server-health-loading" class="loading">Loading server metrics</div>
|
|
1115
|
+
<div id="server-health-error" class="error-message" hidden></div>
|
|
1116
|
+
<div id="server-health-content" hidden>
|
|
1117
|
+
<div class="health-metrics">
|
|
1118
|
+
<div class="metric-card">
|
|
1119
|
+
<div class="metric-icon">💻</div>
|
|
1120
|
+
<div class="metric-details">
|
|
1121
|
+
<div class="metric-label">CPU Usage</div>
|
|
1122
|
+
<div class="metric-value" id="cpu-usage">-</div>
|
|
1123
|
+
</div>
|
|
1124
|
+
</div>
|
|
1125
|
+
<div class="metric-card">
|
|
1126
|
+
<div class="metric-icon">🧠</div>
|
|
1127
|
+
<div class="metric-details">
|
|
1128
|
+
<div class="metric-label">Memory Usage</div>
|
|
1129
|
+
<div class="metric-value" id="memory-usage">-</div>
|
|
1130
|
+
</div>
|
|
1131
|
+
</div>
|
|
1132
|
+
<div class="metric-card">
|
|
1133
|
+
<div class="metric-icon">💾</div>
|
|
1134
|
+
<div class="metric-details">
|
|
1135
|
+
<div class="metric-label">Disk Usage</div>
|
|
1136
|
+
<div class="metric-value" id="disk-usage">-</div>
|
|
1137
|
+
</div>
|
|
1138
|
+
</div>
|
|
1139
|
+
<div class="metric-card">
|
|
1140
|
+
<div class="metric-icon">🐳</div>
|
|
1141
|
+
<div class="metric-details">
|
|
1142
|
+
<div class="metric-label">Docker Containers</div>
|
|
1143
|
+
<div class="metric-value" id="docker-containers">-</div>
|
|
1144
|
+
</div>
|
|
1145
|
+
</div>
|
|
1146
|
+
<div class="metric-card metric-card-wide" id="docker-storage-card">
|
|
1147
|
+
<div class="metric-icon">📦</div>
|
|
1148
|
+
<div class="metric-details">
|
|
1149
|
+
<div class="metric-label">Docker Storage</div>
|
|
1150
|
+
<div class="metric-value" id="docker-storage-total">-</div>
|
|
1151
|
+
<div class="metric-sub" id="docker-storage-available"></div>
|
|
1152
|
+
<div class="metric-sub" id="docker-storage-reclaimable"></div>
|
|
1153
|
+
<div class="docker-storage-breakdown" id="docker-storage-breakdown">
|
|
1154
|
+
<div class="storage-item">
|
|
1155
|
+
<span class="storage-label">Images:</span>
|
|
1156
|
+
<span class="storage-value" id="docker-storage-images">-</span>
|
|
1157
|
+
</div>
|
|
1158
|
+
<div class="storage-item">
|
|
1159
|
+
<span class="storage-label">Containers:</span>
|
|
1160
|
+
<span class="storage-value" id="docker-storage-containers">-</span>
|
|
1161
|
+
</div>
|
|
1162
|
+
<div class="storage-item">
|
|
1163
|
+
<span class="storage-label">Volumes:</span>
|
|
1164
|
+
<span class="storage-value" id="docker-storage-volumes">-</span>
|
|
1165
|
+
</div>
|
|
1166
|
+
<div class="storage-item">
|
|
1167
|
+
<span class="storage-label">Build Cache:</span>
|
|
1168
|
+
<span class="storage-value" id="docker-storage-buildcache">-</span>
|
|
1169
|
+
</div>
|
|
1170
|
+
</div>
|
|
1171
|
+
</div>
|
|
1172
|
+
</div>
|
|
1173
|
+
<div class="metric-card">
|
|
1174
|
+
<div class="metric-icon">⏱️</div>
|
|
1175
|
+
<div class="metric-details">
|
|
1176
|
+
<div class="metric-label">Server Uptime</div>
|
|
1177
|
+
<div class="metric-value" id="server-uptime">-</div>
|
|
1178
|
+
</div>
|
|
1179
|
+
</div>
|
|
1180
|
+
<div class="metric-card">
|
|
1181
|
+
<div class="metric-icon">📡</div>
|
|
1182
|
+
<div class="metric-details">
|
|
1183
|
+
<div class="metric-label">User Sessions</div>
|
|
1184
|
+
<div class="metric-value" id="active-sessions">-</div>
|
|
1185
|
+
</div>
|
|
1186
|
+
</div>
|
|
1187
|
+
</div>
|
|
1188
|
+
<div class="health-actions collapsible-section" id="cleanup-section">
|
|
1189
|
+
<button type="button" class="health-actions-header collapsible-toggle" id="cleanup-toggle" aria-expanded="false" aria-controls="cleanup-content">
|
|
1190
|
+
<div class="health-actions-title">
|
|
1191
|
+
<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">
|
|
1192
|
+
<polyline points="9 18 15 12 9 6"></polyline>
|
|
1193
|
+
</svg>
|
|
1194
|
+
Clean Up
|
|
1195
|
+
</div>
|
|
1196
|
+
<div id="server-health-action-status" class="health-action-status" aria-live="polite" hidden></div>
|
|
1197
|
+
</button>
|
|
1198
|
+
<div class="collapsible-content" id="cleanup-content" hidden>
|
|
1199
|
+
<div class="cleanup-cards">
|
|
1200
|
+
<div class="cleanup-card">
|
|
1201
|
+
<div class="cleanup-card-icon">
|
|
1202
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1203
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
|
1204
|
+
<line x1="9" y1="9" x2="15" y2="15"></line>
|
|
1205
|
+
<line x1="15" y1="9" x2="9" y2="15"></line>
|
|
1206
|
+
</svg>
|
|
1207
|
+
</div>
|
|
1208
|
+
<div class="cleanup-card-content">
|
|
1209
|
+
<div class="cleanup-card-title">Stop All Containers</div>
|
|
1210
|
+
<div class="cleanup-card-description">Gracefully stop all running Docker containers. Active coding sessions will be terminated.</div>
|
|
1211
|
+
</div>
|
|
1212
|
+
<button type="button" class="btn-secondary cleanup-card-btn" id="server-stop-containers">Stop</button>
|
|
1213
|
+
</div>
|
|
1214
|
+
<div class="cleanup-card">
|
|
1215
|
+
<div class="cleanup-card-icon">
|
|
1216
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1217
|
+
<polyline points="3 6 5 6 21 6"></polyline>
|
|
1218
|
+
<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>
|
|
1219
|
+
</svg>
|
|
1220
|
+
</div>
|
|
1221
|
+
<div class="cleanup-card-content">
|
|
1222
|
+
<div class="cleanup-card-title">Remove Stopped Containers</div>
|
|
1223
|
+
<div class="cleanup-card-description">Delete all stopped containers to free up disk space. This cannot be undone.</div>
|
|
1224
|
+
</div>
|
|
1225
|
+
<button type="button" class="btn-secondary cleanup-card-btn" id="server-remove-stopped">Remove</button>
|
|
1226
|
+
</div>
|
|
1227
|
+
<div class="cleanup-card cleanup-card-danger">
|
|
1228
|
+
<div class="cleanup-card-icon">
|
|
1229
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1230
|
+
<path d="M12 2L2 7l10 5 10-5-10-5z"></path>
|
|
1231
|
+
<path d="M2 17l10 5 10-5"></path>
|
|
1232
|
+
<path d="M2 12l10 5 10-5"></path>
|
|
1233
|
+
</svg>
|
|
1234
|
+
</div>
|
|
1235
|
+
<div class="cleanup-card-content">
|
|
1236
|
+
<div class="cleanup-card-title">Docker System Prune</div>
|
|
1237
|
+
<div class="cleanup-card-description">Remove all stopped containers, unused networks, dangling images, and build cache. Frees significant disk space.</div>
|
|
1238
|
+
</div>
|
|
1239
|
+
<button type="button" class="btn-danger cleanup-card-btn" id="server-prune-docker">Prune</button>
|
|
1240
|
+
</div>
|
|
1241
|
+
</div>
|
|
1242
|
+
</div>
|
|
1243
|
+
</div>
|
|
1244
|
+
</div>
|
|
1245
|
+
</div>
|
|
1246
|
+
<div class="modal-actions">
|
|
1247
|
+
<button type="button" id="server-health-refresh" class="btn-secondary">Refresh</button>
|
|
1248
|
+
<button type="button" id="server-health-ok" class="btn-primary">OK</button>
|
|
1249
|
+
</div>
|
|
1250
|
+
</div>
|
|
1251
|
+
</div>
|
|
1252
|
+
|
|
1253
|
+
<!-- About CoderFlow Modal -->
|
|
1254
|
+
<div id="about-coderflow-modal" class="modal" hidden>
|
|
1255
|
+
<div class="modal-overlay"></div>
|
|
1256
|
+
<div class="modal-content modal-content-narrow">
|
|
1257
|
+
<div class="modal-header">
|
|
1258
|
+
<h2>About CoderFlow</h2>
|
|
1259
|
+
<button type="button" class="modal-close" id="about-coderflow-close" aria-label="Close">
|
|
1260
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1261
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
1262
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
1263
|
+
</svg>
|
|
1264
|
+
</button>
|
|
1265
|
+
</div>
|
|
1266
|
+
<div class="modal-body about-modal-body">
|
|
1267
|
+
<div class="about-modal-hero">
|
|
1268
|
+
<img src="/coderflow-logo.svg" alt="CoderFlow" class="brand-logo brand-logo-light about-logo">
|
|
1269
|
+
<img src="/coderflow-logo-reversed.svg" alt="CoderFlow" class="brand-logo brand-logo-dark about-logo">
|
|
1270
|
+
</div>
|
|
1271
|
+
<div class="about-version-card">
|
|
1272
|
+
<span class="about-version-label">Server version</span>
|
|
1273
|
+
<span class="about-version-value" id="about-server-version">Loading...</span>
|
|
1274
|
+
</div>
|
|
1275
|
+
<div id="about-version-error" class="error-message" hidden></div>
|
|
1276
|
+
<p class="about-copyright">© <span id="about-year"></span> Profound Logic Software, Inc.</p>
|
|
1277
|
+
<a class="about-link" href="https://coderflow.ai" target="_blank" rel="noopener">coderflow.ai</a>
|
|
1278
|
+
</div>
|
|
1279
|
+
<div class="modal-actions">
|
|
1280
|
+
<button type="button" id="about-coderflow-ok" class="btn-primary">OK</button>
|
|
1281
|
+
</div>
|
|
1282
|
+
</div>
|
|
1283
|
+
</div>
|
|
1284
|
+
|
|
1285
|
+
<!-- Auto-judge Settings Modal -->
|
|
1286
|
+
<div id="auto-judge-modal" class="modal" hidden>
|
|
1287
|
+
<div class="modal-overlay"></div>
|
|
1288
|
+
<div class="modal-content">
|
|
1289
|
+
<div class="modal-header">
|
|
1290
|
+
<h2>Auto-judge Settings</h2>
|
|
1291
|
+
<button type="button" class="modal-close" aria-label="Close">×</button>
|
|
1292
|
+
</div>
|
|
1293
|
+
<div class="modal-body">
|
|
1294
|
+
<p style="margin-bottom: 1rem;">Select agents to run as judges when a task group completes:</p>
|
|
1295
|
+
<div class="agent-selector" role="group" aria-label="Judge agent selection">
|
|
1296
|
+
<div class="agent-card" data-agent="claude" data-count="0" id="judge-agent-card-claude">
|
|
1297
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Claude count" title="Remove Claude">−</button>
|
|
1298
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Claude" title="Claude (Alt+1)">
|
|
1299
|
+
<svg viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
1300
|
+
<path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 4.212z"/>
|
|
1301
|
+
</svg>
|
|
1302
|
+
</div>
|
|
1303
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Claude count" title="Add Claude">+</button>
|
|
1304
|
+
<div class="agent-count-badge" id="judge-claude-count-display">0</div>
|
|
1305
|
+
<input type="number" min="0" max="2" step="1" id="judge-claude-count" value="0" hidden readonly>
|
|
1306
|
+
</div>
|
|
1307
|
+
<div class="agent-card" data-agent="codex" data-count="0" id="judge-agent-card-codex">
|
|
1308
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Codex count" title="Remove Codex">−</button>
|
|
1309
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Codex" title="Codex (Alt+2)">
|
|
1310
|
+
<svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
1311
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/>
|
|
1312
|
+
</svg>
|
|
1313
|
+
</div>
|
|
1314
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Codex count" title="Add Codex">+</button>
|
|
1315
|
+
<div class="agent-count-badge" id="judge-codex-count-display">0</div>
|
|
1316
|
+
<input type="number" min="0" max="2" step="1" id="judge-codex-count" value="0" hidden readonly>
|
|
1317
|
+
</div>
|
|
1318
|
+
<div class="agent-card" data-agent="gemini" data-count="0" id="judge-agent-card-gemini">
|
|
1319
|
+
<button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Gemini count" title="Remove Gemini">−</button>
|
|
1320
|
+
<div class="agent-icon" role="button" tabindex="0" aria-label="Gemini" title="Gemini (Alt+3)">
|
|
1321
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1322
|
+
<path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
|
|
1323
|
+
</svg>
|
|
1324
|
+
</div>
|
|
1325
|
+
<button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Gemini count" title="Add Gemini">+</button>
|
|
1326
|
+
<div class="agent-count-badge" id="judge-gemini-count-display">0</div>
|
|
1327
|
+
<input type="number" min="0" max="2" step="1" id="judge-gemini-count" value="0" hidden readonly>
|
|
1328
|
+
</div>
|
|
1329
|
+
</div>
|
|
1330
|
+
<div style="margin-top: 1.5rem;">
|
|
1331
|
+
<p style="font-size: 0.9em; color: var(--color-text-secondary);">
|
|
1332
|
+
When agents are selected, a judge task will be automatically launched after all tasks in a group have finished.
|
|
1333
|
+
</p>
|
|
1334
|
+
</div>
|
|
1335
|
+
</div>
|
|
1336
|
+
<div class="modal-actions">
|
|
1337
|
+
<button type="button" class="btn-secondary" id="auto-judge-cancel-btn">Cancel</button>
|
|
1338
|
+
<button type="button" class="btn-primary" id="auto-judge-save-btn">Save</button>
|
|
1339
|
+
</div>
|
|
1340
|
+
</div>
|
|
1341
|
+
</div>
|
|
1342
|
+
|
|
1343
|
+
<!-- Profile Settings Modal -->
|
|
1344
|
+
<div id="profile-modal" class="modal" hidden>
|
|
1345
|
+
<div class="modal-overlay"></div>
|
|
1346
|
+
<div class="modal-content modal-profile">
|
|
1347
|
+
<div class="modal-header">
|
|
1348
|
+
<h2>Profile Settings</h2>
|
|
1349
|
+
<button type="button" class="modal-close" id="profile-modal-close" aria-label="Close">
|
|
1350
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1351
|
+
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
1352
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
1353
|
+
</svg>
|
|
1354
|
+
</button>
|
|
1355
|
+
</div>
|
|
1356
|
+
<div class="modal-body">
|
|
1357
|
+
<!-- Avatar Section -->
|
|
1358
|
+
<div class="profile-avatar-section">
|
|
1359
|
+
<div class="profile-avatar-container">
|
|
1360
|
+
<div class="profile-avatar" id="profile-avatar">
|
|
1361
|
+
<span class="profile-avatar-initials" id="profile-avatar-initials">--</span>
|
|
1362
|
+
<img class="profile-avatar-image" id="profile-avatar-image" alt="Avatar" hidden>
|
|
1363
|
+
</div>
|
|
1364
|
+
<div class="profile-avatar-actions">
|
|
1365
|
+
<button type="button" class="btn-secondary" id="profile-upload-btn">
|
|
1366
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1367
|
+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
1368
|
+
<polyline points="17 8 12 3 7 8"></polyline>
|
|
1369
|
+
<line x1="12" y1="3" x2="12" y2="15"></line>
|
|
1370
|
+
</svg>
|
|
1371
|
+
Upload Photo
|
|
1372
|
+
</button>
|
|
1373
|
+
<button type="button" class="btn-link-danger" id="profile-remove-avatar-btn" hidden>
|
|
1374
|
+
Remove
|
|
1375
|
+
</button>
|
|
1376
|
+
</div>
|
|
1377
|
+
</div>
|
|
1378
|
+
<input type="file" id="profile-avatar-input" accept="image/jpeg,image/png,image/gif,image/webp" hidden>
|
|
1379
|
+
</div>
|
|
1380
|
+
|
|
1381
|
+
<!-- Avatar Cropper (shown when uploading) -->
|
|
1382
|
+
<div class="profile-cropper-section" id="profile-cropper-section" hidden>
|
|
1383
|
+
<p class="profile-cropper-hint">Drag to reposition, scroll to zoom</p>
|
|
1384
|
+
<div class="profile-cropper-container">
|
|
1385
|
+
<img id="profile-cropper-image" alt="Crop preview">
|
|
1386
|
+
</div>
|
|
1387
|
+
<div class="profile-cropper-actions">
|
|
1388
|
+
<button type="button" class="btn-secondary" id="profile-crop-cancel">Cancel</button>
|
|
1389
|
+
<button type="button" class="btn-primary" id="profile-crop-apply">Apply</button>
|
|
1390
|
+
</div>
|
|
1391
|
+
</div>
|
|
1392
|
+
|
|
1393
|
+
<!-- Display Name -->
|
|
1394
|
+
<div class="profile-field">
|
|
1395
|
+
<label for="profile-name">Display Name</label>
|
|
1396
|
+
<input type="text" id="profile-name" class="profile-input" placeholder="Your name">
|
|
1397
|
+
</div>
|
|
1398
|
+
|
|
1399
|
+
<div class="profile-divider"></div>
|
|
1400
|
+
|
|
1401
|
+
<!-- Email Notifications -->
|
|
1402
|
+
<div class="profile-section-title">Email Notifications</div>
|
|
1403
|
+
|
|
1404
|
+
<label class="profile-toggle-row">
|
|
1405
|
+
<span class="profile-toggle-label">@Mentions</span>
|
|
1406
|
+
<input type="checkbox" id="profile-email-mentions" class="toggle-switch" checked>
|
|
1407
|
+
</label>
|
|
1408
|
+
|
|
1409
|
+
<label class="profile-toggle-row">
|
|
1410
|
+
<span class="profile-toggle-label">Comments on my tasks/objectives</span>
|
|
1411
|
+
<input type="checkbox" id="profile-email-comments" class="toggle-switch" checked>
|
|
1412
|
+
</label>
|
|
1413
|
+
</div>
|
|
1414
|
+
<div class="modal-actions">
|
|
1415
|
+
<button type="button" class="btn-secondary" id="profile-cancel-btn">Cancel</button>
|
|
1416
|
+
<button type="button" class="btn-primary" id="profile-save-btn">Save</button>
|
|
1417
|
+
</div>
|
|
1418
|
+
</div>
|
|
1419
|
+
</div>
|
|
1420
|
+
</main>
|
|
1421
|
+
<button type="button" id="scroll-to-top" class="scroll-to-top" title="Back to top" aria-label="Back to top">
|
|
1422
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1423
|
+
<path d="M12 19V5"></path>
|
|
1424
|
+
<polyline points="6 11 12 5 18 11"></polyline>
|
|
1425
|
+
</svg>
|
|
1426
|
+
<span class="scroll-to-top-label">Top</span>
|
|
1427
|
+
</button>
|
|
1428
|
+
<script>
|
|
1429
|
+
// Detect API base for proxied contexts (e.g., /tasks/{taskId}/app/{port}/)
|
|
1430
|
+
(function() {
|
|
1431
|
+
const path = window.location.pathname;
|
|
1432
|
+
const match = path.match(/^(\/tasks\/[^/]+\/app\/[^/]+)/);
|
|
1433
|
+
const apiBase = match ? match[1] : '';
|
|
1434
|
+
|
|
1435
|
+
// Update docs link to use correct base path
|
|
1436
|
+
const docsLink = document.getElementById('docs-link');
|
|
1437
|
+
if (docsLink) {
|
|
1438
|
+
docsLink.href = apiBase + '/docs/';
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
// Update dev-docs link and check availability (only on localhost)
|
|
1442
|
+
const devDocsLink = document.getElementById('dev-docs-link');
|
|
1443
|
+
if (devDocsLink) {
|
|
1444
|
+
devDocsLink.href = apiBase + '/dev-docs/';
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
if (location.hostname === 'localhost' || location.hostname === '127.0.0.1') {
|
|
1448
|
+
fetch(apiBase + '/dev-docs/', { method: 'HEAD' })
|
|
1449
|
+
.then(response => {
|
|
1450
|
+
if (response.ok && devDocsLink) {
|
|
1451
|
+
devDocsLink.hidden = false;
|
|
1452
|
+
}
|
|
1453
|
+
})
|
|
1454
|
+
.catch(() => {}); // Silently ignore if not available
|
|
1455
|
+
}
|
|
1456
|
+
})();
|
|
1457
|
+
</script>
|
|
1458
|
+
</body>
|
|
1459
|
+
</html>
|