shell-mirror 1.5.69 → 1.5.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/app/dashboard.css +253 -0
- package/public/app/dashboard.js +82 -3
- package/public/app/terminal.html +109 -0
- package/public/index.html +74 -0
package/package.json
CHANGED
package/public/app/dashboard.css
CHANGED
|
@@ -64,6 +64,26 @@ body {
|
|
|
64
64
|
backdrop-filter: blur(10px);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
.help-button {
|
|
68
|
+
background: rgba(255, 255, 255, 0.2);
|
|
69
|
+
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
70
|
+
border-radius: 8px;
|
|
71
|
+
color: white;
|
|
72
|
+
padding: 8px 16px;
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
transition: all 0.2s ease;
|
|
75
|
+
font-size: 0.9rem;
|
|
76
|
+
font-weight: 500;
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
gap: 6px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.help-button:hover {
|
|
83
|
+
background: rgba(255, 255, 255, 0.3);
|
|
84
|
+
transform: translateY(-1px);
|
|
85
|
+
}
|
|
86
|
+
|
|
67
87
|
.user-info {
|
|
68
88
|
display: flex;
|
|
69
89
|
align-items: center;
|
|
@@ -880,6 +900,239 @@ body {
|
|
|
880
900
|
text-align: center;
|
|
881
901
|
}
|
|
882
902
|
|
|
903
|
+
/* Empty Agent State Styles */
|
|
904
|
+
.empty-agent-state {
|
|
905
|
+
padding: 20px;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
.empty-state-header {
|
|
909
|
+
text-align: center;
|
|
910
|
+
margin-bottom: 32px;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
.empty-state-header h3 {
|
|
914
|
+
margin: 0 0 8px 0;
|
|
915
|
+
font-size: 1.4rem;
|
|
916
|
+
color: #333;
|
|
917
|
+
font-weight: 600;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.empty-state-header p {
|
|
921
|
+
margin: 0;
|
|
922
|
+
color: #666;
|
|
923
|
+
font-size: 1rem;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
.empty-state-steps {
|
|
927
|
+
max-width: 600px;
|
|
928
|
+
margin: 0 auto;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
.empty-state-step {
|
|
932
|
+
display: flex;
|
|
933
|
+
gap: 16px;
|
|
934
|
+
margin-bottom: 24px;
|
|
935
|
+
align-items: flex-start;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
.empty-step-number {
|
|
939
|
+
flex-shrink: 0;
|
|
940
|
+
width: 36px;
|
|
941
|
+
height: 36px;
|
|
942
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
943
|
+
color: white;
|
|
944
|
+
border-radius: 50%;
|
|
945
|
+
display: flex;
|
|
946
|
+
align-items: center;
|
|
947
|
+
justify-content: center;
|
|
948
|
+
font-weight: 600;
|
|
949
|
+
font-size: 1.1rem;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
.empty-step-content {
|
|
953
|
+
flex: 1;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
.empty-step-content h4 {
|
|
957
|
+
margin: 0 0 10px 0;
|
|
958
|
+
font-size: 1.05rem;
|
|
959
|
+
font-weight: 600;
|
|
960
|
+
color: #333;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
.inline-command-box {
|
|
964
|
+
background: #2d3748;
|
|
965
|
+
border-radius: 8px;
|
|
966
|
+
padding: 14px 16px;
|
|
967
|
+
display: flex;
|
|
968
|
+
align-items: center;
|
|
969
|
+
justify-content: space-between;
|
|
970
|
+
gap: 12px;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.inline-command-box code {
|
|
974
|
+
font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
|
|
975
|
+
font-size: 0.95rem;
|
|
976
|
+
color: #48bb78;
|
|
977
|
+
flex: 1;
|
|
978
|
+
font-weight: 500;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
.inline-copy-btn {
|
|
982
|
+
background: #667eea;
|
|
983
|
+
color: white;
|
|
984
|
+
border: none;
|
|
985
|
+
border-radius: 6px;
|
|
986
|
+
padding: 7px 14px;
|
|
987
|
+
font-size: 0.85rem;
|
|
988
|
+
cursor: pointer;
|
|
989
|
+
transition: all 0.2s ease;
|
|
990
|
+
flex-shrink: 0;
|
|
991
|
+
font-weight: 500;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
.inline-copy-btn:hover {
|
|
995
|
+
background: #5568d3;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
.inline-copy-btn:active {
|
|
999
|
+
transform: scale(0.95);
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
.empty-state-footer {
|
|
1003
|
+
text-align: center;
|
|
1004
|
+
margin-top: 32px;
|
|
1005
|
+
padding-top: 24px;
|
|
1006
|
+
border-top: 1px solid #eee;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
.empty-state-footer p {
|
|
1010
|
+
margin: 0;
|
|
1011
|
+
color: #666;
|
|
1012
|
+
font-size: 0.95rem;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/* Help Modal Styles */
|
|
1016
|
+
.help-modal-content {
|
|
1017
|
+
font-size: 0.95rem;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
.help-intro {
|
|
1021
|
+
margin-top: 0;
|
|
1022
|
+
margin-bottom: 24px;
|
|
1023
|
+
color: #666;
|
|
1024
|
+
font-size: 1rem;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
.help-step {
|
|
1028
|
+
display: flex;
|
|
1029
|
+
gap: 16px;
|
|
1030
|
+
margin-bottom: 24px;
|
|
1031
|
+
align-items: flex-start;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
.step-number {
|
|
1035
|
+
flex-shrink: 0;
|
|
1036
|
+
width: 32px;
|
|
1037
|
+
height: 32px;
|
|
1038
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
1039
|
+
color: white;
|
|
1040
|
+
border-radius: 50%;
|
|
1041
|
+
display: flex;
|
|
1042
|
+
align-items: center;
|
|
1043
|
+
justify-content: center;
|
|
1044
|
+
font-weight: 600;
|
|
1045
|
+
font-size: 0.95rem;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.step-content {
|
|
1049
|
+
flex: 1;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
.step-content h4 {
|
|
1053
|
+
margin: 0 0 12px 0;
|
|
1054
|
+
font-size: 1.05rem;
|
|
1055
|
+
font-weight: 600;
|
|
1056
|
+
color: #333;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
.command-box {
|
|
1060
|
+
background: #f8f9fa;
|
|
1061
|
+
border: 1px solid #e1e4e8;
|
|
1062
|
+
border-radius: 8px;
|
|
1063
|
+
padding: 12px 14px;
|
|
1064
|
+
display: flex;
|
|
1065
|
+
align-items: center;
|
|
1066
|
+
justify-content: space-between;
|
|
1067
|
+
gap: 12px;
|
|
1068
|
+
margin-bottom: 8px;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
.command-box code {
|
|
1072
|
+
font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
|
|
1073
|
+
font-size: 0.9rem;
|
|
1074
|
+
color: #1a1a1a;
|
|
1075
|
+
flex: 1;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
.copy-btn {
|
|
1079
|
+
background: #667eea;
|
|
1080
|
+
color: white;
|
|
1081
|
+
border: none;
|
|
1082
|
+
border-radius: 6px;
|
|
1083
|
+
padding: 6px 12px;
|
|
1084
|
+
font-size: 0.85rem;
|
|
1085
|
+
cursor: pointer;
|
|
1086
|
+
transition: all 0.2s ease;
|
|
1087
|
+
flex-shrink: 0;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
.copy-btn:hover {
|
|
1091
|
+
background: #5568d3;
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
.copy-btn:active {
|
|
1095
|
+
transform: scale(0.95);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
.help-note {
|
|
1099
|
+
margin: 8px 0 0 0;
|
|
1100
|
+
font-size: 0.85rem;
|
|
1101
|
+
color: #666;
|
|
1102
|
+
font-style: italic;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
.help-troubleshooting {
|
|
1106
|
+
margin-top: 32px;
|
|
1107
|
+
padding: 16px;
|
|
1108
|
+
background: #f8f9fa;
|
|
1109
|
+
border-radius: 8px;
|
|
1110
|
+
border-left: 4px solid #667eea;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
.help-troubleshooting h4 {
|
|
1114
|
+
margin: 0 0 12px 0;
|
|
1115
|
+
font-size: 1rem;
|
|
1116
|
+
font-weight: 600;
|
|
1117
|
+
color: #333;
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
.help-troubleshooting ul {
|
|
1121
|
+
margin: 0;
|
|
1122
|
+
padding-left: 20px;
|
|
1123
|
+
list-style-type: disc;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
.help-troubleshooting li {
|
|
1127
|
+
margin-bottom: 8px;
|
|
1128
|
+
color: #555;
|
|
1129
|
+
font-size: 0.9rem;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
.help-troubleshooting li:last-child {
|
|
1133
|
+
margin-bottom: 0;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
883
1136
|
/* Agent Notifications */
|
|
884
1137
|
.agent-notification {
|
|
885
1138
|
position: fixed;
|
package/public/app/dashboard.js
CHANGED
|
@@ -504,6 +504,9 @@ class ShellMirrorDashboard {
|
|
|
504
504
|
<span id="connection-status" class="connection-status" style="display: none;"></span>
|
|
505
505
|
<span id="refresh-status" class="refresh-status">Initializing...</span>
|
|
506
506
|
</div>
|
|
507
|
+
<button class="help-button" onclick="dashboard.showAgentInstructions()" title="How to Use">
|
|
508
|
+
📖 How to Use
|
|
509
|
+
</button>
|
|
507
510
|
<div class="user-info">
|
|
508
511
|
<span class="user-name">${this.user.name || this.user.email}</span>
|
|
509
512
|
<div class="user-dropdown">
|
|
@@ -607,7 +610,46 @@ class ShellMirrorDashboard {
|
|
|
607
610
|
</div>
|
|
608
611
|
</div>
|
|
609
612
|
<div class="card-content">
|
|
610
|
-
${agentCount > 0 ? agentsHtml :
|
|
613
|
+
${agentCount > 0 ? agentsHtml : this.renderEmptyAgentState()}
|
|
614
|
+
</div>
|
|
615
|
+
</div>
|
|
616
|
+
`;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
renderEmptyAgentState() {
|
|
620
|
+
return `
|
|
621
|
+
<div class="empty-agent-state">
|
|
622
|
+
<div class="empty-state-header">
|
|
623
|
+
<h3>🚀 Get Started with Shell Mirror</h3>
|
|
624
|
+
<p>Connect your Mac in 2 simple steps:</p>
|
|
625
|
+
</div>
|
|
626
|
+
|
|
627
|
+
<div class="empty-state-steps">
|
|
628
|
+
<div class="empty-state-step">
|
|
629
|
+
<div class="empty-step-number">1</div>
|
|
630
|
+
<div class="empty-step-content">
|
|
631
|
+
<h4>Install the agent</h4>
|
|
632
|
+
<div class="inline-command-box">
|
|
633
|
+
<code>npm install -g shell-mirror</code>
|
|
634
|
+
<button class="inline-copy-btn" onclick="navigator.clipboard.writeText('npm install -g shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
|
|
635
|
+
</div>
|
|
636
|
+
</div>
|
|
637
|
+
</div>
|
|
638
|
+
|
|
639
|
+
<div class="empty-state-step">
|
|
640
|
+
<div class="empty-step-number">2</div>
|
|
641
|
+
<div class="empty-step-content">
|
|
642
|
+
<h4>Run the agent</h4>
|
|
643
|
+
<div class="inline-command-box">
|
|
644
|
+
<code>shell-mirror</code>
|
|
645
|
+
<button class="inline-copy-btn" onclick="navigator.clipboard.writeText('shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
|
|
646
|
+
</div>
|
|
647
|
+
</div>
|
|
648
|
+
</div>
|
|
649
|
+
</div>
|
|
650
|
+
|
|
651
|
+
<div class="empty-state-footer">
|
|
652
|
+
<p>✨ Your agent will appear here once connected</p>
|
|
611
653
|
</div>
|
|
612
654
|
</div>
|
|
613
655
|
`;
|
|
@@ -1186,8 +1228,45 @@ class ShellMirrorDashboard {
|
|
|
1186
1228
|
}
|
|
1187
1229
|
|
|
1188
1230
|
showAgentInstructions() {
|
|
1189
|
-
|
|
1190
|
-
|
|
1231
|
+
const content = `
|
|
1232
|
+
<div class="help-modal-content">
|
|
1233
|
+
<p class="help-intro">Get started in 2 easy steps:</p>
|
|
1234
|
+
|
|
1235
|
+
<div class="help-step">
|
|
1236
|
+
<div class="step-number">1</div>
|
|
1237
|
+
<div class="step-content">
|
|
1238
|
+
<h4>Install the agent</h4>
|
|
1239
|
+
<div class="command-box">
|
|
1240
|
+
<code>npm install -g shell-mirror</code>
|
|
1241
|
+
<button class="copy-btn" onclick="navigator.clipboard.writeText('npm install -g shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
|
|
1242
|
+
</div>
|
|
1243
|
+
</div>
|
|
1244
|
+
</div>
|
|
1245
|
+
|
|
1246
|
+
<div class="help-step">
|
|
1247
|
+
<div class="step-number">2</div>
|
|
1248
|
+
<div class="step-content">
|
|
1249
|
+
<h4>Run the agent</h4>
|
|
1250
|
+
<div class="command-box">
|
|
1251
|
+
<code>shell-mirror</code>
|
|
1252
|
+
<button class="copy-btn" onclick="navigator.clipboard.writeText('shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
|
|
1253
|
+
</div>
|
|
1254
|
+
<p class="help-note">The agent will automatically connect to your dashboard</p>
|
|
1255
|
+
</div>
|
|
1256
|
+
</div>
|
|
1257
|
+
|
|
1258
|
+
<div class="help-troubleshooting">
|
|
1259
|
+
<h4>💡 Troubleshooting</h4>
|
|
1260
|
+
<ul>
|
|
1261
|
+
<li>Make sure you're logged in with the same Google account</li>
|
|
1262
|
+
<li>Check that the agent is running in your terminal</li>
|
|
1263
|
+
<li>Refresh this dashboard after starting the agent</li>
|
|
1264
|
+
</ul>
|
|
1265
|
+
</div>
|
|
1266
|
+
</div>
|
|
1267
|
+
`;
|
|
1268
|
+
|
|
1269
|
+
this.showModal('🚀 How to Use Shell Mirror', content);
|
|
1191
1270
|
}
|
|
1192
1271
|
|
|
1193
1272
|
showSettings() {
|
package/public/app/terminal.html
CHANGED
|
@@ -176,6 +176,32 @@
|
|
|
176
176
|
#agent-id-input { font-size: 1.2em; padding: 8px; width: 400px; margin-bottom: 1em; }
|
|
177
177
|
#connect-btn { font-size: 1.2em; padding: 10px 20px; }
|
|
178
178
|
|
|
179
|
+
/* How to Use Button */
|
|
180
|
+
.how-to-use-btn {
|
|
181
|
+
position: fixed;
|
|
182
|
+
top: 20px;
|
|
183
|
+
left: 170px;
|
|
184
|
+
background: rgba(102, 126, 234, 0.9);
|
|
185
|
+
color: white;
|
|
186
|
+
border: none;
|
|
187
|
+
border-radius: 8px;
|
|
188
|
+
padding: 10px 16px;
|
|
189
|
+
cursor: pointer;
|
|
190
|
+
font-size: 0.9em;
|
|
191
|
+
font-weight: 500;
|
|
192
|
+
display: flex;
|
|
193
|
+
align-items: center;
|
|
194
|
+
gap: 6px;
|
|
195
|
+
z-index: 10000;
|
|
196
|
+
backdrop-filter: blur(10px);
|
|
197
|
+
transition: all 0.2s ease;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.how-to-use-btn:hover {
|
|
201
|
+
background: rgba(102, 126, 234, 1);
|
|
202
|
+
transform: translateY(-1px);
|
|
203
|
+
}
|
|
204
|
+
|
|
179
205
|
/* Back to Dashboard Button */
|
|
180
206
|
.back-to-dashboard {
|
|
181
207
|
position: fixed;
|
|
@@ -234,6 +260,11 @@
|
|
|
234
260
|
<span>←</span>
|
|
235
261
|
<span>Dashboard</span>
|
|
236
262
|
</a>
|
|
263
|
+
|
|
264
|
+
<!-- How to Use Button -->
|
|
265
|
+
<button class="how-to-use-btn" id="how-to-use-btn" onclick="showHelpModal()">
|
|
266
|
+
📖 How to Use
|
|
267
|
+
</button>
|
|
237
268
|
|
|
238
269
|
<div id="connect-container">
|
|
239
270
|
<h2>Terminal Mirror</h2>
|
|
@@ -262,6 +293,51 @@
|
|
|
262
293
|
<div id="terminal"></div>
|
|
263
294
|
</div>
|
|
264
295
|
|
|
296
|
+
<!-- Help Modal -->
|
|
297
|
+
<div id="help-modal" style="display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.8); align-items: center; justify-content: center; z-index: 20000;">
|
|
298
|
+
<div style="background: white; border-radius: 12px; max-width: 500px; width: 90%; max-height: 80vh; overflow: hidden;">
|
|
299
|
+
<div style="padding: 20px 24px; border-bottom: 1px solid #eee; display: flex; justify-content: space-between; align-items: center;">
|
|
300
|
+
<h3 style="margin: 0; font-size: 1.2rem; color: #333;">🚀 How to Use Shell Mirror</h3>
|
|
301
|
+
<button onclick="closeHelpModal()" style="background: none; border: none; font-size: 1.5rem; cursor: pointer; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; color: #666;">×</button>
|
|
302
|
+
</div>
|
|
303
|
+
<div style="padding: 24px; max-height: 60vh; overflow-y: auto;">
|
|
304
|
+
<p style="margin-top: 0; margin-bottom: 24px; color: #666; font-size: 1rem;">Get started in 2 easy steps:</p>
|
|
305
|
+
|
|
306
|
+
<div style="display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start;">
|
|
307
|
+
<div style="flex-shrink: 0; width: 32px; height: 32px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.95rem;">1</div>
|
|
308
|
+
<div style="flex: 1;">
|
|
309
|
+
<h4 style="margin: 0 0 12px 0; font-size: 1.05rem; font-weight: 600; color: #333;">Install the agent</h4>
|
|
310
|
+
<div style="background: #f8f9fa; border: 1px solid #e1e4e8; border-radius: 8px; padding: 12px 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px;">
|
|
311
|
+
<code style="font-family: 'Monaco', 'Menlo', 'Courier New', monospace; font-size: 0.9rem; color: #1a1a1a; flex: 1;">npm install -g shell-mirror</code>
|
|
312
|
+
<button onclick="copyToClipboard('npm install -g shell-mirror', this)" style="background: #667eea; color: white; border: none; border-radius: 6px; padding: 6px 12px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; flex-shrink: 0;">Copy</button>
|
|
313
|
+
</div>
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<div style="display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start;">
|
|
318
|
+
<div style="flex-shrink: 0; width: 32px; height: 32px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.95rem;">2</div>
|
|
319
|
+
<div style="flex: 1;">
|
|
320
|
+
<h4 style="margin: 0 0 12px 0; font-size: 1.05rem; font-weight: 600; color: #333;">Run the agent</h4>
|
|
321
|
+
<div style="background: #f8f9fa; border: 1px solid #e1e4e8; border-radius: 8px; padding: 12px 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px;">
|
|
322
|
+
<code style="font-family: 'Monaco', 'Menlo', 'Courier New', monospace; font-size: 0.9rem; color: #1a1a1a; flex: 1;">shell-mirror</code>
|
|
323
|
+
<button onclick="copyToClipboard('shell-mirror', this)" style="background: #667eea; color: white; border: none; border-radius: 6px; padding: 6px 12px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; flex-shrink: 0;">Copy</button>
|
|
324
|
+
</div>
|
|
325
|
+
<p style="margin: 8px 0 0 0; font-size: 0.85rem; color: #666; font-style: italic;">The agent will automatically connect to your dashboard</p>
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
|
|
329
|
+
<div style="margin-top: 32px; padding: 16px; background: #f8f9fa; border-radius: 8px; border-left: 4px solid #667eea;">
|
|
330
|
+
<h4 style="margin: 0 0 12px 0; font-size: 1rem; font-weight: 600; color: #333;">💡 Troubleshooting</h4>
|
|
331
|
+
<ul style="margin: 0; padding-left: 20px; list-style-type: disc;">
|
|
332
|
+
<li style="margin-bottom: 8px; color: #555; font-size: 0.9rem;">Make sure you're logged in with the same Google account</li>
|
|
333
|
+
<li style="margin-bottom: 8px; color: #555; font-size: 0.9rem;">Check that the agent is running in your terminal</li>
|
|
334
|
+
<li style="margin-bottom: 0; color: #555; font-size: 0.9rem;">Refresh your dashboard after starting the agent</li>
|
|
335
|
+
</ul>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
|
|
265
341
|
<!-- Version Footer -->
|
|
266
342
|
<footer style="background: #ff6b35; color: white; text-align: center; padding: 10px 0; font-size: 0.8rem; position: fixed; bottom: 0; left: 0; right: 0; z-index: 1000;">
|
|
267
343
|
<div style="max-width: 1200px; margin: 0 auto;">
|
|
@@ -269,6 +345,39 @@
|
|
|
269
345
|
</div>
|
|
270
346
|
</footer>
|
|
271
347
|
|
|
348
|
+
<script>
|
|
349
|
+
// Help Modal Functions
|
|
350
|
+
function showHelpModal() {
|
|
351
|
+
const modal = document.getElementById('help-modal');
|
|
352
|
+
modal.style.display = 'flex';
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function closeHelpModal() {
|
|
356
|
+
const modal = document.getElementById('help-modal');
|
|
357
|
+
modal.style.display = 'none';
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function copyToClipboard(text, button) {
|
|
361
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
362
|
+
const originalText = button.textContent;
|
|
363
|
+
button.textContent = 'Copied!';
|
|
364
|
+
setTimeout(() => {
|
|
365
|
+
button.textContent = originalText;
|
|
366
|
+
}, 2000);
|
|
367
|
+
}).catch(err => {
|
|
368
|
+
console.error('Failed to copy:', err);
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Close modal when clicking outside
|
|
373
|
+
document.addEventListener('click', function(event) {
|
|
374
|
+
const modal = document.getElementById('help-modal');
|
|
375
|
+
if (event.target === modal) {
|
|
376
|
+
closeHelpModal();
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
</script>
|
|
380
|
+
|
|
272
381
|
<script src="/app/terminal.js?v=chunked-20250820"></script>
|
|
273
382
|
</body>
|
|
274
383
|
</html>
|
package/public/index.html
CHANGED
|
@@ -199,6 +199,12 @@
|
|
|
199
199
|
text-align: center;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
/* Quick Start Section */
|
|
203
|
+
.quick-start {
|
|
204
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
205
|
+
padding: 60px 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
202
208
|
/* Installation Code */
|
|
203
209
|
.install-code {
|
|
204
210
|
background: rgba(0, 0, 0, 0.3);
|
|
@@ -569,6 +575,57 @@
|
|
|
569
575
|
</div>
|
|
570
576
|
</section>
|
|
571
577
|
|
|
578
|
+
<!-- Quick Start Section -->
|
|
579
|
+
<section class="quick-start" id="quick-start">
|
|
580
|
+
<div class="container">
|
|
581
|
+
<h2 class="section-title" style="color: white; margin-bottom: 30px;">Quick Start</h2>
|
|
582
|
+
<p style="text-align: center; color: rgba(255, 255, 255, 0.9); font-size: 1.1rem; margin-bottom: 40px;">
|
|
583
|
+
Get started in 2 simple steps:
|
|
584
|
+
</p>
|
|
585
|
+
|
|
586
|
+
<div class="setup-steps">
|
|
587
|
+
<div class="setup-step">
|
|
588
|
+
<div class="step-number">1</div>
|
|
589
|
+
<div class="install-code">
|
|
590
|
+
<pre>npm install -g shell-mirror</pre>
|
|
591
|
+
<button class="copy-btn" onclick="copyToClipboard('npm install -g shell-mirror', this)" title="Copy to clipboard">
|
|
592
|
+
<svg width="16" height="16" fill="white" viewBox="0 0 16 16">
|
|
593
|
+
<path d="M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V2z"/>
|
|
594
|
+
<path d="M2 6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2H4a2 2 0 0 1-2-2V6z"/>
|
|
595
|
+
</svg>
|
|
596
|
+
</button>
|
|
597
|
+
</div>
|
|
598
|
+
</div>
|
|
599
|
+
|
|
600
|
+
<div class="setup-step">
|
|
601
|
+
<div class="step-number">2</div>
|
|
602
|
+
<div class="install-code">
|
|
603
|
+
<pre>shell-mirror</pre>
|
|
604
|
+
<button class="copy-btn" onclick="copyToClipboard('shell-mirror', this)" title="Copy to clipboard">
|
|
605
|
+
<svg width="16" height="16" fill="white" viewBox="0 0 16 16">
|
|
606
|
+
<path d="M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V2z"/>
|
|
607
|
+
<path d="M2 6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2H4a2 2 0 0 1-2-2V6z"/>
|
|
608
|
+
</svg>
|
|
609
|
+
</button>
|
|
610
|
+
</div>
|
|
611
|
+
</div>
|
|
612
|
+
|
|
613
|
+
<div class="setup-step">
|
|
614
|
+
<div class="step-number">3</div>
|
|
615
|
+
<button class="btn-google" onclick="handleGoogleLogin()">
|
|
616
|
+
<svg width="20" height="20" viewBox="0 0 24 24">
|
|
617
|
+
<path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
|
|
618
|
+
<path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
|
|
619
|
+
<path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
|
|
620
|
+
<path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
|
|
621
|
+
</svg>
|
|
622
|
+
Login with Google
|
|
623
|
+
</button>
|
|
624
|
+
</div>
|
|
625
|
+
</div>
|
|
626
|
+
</div>
|
|
627
|
+
</section>
|
|
628
|
+
|
|
572
629
|
<!-- How It Works -->
|
|
573
630
|
<section class="how-it-works" id="how-it-works">
|
|
574
631
|
<div class="container">
|
|
@@ -696,6 +753,23 @@
|
|
|
696
753
|
|
|
697
754
|
|
|
698
755
|
<script>
|
|
756
|
+
// Copy to clipboard function
|
|
757
|
+
function copyToClipboard(text, button) {
|
|
758
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
759
|
+
// Show feedback
|
|
760
|
+
const originalHTML = button.innerHTML;
|
|
761
|
+
button.innerHTML = '<span style="font-size: 0.9rem;">✓</span>';
|
|
762
|
+
button.style.background = 'rgba(0, 255, 136, 0.3)';
|
|
763
|
+
|
|
764
|
+
setTimeout(() => {
|
|
765
|
+
button.innerHTML = originalHTML;
|
|
766
|
+
button.style.background = 'rgba(255, 255, 255, 0.1)';
|
|
767
|
+
}, 2000);
|
|
768
|
+
}).catch(err => {
|
|
769
|
+
console.error('Failed to copy:', err);
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
|
|
699
773
|
// Check authentication status without auto-redirect
|
|
700
774
|
async function checkAuthStatus() {
|
|
701
775
|
try {
|