diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..218f5d2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +.pytest_cache +__pycache__ +*.pyc +*.pyo +tests/ +.env* diff --git a/Dockerfile b/Dockerfile index 295d86e..de0212e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,9 @@ WORKDIR /app # Copy source COPY . /app +# Install Python dependencies +RUN pip install --no-cache-dir -r requirements.txt + # Default to binding all interfaces (required for container networking) ENV HERMES_WEBUI_HOST=0.0.0.0 ENV HERMES_WEBUI_PORT=8787 diff --git a/docker-compose.yml b/docker-compose.yml index c020fdd..eba188b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: # Persist session data, settings, and projects across restarts - hermes-data:/data # Mount hermes-agent for full agent features (optional) - - ${HERMES_HOME:-~/.hermes}:/root/.hermes:ro + - ${HERMES_HOME:-${HOME}/.hermes}:/root/.hermes:ro environment: - HERMES_WEBUI_HOST=0.0.0.0 - HERMES_WEBUI_PORT=8787 diff --git a/static/boot.js b/static/boot.js index c1fcde6..bd1d3f8 100644 --- a/static/boot.js +++ b/static/boot.js @@ -29,16 +29,21 @@ function toggleMobileFiles(){ panel.classList.toggle('mobile-open'); } function mobileSwitchPanel(name){ - // Close sidebar if open, then switch panel - closeMobileSidebar(); - // Open sidebar for the selected panel, then close after a moment - const sidebar=document.querySelector('.sidebar'); - const overlay=$('mobileOverlay'); - if(sidebar){ - sidebar.classList.add('mobile-open'); - if(overlay)overlay.classList.add('visible'); - } + // Switch the panel content view switchPanel(name); + // For non-chat panels (tasks, skills, memory, spaces), open the sidebar + // so the panel is visible. For 'chat', the content is in the main area — + // just close the sidebar so the chat view is unobstructed. + if(name==='chat'){ + closeMobileSidebar(); + } else { + const sidebar=document.querySelector('.sidebar'); + const overlay=$('mobileOverlay'); + if(sidebar){ + sidebar.classList.add('mobile-open'); + if(overlay)overlay.classList.add('visible'); + } + } // Update bottom nav active state document.querySelectorAll('.mobile-nav-btn').forEach(btn=>{ btn.classList.toggle('active',btn.dataset.panel===name); diff --git a/static/style.css b/static/style.css index 375f9f1..641dc83 100644 --- a/static/style.css +++ b/static/style.css @@ -525,9 +525,14 @@ transition:background .15s; } .resize-handle:hover,.resize-handle.dragging{background:rgba(124,185,255,.35);} -.sidebar{position:relative;} +/* Desktop-only: position:relative for sidebar/rightpanel resize handles. + Must be scoped to min-width:641px so it doesn't override the mobile + position:fixed slide-in overlay set in the max-width:640px @media block above. */ +@media(min-width:641px){ + .sidebar{position:relative;} + .rightpanel{position:relative;} +} .sidebar .resize-handle{right:-2px;} -.rightpanel{position:relative;} .rightpanel .resize-handle{left:-2px;} /* Prevent text selection during drag */ body.resizing{user-select:none;cursor:col-resize;}