@shawnowen/comet-mcp 2.3.1 → 2.4.2

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 (65) hide show
  1. package/README.md +97 -19
  2. package/dist/alert-dispatcher.d.ts +23 -0
  3. package/dist/alert-dispatcher.js +101 -0
  4. package/dist/binding-reaper.d.ts +46 -0
  5. package/dist/binding-reaper.js +73 -0
  6. package/dist/bound-session.d.ts +23 -0
  7. package/dist/bound-session.js +119 -0
  8. package/dist/bridge-config.d.ts +6 -0
  9. package/dist/bridge-config.js +78 -0
  10. package/dist/cdp-client.d.ts +40 -4
  11. package/dist/cdp-client.js +502 -155
  12. package/dist/comet-ai.d.ts +15 -0
  13. package/dist/comet-ai.js +114 -38
  14. package/dist/delegate-binding.d.ts +19 -0
  15. package/dist/delegate-binding.js +73 -0
  16. package/dist/http-server.js +2188 -47
  17. package/dist/index.js +3545 -788
  18. package/dist/observer.d.ts +47 -0
  19. package/dist/observer.js +516 -0
  20. package/dist/project-config.d.ts +46 -0
  21. package/dist/project-config.js +166 -0
  22. package/dist/session-registry.d.ts +57 -0
  23. package/dist/session-registry.js +500 -0
  24. package/dist/sidecar-artifacts.d.ts +49 -0
  25. package/dist/sidecar-artifacts.js +146 -0
  26. package/dist/snapshot-capture.d.ts +3 -0
  27. package/dist/snapshot-capture.js +91 -0
  28. package/dist/tab-group-archive.js +3 -1
  29. package/dist/tab-groups.d.ts +28 -1
  30. package/dist/tab-groups.js +205 -3
  31. package/dist/types.d.ts +237 -0
  32. package/dist/window-bindings.d.ts +160 -0
  33. package/dist/window-bindings.js +561 -0
  34. package/extension/background.js +1577 -300
  35. package/extension/icons/icon.svg +9 -0
  36. package/extension/icons/icon128.png +0 -0
  37. package/extension/icons/icon16.png +0 -0
  38. package/extension/icons/icon48.png +0 -0
  39. package/extension/manifest.json +34 -4
  40. package/extension/perplexity-capability-manifest.json +1181 -0
  41. package/extension/perplexity-capability-manifest.schema.json +142 -0
  42. package/extension/session-logic.js +3054 -0
  43. package/extension/session-manager.html +311 -0
  44. package/extension/sidepanel.css +5338 -528
  45. package/extension/sidepanel.html +282 -2
  46. package/extension/sidepanel.js +10604 -950
  47. package/extension/window-policy.js +162 -0
  48. package/package.json +10 -7
  49. package/vendor/lifecycle-mcp-adapter.mjs +103 -0
  50. package/vendor/lifecycle-metadata.mjs +252 -0
  51. package/vendor/readiness-report.mjs +742 -0
  52. package/dist/cdp-client.d.ts.map +0 -1
  53. package/dist/cdp-client.js.map +0 -1
  54. package/dist/comet-ai.d.ts.map +0 -1
  55. package/dist/comet-ai.js.map +0 -1
  56. package/dist/http-server.d.ts.map +0 -1
  57. package/dist/http-server.js.map +0 -1
  58. package/dist/index.d.ts.map +0 -1
  59. package/dist/index.js.map +0 -1
  60. package/dist/tab-group-archive.d.ts.map +0 -1
  61. package/dist/tab-group-archive.js.map +0 -1
  62. package/dist/tab-groups.d.ts.map +0 -1
  63. package/dist/tab-groups.js.map +0 -1
  64. package/dist/types.d.ts.map +0 -1
  65. package/dist/types.js.map +0 -1
@@ -4,7 +4,7 @@
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Comet Session Manager</title>
7
+ <title>Equabotz Browser Agents</title>
8
8
  <link rel="stylesheet" href="sidepanel.css">
9
9
  </head>
10
10
 
@@ -45,6 +45,166 @@
45
45
  </svg>
46
46
  Export
47
47
  </button>
