fix: disable native touch panning on mobile terminal and archive specs
- Change mobile terminal CSS to use touch-action: none and overscroll-behavior: none so the custom touch handler owns swipes - Archive completed/partial OpenSpec specs to openspec/changes/archive/2026-06-14-completed-specs-archive/ - Regenerate project maps Quality gates: npm run typecheck, npm run lint (apps/web)
This commit is contained in:
+19
@@ -0,0 +1,19 @@
|
||||
# 2026-06-14-completed-specs-archive/tool-terminal (index)
|
||||
dir: 2026-06-14-completed-specs-archive/tool-terminal
|
||||
|
||||
## role
|
||||
Defines requirements for a browser-based WebSocket terminal interface that enables secure, session-managed access to running Docker containers with bidirectional I/O streaming.
|
||||
## parent
|
||||
index: 2026-06-14-completed-specs-archive/.pi-map.index.md
|
||||
map: 2026-06-14-completed-specs-archive/.pi-map.md
|
||||
## children
|
||||
-
|
||||
## files
|
||||
- spec.md
|
||||
## links
|
||||
index: 2026-06-14-completed-specs-archive/tool-terminal/.pi-map.index.md
|
||||
map: 2026-06-14-completed-specs-archive/tool-terminal/.pi-map.md
|
||||
## workflows
|
||||
-
|
||||
## dirty
|
||||
-
|
||||
@@ -0,0 +1,19 @@
|
||||
# 2026-06-14-completed-specs-archive/tool-terminal
|
||||
dir: 2026-06-14-completed-specs-archive/tool-terminal
|
||||
|
||||
index: 2026-06-14-completed-specs-archive/tool-terminal/.pi-map.index.md
|
||||
|
||||
## role
|
||||
Defines requirements for a browser-based WebSocket terminal interface that enables secure, session-managed access to running Docker containers with bidirectional I/O streaming.
|
||||
## files
|
||||
- spec.md | Specifies requirements for a browser-based WebSocket terminal system for accessing running Docker containers with session management, I/O streaming, and access control. | dep: tool-instances, auth-oauth, xterm.js, ptyprocess
|
||||
## arch
|
||||
Event-driven WebSocket architecture with session-based multiplexing, container-attach abstraction layer, and token-based access control for real-time bidirectional streaming between browser clients and Docker container TTY/stdout/stderr interfaces.
|
||||
## tags
|
||||
spec, specifies, requirements, browser, websocket, terminal, system, accessing
|
||||
## symbols
|
||||
-
|
||||
## workflows
|
||||
-
|
||||
## dirty
|
||||
-
|
||||
@@ -0,0 +1,95 @@
|
||||
# Web Terminal Specification
|
||||
|
||||
## Purpose
|
||||
|
||||
Provide browser-based terminal access to running tool containers.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: WebSocket Terminal
|
||||
|
||||
The system SHALL provide terminal sessions via WebSocket.
|
||||
|
||||
#### Scenario: Open terminal
|
||||
- GIVEN a running tool instance
|
||||
- WHEN the user opens the terminal
|
||||
- THEN a WebSocket connection is established
|
||||
- AND a shell is spawned in the container via `docker exec`
|
||||
|
||||
#### Scenario: Open terminal with startup command
|
||||
- GIVEN a running tool instance with a tool type that has `startup_command` set
|
||||
- WHEN the user opens the terminal
|
||||
- THEN a WebSocket connection is established
|
||||
- AND the startup command is executed before the interactive shell
|
||||
- AND the shell is spawned in the container via `docker exec`
|
||||
|
||||
#### Scenario: Open terminal without startup command
|
||||
- GIVEN a running tool instance with a tool type that has no `startup_command`
|
||||
- WHEN the user opens the terminal
|
||||
- THEN a WebSocket connection is established
|
||||
- AND the shell spawns directly without any startup execution
|
||||
|
||||
### Requirement: Terminal I/O
|
||||
|
||||
The system SHALL stream terminal I/O via WebSocket.
|
||||
|
||||
#### Scenario: Command execution
|
||||
- GIVEN an active terminal session
|
||||
- WHEN the user types a command
|
||||
- THEN stdin is forwarded to the container shell
|
||||
- AND stdout/stderr is streamed back to the browser
|
||||
|
||||
### Requirement: Terminal Resize
|
||||
|
||||
The system SHALL support terminal resize events.
|
||||
|
||||
#### Scenario: Resize terminal
|
||||
- GIVEN an active terminal session
|
||||
- WHEN the browser window is resized
|
||||
- THEN the terminal dimensions (COLS, ROWS) are updated
|
||||
- AND the shell receives the new size
|
||||
|
||||
### Requirement: Session Management
|
||||
|
||||
The system SHALL manage terminal sessions.
|
||||
|
||||
#### Scenario: Multiple sessions
|
||||
- GIVEN a running tool instance
|
||||
- WHEN multiple terminals are opened
|
||||
- THEN each has an independent session
|
||||
|
||||
#### Scenario: Cleanup
|
||||
- GIVEN an active terminal session
|
||||
- WHEN the user disconnects
|
||||
- THEN the session is cleaned up
|
||||
- AND the shell process is terminated
|
||||
|
||||
#### Scenario: Reset terminal session runs startup command
|
||||
- GIVEN an active terminal session
|
||||
- WHEN the user resets the session
|
||||
- THEN a new shell is spawned
|
||||
- AND the startup command executes before the new interactive shell
|
||||
|
||||
### Requirement: Access Control
|
||||
|
||||
The system SHALL restrict terminal access.
|
||||
|
||||
#### Scenario: Unauthorized access
|
||||
- GIVEN a tool instance owned by user A
|
||||
- WHEN user B tries to access the terminal
|
||||
- THEN the connection is rejected with 403
|
||||
|
||||
## Dependencies
|
||||
|
||||
- tool-instances (running containers)
|
||||
- auth-oauth (authentication)
|
||||
- xterm.js frontend library
|
||||
- ptyprocess for pseudo-TTY
|
||||
|
||||
## Quality Gates
|
||||
|
||||
- `pytest` must pass
|
||||
- `mypy .` must pass
|
||||
- `ruff check .` must pass
|
||||
- `npm run typecheck` must pass
|
||||
- `npm run lint` must pass
|
||||
Reference in New Issue
Block a user