@profoundlogic/coderflow-server 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/LICENSE.txt +322 -0
  2. package/README.md +158 -0
  3. package/dist/LICENSE.txt +322 -0
  4. package/dist/README.md +158 -0
  5. package/dist/base-image/Dockerfile +184 -0
  6. package/dist/base-image/agent-wrapper.sh +143 -0
  7. package/dist/base-image/apply-local-state.sh +357 -0
  8. package/dist/base-image/coder-git-credential-helper +307 -0
  9. package/dist/base-image/entrypoint.sh +942 -0
  10. package/dist/base-image/ssh_config_template +41 -0
  11. package/dist/base-image/start-code-server.sh +76 -0
  12. package/dist/base-image/sync-repos.sh +170 -0
  13. package/dist/base-image/vscode-extensions.txt +10 -0
  14. package/dist/base-image/vscode-settings.json +41 -0
  15. package/dist/coder-server.js +2 -0
  16. package/dist/config/cli-models.json +45 -0
  17. package/dist/config/imported-skills.schema.json +83 -0
  18. package/dist/config/skill-catalog.json +18 -0
  19. package/dist/config/skill-catalog.schema.json +140 -0
  20. package/dist/config.js +1 -0
  21. package/dist/examples/oidc.json.example +11 -0
  22. package/dist/lib/agent-keepalive.js +1 -0
  23. package/dist/lib/api-keys.js +1 -0
  24. package/dist/lib/apiKeys.js +1 -0
  25. package/dist/lib/auto-judge.js +1 -0
  26. package/dist/lib/basic-auth.js +1 -0
  27. package/dist/lib/build-history.js +1 -0
  28. package/dist/lib/build-output-service.js +1 -0
  29. package/dist/lib/build-scheduler.js +1 -0
  30. package/dist/lib/build-service.js +1 -0
  31. package/dist/lib/claude-oauth-refresh.js +1 -0
  32. package/dist/lib/cli/build.js +1 -0
  33. package/dist/lib/cli/config-command.js +1 -0
  34. package/dist/lib/cli/config.js +1 -0
  35. package/dist/lib/cli/create-user.js +1 -0
  36. package/dist/lib/cli/init.js +1 -0
  37. package/dist/lib/cli/jira.js +1 -0
  38. package/dist/lib/cli/license.js +1 -0
  39. package/dist/lib/cli/server-manager.js +1 -0
  40. package/dist/lib/container-tokens.js +1 -0
  41. package/dist/lib/data-dir.js +1 -0
  42. package/dist/lib/deployment-history.js +1 -0
  43. package/dist/lib/deployment-service.js +1 -0
  44. package/dist/lib/docker-utils.js +1 -0
  45. package/dist/lib/email.js +1 -0
  46. package/dist/lib/emailTemplates.js +1 -0
  47. package/dist/lib/entitlement.js +1 -0
  48. package/dist/lib/fetch-utils.js +1 -0
  49. package/dist/lib/git-provider-service.js +1 -0
  50. package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
  51. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
  52. package/dist/lib/git-provider-setup/index.js +1 -0
  53. package/dist/lib/git-provider-setup/setup-factory.js +1 -0
  54. package/dist/lib/git-provider-setup/setup-interface.js +1 -0
  55. package/dist/lib/git-providers/azure-devops-provider.js +1 -0
  56. package/dist/lib/git-providers/github-app-provider.js +1 -0
  57. package/dist/lib/git-providers/index.js +1 -0
  58. package/dist/lib/git-providers/provider-factory.js +1 -0
  59. package/dist/lib/git-providers/provider-interface.js +1 -0
  60. package/dist/lib/jira-client.js +1 -0
  61. package/dist/lib/logger.js +1 -0
  62. package/dist/lib/model-fetcher.js +1 -0
  63. package/dist/lib/notifications.js +1 -0
  64. package/dist/lib/oidc-auth.js +1 -0
  65. package/dist/lib/oidc-device-flow.js +1 -0
  66. package/dist/lib/passwordTokens.js +1 -0
  67. package/dist/lib/pin-cascade.js +1 -0
  68. package/dist/lib/provider-accounts.js +1 -0
  69. package/dist/lib/provider-oauth.js +1 -0
  70. package/dist/lib/provider-profile.js +1 -0
  71. package/dist/lib/provider-token-refresh.js +1 -0
  72. package/dist/lib/roles.js +1 -0
  73. package/dist/lib/secrets.js +1 -0
  74. package/dist/lib/state-capture.js +1 -0
  75. package/dist/lib/static-files.js +1 -0
  76. package/dist/lib/task-name-generator.js +1 -0
  77. package/dist/lib/users.js +1 -0
  78. package/dist/middleware/requireAuth.js +1 -0
  79. package/dist/middleware/requireInit.js +1 -0
  80. package/dist/middleware/requirePermission.js +1 -0
  81. package/dist/package-lock.json +4151 -0
  82. package/dist/package.json +50 -0
  83. package/dist/routes/apiKeys.js +1 -0
  84. package/dist/routes/auth-oidc.js +1 -0
  85. package/dist/routes/auth.js +1 -0
  86. package/dist/routes/build.js +1 -0
  87. package/dist/routes/containers.js +1 -0
  88. package/dist/routes/deploy-task.js +1 -0
  89. package/dist/routes/environment-management.js +1 -0
  90. package/dist/routes/environments.js +1 -0
  91. package/dist/routes/external-skills.js +1 -0
  92. package/dist/routes/git-credentials.js +1 -0
  93. package/dist/routes/git-provider-setup.js +1 -0
  94. package/dist/routes/health.js +1 -0
  95. package/dist/routes/jira.js +1 -0
  96. package/dist/routes/objective-management.js +1 -0
  97. package/dist/routes/password.js +1 -0
  98. package/dist/routes/prompt.js +1 -0
  99. package/dist/routes/provider-auth.js +1 -0
  100. package/dist/routes/qa.js +1 -0
  101. package/dist/routes/settings.js +1 -0
  102. package/dist/routes/skill-management.js +1 -0
  103. package/dist/routes/skills.js +1 -0
  104. package/dist/routes/tasks.js +2 -0
  105. package/dist/routes/templates.js +1 -0
  106. package/dist/routes/test-task.js +1 -0
  107. package/dist/routes/test.js +1 -0
  108. package/dist/routes/users.js +1 -0
  109. package/dist/routes/visualizations.js +1 -0
  110. package/dist/schemas/template-metadata.schema.json +178 -0
  111. package/dist/scripts/create-user.js +2 -0
  112. package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
  113. package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
  114. package/dist/shipped-skills/objective-management/SKILL.md +238 -0
  115. package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
  116. package/dist/start.js +2 -0
  117. package/dist/web-ui/public/activity-detail-modal.js +1 -0
  118. package/dist/web-ui/public/activity-feed.js +1 -0
  119. package/dist/web-ui/public/activity-formatters.js +1 -0
  120. package/dist/web-ui/public/agent-event-parser.js +1 -0
  121. package/dist/web-ui/public/app.js +1 -0
  122. package/dist/web-ui/public/approve-dialog.js +1 -0
  123. package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
  124. package/dist/web-ui/public/coderflow-logo.svg +46 -0
  125. package/dist/web-ui/public/comments-widget.js +1 -0
  126. package/dist/web-ui/public/docs/.nojekyll +0 -0
  127. package/dist/web-ui/public/docs/README.md +26 -0
  128. package/dist/web-ui/public/docs/_sidebar.md +47 -0
  129. package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
  130. package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
  131. package/dist/web-ui/public/docs/admin/environments.md +215 -0
  132. package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
  133. package/dist/web-ui/public/docs/admin/installation.md +313 -0
  134. package/dist/web-ui/public/docs/admin/skills.md +35 -0
  135. package/dist/web-ui/public/docs/admin/sso.md +241 -0
  136. package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
  137. package/dist/web-ui/public/docs/code/cli.md +102 -0
  138. package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
  139. package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
  140. package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
  141. package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
  142. package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
  143. package/dist/web-ui/public/docs/index.html +151 -0
  144. package/dist/web-ui/public/docs/integrations/custom.md +58 -0
  145. package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
  146. package/dist/web-ui/public/docs/integrations/overview.md +48 -0
  147. package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
  148. package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
  149. package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
  150. package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
  151. package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
  152. package/dist/web-ui/public/docs/tasks/judging.md +114 -0
  153. package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
  154. package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
  155. package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
  156. package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
  157. package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
  158. package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
  159. package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
  160. package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
  161. package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
  162. package/dist/web-ui/public/environments.css +3942 -0
  163. package/dist/web-ui/public/environments.html +1791 -0
  164. package/dist/web-ui/public/environments.js +1 -0
  165. package/dist/web-ui/public/favicon-16.png +0 -0
  166. package/dist/web-ui/public/favicon-32.png +0 -0
  167. package/dist/web-ui/public/favicon.ico +0 -0
  168. package/dist/web-ui/public/feedback-widget.css +3133 -0
  169. package/dist/web-ui/public/feedback-widget.js +1 -0
  170. package/dist/web-ui/public/git-history.css +2663 -0
  171. package/dist/web-ui/public/git-history.html +272 -0
  172. package/dist/web-ui/public/git-history.js +1 -0
  173. package/dist/web-ui/public/git-status.js +1 -0
  174. package/dist/web-ui/public/index.html +1459 -0
  175. package/dist/web-ui/public/index.js +1 -0
  176. package/dist/web-ui/public/login.html +346 -0
  177. package/dist/web-ui/public/login.js +1 -0
  178. package/dist/web-ui/public/markdown-editor.js +1 -0
  179. package/dist/web-ui/public/markdown-file-editor.js +1 -0
  180. package/dist/web-ui/public/modal-maximize.js +1 -0
  181. package/dist/web-ui/public/notifications.js +1 -0
  182. package/dist/web-ui/public/server-health.js +1 -0
  183. package/dist/web-ui/public/settings.css +761 -0
  184. package/dist/web-ui/public/settings.html +1044 -0
  185. package/dist/web-ui/public/settings.js +1 -0
  186. package/dist/web-ui/public/setup-password.html +355 -0
  187. package/dist/web-ui/public/setup-password.js +1 -0
  188. package/dist/web-ui/public/skills.css +1949 -0
  189. package/dist/web-ui/public/skills.html +820 -0
  190. package/dist/web-ui/public/skills.js +1 -0
  191. package/dist/web-ui/public/sse-client.js +1 -0
  192. package/dist/web-ui/public/sse-shared-worker.js +1 -0
  193. package/dist/web-ui/public/styles.css +18614 -0
  194. package/dist/web-ui/public/task.html +1779 -0
  195. package/dist/web-ui/public/task.js +1 -0
  196. package/dist/web-ui/public/terminal.html +45 -0
  197. package/dist/web-ui/public/terminal.js +1 -0
  198. package/dist/web-ui/public/theme.js +1 -0
  199. package/dist/web-ui/public/users.html +298 -0
  200. package/dist/web-ui/public/users.js +1 -0
  201. package/dist/web-ui/public/variant-grouping.js +1 -0
  202. package/package.json +63 -0
