agentgui 1.0.273 → 1.0.275

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 (71) hide show
  1. package/CLAUDE.md +280 -280
  2. package/IPFS_DOWNLOADER.md +277 -277
  3. package/TASK_2C_COMPLETION.md +334 -334
  4. package/bin/gmgui.cjs +54 -54
  5. package/build-portable.js +111 -0
  6. package/database.js +1422 -1406
  7. package/lib/claude-runner.js +1130 -1130
  8. package/lib/ipfs-downloader.js +459 -459
  9. package/lib/speech.js +152 -152
  10. package/package.json +1 -1
  11. package/portable-entry.js +43 -0
  12. package/readme.md +76 -76
  13. package/scripts/inject-pe-section.py +185 -0
  14. package/server.js +3787 -3794
  15. package/setup-npm-token.sh +68 -68
  16. package/static/app.js +773 -773
  17. package/static/event-rendering-showcase.html +708 -708
  18. package/static/index.html +3178 -3180
  19. package/static/js/agent-auth.js +298 -298
  20. package/static/js/audio-recorder-processor.js +18 -18
  21. package/static/js/client.js +2656 -2656
  22. package/static/js/conversations.js +583 -583
  23. package/static/js/dialogs.js +267 -267
  24. package/static/js/event-consolidator.js +101 -101
  25. package/static/js/event-filter.js +311 -311
  26. package/static/js/event-processor.js +452 -452
  27. package/static/js/features.js +413 -413
  28. package/static/js/kalman-filter.js +67 -67
  29. package/static/js/progress-dialog.js +130 -130
  30. package/static/js/script-runner.js +219 -219
  31. package/static/js/streaming-renderer.js +2123 -2120
  32. package/static/js/syntax-highlighter.js +269 -269
  33. package/static/js/tts-websocket-handler.js +152 -152
  34. package/static/js/ui-components.js +431 -431
  35. package/static/js/voice.js +849 -849
  36. package/static/js/websocket-manager.js +596 -596
  37. package/static/templates/INDEX.html +465 -465
  38. package/static/templates/README.md +190 -190
  39. package/static/templates/agent-capabilities.html +56 -56
  40. package/static/templates/agent-metadata-panel.html +44 -44
  41. package/static/templates/agent-status-badge.html +30 -30
  42. package/static/templates/code-annotation-panel.html +155 -155
  43. package/static/templates/code-suggestion-panel.html +184 -184
  44. package/static/templates/command-header.html +77 -77
  45. package/static/templates/command-output-scrollable.html +118 -118
  46. package/static/templates/elapsed-time.html +54 -54
  47. package/static/templates/error-alert.html +106 -106
  48. package/static/templates/error-history-timeline.html +160 -160
  49. package/static/templates/error-recovery-options.html +109 -109
  50. package/static/templates/error-stack-trace.html +95 -95
  51. package/static/templates/error-summary.html +80 -80
  52. package/static/templates/event-counter.html +48 -48
  53. package/static/templates/execution-actions.html +97 -97
  54. package/static/templates/execution-progress-bar.html +80 -80
  55. package/static/templates/execution-stepper.html +120 -120
  56. package/static/templates/file-breadcrumb.html +118 -118
  57. package/static/templates/file-diff-viewer.html +121 -121
  58. package/static/templates/file-metadata.html +133 -133
  59. package/static/templates/file-read-panel.html +66 -66
  60. package/static/templates/file-write-panel.html +120 -120
  61. package/static/templates/git-branch-remote.html +107 -107
  62. package/static/templates/git-diff-list.html +101 -101
  63. package/static/templates/git-log-visualization.html +153 -153
  64. package/static/templates/git-status-panel.html +115 -115
  65. package/static/templates/quality-metrics-display.html +170 -170
  66. package/static/templates/terminal-output-panel.html +87 -87
  67. package/static/templates/test-results-display.html +144 -144
  68. package/static/theme.js +72 -72
  69. package/test-download-progress.js +223 -223
  70. package/test-websocket-broadcast.js +147 -147
  71. package/tests/ipfs-downloader.test.js +370 -370
