agentgui 1.0.274 → 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 (69) 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 +3 -42
  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/readme.md +76 -76
  12. package/server.js +3787 -3794
  13. package/setup-npm-token.sh +68 -68
  14. package/static/app.js +773 -773
  15. package/static/event-rendering-showcase.html +708 -708
  16. package/static/index.html +3178 -3180
  17. package/static/js/agent-auth.js +298 -298
  18. package/static/js/audio-recorder-processor.js +18 -18
  19. package/static/js/client.js +2656 -2656
  20. package/static/js/conversations.js +583 -583
  21. package/static/js/dialogs.js +267 -267
  22. package/static/js/event-consolidator.js +101 -101
  23. package/static/js/event-filter.js +311 -311
  24. package/static/js/event-processor.js +452 -452
  25. package/static/js/features.js +413 -413
  26. package/static/js/kalman-filter.js +67 -67
  27. package/static/js/progress-dialog.js +130 -130
  28. package/static/js/script-runner.js +219 -219
  29. package/static/js/streaming-renderer.js +2123 -2120
  30. package/static/js/syntax-highlighter.js +269 -269
  31. package/static/js/tts-websocket-handler.js +152 -152
  32. package/static/js/ui-components.js +431 -431
  33. package/static/js/voice.js +849 -849
  34. package/static/js/websocket-manager.js +596 -596
  35. package/static/templates/INDEX.html +465 -465
  36. package/static/templates/README.md +190 -190
  37. package/static/templates/agent-capabilities.html +56 -56
  38. package/static/templates/agent-metadata-panel.html +44 -44
  39. package/static/templates/agent-status-badge.html +30 -30
  40. package/static/templates/code-annotation-panel.html +155 -155
  41. package/static/templates/code-suggestion-panel.html +184 -184
  42. package/static/templates/command-header.html +77 -77
  43. package/static/templates/command-output-scrollable.html +118 -118
  44. package/static/templates/elapsed-time.html +54 -54
  45. package/static/templates/error-alert.html +106 -106
  46. package/static/templates/error-history-timeline.html +160 -160
  47. package/static/templates/error-recovery-options.html +109 -109
  48. package/static/templates/error-stack-trace.html +95 -95
  49. package/static/templates/error-summary.html +80 -80
  50. package/static/templates/event-counter.html +48 -48
  51. package/static/templates/execution-actions.html +97 -97
  52. package/static/templates/execution-progress-bar.html +80 -80
  53. package/static/templates/execution-stepper.html +120 -120
  54. package/static/templates/file-breadcrumb.html +118 -118
  55. package/static/templates/file-diff-viewer.html +121 -121
  56. package/static/templates/file-metadata.html +133 -133
  57. package/static/templates/file-read-panel.html +66 -66
  58. package/static/templates/file-write-panel.html +120 -120
  59. package/static/templates/git-branch-remote.html +107 -107
  60. package/static/templates/git-diff-list.html +101 -101
  61. package/static/templates/git-log-visualization.html +153 -153
  62. package/static/templates/git-status-panel.html +115 -115
  63. package/static/templates/quality-metrics-display.html +170 -170
  64. package/static/templates/terminal-output-panel.html +87 -87
  65. package/static/templates/test-results-display.html +144 -144
  66. package/static/theme.js +72 -72
  67. package/test-download-progress.js +223 -223
  68. package/test-websocket-broadcast.js +147 -147
  69. 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>