@symbo.ls/connect 3.4.9 → 3.5.0
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/dist/manifest.json +1 -1
- package/dist/panel.css +275 -0
- package/dist/panel.html +117 -4
- package/dist/panel.js +485 -20
- package/dist/service_worker.js +57 -1
- package/dist/service_worker.js.map +2 -2
- package/package.json +2 -2
- package/src/service_worker.js +57 -1
- package/static/panel.css +275 -0
- package/static/panel.html +117 -4
- package/static/panel.js +485 -20
package/dist/manifest.json
CHANGED
package/dist/panel.css
CHANGED
|
@@ -2803,3 +2803,278 @@ body {
|
|
|
2803
2803
|
padding-top: 8px;
|
|
2804
2804
|
border-top: 1px solid var(--border);
|
|
2805
2805
|
}
|
|
2806
|
+
|
|
2807
|
+
/* ============================================================
|
|
2808
|
+
Network mode
|
|
2809
|
+
============================================================ */
|
|
2810
|
+
#mode-network {
|
|
2811
|
+
flex-direction: column;
|
|
2812
|
+
overflow-y: auto;
|
|
2813
|
+
}
|
|
2814
|
+
.network-panel {
|
|
2815
|
+
padding: 12px 16px;
|
|
2816
|
+
display: flex;
|
|
2817
|
+
flex-direction: column;
|
|
2818
|
+
gap: 16px;
|
|
2819
|
+
}
|
|
2820
|
+
.network-section {
|
|
2821
|
+
border: 1px solid var(--border);
|
|
2822
|
+
border-radius: var(--radius);
|
|
2823
|
+
padding: 12px;
|
|
2824
|
+
background: var(--bg-alt);
|
|
2825
|
+
}
|
|
2826
|
+
.network-section .section-header {
|
|
2827
|
+
margin-bottom: 10px;
|
|
2828
|
+
}
|
|
2829
|
+
.network-status {
|
|
2830
|
+
display: flex;
|
|
2831
|
+
align-items: center;
|
|
2832
|
+
gap: 8px;
|
|
2833
|
+
padding: 8px 10px;
|
|
2834
|
+
border-radius: var(--radius-sm);
|
|
2835
|
+
background: var(--bg-input);
|
|
2836
|
+
font-size: 12px;
|
|
2837
|
+
margin-bottom: 10px;
|
|
2838
|
+
}
|
|
2839
|
+
.network-status-dot {
|
|
2840
|
+
width: 8px;
|
|
2841
|
+
height: 8px;
|
|
2842
|
+
border-radius: 50%;
|
|
2843
|
+
background: var(--text-dim);
|
|
2844
|
+
flex-shrink: 0;
|
|
2845
|
+
}
|
|
2846
|
+
.network-status.connected .network-status-dot { background: #4caf50; }
|
|
2847
|
+
.network-status.error .network-status-dot { background: var(--error-color); }
|
|
2848
|
+
.network-fields {
|
|
2849
|
+
display: flex;
|
|
2850
|
+
flex-direction: column;
|
|
2851
|
+
gap: 8px;
|
|
2852
|
+
}
|
|
2853
|
+
.network-field label {
|
|
2854
|
+
display: block;
|
|
2855
|
+
font-size: 11px;
|
|
2856
|
+
color: var(--text-dim);
|
|
2857
|
+
margin-bottom: 3px;
|
|
2858
|
+
}
|
|
2859
|
+
.network-field-row {
|
|
2860
|
+
display: flex;
|
|
2861
|
+
gap: 6px;
|
|
2862
|
+
}
|
|
2863
|
+
.network-input {
|
|
2864
|
+
flex: 1;
|
|
2865
|
+
background: var(--bg-input);
|
|
2866
|
+
border: 1px solid var(--border);
|
|
2867
|
+
color: var(--text-bright);
|
|
2868
|
+
font-family: inherit;
|
|
2869
|
+
font-size: 12px;
|
|
2870
|
+
padding: 6px 10px;
|
|
2871
|
+
border-radius: var(--radius-sm);
|
|
2872
|
+
outline: none;
|
|
2873
|
+
}
|
|
2874
|
+
.network-input:focus { border-color: var(--accent); }
|
|
2875
|
+
.network-btn-sm {
|
|
2876
|
+
background: var(--bg-input);
|
|
2877
|
+
border: 1px solid var(--border);
|
|
2878
|
+
color: var(--text);
|
|
2879
|
+
font-size: 11px;
|
|
2880
|
+
padding: 4px 10px;
|
|
2881
|
+
border-radius: var(--radius-sm);
|
|
2882
|
+
cursor: pointer;
|
|
2883
|
+
white-space: nowrap;
|
|
2884
|
+
}
|
|
2885
|
+
.network-btn-sm:hover { border-color: var(--accent); color: var(--text-bright); }
|
|
2886
|
+
.network-actions {
|
|
2887
|
+
display: flex;
|
|
2888
|
+
gap: 8px;
|
|
2889
|
+
margin-top: 10px;
|
|
2890
|
+
}
|
|
2891
|
+
.network-btn {
|
|
2892
|
+
background: var(--accent);
|
|
2893
|
+
border: none;
|
|
2894
|
+
color: #fff;
|
|
2895
|
+
font-size: 12px;
|
|
2896
|
+
font-family: inherit;
|
|
2897
|
+
padding: 6px 14px;
|
|
2898
|
+
border-radius: var(--radius-sm);
|
|
2899
|
+
cursor: pointer;
|
|
2900
|
+
}
|
|
2901
|
+
.network-btn:hover { opacity: 0.9; }
|
|
2902
|
+
.network-btn-secondary {
|
|
2903
|
+
background: transparent;
|
|
2904
|
+
border: 1px solid var(--border);
|
|
2905
|
+
color: var(--text-dim);
|
|
2906
|
+
}
|
|
2907
|
+
.network-btn-secondary:hover { border-color: var(--text-dim); color: var(--text); }
|
|
2908
|
+
.network-info {
|
|
2909
|
+
display: flex;
|
|
2910
|
+
flex-direction: column;
|
|
2911
|
+
gap: 4px;
|
|
2912
|
+
}
|
|
2913
|
+
.network-info-row {
|
|
2914
|
+
display: flex;
|
|
2915
|
+
justify-content: space-between;
|
|
2916
|
+
padding: 4px 0;
|
|
2917
|
+
font-size: 12px;
|
|
2918
|
+
border-bottom: 1px solid var(--border);
|
|
2919
|
+
}
|
|
2920
|
+
.network-info-row:last-child { border-bottom: none; }
|
|
2921
|
+
.network-info-label {
|
|
2922
|
+
color: var(--text-dim);
|
|
2923
|
+
}
|
|
2924
|
+
.network-info-value {
|
|
2925
|
+
color: var(--text-bright);
|
|
2926
|
+
font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;
|
|
2927
|
+
font-size: 11px;
|
|
2928
|
+
}
|
|
2929
|
+
|
|
2930
|
+
/* ============================================================
|
|
2931
|
+
Integrations mode
|
|
2932
|
+
============================================================ */
|
|
2933
|
+
#mode-integrations {
|
|
2934
|
+
flex-direction: column;
|
|
2935
|
+
overflow-y: auto;
|
|
2936
|
+
}
|
|
2937
|
+
.integrations-panel {
|
|
2938
|
+
padding: 12px 16px;
|
|
2939
|
+
display: flex;
|
|
2940
|
+
flex-direction: column;
|
|
2941
|
+
gap: 16px;
|
|
2942
|
+
}
|
|
2943
|
+
.integrations-section {
|
|
2944
|
+
display: flex;
|
|
2945
|
+
flex-direction: column;
|
|
2946
|
+
gap: 8px;
|
|
2947
|
+
}
|
|
2948
|
+
.integrations-search-row {
|
|
2949
|
+
margin-bottom: 4px;
|
|
2950
|
+
}
|
|
2951
|
+
.integrations-search {
|
|
2952
|
+
width: 100%;
|
|
2953
|
+
background: var(--bg-input);
|
|
2954
|
+
border: 1px solid var(--border);
|
|
2955
|
+
color: var(--text);
|
|
2956
|
+
font-size: 12px;
|
|
2957
|
+
font-family: inherit;
|
|
2958
|
+
padding: 6px 10px;
|
|
2959
|
+
border-radius: var(--radius-sm);
|
|
2960
|
+
outline: none;
|
|
2961
|
+
}
|
|
2962
|
+
.integrations-search:focus { border-color: var(--accent); }
|
|
2963
|
+
.integrations-list {
|
|
2964
|
+
display: flex;
|
|
2965
|
+
flex-direction: column;
|
|
2966
|
+
gap: 6px;
|
|
2967
|
+
}
|
|
2968
|
+
.integration-item {
|
|
2969
|
+
display: flex;
|
|
2970
|
+
align-items: center;
|
|
2971
|
+
gap: 10px;
|
|
2972
|
+
padding: 10px 12px;
|
|
2973
|
+
border: 1px solid var(--border);
|
|
2974
|
+
border-radius: var(--radius);
|
|
2975
|
+
background: var(--bg-alt);
|
|
2976
|
+
}
|
|
2977
|
+
.integration-icon {
|
|
2978
|
+
width: 32px;
|
|
2979
|
+
height: 32px;
|
|
2980
|
+
border-radius: var(--radius-sm);
|
|
2981
|
+
background: var(--bg-input);
|
|
2982
|
+
display: flex;
|
|
2983
|
+
align-items: center;
|
|
2984
|
+
justify-content: center;
|
|
2985
|
+
font-size: 16px;
|
|
2986
|
+
flex-shrink: 0;
|
|
2987
|
+
}
|
|
2988
|
+
.integration-info {
|
|
2989
|
+
flex: 1;
|
|
2990
|
+
min-width: 0;
|
|
2991
|
+
}
|
|
2992
|
+
.integration-name {
|
|
2993
|
+
font-size: 12px;
|
|
2994
|
+
font-weight: 500;
|
|
2995
|
+
color: var(--text-bright);
|
|
2996
|
+
}
|
|
2997
|
+
.integration-desc {
|
|
2998
|
+
font-size: 10px;
|
|
2999
|
+
color: var(--text-dim);
|
|
3000
|
+
margin-top: 2px;
|
|
3001
|
+
overflow: hidden;
|
|
3002
|
+
text-overflow: ellipsis;
|
|
3003
|
+
white-space: nowrap;
|
|
3004
|
+
}
|
|
3005
|
+
.integration-actions {
|
|
3006
|
+
flex-shrink: 0;
|
|
3007
|
+
display: flex;
|
|
3008
|
+
gap: 4px;
|
|
3009
|
+
}
|
|
3010
|
+
.integration-btn {
|
|
3011
|
+
background: var(--bg-input);
|
|
3012
|
+
border: 1px solid var(--border);
|
|
3013
|
+
color: var(--text);
|
|
3014
|
+
font-size: 10px;
|
|
3015
|
+
padding: 3px 8px;
|
|
3016
|
+
border-radius: var(--radius-sm);
|
|
3017
|
+
cursor: pointer;
|
|
3018
|
+
font-family: inherit;
|
|
3019
|
+
}
|
|
3020
|
+
.integration-btn:hover { border-color: var(--accent); color: var(--text-bright); }
|
|
3021
|
+
.integration-btn-primary {
|
|
3022
|
+
background: var(--accent);
|
|
3023
|
+
border-color: var(--accent);
|
|
3024
|
+
color: #fff;
|
|
3025
|
+
}
|
|
3026
|
+
.integration-btn-primary:hover { opacity: 0.9; }
|
|
3027
|
+
.integration-btn-danger {
|
|
3028
|
+
color: var(--error-color);
|
|
3029
|
+
}
|
|
3030
|
+
.integration-btn-danger:hover { border-color: var(--error-color); }
|
|
3031
|
+
.integrations-grid {
|
|
3032
|
+
display: grid;
|
|
3033
|
+
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
|
3034
|
+
gap: 8px;
|
|
3035
|
+
}
|
|
3036
|
+
.integration-card {
|
|
3037
|
+
padding: 12px;
|
|
3038
|
+
border: 1px solid var(--border);
|
|
3039
|
+
border-radius: var(--radius);
|
|
3040
|
+
background: var(--bg-alt);
|
|
3041
|
+
cursor: pointer;
|
|
3042
|
+
transition: border-color 0.15s;
|
|
3043
|
+
}
|
|
3044
|
+
.integration-card:hover { border-color: var(--accent); }
|
|
3045
|
+
.integration-card-header {
|
|
3046
|
+
display: flex;
|
|
3047
|
+
align-items: center;
|
|
3048
|
+
gap: 8px;
|
|
3049
|
+
margin-bottom: 6px;
|
|
3050
|
+
}
|
|
3051
|
+
.integration-card-icon {
|
|
3052
|
+
width: 24px;
|
|
3053
|
+
height: 24px;
|
|
3054
|
+
border-radius: 4px;
|
|
3055
|
+
background: var(--bg-input);
|
|
3056
|
+
display: flex;
|
|
3057
|
+
align-items: center;
|
|
3058
|
+
justify-content: center;
|
|
3059
|
+
font-size: 14px;
|
|
3060
|
+
flex-shrink: 0;
|
|
3061
|
+
}
|
|
3062
|
+
.integration-card-name {
|
|
3063
|
+
font-size: 12px;
|
|
3064
|
+
font-weight: 500;
|
|
3065
|
+
color: var(--text-bright);
|
|
3066
|
+
}
|
|
3067
|
+
.integration-card-desc {
|
|
3068
|
+
font-size: 10px;
|
|
3069
|
+
color: var(--text-dim);
|
|
3070
|
+
line-height: 1.4;
|
|
3071
|
+
}
|
|
3072
|
+
.integration-card-tag {
|
|
3073
|
+
display: inline-block;
|
|
3074
|
+
font-size: 9px;
|
|
3075
|
+
color: var(--text-dim);
|
|
3076
|
+
background: var(--bg-input);
|
|
3077
|
+
padding: 1px 5px;
|
|
3078
|
+
border-radius: 8px;
|
|
3079
|
+
margin-top: 6px;
|
|
3080
|
+
}
|
package/dist/panel.html
CHANGED
|
@@ -72,6 +72,8 @@
|
|
|
72
72
|
<button class="mode-tab" data-mode="chat">Chat</button>
|
|
73
73
|
<button class="mode-tab" data-mode="gallery">Gallery</button>
|
|
74
74
|
<button class="mode-tab" data-mode="content">Content</button>
|
|
75
|
+
<button class="mode-tab" data-mode="network">Network</button>
|
|
76
|
+
<button class="mode-tab" data-mode="integrations">Integrations</button>
|
|
75
77
|
<span class="mode-tab-spacer"></span>
|
|
76
78
|
<span id="app-connection-badge"></span>
|
|
77
79
|
<button id="btn-app-disconnect" title="Disconnect">✕</button>
|
|
@@ -167,6 +169,10 @@
|
|
|
167
169
|
<select id="ai-model" class="ai-model-select" title="Select AI model">
|
|
168
170
|
<option value="Starter">Starter (free)</option>
|
|
169
171
|
<option value="claude">Claude</option>
|
|
172
|
+
<option value="openai">GPT-4o</option>
|
|
173
|
+
<option value="gemini">Gemini</option>
|
|
174
|
+
<option value="deepseek">DeepSeek</option>
|
|
175
|
+
<option value="groq">Groq</option>
|
|
170
176
|
<option value="chrome">Chrome AI (local)</option>
|
|
171
177
|
</select>
|
|
172
178
|
<button class="ai-settings-btn" title="AI settings" data-settings="ai">⚙</button>
|
|
@@ -205,6 +211,10 @@
|
|
|
205
211
|
<select id="chat-model" class="ai-model-select" title="Select AI model">
|
|
206
212
|
<option value="Starter">Starter (free)</option>
|
|
207
213
|
<option value="claude">Claude</option>
|
|
214
|
+
<option value="openai">GPT-4o</option>
|
|
215
|
+
<option value="gemini">Gemini</option>
|
|
216
|
+
<option value="deepseek">DeepSeek</option>
|
|
217
|
+
<option value="groq">Groq</option>
|
|
208
218
|
<option value="chrome">Chrome AI (local)</option>
|
|
209
219
|
</select>
|
|
210
220
|
<button class="ai-settings-btn" title="AI settings" data-settings="ai">⚙</button>
|
|
@@ -239,6 +249,79 @@
|
|
|
239
249
|
</div>
|
|
240
250
|
</div>
|
|
241
251
|
|
|
252
|
+
<!-- ============================================================
|
|
253
|
+
NETWORK MODE
|
|
254
|
+
============================================================ -->
|
|
255
|
+
<div id="mode-network" class="mode-panel">
|
|
256
|
+
<div class="network-panel">
|
|
257
|
+
<div class="network-section">
|
|
258
|
+
<div class="section-header">Backend Connection</div>
|
|
259
|
+
<div id="network-status" class="network-status">
|
|
260
|
+
<span class="network-status-dot"></span>
|
|
261
|
+
<span id="network-status-text">Not connected</span>
|
|
262
|
+
</div>
|
|
263
|
+
<div class="network-fields">
|
|
264
|
+
<div class="network-field">
|
|
265
|
+
<label>Server URL</label>
|
|
266
|
+
<div class="network-field-row">
|
|
267
|
+
<input id="network-url" type="text" placeholder="https://api.example.com" class="network-input" />
|
|
268
|
+
<button id="network-test" class="network-btn-sm">Test</button>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
<div class="network-field">
|
|
272
|
+
<label>API Key / Token</label>
|
|
273
|
+
<input id="network-token" type="password" placeholder="Bearer token or API key" class="network-input" />
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
<div class="network-actions">
|
|
277
|
+
<button id="network-save" class="network-btn">Save Connection</button>
|
|
278
|
+
<button id="network-disconnect" class="network-btn network-btn-secondary">Disconnect</button>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
<div class="network-section">
|
|
283
|
+
<div class="section-header">Server Info</div>
|
|
284
|
+
<div id="network-info" class="network-info">
|
|
285
|
+
<div class="network-info-row"><span class="network-info-label">Host</span><span id="network-info-host" class="network-info-value">—</span></div>
|
|
286
|
+
<div class="network-info-row"><span class="network-info-label">IP</span><span id="network-info-ip" class="network-info-value">—</span></div>
|
|
287
|
+
<div class="network-info-row"><span class="network-info-label">Status</span><span id="network-info-status" class="network-info-value">—</span></div>
|
|
288
|
+
<div class="network-info-row"><span class="network-info-label">Latency</span><span id="network-info-latency" class="network-info-value">—</span></div>
|
|
289
|
+
<div class="network-info-row"><span class="network-info-label">Platform</span><span id="network-info-platform" class="network-info-value">—</span></div>
|
|
290
|
+
<div class="network-info-row"><span class="network-info-label">Region</span><span id="network-info-region" class="network-info-value">—</span></div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
<div class="network-section">
|
|
295
|
+
<div class="section-header">Deployment</div>
|
|
296
|
+
<div id="network-deployment" class="network-info">
|
|
297
|
+
<div class="empty-message">Connect to view deployment configuration</div>
|
|
298
|
+
</div>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
|
|
303
|
+
<!-- ============================================================
|
|
304
|
+
INTEGRATIONS MODE
|
|
305
|
+
============================================================ -->
|
|
306
|
+
<div id="mode-integrations" class="mode-panel">
|
|
307
|
+
<div class="integrations-panel">
|
|
308
|
+
<div class="integrations-section">
|
|
309
|
+
<div class="section-header">Active Integrations</div>
|
|
310
|
+
<div id="integrations-active" class="integrations-list">
|
|
311
|
+
<div class="empty-message">No integrations enabled</div>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
<div class="integrations-section">
|
|
316
|
+
<div class="section-header">Marketplace</div>
|
|
317
|
+
<div class="integrations-search-row">
|
|
318
|
+
<input id="integrations-search" type="text" placeholder="Search integrations..." class="integrations-search" />
|
|
319
|
+
</div>
|
|
320
|
+
<div id="integrations-marketplace" class="integrations-grid"></div>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
242
325
|
</div>
|
|
243
326
|
|
|
244
327
|
<!-- AI Settings Dialog -->
|
|
@@ -249,15 +332,45 @@
|
|
|
249
332
|
<button id="ai-dialog-close">×</button>
|
|
250
333
|
</div>
|
|
251
334
|
<div class="ai-dialog-body">
|
|
335
|
+
<div id="ai-dialog-auth-status" class="ai-dialog-auth-status"></div>
|
|
336
|
+
|
|
252
337
|
<div class="ai-dialog-section">
|
|
253
|
-
<div class="ai-dialog-label">Claude API</div>
|
|
254
|
-
<p class="ai-dialog-hint">Sign in to symbols.app to use Claude via the platform, or enter your own Anthropic API key.</p>
|
|
255
|
-
<div id="ai-dialog-auth-status" class="ai-dialog-auth-status"></div>
|
|
256
338
|
<div class="ai-dialog-field">
|
|
257
|
-
<label>Anthropic
|
|
339
|
+
<label>Anthropic (Claude)</label>
|
|
258
340
|
<input id="ai-key-anthropic" type="password" placeholder="sk-ant-..." class="ai-dialog-input" />
|
|
259
341
|
</div>
|
|
260
342
|
</div>
|
|
343
|
+
|
|
344
|
+
<div class="ai-dialog-section">
|
|
345
|
+
<div class="ai-dialog-field">
|
|
346
|
+
<label>OpenAI (GPT-4o)</label>
|
|
347
|
+
<input id="ai-key-openai" type="password" placeholder="sk-..." class="ai-dialog-input" />
|
|
348
|
+
</div>
|
|
349
|
+
</div>
|
|
350
|
+
|
|
351
|
+
<div class="ai-dialog-section">
|
|
352
|
+
<div class="ai-dialog-field">
|
|
353
|
+
<label>Google AI (Gemini)</label>
|
|
354
|
+
<input id="ai-key-gemini" type="password" placeholder="AIza..." class="ai-dialog-input" />
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
358
|
+
<div class="ai-dialog-section">
|
|
359
|
+
<div class="ai-dialog-field">
|
|
360
|
+
<label>DeepSeek</label>
|
|
361
|
+
<input id="ai-key-deepseek" type="password" placeholder="sk-..." class="ai-dialog-input" />
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
|
|
365
|
+
<div class="ai-dialog-section">
|
|
366
|
+
<div class="ai-dialog-field">
|
|
367
|
+
<label>Groq</label>
|
|
368
|
+
<input id="ai-key-groq" type="password" placeholder="gsk_..." class="ai-dialog-input" />
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
<p class="ai-dialog-hint">Sign in to symbols.app for free Claude access, or enter API keys above.</p>
|
|
373
|
+
|
|
261
374
|
<div class="ai-dialog-actions">
|
|
262
375
|
<button id="ai-dialog-save" class="ai-dialog-save">Save</button>
|
|
263
376
|
</div>
|