@@ -1,97 +1,97 @@
1
- <!-- Execution Control Buttons -->
2
- <div class="execution-actions flex gap-2" role="group" aria-label="Execution controls">
3
- <!-- Cancel Button -->
4
- <button class="btn btn-secondary"
5
- data-action="cancel"
6
- aria-label="Cancel execution"
7
- title="Stop the current execution">
8
- <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
9
- <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"/>
10
- </svg>
11
- <span>Cancel</span>
12
- </button>
13
-
14
- <!-- Pause Button -->
15
- <button class="btn btn-secondary"
16
- data-action="pause"
17
- aria-label="Pause execution"
18
- title="Pause the current execution">
19
- <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
20
- <path d="M5 3a2 2 0 012 2v10a2 2 0 01-2 2H3a2 2 0 01-2-2V5a2 2 0 012-2h2zm10 0a2 2 0 012 2v10a2 2 0 01-2 2h-2a2 2 0 01-2-2V5a2 2 0 012-2h2z"/>
21
- </svg>
22
- <span>Pause</span>
23
- </button>
24
-
25
- <!-- Resume Button (hidden by default) -->
26
- <button class="btn btn-secondary hidden"
27
- data-action="resume"
28
- aria-label="Resume execution"
29
- title="Resume the paused execution">
30
- <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
31
- <path d="M6.3 2.841A1.5 1.5 0 004 4.11V15.89a1.5 1.5 0 002.3 1.269l9.344-5.89a1.5 1.5 0 000-2.538L6.3 2.84z"/>
32
- </svg>
33
- <span>Resume</span>
34
- </button>
35
-
36
- <!-- Export Button -->
37
- <button class="btn btn-tertiary"
38
- data-action="export"
39
- aria-label="Export execution results"
40
- title="Download results as JSON">
41
- <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
42
- <path d="M3 17a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1v-2zm4-6a1 1 0 011-1h2V4a1 1 0 112 0v6h2a1 1 0 110 2h-6a1 1 0 01-1-1z"/>
43
- </svg>
44
- <span>Export</span>
45
- </button>
46
- </div>
47
-
48
- <style scoped>
49
- .execution-actions {
50
- display: flex;
51
- gap: 8px;
52
- flex-wrap: wrap;
53
- }
54
-
55
- .btn {
56
- display: inline-flex;
57
- align-items: center;
58
- gap: 6px;
59
- padding: 8px 12px;
60
- border-radius: 4px;
61
- font-size: 13px;
62
- font-weight: 500;
63
- cursor: pointer;
64
- border: none;
65
- transition: all 0.2s ease;
66
- }
67
-
68
- .btn:disabled {
69
- opacity: 0.5;
70
- cursor: not-allowed;
71
- }
72
-
73
- .btn-secondary {
74
- background-color: var(--color-bg-secondary);
75
- color: var(--color-text-primary);
76
- border: 1px solid var(--color-border);
77
- }
78
-
79
- .btn-secondary:hover:not(:disabled) {
80
- background-color: var(--color-bg-hover);
81
- border-color: var(--color-primary);
82
- }
83
-
84
- .btn-tertiary {
85
- background-color: transparent;
86
- color: var(--color-primary);
87
- border: 1px solid var(--color-primary);
88
- }
89
-
90
- .btn-tertiary:hover:not(:disabled) {
91
- background-color: var(--color-primary-hover);
92
- }
93
-
94
- .hidden {
95
- display: none;
96
- }
97
- </style>
1
+ <!-- Execution Control Buttons -->
2
+ <div class="execution-actions flex gap-2" role="group" aria-label="Execution controls">
3
+ <!-- Cancel Button -->
4
+ <button class="btn btn-secondary"
5
+ data-action="cancel"
6
+ aria-label="Cancel execution"
7
+ title="Stop the current execution">
8
+ <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
9
+ <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"/>
10
+ </svg>
11
+ <span>Cancel</span>
12
+ </button>
13
+
14
+ <!-- Pause Button -->
15
+ <button class="btn btn-secondary"
16
+ data-action="pause"
17
+ aria-label="Pause execution"
18
+ title="Pause the current execution">
19
+ <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
20
+ <path d="M5 3a2 2 0 012 2v10a2 2 0 01-2 2H3a2 2 0 01-2-2V5a2 2 0 012-2h2zm10 0a2 2 0 012 2v10a2 2 0 01-2 2h-2a2 2 0 01-2-2V5a2 2 0 012-2h2z"/>
21
+ </svg>
22
+ <span>Pause</span>
23
+ </button>
24
+
25
+ <!-- Resume Button (hidden by default) -->
26
+ <button class="btn btn-secondary hidden"
27
+ data-action="resume"
28
+ aria-label="Resume execution"
29
+ title="Resume the paused execution">
30
+ <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
31
+ <path d="M6.3 2.841A1.5 1.5 0 004 4.11V15.89a1.5 1.5 0 002.3 1.269l9.344-5.89a1.5 1.5 0 000-2.538L6.3 2.84z"/>
32
+ </svg>
33
+ <span>Resume</span>
34
+ </button>
35
+
36
+ <!-- Export Button -->
37
+ <button class="btn btn-tertiary"
38
+ data-action="export"
39
+ aria-label="Export execution results"
40
+ title="Download results as JSON">
41
+ <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
42
+ <path d="M3 17a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1v-2zm4-6a1 1 0 011-1h2V4a1 1 0 112 0v6h2a1 1 0 110 2h-6a1 1 0 01-1-1z"/>
43
+ </svg>
44
+ <span>Export</span>
45
+ </button>
46
+ </div>
47
+
48
+ <style scoped>
49
+ .execution-actions {
50
+ display: flex;
51
+ gap: 8px;
52
+ flex-wrap: wrap;
53
+ }
54
+
55
+ .btn {
56
+ display: inline-flex;
57
+ align-items: center;
58
+ gap: 6px;
59
+ padding: 8px 12px;
60
+ border-radius: 4px;
61
+ font-size: 13px;
62
+ font-weight: 500;
63
+ cursor: pointer;
64
+ border: none;
65
+ transition: all 0.2s ease;
66
+ }
67
+
68
+ .btn:disabled {
69
+ opacity: 0.5;
70
+ cursor: not-allowed;
71
+ }
72
+
73
+ .btn-secondary {
74
+ background-color: var(--color-bg-secondary);
75
+ color: var(--color-text-primary);
76
+ border: 1px solid var(--color-border);
77
+ }
78
+
79
+ .btn-secondary:hover:not(:disabled) {
80
+ background-color: var(--color-bg-hover);
81
+ border-color: var(--color-primary);
82
+ }
83
+
84
+ .btn-tertiary {
85
+ background-color: transparent;
86
+ color: var(--color-primary);
87
+ border: 1px solid var(--color-primary);
88
+ }
89
+
90
+ .btn-tertiary:hover:not(:disabled) {
91
+ background-color: var(--color-primary-hover);
92
+ }
93
+
94
+ .hidden {
95
+ display: none;
96
+ }
97
+ </style>
@@ -1,80 +1,80 @@
1
- <!-- Execution Progress Visualization -->
2
- <div class="execution-progress card" role="region" aria-label="Execution progress">
3
- <div class="card-header flex items-center justify-between mb-4">
4
- <div>
5
- <h3 class="font-semibold">Execution Progress</h3>
6
- <p class="text-sm text-secondary">{{ executionStatus }}</p>
7
- </div>
8
- <span class="badge" role="status" aria-live="polite">{{ percentage }}%</span>
9
- </div>
10
-
11
- <!-- Progress Bar -->
12
- <div class="progress-container mb-4" role="progressbar" aria-valuenow="{{ percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="Progress: {{ percentage }}%">
13
- <div class="progress-bar" style="width: {{ percentage }}%">
14
- <span class="progress-text" aria-hidden="true">{{ percentage }}%</span>
15
- </div>
16
- </div>
17
-
18
- <!-- Progress Details Grid -->
19
- <div class="grid grid-cols-3 gap-3 text-sm">
20
- <div class="border-r pr-3">
21
- <span class="text-secondary">Events</span>
22
- <p class="font-semibold text-lg">{{ eventCount }}</p>
23
- </div>
24
- <div class="border-r pr-3">
25
- <span class="text-secondary">Elapsed</span>
26
- <p class="font-mono text-lg">{{ elapsedTime }}</p>
27
- </div>
28
- <div>
29
- <span class="text-secondary">Remaining</span>
30
- <p class="font-mono text-lg">{{ estimatedRemaining }}</p>
31
- </div>
32
- </div>
33
-
34
- <!-- Status Timeline -->
35
- <div class="mt-4 pt-4 border-t">
36
- <div class="flex justify-between text-xs">
37
- <span class="flex items-center gap-1">
38
- <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
39
- Queued
40
- </span>
41
- <span class="flex items-center gap-1">
42
- <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
43
- Running
44
- </span>
45
- <span class="flex items-center gap-1">
46
- <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
47
- Processing
48
- </span>
49
- <span class="flex items-center gap-1">
50
- <span class="w-2 h-2 rounded-full bg-secondary" aria-hidden="true"></span>
51
- Complete
52
- </span>
53
- </div>
54
- </div>
55
- </div>
56
-
57
- <style scoped>
58
- .progress-container {
59
- position: relative;
60
- height: 24px;
61
- background-color: var(--color-bg-secondary);
62
- border-radius: 4px;
63
- overflow: hidden;
64
- }
65
-
66
- .progress-bar {
67
- height: 100%;
68
- background-color: var(--color-primary);
69
- transition: width 0.3s ease;
70
- display: flex;
71
- align-items: center;
72
- justify-content: center;
73
- }
74
-
75
- .progress-text {
76
- font-size: 11px;
77
- font-weight: 600;
78
- color: white;
79
- }
80
- </style>
1
+ <!-- Execution Progress Visualization -->
2
+ <div class="execution-progress card" role="region" aria-label="Execution progress">
3
+ <div class="card-header flex items-center justify-between mb-4">
4
+ <div>
5
+ <h3 class="font-semibold">Execution Progress</h3>
6
+ <p class="text-sm text-secondary">{{ executionStatus }}</p>
7
+ </div>
8
+ <span class="badge" role="status" aria-live="polite">{{ percentage }}%</span>
9
+ </div>
10
+
11
+ <!-- Progress Bar -->
12
+ <div class="progress-container mb-4" role="progressbar" aria-valuenow="{{ percentage }}" aria-valuemin="0" aria-valuemax="100" aria-label="Progress: {{ percentage }}%">
13
+ <div class="progress-bar" style="width: {{ percentage }}%">
14
+ <span class="progress-text" aria-hidden="true">{{ percentage }}%</span>
15
+ </div>
16
+ </div>
17
+
18
+ <!-- Progress Details Grid -->
19
+ <div class="grid grid-cols-3 gap-3 text-sm">
20
+ <div class="border-r pr-3">
21
+ <span class="text-secondary">Events</span>
22
+ <p class="font-semibold text-lg">{{ eventCount }}</p>
23
+ </div>
24
+ <div class="border-r pr-3">
25
+ <span class="text-secondary">Elapsed</span>
26
+ <p class="font-mono text-lg">{{ elapsedTime }}</p>
27
+ </div>
28
+ <div>
29
+ <span class="text-secondary">Remaining</span>
30
+ <p class="font-mono text-lg">{{ estimatedRemaining }}</p>
31
+ </div>
32
+ </div>
33
+
34
+ <!-- Status Timeline -->
35
+ <div class="mt-4 pt-4 border-t">
36
+ <div class="flex justify-between text-xs">
37
+ <span class="flex items-center gap-1">
38
+ <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
39
+ Queued
40
+ </span>
41
+ <span class="flex items-center gap-1">
42
+ <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
43
+ Running
44
+ </span>
45
+ <span class="flex items-center gap-1">
46
+ <span class="w-2 h-2 rounded-full bg-primary" aria-hidden="true"></span>
47
+ Processing
48
+ </span>
49
+ <span class="flex items-center gap-1">
50
+ <span class="w-2 h-2 rounded-full bg-secondary" aria-hidden="true"></span>
51
+ Complete
52
+ </span>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <style scoped>
58
+ .progress-container {
59
+ position: relative;
60
+ height: 24px;
61
+ background-color: var(--color-bg-secondary);
62
+ border-radius: 4px;
63
+ overflow: hidden;
64
+ }
65
+
66
+ .progress-bar {
67
+ height: 100%;
68
+ background-color: var(--color-primary);
69
+ transition: width 0.3s ease;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ }
74
+
75
+ .progress-text {
76
+ font-size: 11px;
77
+ font-weight: 600;
78
+ color: white;
79
+ }
80
+ </style>
@@ -1,120 +1,120 @@
1
- <!-- Execution Phase Stepper -->
2
- <div class="execution-stepper" role="region" aria-label="Execution phases">
3
- <div class="flex justify-between items-center">
4
- <!-- Phase 1: Queued -->
5
- <div class="stepper-item" data-phase="queued" data-completed="true" aria-label="Phase: Queued (completed)">
6
- <div class="stepper-circle">
7
- <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
8
- <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/>
9
- </svg>
10
- </div>
11
- <span class="stepper-label">Queued</span>
12
- </div>
13
-
14
- <div class="stepper-connector"></div>
15
-
16
- <!-- Phase 2: Running -->
17
- <div class="stepper-item" data-phase="running" data-completed="true" aria-label="Phase: Running (completed)">
18
- <div class="stepper-circle">
19
- <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
20
- <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/>
21
- </svg>
22
- </div>
23
- <span class="stepper-label">Running</span>
24
- </div>
25
-
26
- <div class="stepper-connector"></div>
27
-
28
- <!-- Phase 3: Processing -->
29
- <div class="stepper-item" data-phase="processing" data-active="true" aria-label="Phase: Processing (active)">
30
- <div class="stepper-circle loading">
31
- <div class="spinner"></div>
32
- </div>
33
- <span class="stepper-label">Processing</span>
34
- </div>
35
-
36
- <div class="stepper-connector"></div>
37
-
38
- <!-- Phase 4: Complete -->
39
- <div class="stepper-item" data-phase="complete" aria-label="Phase: Complete (pending)">
40
- <div class="stepper-circle">4</div>
41
- <span class="stepper-label">Complete</span>
42
- </div>
43
- </div>
44
- </div>
45
-
46
- <style scoped>
47
- .execution-stepper {
48
- padding: 20px;
49
- background: var(--color-bg-primary);
50
- }
51
-
52
- .stepper-item {
53
- display: flex;
54
- flex-direction: column;
55
- align-items: center;
56
- flex: 1;
57
- }
58
-
59
- .stepper-circle {
60
- width: 40px;
61
- height: 40px;
62
- border-radius: 50%;
63
- display: flex;
64
- align-items: center;
65
- justify-content: center;
66
- background-color: var(--color-bg-secondary);
67
- color: var(--color-text-secondary);
68
- font-weight: 600;
69
- margin-bottom: 8px;
70
- border: 2px solid var(--color-border);
71
- }
72
-
73
- .stepper-item[data-completed="true"] .stepper-circle {
74
- background-color: var(--color-success);
75
- color: white;
76
- border-color: var(--color-success);
77
- }
78
-
79
- .stepper-item[data-active="true"] .stepper-circle {
80
- background-color: var(--color-primary);
81
- color: white;
82
- border-color: var(--color-primary);
83
- }
84
-
85
- .stepper-circle.loading {
86
- position: relative;
87
- }
88
-
89
- .spinner {
90
- width: 20px;
91
- height: 20px;
92
- border: 2px solid transparent;
93
- border-top-color: white;
94
- border-right-color: white;
95
- border-radius: 50%;
96
- animation: spin 0.8s linear infinite;
97
- }
98
-
99
- @keyframes spin {
100
- to { transform: rotate(360deg); }
101
- }
102
-
103
- .stepper-label {
104
- font-size: 12px;
105
- font-weight: 500;
106
- text-align: center;
107
- }
108
-
109
- .stepper-connector {
110
- flex: 1;
111
- height: 2px;
112
- background-color: var(--color-border);
113
- margin: 0 10px;
114
- margin-top: 20px;
115
- }
116
-
117
- .stepper-item[data-completed="true"] ~ .stepper-connector {
118
- background-color: var(--color-success);
119
- }
120
- </style>
1
+ <!-- Execution Phase Stepper -->
2
+ <div class="execution-stepper" role="region" aria-label="Execution phases">
3
+ <div class="flex justify-between items-center">
4
+ <!-- Phase 1: Queued -->
5
+ <div class="stepper-item" data-phase="queued" data-completed="true" aria-label="Phase: Queued (completed)">
6
+ <div class="stepper-circle">
7
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
8
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/>
9
+ </svg>
10
+ </div>
11
+ <span class="stepper-label">Queued</span>
12
+ </div>
13
+
14
+ <div class="stepper-connector"></div>
15
+
16
+ <!-- Phase 2: Running -->
17
+ <div class="stepper-item" data-phase="running" data-completed="true" aria-label="Phase: Running (completed)">
18
+ <div class="stepper-circle">
19
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
20
+ <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/>
21
+ </svg>
22
+ </div>
23
+ <span class="stepper-label">Running</span>
24
+ </div>
25
+
26
+ <div class="stepper-connector"></div>
27
+
28
+ <!-- Phase 3: Processing -->
29
+ <div class="stepper-item" data-phase="processing" data-active="true" aria-label="Phase: Processing (active)">
30
+ <div class="stepper-circle loading">
31
+ <div class="spinner"></div>
32
+ </div>
33
+ <span class="stepper-label">Processing</span>
34
+ </div>
35
+
36
+ <div class="stepper-connector"></div>
37
+
38
+ <!-- Phase 4: Complete -->
39
+ <div class="stepper-item" data-phase="complete" aria-label="Phase: Complete (pending)">
40
+ <div class="stepper-circle">4</div>
41
+ <span class="stepper-label">Complete</span>
42
+ </div>
43
+ </div>
44
+ </div>
45
+
46
+ <style scoped>
47
+ .execution-stepper {
48
+ padding: 20px;
49
+ background: var(--color-bg-primary);
50
+ }
51
+
52
+ .stepper-item {
53
+ display: flex;
54
+ flex-direction: column;
55
+ align-items: center;
56
+ flex: 1;
57
+ }
58
+
59
+ .stepper-circle {
60
+ width: 40px;
61
+ height: 40px;
62
+ border-radius: 50%;
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ background-color: var(--color-bg-secondary);
67
+ color: var(--color-text-secondary);
68
+ font-weight: 600;
69
+ margin-bottom: 8px;
70
+ border: 2px solid var(--color-border);
71
+ }
72
+
73
+ .stepper-item[data-completed="true"] .stepper-circle {
74
+ background-color: var(--color-success);
75
+ color: white;
76
+ border-color: var(--color-success);
77
+ }
78
+
79
+ .stepper-item[data-active="true"] .stepper-circle {
80
+ background-color: var(--color-primary);
81
+ color: white;
82
+ border-color: var(--color-primary);
83
+ }
84
+
85
+ .stepper-circle.loading {
86
+ position: relative;
87
+ }
88
+
89
+ .spinner {
90
+ width: 20px;
91
+ height: 20px;
92
+ border: 2px solid transparent;
93
+ border-top-color: white;
94
+ border-right-color: white;
95
+ border-radius: 50%;
96
+ animation: spin 0.8s linear infinite;
97
+ }
98
+
99
+ @keyframes spin {
100
+ to { transform: rotate(360deg); }
101
+ }
102
+
103
+ .stepper-label {
104
+ font-size: 12px;
105
+ font-weight: 500;
106
+ text-align: center;
107
+ }
108
+
109
+ .stepper-connector {
110
+ flex: 1;
111
+ height: 2px;
112
+ background-color: var(--color-border);
113
+ margin: 0 10px;
114
+ margin-top: 20px;
115
+ }
116
+
117
+ .stepper-item[data-completed="true"] ~ .stepper-connector {
118
+ background-color: var(--color-success);
119
+ }
120
+ </style>