48
+ <div class="toolbar-spacer"></div>
49
+ <button id="btn-fullscreen" class="toolbar-btn toolbar-btn-icon" title="Open in full tab">
50
+ <svg viewBox="0 0 16 16" width="14" height="14">
51
+ <path fill="currentColor"
52
+ d="M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zm10-1a.5.5 0 0 0 0 1h4a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 1 0v-4A1.5 1.5 0 0 0 15.5 0h-4zM.5 11a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 15.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z" />
53
+ </svg>
54
+ </button>
55
+ <button id="btn-settings" class="toolbar-btn toolbar-btn-icon" title="Settings">
56
+ <svg viewBox="0 0 16 16" width="14" height="14">
57
+ <path fill="currentColor"
58
+ d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z" />
59
+ <path fill="currentColor"
60
+ d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.421 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.421-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.116l.094-.318z" />
61
+ </svg>
62
+ </button>
63
+ </div>
64
+
65
+ <!-- Settings Panel (T115) -->
66
+ <div class="settings-panel hidden" id="settings-panel">
67
+ <div class="settings-header">
68
+ <span class="settings-title">Workspace Settings</span>
69
+ <button id="settings-reset" class="btn-text" title="Reset to defaults">Reset</button>
70
+ </div>
71
+ <div class="settings-row">
72
+ <label title="Extension-managed browser windows are locked to the agents display at full-screen bounds while keeping browser tabs visible.">Locked Full-Screen View <span class="settings-hint">?</span></label>
73
+ <input type="text" class="settings-input" value="Top display: 0,-1440, 2560x1440" readonly>
74
+ <select class="settings-select" title="This policy is mandatory for extension-managed browser windows." disabled>
75
+ <option selected>Locked</option>
76
+ </select>
77
+ </div>
78
+ <div class="settings-row">
79
+ <label title="Number of physical displays/monitors in your workspace. Used to organize the sidebar hierarchy by screen position (e.g. Top Display, Primary Display).">Displays <span class="settings-hint">?</span></label>
80
+ <input type="number" id="setting-displays" class="settings-input" min="1" max="10" value="2">
81
+ <select id="setting-displays-mode" class="settings-select" title="Soft Warning: visual indicator when exceeded. Hard Limit: blocks extension actions (restore, import) but cannot prevent native browser tabs. Display Default: adjusts sidebar layout only.">
82
+ <option value="warn">Soft Warning</option>
83
+ <option value="default">Display Default</option>
84
+ <option value="hard">Hard Limit</option>
85
+ </select>
86
+ </div>
87
+ <div class="settings-row">
88
+ <label title="Maximum number of browser windows per display. Helps track window sprawl across monitors. Windows are assigned to displays based on their screen coordinates.">Windows / Display <span class="settings-hint">?</span></label>
89
+ <input type="number" id="setting-windows" class="settings-input" min="1" max="20" value="3">
90
+ <select id="setting-windows-mode" class="settings-select" title="Soft Warning: visual indicator when exceeded. Hard Limit: blocks extension actions (restore, import) but cannot prevent native browser tabs. Display Default: adjusts sidebar layout only.">
91
+ <option value="warn">Soft Warning</option>
92
+ <option value="default">Display Default</option>
93
+ <option value="hard">Hard Limit</option>
94
+ </select>
95
+ </div>
96
+ <div class="settings-row">
97
+ <label title="Locked policy: each browser window can contain only one tab group. Additional groups are moved to dedicated top-display fullscreen windows.">Groups / Window <span class="settings-hint">?</span></label>
98
+ <input type="number" id="setting-groups" class="settings-input" min="1" max="1" value="1" disabled>
99
+ <select id="setting-groups-mode" class="settings-select" title="Locked hard limit: extension actions cannot add a second tab group to an existing browser window." disabled>
100
+ <option value="warn">Soft Warning</option>
101
+ <option value="default">Display Default</option>
102
+ <option value="hard" selected>Hard Limit</option>
103
+ </select>
104
+ </div>
105
+ <div class="settings-row">
106
+ <label title="Maximum number of tabs per tab group. Prevents memory bloat from groups with too many open pages. Chrome performance degrades significantly above 30-40 tabs per group.">Tabs / Group <span class="settings-hint">?</span></label>
107
+ <input type="number" id="setting-tabs" class="settings-input" min="1" max="100" value="15">
108
+ <select id="setting-tabs-mode" class="settings-select" title="Soft Warning: visual indicator when exceeded. Hard Limit: blocks extension actions (restore, import) but cannot prevent native browser tabs. Display Default: adjusts sidebar layout only.">
109
+ <option value="warn">Soft Warning</option>
110
+ <option value="default">Display Default</option>
111
+ <option value="hard">Hard Limit</option>
112
+ </select>
113
+ </div>
114
+
115
+ <!-- Equanaut routing mirrors the equa-web Command Center settings surface. -->
116
+ <div class="settings-equanaut-routing" aria-label="Equanaut LLM routing settings">
117
+ <div class="settings-section-header settings-section-header-strong">
118
+ <span class="settings-section-title">LLM Routing</span>
119
+ <span class="settings-section-note" id="setting-model-source">Standalone</span>
120
+ </div>
121
+ <p class="settings-section-copy">Defaults are loaded from gateway config. Browser overrides stay local.</p>
122
+
123
+ <div class="settings-field-header">
124
+ <label>Routing Mode</label>
125
+ <span class="settings-pill" id="setting-routing-badge">Gateway default</span>
126
+ </div>
127
+ <div class="settings-routing-toggle" role="radiogroup" aria-label="Routing mode">
128
+ <button type="button" class="settings-routing-option is-active" data-routing-mode="auto"
129
+ aria-pressed="true">Auto (Cloud + Fallback)</button>
130
+ <button type="button" class="settings-routing-option" data-routing-mode="local"
131
+ aria-pressed="false">Local Only</button>
132
+ <button type="button" class="settings-routing-option" data-routing-mode="cloud-only"
133
+ aria-pressed="false">Cloud Only</button>
134
+ </div>
135
+ <p class="settings-row-hint settings-row-hint-full" id="setting-routing-hint">Uses cloud gateway by default. Falls back to local Ollama if rate-limited.</p>
136
+
137
+ <div class="settings-field-header">
138
+ <label>Preferred Model</label>
139
+ <span class="settings-pill" id="setting-model-badge">Gateway default</span>
140
+ </div>
141
+ <div class="settings-row settings-row-model settings-row-model-command-center">
142
+ <select id="setting-model" class="settings-select settings-select-wide" aria-label="Preferred model">
143
+ <option value="">Loading…</option>
144
+ </select>
145
+ <button type="button" id="setting-model-refresh" class="settings-input-btn settings-input-btn-wide"
146
+ title="Refresh model catalog">Refresh</button>
147
+ </div>
148
+ <p class="settings-row-hint settings-row-hint-full" id="setting-model-hint">Loading model catalog…</p>
149
+
150
+ <div class="settings-field-header settings-field-header-spaced">
151
+ <label>Available Models</label>
152
+ <button type="button" class="btn-text" id="setting-model-load">Load models</button>
153
+ </div>
154
+ <div class="settings-model-studio" aria-label="Model catalog filters">
155
+ <div class="settings-model-toolbar">
156
+ <div class="model-search-shell settings-model-search-shell">
157
+ <svg class="model-search-icon" viewBox="0 0 24 24" width="16" height="16" fill="none"
158
+ stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
159
+ aria-hidden="true">
160
+ <circle cx="11" cy="11" r="8"></circle>
161
+ <path d="M21 21l-4.35-4.35"></path>
162
+ </svg>
163
+ <input type="search" id="setting-model-search" class="settings-model-search model-search-input"
164
+ placeholder="Search models, providers, capabilities" autocomplete="off" spellcheck="false"
165
+ aria-label="Search available models">
166
+ <button type="button" id="setting-model-search-clear" class="model-search-clear"
167
+ title="Clear model search" aria-label="Clear model search" hidden>
168
+ <svg viewBox="0 0 10 10" width="10" height="10" fill="none" stroke="currentColor" stroke-width="1.5"
169
+ aria-hidden="true">
170
+ <path d="M1 1L9 9M9 1L1 9" stroke-linecap="round"></path>
171
+ </svg>
172
+ </button>
173
+ </div>
174
+ <select id="setting-model-capability" class="settings-select settings-capability-select"
175
+ aria-label="Filter available models by capability">
176
+ <option value="all">Any capability</option>
177
+ <option value="fast">Fast</option>
178
+ <option value="vision">Vision</option>
179
+ <option value="reasoning">Reasoning</option>
180
+ <option value="tools">Tools</option>
181
+ <option value="image">Image</option>
182
+ <option value="pdf">PDF</option>
183
+ </select>
184
+ </div>
185
+ <div class="settings-model-provider-rail" id="setting-model-provider-rail"
186
+ aria-label="Filter available models by provider"></div>
187
+ </div>
188
+ <div class="settings-model-list" id="setting-model-list" aria-live="polite"></div>
189
+
190
+ <button type="button" class="settings-reset-command-center" id="setting-model-reset">Reset to Gateway Defaults</button>
191
+ </div>
192
+
193
+ <div class="settings-divider"></div>
194
+
195
+ <div class="settings-gateway-connection">
196
+ <div class="settings-section-header settings-section-header-plain">
197
+ <span class="settings-section-title">Gateway Connection</span>
198
+ </div>
199
+ <p class="settings-callout">The gateway connects automatically using server configuration. Overrides are optional.</p>
200
+ <label class="settings-field-label" for="setting-gateway-url">Gateway URL Override</label>
201
+ <input type="text" id="setting-gateway-url" class="settings-input settings-input-wide"
202
+ placeholder="Leave empty to use server default" autocomplete="off">
203
+ <label class="settings-field-label" for="setting-gateway-token">API Token Override</label>
204
+ <input type="password" id="setting-gateway-token" class="settings-input settings-input-wide"
205
+ placeholder="Leave empty to use server default" autocomplete="off">
206
+ <p class="settings-row-hint settings-row-hint-full" id="setting-gateway-hint">Server defaults are used unless overrides are set.</p>
207
+ </div>
48
208
  </div>
