chore: Phase 1 complete — all backend proxy tests pass

This commit is contained in:
Brian Krabach
2026-04-01 12:33:17 -07:00
parent e726ef9926
commit d0fe9cda67
15 changed files with 2110 additions and 10 deletions
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+18 -8
View File
@@ -108,15 +108,12 @@
<nav class="settings-tabs"> <nav class="settings-tabs">
<button class="settings-tab settings-tab--active" data-tab="display">Display</button> <button class="settings-tab settings-tab--active" data-tab="display">Display</button>
<button class="settings-tab" data-tab="sessions">Sessions</button> <button class="settings-tab" data-tab="sessions">Sessions</button>
<button class="settings-tab" data-tab="notifications">Notifications</button>
<button class="settings-tab" data-tab="new-session">Commands</button> <button class="settings-tab" data-tab="new-session">Commands</button>
<button class="settings-tab" data-tab="devices">Multi-Device</button> <button class="settings-tab" data-tab="devices">Multi-Device</button>
</nav> </nav>
<div class="settings-content"> <div class="settings-content">
<div class="settings-panel" data-tab="display"> <div class="settings-panel" data-tab="display">
<div class="settings-field">
<label class="settings-label" for="setting-device-name">Device Name</label>
<input type="text" id="setting-device-name" class="settings-input" placeholder="This device" />
</div>
<div class="settings-field"> <div class="settings-field">
<label class="settings-label" for="setting-font-size">Font Size</label> <label class="settings-label" for="setting-font-size">Font Size</label>
<select id="setting-font-size" class="settings-select"> <select id="setting-font-size" class="settings-select">
@@ -188,6 +185,12 @@
<label class="settings-label" for="setting-auto-open">Auto-open created sessions</label> <label class="settings-label" for="setting-auto-open">Auto-open created sessions</label>
<input type="checkbox" id="setting-auto-open" class="settings-checkbox" checked /> <input type="checkbox" id="setting-auto-open" class="settings-checkbox" checked />
</div> </div>
<div class="settings-field settings-field--column">
<label class="settings-label">Hidden Sessions</label>
<div id="setting-hidden-sessions" class="settings-checkbox-list"></div>
</div>
</div>
<div class="settings-panel hidden" data-tab="notifications">
<div class="settings-field"> <div class="settings-field">
<label class="settings-label" for="setting-bell-sound">Bell Sound</label> <label class="settings-label" for="setting-bell-sound">Bell Sound</label>
<input type="checkbox" id="setting-bell-sound" class="settings-checkbox" /> <input type="checkbox" id="setting-bell-sound" class="settings-checkbox" />
@@ -199,10 +202,6 @@
<button id="notification-request-btn" class="settings-action-btn">Request Permission</button> <button id="notification-request-btn" class="settings-action-btn">Request Permission</button>
</div> </div>
</div> </div>
<div class="settings-field settings-field--column">
<label class="settings-label">Hidden Sessions</label>
<div id="setting-hidden-sessions" class="settings-checkbox-list"></div>
</div>
</div> </div>
<div class="settings-panel hidden" data-tab="new-session"> <div class="settings-panel hidden" data-tab="new-session">
<div class="settings-field settings-field--column"> <div class="settings-field settings-field--column">
@@ -219,6 +218,10 @@
</div> </div>
</div> </div>
<div class="settings-panel hidden" data-tab="devices"> <div class="settings-panel hidden" data-tab="devices">
<div class="settings-field">
<label class="settings-label" for="setting-device-name">Device Name</label>
<input type="text" id="setting-device-name" class="settings-input" placeholder="This device" />
</div>
<div class="settings-field"> <div class="settings-field">
<label class="settings-label" for="setting-multi-device-enabled">Enable multi-device support</label> <label class="settings-label" for="setting-multi-device-enabled">Enable multi-device support</label>
<input type="checkbox" id="setting-multi-device-enabled" class="settings-checkbox" /> <input type="checkbox" id="setting-multi-device-enabled" class="settings-checkbox" />
@@ -232,6 +235,13 @@
<option value="filtered">Filtered</option> <option value="filtered">Filtered</option>
</select> </select>
</div> </div>
<div class="settings-field">
<label class="settings-label" for="setting-view-scope">View Scope</label>
<select id="setting-view-scope" class="settings-select">
<option value="all">All Instances</option>
<option value="local">Local Only</option>
</select>
</div>
<div class="settings-field settings-field--column"> <div class="settings-field settings-field--column">
<label class="settings-label">Remote Instances</label> <label class="settings-label">Remote Instances</label>
<div id="setting-remote-instances" class="settings-remote-list"></div> <div id="setting-remote-instances" class="settings-remote-list"></div>
+8
View File
@@ -256,6 +256,14 @@ body {
animation: bell-pulse 1.4s ease-in-out infinite; animation: bell-pulse 1.4s ease-in-out infinite;
} }
/* Bell count number inside the badge */
.tile-bell-count {
font-size: 9px;
font-weight: 700;
line-height: 1;
color: inherit;
}
@keyframes bell-pulse { @keyframes bell-pulse {
0%, 100% { 0%, 100% {
opacity: 1; opacity: 1;
Binary file not shown.
+5
View File
@@ -45,3 +45,8 @@ addopts = "--import-mode=importlib -m 'not integration'"
markers = [ markers = [
"integration: marks tests as integration tests requiring real tmux (deselect with '-m not integration')", "integration: marks tests as integration tests requiring real tmux (deselect with '-m not integration')",
] ]
[dependency-groups]
dev = [
"pytest-timeout>=2.4.0",
]
Generated
+22 -2
View File
@@ -208,6 +208,7 @@ source = { editable = "." }
dependencies = [ dependencies = [
{ name = "aiofiles" }, { name = "aiofiles" },
{ name = "fastapi" }, { name = "fastapi" },
{ name = "httpx" },
{ name = "itsdangerous" }, { name = "itsdangerous" },
{ name = "python-multipart" }, { name = "python-multipart" },
{ name = "python-pam" }, { name = "python-pam" },
@@ -219,17 +220,21 @@ dependencies = [
[package.optional-dependencies] [package.optional-dependencies]
dev = [ dev = [
{ name = "beautifulsoup4" }, { name = "beautifulsoup4" },
{ name = "httpx" },
{ name = "pytest" }, { name = "pytest" },
{ name = "pytest-asyncio" }, { name = "pytest-asyncio" },
] ]
[package.dev-dependencies]
dev = [
{ name = "pytest-timeout" },
]
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "aiofiles", specifier = ">=23.0" }, { name = "aiofiles", specifier = ">=23.0" },
{ name = "beautifulsoup4", marker = "extra == 'dev'", specifier = ">=4.12" }, { name = "beautifulsoup4", marker = "extra == 'dev'", specifier = ">=4.12" },
{ name = "fastapi", specifier = ">=0.115.0" }, { name = "fastapi", specifier = ">=0.115.0" },
{ name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27.0" }, { name = "httpx", specifier = ">=0.27.0" },
{ name = "itsdangerous", specifier = ">=2.1.0" }, { name = "itsdangerous", specifier = ">=2.1.0" },
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" },
{ name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" },
@@ -241,6 +246,9 @@ requires-dist = [
] ]
provides-extras = ["dev"] provides-extras = ["dev"]
[package.metadata.requires-dev]
dev = [{ name = "pytest-timeout", specifier = ">=2.4.0" }]
[[package]] [[package]]
name = "packaging" name = "packaging"
version = "26.0" version = "26.0"
@@ -409,6 +417,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
] ]
[[package]]
name = "pytest-timeout"
version = "2.4.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" },
]
[[package]] [[package]]
name = "python-dotenv" name = "python-dotenv"
version = "1.2.2" version = "1.2.2"