Compare commits

...

4 Commits

Author SHA1 Message Date
Developer 597cfb9573 fix: notification center always on top
The notification dropdown was at z-index: 100, well below fullscreen
terminals (1000), modal overlays (1000), and dialog overlays (1000).
Because .notification-center creates a stacking context with no explicit
z-index, the dropdown was trapped behind any of those overlays and
became unclickable.

- Set .notification-center z-index to 9999 so it competes above all
  other overlays in the root stacking context.
- Set .notification-dropdown z-index to 9999 for consistency.

Quality gates: tsc --noEmit (pass), build (pass)
2026-06-04 18:47:46 +00:00
Developer 703cf1f88b fix: mobile terminal back and X buttons navigate to /sessions
Terminal sessions are opened in a new tab via window.open with
noopener,noreferrer. In a new tab, window.history has no previous
entry, so navigate(-1) silently does nothing. Both the back arrow
and the X button in the mobile terminal overlay called navigate(-1),
which made them appear broken.

Change both buttons to navigate('/sessions') so they always exit
to a sensible page regardless of how the terminal was opened.

Quality gates: tsc --noEmit (pass), build (pass)
2026-06-04 18:24:48 +00:00
alex 5dc7d44111 feat: improve session naming with workspace-aware scoped numbering
When a workspace is provided, auto-generated display names now use
workspace.name instead of repo.name:
  'myworkspace / VS Code Server'          # first
  'myworkspace / VS Code Server #2'       # second

Without a workspace, naming falls back to repo.name:
  'myrepo / VS Code Server'
  'myrepo / VS Code Server #2'

The counter is scoped to workspace+tool_type (or repo+tool_type),
so different tool types for the same workspace/repo are numbered
independently.

This replaces the old format of 'project / repo / tool #N' which
was always repo-based and included the project name even though
the sidebar already groups by project.

Quality gates: py_compile passed, ruff passed.
2026-06-04 16:23:40 +02:00
alex ee348643f8 fix: update main.py imports for service subpackages
services/correlation.py was moved to services/shared/correlation.py,
services/event_bus.py to services/instance/event_bus.py, and
services/health_monitor.py to services/instance/health_monitor.py
but main.py was still importing from the old flat paths.

Updated main.py to import from the new subpackage paths via
__init__.py re-exports.

Quality gates: py_compile passed, ruff passed.
2026-06-04 16:12:28 +02:00
4 changed files with 27 additions and 15 deletions
+21 -9
View File
@@ -853,19 +853,31 @@ async def create_instance(
# Generate unique name
instance_name = f"{tool_type.name}-{repo.name}-{uuid.uuid4().hex[:8]}"
# Auto-generate display name with numbering when duplicates exist
# Auto-generate display name with scoped numbering.
# When a workspace is provided, use workspace name + tool type.
# Otherwise fall back to repo name + tool type.
if data.display_name:
instance_display = data.display_name
else:
auto_name = f"{_project.name} / {repo.name} / {tool_type.display_name}"
result = await session.execute(
select(ToolInstance).where(
ToolInstance.project_id == project_id,
ToolInstance.repository_id == repo_id,
ToolInstance.tool_type_id == tool_type_id,
ToolInstance.owner_id == user_id,
scope_name = workspace.name if workspace else repo.name
auto_name = f"{scope_name} / {tool_type.display_name}"
if workspace:
count_query = (
select(ToolInstance)
.where(ToolInstance.workspace_id == workspace_id)
.where(ToolInstance.tool_type_id == tool_type_id)
.where(ToolInstance.owner_id == user_id)
)
)
else:
count_query = (
select(ToolInstance)
.where(ToolInstance.repository_id == repo_id)
.where(ToolInstance.tool_type_id == tool_type_id)
.where(ToolInstance.owner_id == user_id)
)
result = await session.execute(count_query)
existing_count = len(result.scalars().all())
if existing_count > 0:
instance_display = f"{auto_name} #{existing_count + 1}"
+2 -3
View File
@@ -41,9 +41,8 @@ from src.logging_config import (
configure_logging,
)
from src.seeds.builtin_tool_types import seed_builtin_tool_types
from src.services.correlation import CorrelationIdMiddleware
from src.services.event_bus import InstanceEventBus
from src.services.health_monitor import HealthMonitor
from src.services.instance import InstanceEventBus, HealthMonitor
from src.services.shared import CorrelationIdMiddleware
# Configure logging early
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
+2 -2
View File
@@ -318,7 +318,7 @@ export const TerminalPage: React.FC = () => {
<div className="mobile-terminal-toolbar-left">
<button
className="mobile-terminal-toolbtn"
onClick={() => navigate(-1)}
onClick={() => navigate("/sessions")}
type="button"
aria-label="Back"
>
@@ -353,7 +353,7 @@ export const TerminalPage: React.FC = () => {
</button>
<button
className="mobile-terminal-toolbtn"
onClick={() => navigate(-1)}
onClick={() => navigate("/sessions")}
type="button"
aria-label="Exit terminal"
>
+2 -1
View File
@@ -4626,6 +4626,7 @@ a:active,
.notification-center {
position: relative;
display: inline-flex;
z-index: 9999;
}
.notification-bell {
@@ -4679,7 +4680,7 @@ a:active,
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
z-index: 100;
z-index: 9999;
display: flex;
flex-direction: column;
overflow: hidden;