49
209
 
50
210
  <!-- Main Content Sections -->
@@ -100,6 +260,124 @@
100
260
 
101
261
  </div>
102
262
 
263
+ <!-- Equanaut Chat Surface (sidebar only) -->
264
+ <div class="equanaut-chat" id="equanaut-chat" aria-label="Equanaut conversation">
265
+ <div class="equanaut-chat-header" id="equanaut-chat-header" hidden>
266
+ <span class="equanaut-chat-title">Equanaut</span>
267
+ <span class="equanaut-chat-model" id="equanaut-chat-model" title="Active model — click sparkle to change"></span>
268
+ <span class="equanaut-chat-status" id="equanaut-chat-status" data-state="ready">Ready</span>
269
+ <button type="button" class="equanaut-chat-clear" id="equanaut-chat-clear"
270
+ title="Clear conversation" aria-label="Clear conversation">×</button>
271
+ </div>
272
+ <ul class="equanaut-chat-messages" id="equanaut-chat-messages" aria-live="polite"></ul>
273
+ <div class="equanaut-chat-error" id="equanaut-chat-error" hidden></div>
274
+ </div>
275
+
276
+ <!-- Equanaut Input Gateway (Perplexity-style composer, sidebar only) -->
277
+ <div class="equanaut-gateway" id="equanaut-gateway" aria-label="Equanaut input gateway">
278
+ <div class="equanaut-gateway-context hidden" id="equanaut-gateway-context">
279
+ <span class="equanaut-gateway-context-icon" aria-hidden="true">
280
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor">
281
+ <path fill-rule="evenodd"
282
+ d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.74-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" />
283
+ </svg>
284
+ </span>
285
+ <span class="equanaut-gateway-context-text" id="equanaut-gateway-context-text"></span>
286
+ <button type="button" class="equanaut-gateway-context-dismiss" id="equanaut-gateway-context-dismiss"
287
+ title="Clear context" aria-label="Clear context">×</button>
288
+ </div>
289
+ <div class="equanaut-gateway-attachments" id="equanaut-gateway-attachments" hidden></div>
290
+ <input type="file" id="equanaut-gateway-file" multiple style="display:none" aria-hidden="true">
291
+ <div class="equanaut-slash-palette" id="equanaut-slash-palette" hidden role="listbox"
292
+ aria-label="Equanaut slash commands">
293
+ <div class="equanaut-slash-palette-header">
294
+ <span class="equanaut-slash-palette-title">Commands</span>
295
+ <span class="equanaut-slash-palette-source" id="equanaut-slash-palette-source">Comet agent</span>
296
+ </div>
297
+ <div class="equanaut-slash-palette-status" id="equanaut-slash-palette-status">Type / to search commands</div>
298
+ <ul class="equanaut-slash-palette-list" id="equanaut-slash-palette-list"></ul>
299
+ </div>
300
+ <div class="equanaut-model-picker" id="equanaut-model-picker" hidden role="menu" aria-label="Select model">
301
+ <div class="equanaut-model-picker-header">
302
+ <span class="equanaut-model-picker-title">Model</span>
303
+ <button type="button" class="equanaut-model-picker-refresh" id="equanaut-model-picker-refresh"
304
+ title="Refresh model list" aria-label="Refresh">↻</button>
305
+ </div>
306
+ <div class="equanaut-model-picker-toolbar">
307
+ <div class="model-search-shell equanaut-model-picker-search-shell">
308
+ <svg class="model-search-icon" viewBox="0 0 24 24" width="16" height="16" fill="none"
309
+ stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
310
+ aria-hidden="true">
311
+ <circle cx="11" cy="11" r="8"></circle>
312
+ <path d="M21 21l-4.35-4.35"></path>
313
+ </svg>
314
+ <input type="search" id="equanaut-model-picker-search"
315
+ class="equanaut-model-picker-search model-search-input" placeholder="Search models" autocomplete="off"
316
+ spellcheck="false" aria-label="Search models">
317
+ <button type="button" id="equanaut-model-picker-search-clear" class="model-search-clear"
318
+ title="Clear model search" aria-label="Clear model search" hidden>
319
+ <svg viewBox="0 0 10 10" width="10" height="10" fill="none" stroke="currentColor" stroke-width="1.5"
320
+ aria-hidden="true">
321
+ <path d="M1 1L9 9M9 1L1 9" stroke-linecap="round"></path>
322
+ </svg>
323
+ </button>
324
+ </div>
325
+ <select id="equanaut-model-picker-capability" class="equanaut-model-picker-filter"
326
+ aria-label="Filter models by capability">
327
+ <option value="all">All</option>
328
+ <option value="fast">Fast</option>
329
+ <option value="vision">Vision</option>
330
+ <option value="reasoning">Reasoning</option>
331
+ <option value="tools">Tools</option>
332
+ <option value="image">Image</option>
333
+ <option value="pdf">PDF</option>
334
+ </select>
335
+ </div>
336
+ <div class="equanaut-model-picker-provider-rail" id="equanaut-model-picker-provider-rail"
337
+ aria-label="Filter models by provider"></div>
338
+ <div class="equanaut-model-picker-status" id="equanaut-model-picker-status">Loading…</div>
339
+ <ul class="equanaut-model-picker-list" id="equanaut-model-picker-list"></ul>
340
+ <div class="equanaut-model-picker-footer">
341
+ <span class="equanaut-model-picker-current" id="equanaut-model-picker-current"></span>
342
+ </div>
343
+ </div>
344
+ <div class="equanaut-gateway-shell">
345
+ <button type="button" class="equanaut-gateway-attach" id="equanaut-gateway-attach"
346
+ title="Add context">+</button>
347
+ <div class="equanaut-gateway-input-area">
348
+ <textarea id="equanaut-gateway-input" class="equanaut-gateway-input" rows="1"
349
+ placeholder="Ask anything…" autocomplete="off" spellcheck="true"
350
+ aria-label="Message to Equanaut"></textarea>
351
+ <span class="equanaut-gateway-modes-hint">Search modes and shortcuts.</span>
352
+ </div>
353
+ <div class="equanaut-gateway-actions">
354
+ <button type="button" class="equanaut-gateway-action-btn equanaut-model-control" id="equanaut-gateway-sparkle"
355
+ title="Modes &amp; shortcuts" aria-label="Modes and shortcuts">
356
+ <svg class="equanaut-gateway-model-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2"
357
+ stroke-linecap="round">
358
+ <path d="M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M5.6 18.4l2.1-2.1M16.3 7.7l2.1-2.1" />
359
+ <circle cx="12" cy="12" r="3" />
360
+ </svg>
361
+ <span class="equanaut-gateway-model-label" id="equanaut-gateway-model-label"></span>
362
+ </button>
363
+ <button type="button" class="equanaut-gateway-action-btn" id="equanaut-gateway-mic"
364
+ title="Start voice input" aria-label="Start voice input" aria-pressed="false">
365
+ <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2">
366
+ <path d="M12 14a3 3 0 0 0 3-3V6a3 3 0 1 0-6 0v5a3 3 0 0 0 3 3z" />
367
+ <path d="M19 11a7 7 0 0 1-14 0M12 18v3M8 21h8" />
368
+ </svg>
369
+ </button>
370
+ <button type="button" class="equanaut-gateway-send" id="equanaut-gateway-send"
371
+ title="Send message" aria-label="Send message">
372
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true">
373
+ <path d="M4 14v4c0 1.1.9 2 2 2h2l5 3v-6l-5 3V9l5 3V9l-5-6H6c-1.1 0-2 .9-2 2v3z" opacity=".35" />
374
+ <path d="M15 9v11l5-4V13l-5-4z" />
375
+ </svg>
376
+ </button>
377
+ </div>
378
+ </div>
379
+ </div>
380
+
103
381
  <!-- Import Dialog (Modal) -->
104
382
  <div class="modal-overlay hidden" id="import-overlay">
105
383
  <div class="modal" id="import-modal">
@@ -139,7 +417,9 @@
139
417
  <button class="reconnect-btn hidden" id="btn-reconnect" title="Reconnect to CDP bridge">Reconnect</button>
140
418
  </footer>
141
419
 
420
+ <script src="session-logic.js"></script>
421
+ <script src="window-policy.js"></script>
142
422
  <script src="sidepanel.js"></script>
143
423
  </body>
144
424
 
145
- </html>
425
+ </html>