@@ -0,0 +1,1779 @@
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>Task Details · 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=90">
26
+ <!-- Syntax highlighting -->
27
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
28
+ <!-- Load libraries before modules (blocking) -->
29
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
30
+ <script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js"></script>
31
+ <script src="https://cdn.jsdelivr.net/npm/turndown@7.1.2/dist/turndown.js"></script>
32
+ <!-- Image editor dependencies -->
33
+ <link rel="stylesheet" href="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.css">
34
+ <link rel="stylesheet" href="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.css">
35
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.3.0/fabric.min.js"></script>
36
+ <script src="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.js"></script>
37
+ <script src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script>
38
+ <script type="module" src="markdown-editor.js?v=1"></script>
39
+ <script src="markdown-file-editor.js?v=1"></script>
40
+ <script type="module" src="comments-widget.js?v=1"></script>
41
+ <script type="module" src="task.js?v=68"></script>
42
+ <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
43
+ </head>
44
+ <body>
45
+ <button id="task-list-side-trigger" class="task-list-side-trigger" title="Browse other tasks">
46
+ <span class="side-trigger-icon">☰</span>
47
+ <span class="side-trigger-label">Tasks</span>
48
+ </button>
49
+ <main class="task-detail">
50
+ <div class="task-hero">
51
+ <div class="hero-top">
52
+ <nav class="breadcrumb" aria-label="Breadcrumb">
53
+ <a class="breadcrumb-link" href="index.html">
54
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
55
+ <path d="M3 11.5L12 4l9 7.5"></path>
56
+ <path d="M5 10.5V20h5v-5h4v5h5v-9.5"></path>
57
+ </svg>
58
+ <span>Home</span>
59
+ </a>
60
+ <span class="breadcrumb-separator" aria-hidden="true">/</span>
61
+ <span class="breadcrumb-current">Task Details</span>
62
+ </nav>
63
+ <span id="task-context" class="task-context">Loading…</span>
64
+ <button class="btn-icon" id="view-task-group" title="View task group" aria-label="View task group" style="display: none;">
65
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
66
+ <rect x="3" y="3" width="7" height="7"></rect>
67
+ <rect x="14" y="3" width="7" height="7"></rect>
68
+ <rect x="14" y="14" width="7" height="7"></rect>
69
+ <rect x="3" y="14" width="7" height="7"></rect>
70
+ </svg>
71
+ </button>
72
+ <button class="btn-ghost btn-small judge-indicator-btn" id="judge-indicator-btn" title="Judge tasks" aria-label="Judge tasks" hidden>
73
+ <span class="judge-indicator-icon" aria-hidden="true">
74
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
75
+ <path d="M6 6h12"></path>
76
+ <path d="M12 6v12"></path>
77
+ <path d="M8 18h8"></path>
78
+ <path d="M6 6l-3 5h6l-3-5z"></path>
79
+ <path d="M18 6l-3 5h6l-3-5z"></path>
80
+ </svg>
81
+ </span>
82
+ <span class="judge-count-badge" id="judge-count-badge" hidden>0</span>
83
+ </button>
84
+ <div class="btn-group" id="share-btn-group">
85
+ <button class="btn-icon" id="share-task" title="Share">
86
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
87
+ <circle cx="18" cy="5" r="3"></circle>
88
+ <circle cx="6" cy="12" r="3"></circle>
89
+ <circle cx="18" cy="19" r="3"></circle>
90
+ <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line>
91
+ <line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>
92
+ </svg>
93
+ </button>
94
+ <div class="dropdown-menu" id="share-dropdown-menu" hidden>
95
+ <button class="dropdown-item" id="share-copy-group-link" data-action="copy-group-link" hidden>
96
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
97
+ <rect x="3" y="3" width="7" height="7"></rect>
98
+ <rect x="14" y="3" width="7" height="7"></rect>
99
+ <rect x="14" y="14" width="7" height="7"></rect>
100
+ <rect x="3" y="14" width="7" height="7"></rect>
101
+ </svg>
102
+ <span class="option-text">Copy Task Group Link</span>
103
+ </button>
104
+ <button class="dropdown-item" id="share-copy-link" data-action="copy-link">
105
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
106
+ <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
107
+ <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
108
+ </svg>
109
+ <span class="option-text">Copy Task Link</span>
110
+ </button>
111
+ <button class="dropdown-item" id="share-copy-id" data-action="copy-id">
112
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
113
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
114
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
115
+ </svg>
116
+ <span class="option-text">Copy Task ID</span>
117
+ </button>
118
+ </div>
119
+ </div>
120
+ <button class="btn-icon" id="pin-task" title="Pin task" data-pinned="false">
121
+ <svg class="pin-icon pin-svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
122
+ <path d="M12 17v5"></path>
123
+ <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>
124
+ </svg>
125
+ <span class="pin-icon pin-emoji" style="display: none;">📌</span>
126
+ </button>
127
+ <button class="btn-ghost btn-small" id="reset-layout">Reset Layout</button>
128
+ <button class="btn-icon" id="hide-all-sections" title="Hide all sections" style="display: none;">
129
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
130
+ <polyline points="17 11 12 6 7 11"></polyline>
131
+ <polyline points="17 18 12 13 7 18"></polyline>
132
+ </svg>
133
+ </button>
134
+ <button class="btn-ghost btn-small" id="show-hidden-sections" style="display: none;">Show Hidden (0)</button>
135
+ <!-- More Actions Menu -->
136
+ <div class="btn-group" id="more-actions-btn-group">
137
+ <button class="btn-icon" id="more-actions-btn" title="More actions" aria-label="More actions">
138
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
139
+ <circle cx="12" cy="12" r="1"></circle>
140
+ <circle cx="12" cy="5" r="1"></circle>
141
+ <circle cx="12" cy="19" r="1"></circle>
142
+ </svg>
143
+ </button>
144
+ <div class="dropdown-menu" id="more-actions-dropdown" hidden>
145
+ <div class="dropdown-section">
146
+ <button class="dropdown-item" id="more-manage-grouping" data-action="manage-grouping">
147
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
148
+ <path d="M8 6h2v2H8V6zm6 0h2v2h-2V6zM8 11h2v2H8v-2zm6 0h2v2h-2v-2zm-6 5h2v2H8v-2zm6 0h2v2h-2v-2z"/>
149
+ </svg>
150
+ <span class="option-text">Manage Grouping...</span>
151
+ </button>
152
+ <button class="dropdown-item" id="more-compare-variants" data-action="compare-variants" hidden>
153
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
154
+ <path d="M6 9H4.5a2.5 2.5 0 0 1 0-5H6"></path>
155
+ <path d="M18 9h1.5a2.5 2.5 0 0 0 0-5H18"></path>
156
+ <path d="M4 22h16"></path>
157
+ <path d="M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"></path>
158
+ <path d="M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"></path>
159
+ <path d="M18 2H6v7a6 6 0 0 0 12 0V2Z"></path>
160
+ </svg>
161
+ <span class="option-text">Compare Variants...</span>
162
+ </button>
163
+ <button class="dropdown-item" id="more-open-all-variants" data-action="open-all-variants" hidden>
164
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
165
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
166
+ <polyline points="15 3 21 3 21 9"></polyline>
167
+ <line x1="10" y1="14" x2="21" y2="3"></line>
168
+ </svg>
169
+ <span class="option-text">Open Variants in Separate Tabs</span>
170
+ </button>
171
+ <button class="dropdown-item" id="more-resubmit-task" data-action="resubmit-task">
172
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
173
+ <path d="M17 1l4 4-4 4"></path>
174
+ <path d="M3 11V9a4 4 0 0 1 4-4h14"></path>
175
+ <path d="M7 23l-4-4 4-4"></path>
176
+ <path d="M21 13v2a4 4 0 0 1-4 4H3"></path>
177
+ </svg>
178
+ <span class="option-text">Resubmit Task...</span>
179
+ </button>
180
+ <button class="dropdown-item" id="more-delete-task" data-action="delete-task">
181
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
182
+ <polyline points="3 6 5 6 21 6"></polyline>
183
+ <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>
184
+ <line x1="10" y1="11" x2="10" y2="17"></line>
185
+ <line x1="14" y1="11" x2="14" y2="17"></line>
186
+ </svg>
187
+ <span class="option-text">Delete Task...</span>
188
+ </button>
189
+ </div>
190
+ <div class="dropdown-divider"></div>
191
+ <div class="dropdown-section">
192
+ <button class="dropdown-item" id="more-theme-toggle" data-action="theme-toggle">
193
+ <svg class="option-icon theme-icon-sun" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
194
+ <circle cx="12" cy="12" r="5"></circle>
195
+ <line x1="12" y1="1" x2="12" y2="3"></line>
196
+ <line x1="12" y1="21" x2="12" y2="23"></line>
197
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
198
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
199
+ <line x1="1" y1="12" x2="3" y2="12"></line>
200
+ <line x1="21" y1="12" x2="23" y2="12"></line>
201
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
202
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
203
+ </svg>
204
+ <svg class="option-icon theme-icon-moon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display: none;">
205
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
206
+ </svg>
207
+ <span class="option-text" id="more-theme-toggle-text">Dark Mode</span>
208
+ </button>
209
+ <button class="dropdown-item" id="more-keyboard-shortcuts" data-action="keyboard-shortcuts">
210
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
211
+ <rect x="2" y="4" width="20" height="16" rx="2" ry="2"></rect>
212
+ <path d="M6 8h.001M10 8h.001M14 8h.001M18 8h.001M8 12h.001M12 12h.001M16 12h.001M6 16h8"></path>
213
+ </svg>
214
+ <span class="option-text">Keyboard Shortcuts</span>
215
+ </button>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </div>
220
+ <div class="status-hero">
221
+ <div class="status-copy">
222
+ <div class="task-title-wrapper" style="display: flex; align-items: center;">
223
+ <h1 id="task-title">Task</h1>
224
+ <button class="task-rename-btn" id="task-rename-btn" title="Rename task">
225
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
226
+ <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>
227
+ <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>
228
+ </svg>
229
+ </button>
230
+ </div>
231
+ <p id="task-subtitle" class="task-subtitle">Preparing details…</p>
232
+
233
+ <!-- Jira Link Badge (hidden by default) -->
234
+ <div id="jiraInfo" class="jira-link-badge" style="display: none; margin-top: 8px; margin-bottom: -8px;">
235
+ <span class="jira-icon">📋</span>
236
+ <span>Jira Issue: <a id="jiraLink" href="" target="_blank" rel="noopener"></a></span>
237
+ </div>
238
+ </div>
239
+ <div class="status-actions">
240
+ <span id="task-status" class="status-pill status-unknown">Status</span>
241
+ <div class="btn-group" id="vscode-btn-group">
242
+ <button class="btn-secondary btn-small" id="vscode-task" disabled>VS Code</button>
243
+ <button class="btn-secondary btn-small btn-dropdown-toggle" id="vscode-dropdown-toggle" disabled>▼</button>
244
+ <div class="dropdown-menu" id="vscode-dropdown-menu" hidden>
245
+ <div class="dropdown-section" id="vscode-directories-section">
246
+ <button class="dropdown-item task-menu-item" data-action="workspace" data-path="/workspace">
247
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
248
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path>
249
+ </svg>
250
+ <span class="option-text">Workspace</span>
251
+ </button>
252
+ <button class="dropdown-item task-menu-item" data-action="root" data-path="/">
253
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
254
+ <rect x="3" y="3" width="7" height="7"></rect>
255
+ <rect x="14" y="3" width="7" height="7"></rect>
256
+ <rect x="14" y="14" width="7" height="7"></rect>
257
+ <rect x="3" y="14" width="7" height="7"></rect>
258
+ </svg>
259
+ <span class="option-text">Container Root</span>
260
+ </button>
261
+ <button class="dropdown-item task-menu-item" data-action="task-output" data-path="/task-output">
262
+ <svg class="option-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
263
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
264
+ <polyline points="14 2 14 8 20 8"></polyline>
265
+ <line x1="16" y1="13" x2="8" y2="13"></line>
266
+ <line x1="16" y1="17" x2="8" y2="17"></line>
267
+ <polyline points="10 9 9 9 8 9"></polyline>
268
+ </svg>
269
+ <span class="option-text">Task Output</span>
270
+ </button>
271
+ </div>
272
+ <div class="dropdown-section" id="vscode-repos-section" hidden>
273
+ <!-- Repository items will be populated dynamically -->
274
+ </div>
275
+ </div>
276
+ </div>
277
+ <div class="btn-group" id="app-server-btn-group" hidden>
278
+ <button class="btn-secondary btn-small" id="app-server-task" disabled>
279
+ <span id="app-server-status-indicator" class="status-indicator"></span>
280
+ Testing
281
+ </button>
282
+ <button class="btn-secondary btn-small btn-dropdown-toggle" id="app-server-dropdown-toggle" disabled>▼</button>
283
+ <div class="dropdown-menu" id="app-server-dropdown-menu" hidden>
284
+ <div class="dropdown-section" id="app-server-control-section">
285
+ <button class="dropdown-item task-menu-item" id="app-server-start-btn" data-action="start">
286
+ <svg class="option-icon icon-play" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
287
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
288
+ </svg>
289
+ <span class="option-text" id="start-server-text">Start Server</span>
290
+ </button>
291
+ <button class="dropdown-item task-menu-item" id="app-server-restart-btn" data-action="restart" hidden>
292
+ <svg class="option-icon icon-restart" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
293
+ <polyline points="23 4 23 10 17 10"></polyline>
294
+ <polyline points="1 20 1 14 7 14"></polyline>
295
+ <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>
296
+ </svg>
297
+ <span class="option-text" id="restart-server-text">Restart Server</span>
298
+ </button>
299
+ <button class="dropdown-item task-menu-item" id="app-server-stop-btn" data-action="stop" hidden>
300
+ <svg class="option-icon icon-stop" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
301
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
302
+ </svg>
303
+ <span class="option-text" id="stop-server-text">Stop Server</span>
304
+ </button>
305
+ <button class="dropdown-item task-menu-item" id="app-server-view-logs-btn">
306
+ <svg class="option-icon icon-logs" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
307
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
308
+ <polyline points="14 2 14 8 20 8"></polyline>
309
+ <line x1="16" y1="13" x2="8" y2="13"></line>
310
+ <line x1="16" y1="17" x2="8" y2="17"></line>
311
+ <polyline points="10 9 9 9 8 9"></polyline>
312
+ </svg>
313
+ <span class="option-text">View Server Logs</span>
314
+ </button>
315
+ </div>
316
+ <div class="dropdown-section" id="app-server-launch-start-section" hidden>
317
+ <div class="dropdown-submenu-wrapper">
318
+ <button class="dropdown-item dropdown-submenu-toggle task-menu-item" id="launch-start-toggle">
319
+ <svg class="option-icon icon-play" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
320
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
321
+ </svg>
322
+ <span class="option-text">Start Server & Launch</span>
323
+ <span class="dropdown-arrow">▶</span>
324
+ </button>
325
+ <div class="dropdown-submenu" id="launch-start-submenu" hidden>
326
+ <div id="app-server-launch-start-container">
327
+ <!-- URLs will be populated dynamically -->
328
+ </div>
329
+ </div>
330
+ </div>
331
+ </div>
332
+ <div class="dropdown-section" id="app-server-urls-section" hidden>
333
+ <div class="dropdown-submenu-wrapper">
334
+ <button class="dropdown-item dropdown-submenu-toggle task-menu-item" id="launch-urls-toggle">
335
+ <svg class="option-icon icon-globe" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
336
+ <circle cx="12" cy="12" r="10"></circle>
337
+ <line x1="2" y1="12" x2="22" y2="12"></line>
338
+ <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>
339
+ </svg>
340
+ <span class="option-text">Launch URLs</span>
341
+ <span class="dropdown-arrow">▶</span>
342
+ </button>
343
+ <div class="dropdown-submenu" id="launch-urls-submenu" hidden>
344
+ <div id="app-server-urls-container">
345
+ <!-- URLs will be populated dynamically -->
346
+ </div>
347
+ </div>
348
+ </div>
349
+ </div>
350
+ <div class="dropdown-section" id="tests-section" hidden>
351
+ <div class="dropdown-submenu-wrapper">
352
+ <button class="dropdown-item dropdown-submenu-toggle task-menu-item" id="run-tests-toggle">
353
+ <svg class="option-icon icon-test-run" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
354
+ <polyline points="9 11 12 14 22 4"></polyline>
355
+ <path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path>
356
+ </svg>
357
+ <span class="option-text">Run Test Commands</span>
358
+ <span class="dropdown-arrow">▶</span>
359
+ </button>
360
+ <div class="dropdown-submenu" id="run-tests-submenu" hidden>
361
+ <div id="tests-container">
362
+ <!-- Tests will be populated dynamically -->
363
+ </div>
364
+ </div>
365
+ </div>
366
+ </div>
367
+ </div>
368
+ </div>
369
+ <div class="btn-group" id="terminal-btn-group">
370
+ <button class="btn-secondary btn-small" id="terminal-task" disabled>Terminal</button>
371
+ <button class="btn-secondary btn-small btn-dropdown-toggle" id="terminal-dropdown-toggle" disabled>▼</button>
372
+ <div class="dropdown-menu" id="terminal-dropdown-menu" hidden>
373
+ <button class="dropdown-item task-menu-item" data-action="terminal">
374
+ <svg class="option-icon icon-terminal-open" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
375
+ <polyline points="4 17 10 11 4 5"></polyline>
376
+ <line x1="12" y1="19" x2="20" y2="19"></line>
377
+ </svg>
378
+ <span class="option-text">Open Terminal</span>
379
+ </button>
380
+ <button class="dropdown-item task-menu-item" data-action="copy-attach">
381
+ <svg class="option-icon icon-copy" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
382
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
383
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
384
+ </svg>
385
+ <span class="option-text">Copy Attach Command</span>
386
+ </button>
387
+ <button class="dropdown-item task-menu-item" data-action="resume" id="terminal-resume-option" hidden>
388
+ <svg class="option-icon icon-resume" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
389
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
390
+ </svg>
391
+ <span class="option-text">Resume with [Agent]</span>
392
+ </button>
393
+ <button class="dropdown-item task-menu-item" data-action="new-claude">
394
+ <svg class="option-icon icon-claude-session" width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
395
+ <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"/>
396
+ </svg>
397
+ <span class="option-text">New Claude Session</span>
398
+ </button>
399
+ <button class="dropdown-item task-menu-item" data-action="new-codex">
400
+ <svg class="option-icon icon-codex-session" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
401
+ <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"/>
402
+ </svg>
403
+ <span class="option-text">New Codex Session</span>
404
+ </button>
405
+ <button class="dropdown-item task-menu-item" data-action="new-gemini">
406
+ <svg class="option-icon icon-gemini-session" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
407
+ <path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
408
+ </svg>
409
+ <span class="option-text">New Gemini Session</span>
410
+ </button>
411
+ </div>
412
+ </div>
413
+ <button class="btn-ghost btn-small" id="stop-task" disabled>Stop</button>
414
+ <button class="btn-primary btn-small" id="approve-task" disabled>Approve</button>
415
+ </div>
416
+ </div>
417
+
418
+ <div class="latest-activity-banner fade-gradient-container" id="latest-activity-banner" hidden>
419
+ <div class="latest-activity-header">
420
+ <div class="latest-activity-label">Latest update</div>
421
+ <span class="latest-activity-time" id="latest-activity-time">—</span>
422
+ <button type="button" id="copy-latest-activity-btn" class="btn-ghost btn-small icon-btn" title="Copy update" style="margin-left: auto; margin-right: 4px;">
423
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
424
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
425
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
426
+ </svg>
427
+ </button>
428
+ <button type="button" id="jump-to-comments-btn" class="btn-ghost btn-small jump-to-comments-btn" title="Jump to comments" hidden>
429
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
430
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
431
+ </svg>
432
+ <span id="jump-to-comments-count"></span>
433
+ </button>
434
+ <svg class="latest-activity-chevron" id="latest-activity-chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
435
+ <polyline points="6 9 12 15 18 9"></polyline>
436
+ </svg>
437
+ </div>
438
+ <!-- Sticky Todo Progress Section (shows when todos exist in activity history) -->
439
+ <div class="todo-progress-section" id="todo-progress-section" hidden>
440
+ <div class="todo-progress-header" id="todo-progress-clickable" title="Click to view full to do list">
441
+ <span class="todo-progress-icon">
442
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" y1="6" x2="21" y2="6"></line><line x1="10" y1="12" x2="21" y2="12"></line><line x1="10" y1="18" x2="21" y2="18"></line><polyline points="3 6 4 7 6 5"></polyline><polyline points="3 12 4 13 6 11"></polyline><polyline points="3 18 4 19 6 17"></polyline></svg>
443
+ </span>
444
+ <span class="todo-progress-label">To Do</span>
445
+ <div class="todo-progress-bar-container">
446
+ <div class="todo-progress-bar" id="todo-progress-bar"></div>
447
+ </div>
448
+ <span class="todo-progress-count" id="todo-progress-count">0/0</span>
449
+ <button type="button" class="todo-progress-dismiss" id="todo-progress-dismiss" title="Dismiss to do progress">
450
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
451
+ <line x1="18" y1="6" x2="6" y2="18"></line>
452
+ <line x1="6" y1="6" x2="18" y2="18"></line>
453
+ </svg>
454
+ </button>
455
+ </div>
456
+ <div class="todo-progress-current" id="todo-progress-current"></div>
457
+ </div>
458
+ <div class="latest-activity-content">
459
+ <div class="latest-activity-icon" id="latest-activity-icon">🤖</div>
460
+ <div class="latest-activity-text">
461
+ <div class="latest-activity-action" id="latest-activity-action">Waiting for updates</div>
462
+ <div class="latest-activity-detail" id="latest-activity-detail">Agent updates will appear here as soon as they happen.</div>
463
+ </div>
464
+ <div class="latest-activity-meta">
465
+ <div class="latest-activity-jump">
466
+ <button type="button" class="btn-ghost btn-small latest-jump-btn" id="jump-to-activity">
467
+ <span class="latest-jump-icon">📡</span>
468
+ <span>Agent Activity</span>
469
+ <span class="activity-count-badge" id="jump-activity-count">0</span>
470
+ </button>
471
+ <button type="button" class="btn-ghost btn-small latest-jump-btn" id="jump-to-summary">
472
+ <span class="latest-jump-icon">📝</span>
473
+ <span>Output Summary</span>
474
+ <span class="summary-check" id="jump-summary-check" hidden>✓</span>
475
+ </button>
476
+ <button type="button" class="btn-ghost btn-small latest-jump-btn" id="jump-to-changes">
477
+ <span class="latest-jump-icon">📂</span>
478
+ <span>Changed Files</span>
479
+ <span class="activity-count-badge" id="jump-files-changed" hidden>0</span>
480
+ <span class="repos-count-badge" id="jump-repos-count" hidden title="Repositories with changes">0 repos</span>
481
+ <span class="diff-stat"><span class="diff-add" id="jump-diff-added">+0</span></span>
482
+ <span class="diff-stat"><span class="diff-del" id="jump-diff-deleted">-0</span></span>
483
+ </button>
484
+ </div>
485
+ </div>
486
+ </div>
487
+ <!-- Quick Reply Section - Proximity-aware feedback input -->
488
+ <div class="quick-reply-section" id="quick-reply-section" hidden>
489
+ <div class="quick-reply-collapsed" id="quick-reply-collapsed">
490
+ <button type="button" class="quick-reply-trigger" id="quick-reply-trigger" title="Reply to agent (R)">
491
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
492
+ <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path>
493
+ </svg>
494
+ <span>Reply...</span>
495
+ <kbd class="quick-reply-kbd">R</kbd>
496
+ </button>
497
+ </div>
498
+ <div class="quick-reply-expanded" id="quick-reply-expanded" hidden>
499
+ <div class="quick-reply-input-wrapper">
500
+ <!-- Markdown editor with toolbar (initialized in JS) -->
501
+ <div class="quick-reply-input-row">
502
+ <div class="quick-reply-editor-wrapper">
503
+ <div id="quick-reply-toolbar" class="follow-up-toolbar follow-up-toolbar-hidden"></div>
504
+ <div id="quick-reply-editor-container" class="follow-up-editor-container"></div>
505
+ </div>
506
+ <button type="button" class="btn-icon-launch quick-reply-submit-btn" id="quick-reply-submit" title="Submit (Ctrl+Enter)">&#10148;</button>
507
+ </div>
508
+ <!-- Action buttons below textarea -->
509
+ <div class="quick-reply-actions">
510
+ <div class="quick-reply-left-actions">
511
+ <button type="button" class="btn-icon-mini" id="quick-reply-attach" title="Attach files">
512
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
513
+ <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>
514
+ </svg>
515
+ </button>
516
+ <button type="button" class="btn-icon-mini" id="quick-reply-screenshot" title="Capture screenshot">
517
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
518
+ <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>
519
+ <circle cx="12" cy="13" r="4"></circle>
520
+ </svg>
521
+ </button>
522
+ </div>
523
+ <div class="quick-reply-right-actions">
524
+ <button type="button" class="btn-ghost btn-small" id="quick-reply-cancel">Cancel</button>
525
+ </div>
526
+ </div>
527
+ <!-- Attached files display -->
528
+ <div id="quick-reply-attached-files" class="attached-files-list" hidden></div>
529
+ </div>
530
+ </div>
531
+ </div>
532
+ </div>
533
+ </div>
534
+
535
+ <div id="task-loading" class="loading">Loading task…</div>
536
+ <div id="task-error" class="empty-state" hidden>
537
+ <h3>We could not load this task</h3>
538
+ <p id="task-error-message" class="text-muted"></p>
539
+ <a class="btn-primary" href="index.html">Back to tasks</a>
540
+ </div>
541
+
542
+ <section id="task-content" class="detail-stack" hidden>
543
+ <article class="detail-card" id="execution-card" draggable="false">
544
+ <header class="detail-card-header">
545
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
546
+ <h2>Task Details</h2>
547
+ <div class="header-actions">
548
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
549
+ <span class="hide-icon">×</span>
550
+ </button>
551
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
552
+ <span class="expand-icon">⬚</span>
553
+ </button>
554
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
555
+ <span class="collapse-icon">▼</span>
556
+ </button>
557
+ </div>
558
+ </header>
559
+ <div class="detail-card-content">
560
+ <dl class="meta-grid" id="execution-meta">
561
+ <div>
562
+ <dt>Task ID</dt>
563
+ <dd><code id="meta-task-id">—</code></dd>
564
+ </div>
565
+ <div>
566
+ <dt>Environment</dt>
567
+ <dd id="meta-environment">—</dd>
568
+ </div>
569
+ <div>
570
+ <dt>Template</dt>
571
+ <dd id="meta-template">—</dd>
572
+ </div>
573
+ <div>
574
+ <dt>Created</dt>
575
+ <dd id="meta-created">—</dd>
576
+ </div>
577
+ <div>
578
+ <dt>Created By</dt>
579
+ <dd id="meta-created-by">—</dd>
580
+ </div>
581
+ <div>
582
+ <dt>Duration</dt>
583
+ <dd id="meta-duration">—</dd>
584
+ </div>
585
+ <div>
586
+ <dt>Exit code</dt>
587
+ <dd id="meta-exit">—</dd>
588
+ </div>
589
+ <div>
590
+ <dt>Container</dt>
591
+ <dd id="meta-container">—</dd>
592
+ </div>
593
+ <div>
594
+ <dt>Container State</dt>
595
+ <dd id="meta-container-state">—</dd>
596
+ </div>
597
+ <div id="meta-approved-by-wrapper" hidden>
598
+ <dt>Approved by</dt>
599
+ <dd id="meta-approved-by">—</dd>
600
+ </div>
601
+ <div id="meta-follow-ups-wrapper" hidden>
602
+ <dt>Follow-Ups</dt>
603
+ <dd><button id="meta-follow-ups" class="link-button" style="padding: 0; border: none; background: none; color: var(--color-primary); cursor: pointer; text-decoration: underline;">—</button></dd>
604
+ </div>
605
+ </dl>
606
+ <div id="execution-tags" class="parameter-group"></div>
607
+ <div class="summary-box-wrapper" style="position: relative;">
608
+ <button type="button" id="copy-execution-notes-btn" class="btn-icon-mini" style="position: absolute; top: 8px; right: 28px; z-index: 10; background: var(--color-bg-primary); border: 1px solid var(--color-border);" title="Copy details">
609
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
610
+ </button>
611
+ <div id="execution-notes" class="summary-box scroll-box field-hint"></div>
612
+ </div>
613
+ </div>
614
+ </article>
615
+
616
+ <article class="detail-card" id="live-activity-card" draggable="false" hidden>
617
+ <header class="detail-card-header">
618
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
619
+ <h2>Agent Activity <span class="activity-count" id="activity-count">0</span></h2>
620
+ <div class="activity-search-wrapper">
621
+ <button type="button" class="btn-ghost btn-small" id="activity-search-toggle" title="Search activity (/)">
622
+ <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">
623
+ <circle cx="11" cy="11" r="8"></circle>
624
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
625
+ </svg>
626
+ </button>
627
+ <div class="activity-search-container" id="activity-search-container" hidden>
628
+ <svg class="activity-search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
629
+ <circle cx="11" cy="11" r="8"></circle>
630
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
631
+ </svg>
632
+ <input type="text" id="activity-search-input" placeholder="Search activity..." autocomplete="off" />
633
+ <button type="button" class="activity-search-close" id="activity-search-close" title="Close search">
634
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
635
+ <line x1="18" y1="6" x2="6" y2="18"></line>
636
+ <line x1="6" y1="6" x2="18" y2="18"></line>
637
+ </svg>
638
+ </button>
639
+ </div>
640
+ <span class="activity-filter-count" id="activity-filter-count" hidden></span>
641
+ </div>
642
+ <div class="header-actions">
643
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
644
+ <span class="hide-icon">×</span>
645
+ </button>
646
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
647
+ <span class="expand-icon">⬚</span>
648
+ </button>
649
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
650
+ <span class="collapse-icon">▼</span>
651
+ </button>
652
+ </div>
653
+ </header>
654
+ <div class="detail-card-content">
655
+ <!-- Activity Type Filter Chips -->
656
+ <div class="activity-filter-chips" id="activity-filter-chips">
657
+ <button type="button" class="activity-filter-chip active" data-filter="all" title="Show all activity">All</button>
658
+ <button type="button" class="activity-filter-chip" data-filter="tools" title="Show tool calls (Bash, Read, Write, Edit, etc.)">
659
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
660
+ <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>
661
+ </svg>
662
+ Tools
663
+ </button>
664
+ <button type="button" class="activity-filter-chip" data-filter="thinking" title="Show agent thinking process">
665
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
666
+ <circle cx="12" cy="12" r="10"></circle>
667
+ <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
668
+ <line x1="12" y1="17" x2="12.01" y2="17"></line>
669
+ </svg>
670
+ Thinking
671
+ </button>
672
+ <button type="button" class="activity-filter-chip" data-filter="responses" title="Show agent responses">
673
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
674
+ <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path>
675
+ </svg>
676
+ Responses
677
+ </button>
678
+ <button type="button" class="activity-filter-chip" data-filter="messages" title="Show user instructions and follow-ups">
679
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
680
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
681
+ </svg>
682
+ Prompts
683
+ </button>
684
+ <button type="button" class="activity-filter-chip" data-filter="errors" title="Show errors only">
685
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
686
+ <circle cx="12" cy="12" r="10"></circle>
687
+ <line x1="12" y1="8" x2="12" y2="12"></line>
688
+ <line x1="12" y1="16" x2="12.01" y2="16"></line>
689
+ </svg>
690
+ Errors
691
+ </button>
692
+ </div>
693
+ <!-- Tool Type Sub-filter (shown when Tools filter is active) -->
694
+ <!-- Chips are dynamically generated from TOOL_TYPES in activity-feed.js -->
695
+ <div class="tool-type-filter-row" id="tool-type-filter-row" hidden>
696
+ <span class="tool-type-filter-label">Filter by type:</span>
697
+ <div class="tool-type-filter-chips" id="tool-type-filter-chips">
698
+ <!-- Dynamically populated by ActivityFeed.initToolTypeChips() -->
699
+ </div>
700
+ </div>
701
+ <div class="activity-feed" id="activity-feed">
702
+ <div class="activity-placeholder">Waiting for activity...</div>
703
+ </div>
704
+ <div class="inline-follow-up-wrapper" id="inline-follow-up-wrapper" hidden>
705
+ <!-- Hidden file input -->
706
+ <input type="file" id="follow-up-attachments" multiple accept="*/*" hidden aria-label="Attach files">
707
+
708
+ <!-- Markdown editor with toolbar (initialized in JS) -->
709
+ <div class="follow-up-input-row">
710
+ <div class="inline-follow-up-editor-wrapper">
711
+ <div id="inline-follow-up-toolbar" class="follow-up-toolbar follow-up-toolbar-hidden"></div>
712
+ <div id="inline-follow-up-editor-container" class="follow-up-editor-container"></div>
713
+ </div>
714
+ <button type="button" class="btn-icon-launch inline-follow-up-submit" id="submit-inline-follow-up" title="Submit follow-up (Ctrl+Enter)">➤</button>
715
+ </div>
716
+
717
+ <!-- File attachment buttons -->
718
+ <div class="follow-up-actions">
719
+ <button type="button" class="btn-icon-mini" id="attach-follow-up-files-btn" title="Attach files">
720
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
721
+ <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>
722
+ </svg>
723
+ </button>
724
+ <button type="button" class="btn-icon-mini" id="capture-follow-up-screenshot-btn" title="Capture screenshot">
725
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
726
+ <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>
727
+ <circle cx="12" cy="13" r="4"></circle>
728
+ </svg>
729
+ </button>
730
+ </div>
731
+
732
+ <!-- Attached files list -->
733
+ <div id="follow-up-attached-files-list" class="attached-files-list" hidden></div>
734
+ </div>
735
+ </div>
736
+ </article>
737
+
738
+ <article class="detail-card" id="activity-card" draggable="false">
739
+ <header class="detail-card-header">
740
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
741
+ <h2>Logs</h2>
742
+ <div class="logs-search-wrapper" id="logs-search-wrapper">
743
+ <button type="button" class="btn-ghost btn-small" id="logs-search-toggle" title="Search logs">
744
+ <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">
745
+ <circle cx="11" cy="11" r="8"></circle>
746
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
747
+ </svg>
748
+ </button>
749
+ <div class="logs-search-container" id="logs-search-container" hidden>
750
+ <svg class="logs-search-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
751
+ <circle cx="11" cy="11" r="8"></circle>
752
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
753
+ </svg>
754
+ <input type="text" id="logs-search-input" placeholder="Search logs..." autocomplete="off" />
755
+ <span class="logs-search-count" id="logs-search-count" hidden>0</span>
756
+ <button type="button" class="logs-search-nav" id="logs-search-prev" title="Previous match">↑</button>
757
+ <button type="button" class="logs-search-nav" id="logs-search-next" title="Next match">↓</button>
758
+ <button type="button" class="logs-search-close" id="logs-search-close" title="Close search">
759
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
760
+ <line x1="18" y1="6" x2="6" y2="18"></line>
761
+ <line x1="6" y1="6" x2="18" y2="18"></line>
762
+ </svg>
763
+ </button>
764
+ </div>
765
+ </div>
766
+ <div class="header-actions">
767
+ <button type="button" id="copy-logs-btn" class="btn-ghost btn-small" title="Copy logs">
768
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
769
+ </button>
770
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
771
+ <span class="hide-icon">×</span>
772
+ </button>
773
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
774
+ <span class="expand-icon">⬚</span>
775
+ </button>
776
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
777
+ <span class="collapse-icon">▼</span>
778
+ </button>
779
+ </div>
780
+ </header>
781
+ <div class="detail-card-content">
782
+ <div id="logs-content" class="log-window"></div>
783
+ </div>
784
+ </article>
785
+
786
+ <article class="detail-card" id="summary-card" draggable="false">
787
+ <header class="detail-card-header">
788
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
789
+ <h2>Output Summary</h2>
790
+ <div class="header-actions">
791
+ <button type="button" id="copy-summary-btn" class="btn-ghost btn-small" title="Copy summary">
792
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>
793
+ </button>
794
+ <button type="button" id="post-to-jira-btn" class="btn-ghost btn-small" style="display: none;" title="Post summary to Jira">
795
+ 📋 Post to Jira
796
+ </button>
797
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
798
+ <span class="hide-icon">×</span>
799
+ </button>
800
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
801
+ <span class="expand-icon">⬚</span>
802
+ </button>
803
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
804
+ <span class="collapse-icon">▼</span>
805
+ </button>
806
+ </div>
807
+ </header>
808
+ <div class="detail-card-content">
809
+ <div id="output-summary" class="summary-box scroll-box" hidden></div>
810
+ <div id="no-summary" class="field-hint" hidden>No summary available yet.</div>
811
+ </div>
812
+ </article>
813
+
814
+ <article class="detail-card" id="changes-card" draggable="false">
815
+ <header class="detail-card-header">
816
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
817
+ <h2>Changed Files</h2>
818
+ <div class="header-actions">
819
+ <button type="button" class="btn-ghost btn-small" id="sync-repos-btn" title="Check for repository changes">
820
+
821
+ </button>
822
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
823
+ <span class="hide-icon">×</span>
824
+ </button>
825
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
826
+ <span class="expand-icon">⬚</span>
827
+ </button>
828
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
829
+ <span class="collapse-icon">▼</span>
830
+ </button>
831
+ </div>
832
+ </header>
833
+ <div class="detail-card-content">
834
+ <div id="changes-stats" class="parameter-group"></div>
835
+
836
+ <div class="changes-layout">
837
+ <div id="changes-sidebar" class="changes-sidebar" hidden>
838
+ <div class="changes-tree-header">
839
+ <span class="changes-tree-title">Files</span>
840
+ <button class="btn-ghost btn-small icon-btn" id="collapse-changes-tree" title="Collapse tree">
841
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
842
+ <polyline points="15 18 9 12 15 6"></polyline>
843
+ </svg>
844
+ </button>
845
+ </div>
846
+ <div id="changes-tree-content" class="changes-tree-content"></div>
847
+ </div>
848
+
849
+ <div class="changes-main">
850
+ <button class="btn-ghost btn-small changes-tree-toggle" id="expand-changes-tree" title="Show file tree" hidden>
851
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
852
+ <polyline points="9 18 15 12 9 6"></polyline>
853
+ </svg>
854
+ </button>
855
+ <ul id="changes-list" class="diff-list"></ul>
856
+ </div>
857
+ </div>
858
+
859
+ <div class="command-block" id="apply-command-block" hidden>
860
+ <code id="apply-command">coder apply</code>
861
+ <button class="btn-secondary btn-small" id="copy-apply">Copy</button>
862
+ </div>
863
+ </div>
864
+ </article>
865
+
866
+ <!-- Comments Section -->
867
+ <article class="detail-card" id="comments-card" draggable="false" data-default-collapsed="true">
868
+ <header class="detail-card-header">
869
+ <span class="drag-handle" title="Drag to reorder">⋮⋮</span>
870
+ <h2>
871
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: -2px; margin-right: 6px;">
872
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
873
+ </svg>
874
+ Comments <span class="comments-count-badge" id="comments-card-count"></span>
875
+ </h2>
876
+ <div class="header-actions">
877
+ <button type="button" class="btn-ghost btn-small hide-card-btn" title="Hide section">
878
+ <span class="hide-icon">×</span>
879
+ </button>
880
+ <button type="button" class="btn-ghost btn-small expand-card-btn" title="Expand">
881
+ <span class="expand-icon">⬚</span>
882
+ </button>
883
+ <button type="button" class="btn-ghost btn-small toggle-card-btn">
884
+ <span class="collapse-icon">▼</span>
885
+ </button>
886
+ </div>
887
+ </header>
888
+ <div class="detail-card-content">
889
+ <div id="task-comments-container" class="comments-container"></div>
890
+ </div>
891
+ </article>
892
+ </section>
893
+ </main>
894
+
895
+ <!-- Task List Slide-Out Panel -->
896
+ <div id="task-list-panel" class="task-list-panel" hidden>
897
+ <div class="task-list-panel-overlay" id="task-list-panel-overlay"></div>
898
+ <div class="task-list-panel-content">
899
+ <div class="task-list-panel-header">
900
+ <button id="task-list-filter-all" class="task-list-filter-btn active" title="All Tasks">
901
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
902
+ <rect x="3" y="3" width="7" height="7"></rect>
903
+ <rect x="14" y="3" width="7" height="7"></rect>
904
+ <rect x="14" y="14" width="7" height="7"></rect>
905
+ <rect x="3" y="14" width="7" height="7"></rect>
906
+ </svg>
907
+ </button>
908
+ <button id="task-list-filter-pinned" class="task-list-filter-btn" title="Pinned Tasks">
909
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
910
+ <line x1="12" y1="17" x2="12" y2="22"></line>
911
+ <path d="M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24Z"></path>
912
+ </svg>
913
+ </button>
914
+ <button id="task-list-refresh" class="task-list-filter-btn" title="Refresh Tasks">
915
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
916
+ <path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path>
917
+ <path d="M3 3v5h5"></path>
918
+ <path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"></path>
919
+ <path d="M21 21v-5h-5"></path>
920
+ </svg>
921
+ </button>
922
+ <input type="text" id="task-list-search" class="task-list-search" placeholder="Search tasks...">
923
+ <button class="btn-icon task-list-close" id="task-list-close" title="Close">
924
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
925
+ <line x1="18" y1="6" x2="6" y2="18"></line>
926
+ <line x1="6" y1="6" x2="18" y2="18"></line>
927
+ </svg>
928
+ </button>
929
+ </div>
930
+ <div class="task-list-panel-body" id="task-list-panel-body">
931
+ <div class="task-list-loading">Loading tasks...</div>
932
+ </div>
933
+ <div class="task-list-panel-footer">
934
+ <button class="btn-ghost btn-small" id="task-list-load-more" hidden>Load More</button>
935
+ </div>
936
+ </div>
937
+ </div>
938
+
939
+ <!-- Approve Modal - dynamically created by approve-dialog.js -->
940
+
941
+ <!-- Delete Modal -->
942
+ <div id="delete-modal" class="modal" hidden>
943
+ <div class="modal-overlay"></div>
944
+ <div class="modal-content">
945
+ <div class="modal-header">
946
+ <h2>Delete Task</h2>
947
+ <button class="modal-close" id="close-delete-modal">&times;</button>
948
+ </div>
949
+ <div class="modal-body">
950
+ <div class="modal-section">
951
+ <p id="delete-warning" class="field-hint" style="color: var(--color-danger); margin: 0;">This action cannot be undone.</p>
952
+ </div>
953
+ <div class="modal-section">
954
+ <p id="delete-message">What would you like to delete?</p>
955
+ </div>
956
+ </div>
957
+ <div class="modal-footer">
958
+ <button class="btn-ghost" id="cancel-delete">Cancel</button>
959
+ <button class="btn-secondary" id="delete-current-variant">Delete This Variant</button>
960
+ <button class="btn-danger" id="delete-all-variants">Delete All Variants</button>
961
+ </div>
962
+ </div>
963
+ </div>
964
+
965
+ <!-- Unpin Objectives Modal -->
966
+ <div id="unpin-objectives-modal" class="modal" hidden>
967
+ <div class="modal-overlay"></div>
968
+ <div class="modal-content">
969
+ <div class="modal-header">
970
+ <h2>Unpin Parent Objectives?</h2>
971
+ <button class="modal-close" id="close-unpin-objectives-modal">&times;</button>
972
+ </div>
973
+ <div class="modal-body">
974
+ <div class="modal-section">
975
+ <p>The following objectives no longer have any pinned children:</p>
976
+ <ul id="orphaned-objectives-list" style="margin: 8px 0; padding-left: 20px;"></ul>
977
+ </div>
978
+ <div class="modal-section">
979
+ <p class="field-hint" style="margin: 0;">Would you like to unpin these objectives as well?</p>
980
+ </div>
981
+ </div>
982
+ <div class="modal-footer">
983
+ <button class="btn-ghost" id="skip-unpin-objectives">Keep Pinned</button>
984
+ <button class="btn-primary" id="confirm-unpin-objectives">Unpin All</button>
985
+ </div>
986
+ </div>
987
+ </div>
988
+
989
+ <!-- Stop Container Modal -->
990
+ <div id="stop-modal" class="modal" hidden>
991
+ <div class="modal-overlay"></div>
992
+ <div class="modal-content">
993
+ <div class="modal-header">
994
+ <h2>Stop Container</h2>
995
+ <button class="modal-close" id="close-stop-modal">&times;</button>
996
+ </div>
997
+ <div class="modal-body">
998
+ <div class="modal-section">
999
+ <p id="stop-warning" class="field-hint" style="margin: 0;">This will terminate the container and free up resources.</p>
1000
+ </div>
1001
+ <div class="modal-section">
1002
+ <p id="stop-message">The task data will be preserved, but the running environment will be stopped.</p>
1003
+ </div>
1004
+ </div>
1005
+ <div class="modal-footer">
1006
+ <button class="btn-ghost" id="cancel-stop">Cancel</button>
1007
+ <button class="btn-danger" id="confirm-stop">Stop Container</button>
1008
+ </div>
1009
+ </div>
1010
+ </div>
1011
+
1012
+ <!-- Resubmit Modal -->
1013
+ <div id="resubmit-modal" class="modal" hidden>
1014
+ <div class="modal-overlay"></div>
1015
+ <div class="modal-content">
1016
+ <div class="modal-header">
1017
+ <h2>Resubmit Task</h2>
1018
+ <button class="modal-close" id="close-resubmit-modal">&times;</button>
1019
+ </div>
1020
+ <div class="modal-body">
1021
+ <div class="modal-section">
1022
+ <p class="field-hint">Create duplicate tasks based on this configuration.</p>
1023
+ </div>
1024
+ <div class="modal-section">
1025
+ <!-- Agent Selection Container -->
1026
+ <div style="display: flex; align-items: center; gap: 8px;">
1027
+ <!-- Agent Selection -->
1028
+ <div class="agent-selector" role="group" aria-label="Agent selection" id="resubmit-agent-selector">
1029
+ <div class="agent-card" data-agent="claude" data-count="0">
1030
+ <button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Claude count" title="Remove Claude">−</button>
1031
+ <div class="agent-icon" role="button" tabindex="0" aria-label="Claude" title="Claude (Alt+1) (click to add, right-click to remove)">
1032
+ <svg viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
1033
+ <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"/>
1034
+ </svg>
1035
+ </div>
1036
+ <button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Claude count" title="Add Claude">+</button>
1037
+ <div class="agent-count-badge" id="resubmit-claude-count-display">0</div>
1038
+ <input type="number" min="0" max="5" step="1" id="resubmit-claude-count" value="0" hidden readonly aria-label="Number of Claude containers">
1039
+ </div>
1040
+ <div class="agent-card" data-agent="codex" data-count="0">
1041
+ <button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Codex count" title="Remove Codex">−</button>
1042
+ <div class="agent-icon" role="button" tabindex="0" aria-label="Codex" title="Codex (Alt+2) (click to add, right-click to remove)">
1043
+ <svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
1044
+ <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"/>
1045
+ </svg>
1046
+ </div>
1047
+ <button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Codex count" title="Add Codex">+</button>
1048
+ <div class="agent-count-badge" id="resubmit-codex-count-display">0</div>
1049
+ <input type="number" min="0" max="5" step="1" id="resubmit-codex-count" value="0" hidden readonly aria-label="Number of Codex containers">
1050
+ </div>
1051
+ <div class="agent-card" data-agent="gemini" data-count="0">
1052
+ <button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Gemini count" title="Remove Gemini">−</button>
1053
+ <div class="agent-icon" role="button" tabindex="0" aria-label="Gemini" title="Gemini (Alt+3) (click to add, right-click to remove)">
1054
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1055
+ <path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
1056
+ </svg>
1057
+ </div>
1058
+ <button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Gemini count" title="Add Gemini">+</button>
1059
+ <div class="agent-count-badge" id="resubmit-gemini-count-display">0</div>
1060
+ <input type="number" min="0" max="5" step="1" id="resubmit-gemini-count" value="0" hidden readonly aria-label="Number of Gemini containers">
1061
+ </div>
1062
+ </div>
1063
+
1064
+ <!-- Agent Selection Hint -->
1065
+ <div class="agent-hint" id="resubmit-agent-hint" data-visible="true">
1066
+ <span class="agent-hint-arrow">←</span>
1067
+ <span class="agent-hint-text">Select Agents</span>
1068
+ </div>
1069
+ </div>
1070
+ </div>
1071
+
1072
+ <!-- Instructions Section -->
1073
+ <div class="modal-section">
1074
+ <label for="resubmit-instructions" class="field-label" style="display: block; margin-bottom: 6px; font-size: 13px; color: var(--color-text-secondary);">Instructions</label>
1075
+ <div class="resubmit-markdown-editor-container">
1076
+ <textarea
1077
+ id="resubmit-instructions"
1078
+ class="resubmit-instructions-textarea"
1079
+ placeholder="Enter instructions for this task..."
1080
+ rows="3"></textarea>
1081
+ </div>
1082
+ </div>
1083
+
1084
+ <!-- Attachments Section -->
1085
+ <div class="modal-section">
1086
+ <input type="file" id="resubmit-attachments" multiple accept="*/*" hidden aria-label="Attach files">
1087
+ <div class="follow-up-actions">
1088
+ <button type="button" class="btn-icon-mini" id="resubmit-attach-files-btn" title="Attach files">
1089
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1090
+ <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>
1091
+ </svg>
1092
+ </button>
1093
+ <button type="button" class="btn-icon-mini" id="resubmit-capture-screenshot-btn" title="Capture screenshot">
1094
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1095
+ <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>
1096
+ <circle cx="12" cy="13" r="4"></circle>
1097
+ </svg>
1098
+ </button>
1099
+ <span class="field-hint" style="margin-left: 8px; font-size: 12px;">New attachments replace original files</span>
1100
+ </div>
1101
+ <div id="resubmit-attached-files-list" class="attached-files-list" hidden></div>
1102
+ </div>
1103
+
1104
+ <!-- Add as Variant Option -->
1105
+ <div class="modal-section" id="resubmit-variant-section" hidden>
1106
+ <label class="checkbox-label resubmit-variant-checkbox">
1107
+ <input type="checkbox" id="resubmit-as-variant">
1108
+ <span>Add as variant to existing group</span>
1109
+ </label>
1110
+ </div>
1111
+
1112
+ <!-- Error Message Container -->
1113
+ <div class="modal-section" id="resubmit-error-section" hidden>
1114
+ <div id="resubmit-error-message" style="color: var(--color-danger); font-size: 13px; padding: 8px 12px; background: rgba(229,83,104,0.08); border-radius: 4px; border-left: 3px solid var(--color-danger);"></div>
1115
+ </div>
1116
+ </div>
1117
+ <div class="modal-footer">
1118
+ <button class="btn-ghost" id="cancel-resubmit">Cancel</button>
1119
+ <button class="btn-primary" id="confirm-resubmit">Launch</button>
1120
+ </div>
1121
+ </div>
1122
+ </div>
1123
+
1124
+ <!-- Follow-Up History Modal (Read-Only) -->
1125
+ <div id="follow-up-history-modal" class="modal" hidden>
1126
+ <div class="modal-overlay"></div>
1127
+ <div class="modal-content">
1128
+ <div class="modal-header">
1129
+ <h2>Follow-Up History</h2>
1130
+ <div class="header-actions">
1131
+ <button type="button" class="btn-ghost btn-small icon-btn" id="maximize-follow-up-history-modal" title="Maximize">
1132
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1133
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1134
+ </svg>
1135
+ </button>
1136
+ <button class="modal-close" id="close-follow-up-history" title="Close">
1137
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1138
+ <line x1="18" y1="6" x2="6" y2="18"></line>
1139
+ <line x1="6" y1="6" x2="18" y2="18"></line>
1140
+ </svg>
1141
+ </button>
1142
+ </div>
1143
+ </div>
1144
+ <div class="modal-body">
1145
+ <div id="follow-up-history-modal-list" style="font-size: 13px;"></div>
1146
+ </div>
1147
+ <div class="modal-footer">
1148
+ <button class="btn-primary" id="close-follow-up-history-btn">Close</button>
1149
+ </div>
1150
+ </div>
1151
+ </div>
1152
+
1153
+ <!-- Test Parameters Modal (task.html) -->
1154
+ <div id="test-param-modal-task" class="modal" hidden>
1155
+ <div class="modal-overlay"></div>
1156
+ <div class="modal-content">
1157
+ <div class="modal-header">
1158
+ <h2 id="test-param-modal-title-task">Test Parameters</h2>
1159
+ <button type="button" class="modal-close" aria-label="Close">&times;</button>
1160
+ </div>
1161
+ <div class="modal-body">
1162
+ <p class="modal-description">This test requires the following parameters:</p>
1163
+ <div id="test-param-fields-task" class="parameter-fields"></div>
1164
+ </div>
1165
+ <div class="modal-footer">
1166
+ <button type="button" class="btn-ghost" id="test-param-cancel-btn-task">Cancel</button>
1167
+ <button type="button" class="btn-primary" id="test-param-confirm-btn-task" disabled>Run Test</button>
1168
+ </div>
1169
+ </div>
1170
+ </div>
1171
+
1172
+ <!-- VS Code Remote Info Modal -->
1173
+ <div id="vscode-remote-info-modal" class="modal" hidden>
1174
+ <div class="modal-overlay"></div>
1175
+ <div class="modal-content">
1176
+ <div class="modal-header">
1177
+ <h2>Open in VS Code (Remote Container)</h2>
1178
+ <button class="modal-close" id="close-vscode-remote-info">&times;</button>
1179
+ </div>
1180
+ <div class="modal-body">
1181
+ <div class="modal-section">
1182
+ <p class="field-hint">To work with this remote container in VS Code, follow these steps:</p>
1183
+ </div>
1184
+
1185
+ <div class="modal-section">
1186
+ <h3 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600;">Prerequisites (One-Time Setup)</h3>
1187
+ <p style="margin: 4px 0 4px 0;">Install these VS Code extensions locally:</p>
1188
+ <ul style="margin: 4px 0 4px 16px; padding-left: 20px; font-size: 13px;">
1189
+ <li style="margin: 2px 0;"><strong>Remote - SSH</strong></li>
1190
+ <li style="margin: 2px 0;"><strong>Dev Containers</strong></li>
1191
+ </ul>
1192
+ <p style="margin: 8px 0 4px 0; font-size: 13px; color: var(--color-text-secondary);">
1193
+ Extensions → Search "Remote SSH" and "Dev Containers" → Install
1194
+ </p>
1195
+ </div>
1196
+
1197
+ <div class="modal-section">
1198
+ <h3 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600;">Step 1: Connect to Remote Host</h3>
1199
+ <p style="margin: 4px 0;">Press <kbd>F1</kbd> → <strong>Remote-SSH: Connect to Host...</strong></p>
1200
+ <p style="margin: 8px 0 4px 0;">Enter: <code>your-username@<span id="remote-ssh-host">hostname</span></code></p>
1201
+ <p style="margin: 4px 0 8px 0; font-size: 13px; color: var(--color-text-secondary);">
1202
+ Replace "your-username" with your SSH username
1203
+ </p>
1204
+ </div>
1205
+
1206
+ <div class="modal-section">
1207
+ <h3 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600;">Step 2: Install Docker Extension (Remote)</h3>
1208
+ <p style="margin: 4px 0; font-size: 13px;">Once connected to SSH, install the <strong>Docker</strong> extension on the remote host.</p>
1209
+ <p style="margin: 4px 0; font-size: 13px; color: var(--color-text-secondary);">
1210
+ Extensions → Search "Docker" → Install on SSH
1211
+ </p>
1212
+ </div>
1213
+
1214
+ <div class="modal-section">
1215
+ <h3 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600;">Step 3: Attach to Container</h3>
1216
+ <p style="margin: 4px 0;">Open <strong>Docker</strong> view → Find this container:</p>
1217
+ <p style="margin: 8px 0 4px 0;">Container Name:</p>
1218
+ <div style="margin-bottom: 8px;">
1219
+ <code style="display: block; padding: 8px; background: var(--color-bg-secondary); border-radius: 4px; font-size: 13px; margin-bottom: 4px; word-break: break-all; font-family: monospace;" id="remote-container-name">coder-taskid</code>
1220
+ <button class="btn-secondary btn-small" id="copy-container-name">Copy</button>
1221
+ </div>
1222
+ <p style="margin: 4px 0; font-size: 13px; color: var(--color-text-secondary);">
1223
+ Right-click the container → <strong>Attach Visual Studio Code</strong>
1224
+ </p>
1225
+ </div>
1226
+
1227
+ <div class="modal-section" style="background: var(--color-bg-secondary); padding: 12px; border-radius: 4px;">
1228
+ <p style="margin: 0; font-size: 13px; color: var(--color-text-secondary);">
1229
+ <strong>Note:</strong> This manual process is required for remote containers. Direct launch via URL is not supported by VS Code for remote Docker hosts.
1230
+ </p>
1231
+ </div>
1232
+ </div>
1233
+ <div class="modal-footer">
1234
+ <button class="btn-primary" id="close-vscode-remote-info-btn">Got It</button>
1235
+ </div>
1236
+ </div>
1237
+ </div>
1238
+
1239
+ <!-- Discard File Modal -->
1240
+ <div id="discard-file-modal" class="modal" hidden>
1241
+ <div class="modal-overlay"></div>
1242
+ <div class="modal-content">
1243
+ <div class="modal-header">
1244
+ <h2>Discard Changes</h2>
1245
+ <button class="modal-close" id="close-discard-file-modal">&times;</button>
1246
+ </div>
1247
+ <div class="modal-body">
1248
+ <div class="modal-section">
1249
+ <p id="discard-file-message">Discard changes to <strong id="discard-file-name"></strong>?</p>
1250
+ </div>
1251
+ </div>
1252
+ <div class="modal-footer">
1253
+ <button class="btn-ghost" id="cancel-discard-file">Cancel</button>
1254
+ <button class="btn-danger" id="confirm-discard-file">Discard</button>
1255
+ </div>
1256
+ </div>
1257
+ </div>
1258
+
1259
+ <!-- Image Editor Modal -->
1260
+ <div id="image-editor-modal" class="modal modal-fullscreen" hidden>
1261
+ <div class="modal-overlay"></div>
1262
+ <div class="modal-content">
1263
+ <div class="modal-header">
1264
+ <h2>Edit Image</h2>
1265
+ <button type="button" class="modal-close" id="image-editor-close" aria-label="Close">&times;</button>
1266
+ </div>
1267
+ <div class="modal-body" style="padding: 0; overflow: hidden;">
1268
+ <div id="image-editor-container"></div>
1269
+ </div>
1270
+ <div class="modal-actions">
1271
+ <button type="button" id="image-editor-cancel" class="btn-secondary">Cancel</button>
1272
+ <button type="button" id="image-editor-save" class="btn-primary">Save</button>
1273
+ </div>
1274
+ </div>
1275
+ </div>
1276
+
1277
+ <!-- Compare Variants Modal -->
1278
+ <div id="compare-modal" class="modal modal-xl" hidden>
1279
+ <div class="modal-overlay"></div>
1280
+ <div class="modal-content">
1281
+ <div class="modal-header">
1282
+ <h2>Compare Variants</h2>
1283
+ <div class="header-actions">
1284
+ <button type="button" class="btn-ghost btn-small icon-btn" id="maximize-compare-modal" title="Maximize">
1285
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1286
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1287
+ </svg>
1288
+ </button>
1289
+ <button class="modal-close" id="close-compare-modal" title="Close">
1290
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1291
+ <line x1="18" y1="6" x2="6" y2="18"></line>
1292
+ <line x1="6" y1="6" x2="18" y2="18"></line>
1293
+ </svg>
1294
+ </button>
1295
+ </div>
1296
+ </div>
1297
+ <div class="modal-body">
1298
+ <div class="compare-table-wrapper">
1299
+ <table class="compare-table" id="compare-table">
1300
+ <!-- Populated dynamically -->
1301
+ <thead>
1302
+ <tr id="compare-header-row">
1303
+ <th></th>
1304
+ <!-- Agent columns appended here -->
1305
+ </tr>
1306
+ </thead>
1307
+ <tbody id="compare-body">
1308
+ <!-- Data rows appended here -->
1309
+ </tbody>
1310
+ </table>
1311
+ </div>
1312
+ <!-- Side-by-Side Diff Panel (hidden by default) -->
1313
+ <div id="side-by-side-diff-panel" class="side-by-side-diff-panel" hidden>
1314
+ <div class="side-by-side-diff-header">
1315
+ <h3>Code Changes</h3>
1316
+ <div class="side-by-side-controls">
1317
+ <select id="side-by-side-file-select" class="side-by-side-file-select">
1318
+ <option value="">Select a file...</option>
1319
+ </select>
1320
+ <button class="btn-ghost btn-small" id="close-side-by-side" title="Close">
1321
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1322
+ <line x1="18" y1="6" x2="6" y2="18"></line>
1323
+ <line x1="6" y1="6" x2="18" y2="18"></line>
1324
+ </svg>
1325
+ </button>
1326
+ </div>
1327
+ </div>
1328
+ <div id="side-by-side-diff-content" class="side-by-side-diff-content">
1329
+ <!-- Populated dynamically -->
1330
+ </div>
1331
+ </div>
1332
+ </div>
1333
+ <div class="modal-footer" style="justify-content: space-between;">
1334
+ <div class="auto-select-group">
1335
+ <span class="label">Auto-Select Winner:</span>
1336
+ <button class="btn-secondary btn-small" id="auto-select-ai" title="Let AI judge and recommend best solution">
1337
+ <span class="icon">🧠</span> AI Judging...
1338
+ </button>
1339
+ <button class="btn-ghost btn-small" id="auto-select-algo" title="Quick selection based on: Completed + Changed Code + Least Lines Changed">
1340
+ <span class="icon">⚡</span> Algorithmic
1341
+ </button>
1342
+ </div>
1343
+ <button class="btn-primary" id="close-compare-modal-btn">Done</button>
1344
+ </div>
1345
+ </div>
1346
+ </div>
1347
+
1348
+ <!-- AI Analysis Modal - Enhanced UI/UX -->
1349
+ <div id="ai-analysis-modal" class="modal" hidden>
1350
+ <div class="modal-overlay"></div>
1351
+ <div class="modal-content ai-analysis-content">
1352
+ <div class="modal-header ai-analysis-header">
1353
+ <div class="ai-analysis-title-group">
1354
+ <div class="ai-analysis-icon">
1355
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1356
+ <path d="M6 6h12"></path>
1357
+ <path d="M12 6v12"></path>
1358
+ <path d="M8 18h8"></path>
1359
+ <path d="M6 6l-3 5h6l-3-5z"></path>
1360
+ <path d="M18 6l-3 5h6l-3-5z"></path>
1361
+ </svg>
1362
+ </div>
1363
+ <div>
1364
+ <h2>AI Judging</h2>
1365
+ <p class="ai-analysis-subtitle" id="ai-analysis-subtitle">Compare variants with AI-powered analysis</p>
1366
+ </div>
1367
+ </div>
1368
+ <div class="header-actions">
1369
+ <button class="btn-icon keyboard-hint-btn" id="keyboard-hint" title="Keyboard shortcuts (?)">
1370
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1371
+ <rect x="2" y="4" width="20" height="16" rx="2" ry="2"></rect>
1372
+ <path d="M6 8h.001M10 8h.001M14 8h.001M18 8h.001M8 12h.001M12 12h.001M16 12h.001M6 16h8"></path>
1373
+ </svg>
1374
+ </button>
1375
+ <button type="button" class="btn-ghost btn-small icon-btn" id="maximize-ai-analysis-modal" title="Maximize (M)">
1376
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1377
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1378
+ </svg>
1379
+ </button>
1380
+ <button class="modal-close" id="close-ai-analysis-modal" title="Close (Esc)">
1381
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1382
+ <line x1="18" y1="6" x2="6" y2="18"></line>
1383
+ <line x1="6" y1="6" x2="18" y2="18"></line>
1384
+ </svg>
1385
+ </button>
1386
+ </div>
1387
+ </div>
1388
+
1389
+ <!-- Tabbed Navigation -->
1390
+ <div class="ai-analysis-tabs" role="tablist">
1391
+ <button class="ai-analysis-tab active" data-tab="launch" role="tab" aria-selected="true" aria-controls="tab-launch">
1392
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1393
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
1394
+ </svg>
1395
+ <span class="tab-label">Launch</span>
1396
+ </button>
1397
+ <button class="ai-analysis-tab" data-tab="history" role="tab" aria-selected="false" aria-controls="tab-history">
1398
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1399
+ <circle cx="12" cy="12" r="10"></circle>
1400
+ <polyline points="12 6 12 12 16 14"></polyline>
1401
+ </svg>
1402
+ <span class="tab-label">History</span>
1403
+ <span class="tab-badge" id="history-count-badge" hidden>0</span>
1404
+ </button>
1405
+ <div class="tab-divider"></div>
1406
+ <button class="ai-analysis-tab" data-tab="recommendation" role="tab" aria-selected="false" aria-controls="tab-recommendation" disabled id="recommendation-tab">
1407
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1408
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
1409
+ <polyline points="14 2 14 8 20 8"></polyline>
1410
+ <line x1="16" y1="13" x2="8" y2="13"></line>
1411
+ <line x1="16" y1="17" x2="8" y2="17"></line>
1412
+ </svg>
1413
+ <span class="tab-label">Recommendation</span>
1414
+ </button>
1415
+ <button class="ai-analysis-tab" data-tab="feedback" role="tab" aria-selected="false" aria-controls="tab-feedback" disabled id="feedback-tab">
1416
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1417
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
1418
+ </svg>
1419
+ <span class="tab-label">Feedback</span>
1420
+ <span class="tab-badge feedback-badge" id="feedback-count-badge" hidden>0</span>
1421
+ </button>
1422
+ </div>
1423
+
1424
+ <div class="modal-body ai-analysis-body">
1425
+ <!-- Tab Panel: Launch -->
1426
+ <div class="ai-analysis-panel active" id="tab-launch" role="tabpanel">
1427
+ <!-- Quick Status Summary -->
1428
+ <div class="judge-quick-summary" id="judge-quick-summary">
1429
+ <div class="quick-summary-card" data-status="ready">
1430
+ <div class="summary-icon">
1431
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1432
+ <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
1433
+ <polyline points="22 4 12 14.01 9 11.01"></polyline>
1434
+ </svg>
1435
+ </div>
1436
+ <div class="summary-content">
1437
+ <span class="summary-value" id="eligible-variants-count">0</span>
1438
+ <span class="summary-label">Eligible Variants</span>
1439
+ </div>
1440
+ </div>
1441
+ <div class="quick-summary-card" data-status="running">
1442
+ <div class="summary-icon">
1443
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1444
+ <circle cx="12" cy="12" r="10"></circle>
1445
+ <polyline points="12 6 12 12 16 14"></polyline>
1446
+ </svg>
1447
+ </div>
1448
+ <div class="summary-content">
1449
+ <span class="summary-value" id="running-judges-count">0</span>
1450
+ <span class="summary-label">Running Judges</span>
1451
+ </div>
1452
+ </div>
1453
+ <div class="quick-summary-card" data-status="completed">
1454
+ <div class="summary-icon">
1455
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1456
+ <path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"></path>
1457
+ <path d="M9 12l2 2 4-4"></path>
1458
+ </svg>
1459
+ </div>
1460
+ <div class="summary-content">
1461
+ <span class="summary-value" id="completed-judges-count">0</span>
1462
+ <span class="summary-label">Completed Judges</span>
1463
+ </div>
1464
+ </div>
1465
+ </div>
1466
+
1467
+ <!-- Judge Agent Selection - Enhanced Cards -->
1468
+ <div class="ai-analysis-section">
1469
+ <label class="section-label">Choose Your Judge</label>
1470
+ <div class="judge-agent-selector" id="judge-agent-selector">
1471
+ <button class="judge-agent-btn selected" data-agent="claude" title="Claude - Anthropic's AI Assistant">
1472
+ <div class="agent-card-glow"></div>
1473
+ <span class="judge-agent-icon">
1474
+ <svg viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
1475
+ <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"/>
1476
+ </svg>
1477
+ </span>
1478
+ <span class="judge-agent-name">Claude</span>
1479
+ <span class="judge-agent-desc">Anthropic</span>
1480
+ <span class="agent-selection-indicator">
1481
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
1482
+ <polyline points="20 6 9 17 4 12"></polyline>
1483
+ </svg>
1484
+ </span>
1485
+ </button>
1486
+ <button class="judge-agent-btn" data-agent="codex" title="Codex - OpenAI's Code Model">
1487
+ <div class="agent-card-glow"></div>
1488
+ <span class="judge-agent-icon">
1489
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
1490
+ <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"/>
1491
+ </svg>
1492
+ </span>
1493
+ <span class="judge-agent-name">Codex</span>
1494
+ <span class="judge-agent-desc">OpenAI</span>
1495
+ <span class="agent-selection-indicator">
1496
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
1497
+ <polyline points="20 6 9 17 4 12"></polyline>
1498
+ </svg>
1499
+ </span>
1500
+ </button>
1501
+ <button class="judge-agent-btn" data-agent="gemini" title="Gemini - Google's AI Model">
1502
+ <div class="agent-card-glow"></div>
1503
+ <span class="judge-agent-icon">
1504
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
1505
+ <path d="M12 2L9.09 9.09 2 12l7.09 2.91L12 22l2.91-7.09L22 12l-7.09-2.91z"></path>
1506
+ </svg>
1507
+ </span>
1508
+ <span class="judge-agent-name">Gemini</span>
1509
+ <span class="judge-agent-desc">Google</span>
1510
+ <span class="agent-selection-indicator">
1511
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
1512
+ <polyline points="20 6 9 17 4 12"></polyline>
1513
+ </svg>
1514
+ </span>
1515
+ </button>
1516
+ </div>
1517
+ </div>
1518
+
1519
+ <!-- Launch Action Area -->
1520
+ <div class="judge-launch-area">
1521
+ <div class="launch-info" id="launch-info">
1522
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1523
+ <circle cx="12" cy="12" r="10"></circle>
1524
+ <path d="M12 16v-4"></path>
1525
+ <path d="M12 8h.01"></path>
1526
+ </svg>
1527
+ <span>The judge will analyze and compare all eligible variants</span>
1528
+ </div>
1529
+ <button class="btn-primary btn-large judge-launch-btn" id="submit-judge-task" disabled>
1530
+ <span class="btn-spinner">
1531
+ <svg class="spinner" viewBox="0 0 24 24" width="18" height="18">
1532
+ <circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="3" stroke-dasharray="31.4 31.4" stroke-linecap="round"/>
1533
+ </svg>
1534
+ </span>
1535
+ <span class="btn-icon">
1536
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1537
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
1538
+ </svg>
1539
+ </span>
1540
+ <span class="btn-text">Launch Judge</span>
1541
+ <span class="btn-text-loading">Launching...</span>
1542
+ </button>
1543
+ </div>
1544
+ </div>
1545
+
1546
+ <!-- Tab Panel: History -->
1547
+ <div class="ai-analysis-panel" id="tab-history" role="tabpanel" hidden>
1548
+ <div class="previous-judgments-container" id="previous-judgments-container">
1549
+ <div class="previous-judgments-empty" id="previous-judgments-empty">
1550
+ <div class="empty-state-icon">
1551
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1552
+ <circle cx="12" cy="12" r="10"></circle>
1553
+ <polyline points="12 6 12 12 16 14"></polyline>
1554
+ </svg>
1555
+ </div>
1556
+ <h3>No Previous Judgments</h3>
1557
+ <p>Launch a judge from the Launch tab to get started</p>
1558
+ </div>
1559
+ <!-- Timeline-style judgment history -->
1560
+ <div class="judgment-timeline" id="judgment-timeline" hidden>
1561
+ <!-- Populated dynamically -->
1562
+ </div>
1563
+ </div>
1564
+ </div>
1565
+
1566
+ <!-- Tab Panel: Recommendation -->
1567
+ <div class="ai-analysis-panel" id="tab-recommendation" role="tabpanel" hidden>
1568
+ <!-- Quick Action Bar -->
1569
+ <div class="judgment-quick-actions" id="judgment-quick-actions">
1570
+ <div class="quick-action-info">
1571
+ <span class="quick-action-judge" id="quick-action-judge-name"></span>
1572
+ <span class="quick-action-separator">recommended</span>
1573
+ <span class="quick-action-winner" id="quick-action-winner-name"></span>
1574
+ </div>
1575
+ <div class="quick-action-buttons">
1576
+ <button class="btn-primary btn-small" id="quick-action-apply" title="Apply Winner">
1577
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1578
+ <polyline points="20 6 9 17 4 12"></polyline>
1579
+ </svg>
1580
+ Apply Winner
1581
+ </button>
1582
+ </div>
1583
+ </div>
1584
+
1585
+ <!-- Recommendation Preview -->
1586
+ <div class="judgment-preview-section" id="judgment-preview-section">
1587
+ <div class="judgment-preview-header">
1588
+ <div class="preview-header-left">
1589
+ <label class="section-label">Analysis</label>
1590
+ <span class="preview-judge-info" id="preview-judge-info"></span>
1591
+ </div>
1592
+ <button type="button" class="btn-ghost btn-small icon-btn" id="maximize-judgment-preview" title="Fullscreen">
1593
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1594
+ <polyline points="15 3 21 3 21 9"></polyline>
1595
+ <polyline points="9 21 3 21 3 15"></polyline>
1596
+ <line x1="21" y1="3" x2="14" y2="10"></line>
1597
+ <line x1="3" y1="21" x2="10" y2="14"></line>
1598
+ </svg>
1599
+ </button>
1600
+ </div>
1601
+ <div class="judgment-preview" id="judgment-preview">
1602
+ <div class="preview-placeholder">
1603
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1604
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
1605
+ <polyline points="14 2 14 8 20 8"></polyline>
1606
+ </svg>
1607
+ <p>Select a judgment from History to view the recommendation</p>
1608
+ </div>
1609
+ </div>
1610
+ </div>
1611
+ </div>
1612
+
1613
+ <!-- Tab Panel: Feedback -->
1614
+ <div class="ai-analysis-panel" id="tab-feedback" role="tabpanel" hidden>
1615
+ <div class="feedback-panel-header">
1616
+ <div class="feedback-header-info">
1617
+ <h3>Improvement Feedback</h3>
1618
+ <p class="feedback-description">Suggestions from the judge for each variant</p>
1619
+ </div>
1620
+ <button class="btn-ghost btn-small" id="expand-all-feedback">
1621
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1622
+ <polyline points="7 13 12 18 17 13"></polyline>
1623
+ <polyline points="7 6 12 11 17 6"></polyline>
1624
+ </svg>
1625
+ Expand All
1626
+ </button>
1627
+ </div>
1628
+ <div class="variant-feedback-section" id="variant-feedback-section">
1629
+ <div class="variant-feedback-list" id="variant-feedback-list">
1630
+ <!-- Populated dynamically when a judgment with feedback is selected -->
1631
+ </div>
1632
+ <div class="feedback-empty-state" id="feedback-empty-state">
1633
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1634
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
1635
+ </svg>
1636
+ <p>No feedback available for this judgment</p>
1637
+ </div>
1638
+ </div>
1639
+ </div>
1640
+ </div>
1641
+
1642
+ <div class="modal-footer ai-analysis-footer">
1643
+ <div class="footer-left">
1644
+ <span class="footer-hint" id="footer-hint">Press <kbd>?</kbd> for keyboard shortcuts</span>
1645
+ </div>
1646
+ <div class="footer-right">
1647
+ <button class="btn-ghost" id="cancel-ai-analysis">Close</button>
1648
+ </div>
1649
+ </div>
1650
+ </div>
1651
+ </div>
1652
+
1653
+ <!-- Keyboard Shortcuts Modal -->
1654
+ <div class="modal keyboard-shortcuts-modal" id="keyboard-shortcuts-modal" hidden>
1655
+ <div class="modal-overlay"></div>
1656
+ <div class="modal-content modal-small">
1657
+ <div class="modal-header">
1658
+ <h3>Keyboard Shortcuts</h3>
1659
+ <button class="modal-close" id="close-shortcuts-modal">&times;</button>
1660
+ </div>
1661
+ <div class="modal-body">
1662
+ <div class="shortcuts-list">
1663
+ <div class="shortcut-group">
1664
+ <h4>Navigation</h4>
1665
+ <div class="shortcut-item"><kbd>1</kbd> <span>Launch tab</span></div>
1666
+ <div class="shortcut-item"><kbd>2</kbd> <span>History tab</span></div>
1667
+ <div class="shortcut-item"><kbd>3</kbd> <span>Recommendation tab</span></div>
1668
+ <div class="shortcut-item"><kbd>4</kbd> <span>Feedback tab</span></div>
1669
+ </div>
1670
+ <div class="shortcut-group">
1671
+ <h4>Actions</h4>
1672
+ <div class="shortcut-item"><kbd>J</kbd> <span>Launch judge</span></div>
1673
+ <div class="shortcut-item"><kbd>A</kbd> <span>Apply winner</span></div>
1674
+ <div class="shortcut-item"><kbd>M</kbd> <span>Maximize/Restore</span></div>
1675
+ </div>
1676
+ <div class="shortcut-group">
1677
+ <h4>Agent Selection</h4>
1678
+ <div class="shortcut-item"><kbd>C</kbd> <span>Select Claude</span></div>
1679
+ <div class="shortcut-item"><kbd>O</kbd> <span>Select Codex</span></div>
1680
+ <div class="shortcut-item"><kbd>G</kbd> <span>Select Gemini</span></div>
1681
+ </div>
1682
+ <div class="shortcut-group">
1683
+ <h4>General</h4>
1684
+ <div class="shortcut-item"><kbd>?</kbd> <kbd>F1</kbd> <span>Show this help</span></div>
1685
+ <div class="shortcut-item"><kbd>Esc</kbd> <span>Close dialog</span></div>
1686
+ </div>
1687
+ </div>
1688
+ </div>
1689
+ </div>
1690
+ </div>
1691
+
1692
+ <!-- Send Feedback as Follow-up Confirmation Modal -->
1693
+ <div class="modal" id="send-feedback-modal" hidden>
1694
+ <div class="modal-overlay"></div>
1695
+ <div class="modal-content modal-medium">
1696
+ <div class="modal-header">
1697
+ <h2>Send Improvement Feedback</h2>
1698
+ <button class="modal-close" id="close-send-feedback-modal">&times;</button>
1699
+ </div>
1700
+ <div class="modal-body">
1701
+ <div class="send-feedback-info">
1702
+ <p>Edit the feedback below before sending as a follow-up to <strong id="send-feedback-variant-name">this variant</strong>:</p>
1703
+ </div>
1704
+ <div class="send-feedback-editor-container">
1705
+ <div id="send-feedback-editor"></div>
1706
+ </div>
1707
+ </div>
1708
+ <div class="modal-footer">
1709
+ <button class="btn-ghost" id="cancel-send-feedback">Cancel</button>
1710
+ <button class="btn-primary" id="confirm-send-feedback">
1711
+ <span class="btn-spinner">
1712
+ <svg class="spinner" viewBox="0 0 24 24" width="16" height="16">
1713
+ <circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="3" stroke-dasharray="31.4 31.4" stroke-linecap="round"/>
1714
+ </svg>
1715
+ </span>
1716
+ <span class="btn-text">Send as Follow-up</span>
1717
+ <span class="btn-text-loading">Sending...</span>
1718
+ </button>
1719
+ </div>
1720
+ </div>
1721
+ </div>
1722
+
1723
+ <button type="button" id="scroll-to-top" class="scroll-to-top" title="Back to top" aria-label="Back to top">
1724
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
1725
+ <path d="M12 19V5"></path>
1726
+ <polyline points="6 11 12 5 18 11"></polyline>
1727
+ </svg>
1728
+ <span class="scroll-to-top-label">Top</span>
1729
+ </button>
1730
+
1731
+ <!-- Global Keyboard Shortcuts Modal -->
1732
+ <div class="modal global-shortcuts-modal" id="global-shortcuts-modal" hidden>
1733
+ <div class="modal-overlay"></div>
1734
+ <div class="modal-content" tabindex="-1">
1735
+ <div class="modal-header">
1736
+ <h3>
1737
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: -3px; margin-right: 8px;">
1738
+ <rect x="2" y="4" width="20" height="16" rx="2" ry="2"></rect>
1739
+ <path d="M6 8h.001M10 8h.001M14 8h.001M18 8h.001M8 12h.001M12 12h.001M16 12h.001M6 16h8"></path>
1740
+ </svg>
1741
+ Keyboard Shortcuts
1742
+ </h3>
1743
+ <button class="modal-close" id="close-global-shortcuts-modal" title="Close (Esc)">&times;</button>
1744
+ </div>
1745
+ <div class="modal-body global-shortcuts-body">
1746
+ <div class="shortcuts-grid">
1747
+ <!-- Navigation Section -->
1748
+ <div class="shortcut-group">
1749
+ <h4>Navigation</h4>
1750
+ <div class="shortcut-item"><kbd>1</kbd> - <kbd>6</kbd> <span>Jump to section</span></div>
1751
+ <div class="shortcut-item"><kbd>T</kbd> <span>Jump to top</span></div>
1752
+ <div class="shortcut-item"><kbd>/</kbd> <span>Search activity</span></div>
1753
+ <div class="shortcut-item"><kbd>←</kbd> <kbd>→</kbd> <span>Switch variant</span></div>
1754
+ <div class="shortcut-item"><kbd>Backspace</kbd> <span>Back to tasks</span></div>
1755
+ </div>
1756
+
1757
+ <!-- Actions Section -->
1758
+ <div class="shortcut-group">
1759
+ <h4>Actions</h4>
1760
+ <div class="shortcut-item"><kbd>A</kbd> <span>Approve changes</span></div>
1761
+ <div class="shortcut-item"><kbd>N</kbd> <span>New task / Resubmit</span></div>
1762
+ <div class="shortcut-item"><kbd>P</kbd> <span>Pin / Unpin</span></div>
1763
+ <div class="shortcut-item"><kbd>Del</kbd> <span>Delete task</span></div>
1764
+ <div class="shortcut-item"><kbd>J</kbd> <span>Judge variants</span></div>
1765
+ <div class="shortcut-item"><kbd>R</kbd> <span>Reply to agent</span></div>
1766
+ </div>
1767
+
1768
+ <!-- Help Section -->
1769
+ <div class="shortcut-group">
1770
+ <h4>General</h4>
1771
+ <div class="shortcut-item"><kbd>?</kbd> <kbd>F1</kbd> <span>Show this help</span></div>
1772
+ <div class="shortcut-item"><kbd>Esc</kbd> <span>Close modal</span></div>
1773
+ </div>
1774
+ </div>
1775
+ </div>
1776
+ </div>
1777
+ </div>
1778
+ </body>
1779
+ </html>