Dinotty for VS Code
English | 简体中文
Dinotty terminals, seamlessly integrated into VS Code.
Dinotty for VS Code brings Dinotty-powered terminal sessions into VS Code's
integrated terminal. Opening a connection creates a new Dinotty tab and pane,
then presents that terminal through the standard VS Code terminal UI with
replay-aware rendering, geometry synchronization, and automatic reconnection.
[!IMPORTANT]
This extension is a terminal client for Dinotty, not a full Dinotty
administration interface. It does not browse or manage existing tabs and
panes. The Connections view stores local server profiles used to open new
terminals.
Features
- Integrated terminal experience - Open Dinotty from the Activity Bar,
Command Palette, or VS Code terminal profile menu.
- Multiple server profiles - Save, test, edit, and select Dinotty
endpoints without putting credentials in workspace settings.
- Secure credentials - Access codes are stored in VS Code SecretStorage and
are redacted from titles, logs, state files, and error messages.
- Reliable terminal rendering - Snapshot replay and synchronized output are
committed atomically so partial frames are not shown in the terminal.
- Responsive terminal sizing - Remote geometry is coordinated with the
current VS Code panel, including recovery when the remote terminal is larger
than the available space.
- Resilient sessions - Temporary WebSocket failures reconnect to the same
Dinotty pane with bounded exponential backoff.
- Optional appearance sync - Use the native VS Code theme or import base and
ANSI colors from Dinotty for each newly opened terminal.
Requirements
- VS Code
1.90.0 or newer.
- Dinotty
v0.18.0 or newer.
- A reachable Dinotty HTTP(S) endpoint.
The minimum Dinotty version must include snapshot_request and
replay_begin/replay_end support, introduced by Dinotty commit
8bcee3186ea900f458ff4cb23bc56804b0bd3ae1.
Installation
Install a published .vsix with the VS Code command:
- Open the Command Palette.
- Run Extensions: Install from VSIX....
- Select the Dinotty VSIX file and reload VS Code when prompted.
To build a VSIX from source:
npm ci
npm run package:vsix
The package is written to artifacts/dinotty-vscode.vsix.
Quick Start
- Select the Dinotty icon in the Activity Bar.
- Choose Add Dinotty Connection.
- Enter the Dinotty server URL, a local display name, an optional remote
working directory, and an optional access code.
- Select the saved profile in the Connections view.
- Use the newly created terminal like any other VS Code integrated terminal.
You can also run Dinotty: Connect from the Command Palette or select
Dinotty from the terminal profile menu. When more than one profile exists,
the extension asks which server to use.
What Happens When You Open a Terminal
The extension performs the following sequence for every new terminal:
- Resolves a snapshot of the selected local connection profile.
- Optionally reads Dinotty appearance settings.
- Calls
POST /api/tabs to create a new Dinotty tab and pane.
- Connects to that pane through
/ws?paneId=....
- Requests and renders a terminal snapshot at a compatible size.
- Forwards subsequent terminal input, output, and resize events.
Closing the VS Code terminal disconnects its local WebSocket endpoint. It does
not delete the Dinotty tab created on the server. Editing or deleting a saved
profile also does not retarget terminals that are already open.
For loopback server URLs, the first local filesystem workspace folder is used
as the working directory. Remote server profiles omit cwd by default so a
local path is never mistaken for a server path. Set the profile's remote
working directory when the Dinotty host needs a specific Windows, POSIX, UNC,
or container path.
Connection Profiles and Security
Connection profiles are local client configuration, not Dinotty server
resources. A profile contains a display name, normalized server URL, optional
remote working directory, ordering metadata, and an optional reference to a
credential.
- Profile metadata is stored in
globalStorageUri/connection-store-v1.json.
- Access codes are stored only in VS Code SecretStorage under randomized slots.
- A terminal freezes its resolved profile when it is created. Later profile
edits affect only new terminals.
- A missing referenced secret is treated as an error; the extension never
silently retries the profile without authentication.
- Access codes can be used over HTTP and HTTPS. Non-loopback plain HTTP requires
an explicit warning because credentials and terminal traffic are unencrypted;
use HTTPS for remote servers whenever possible.
- HTTP and WebSocket authentication use
Authorization: Bearer <access-code>.
Profiles are shared by VS Code windows using the same user profile. Writes use
an atomic state file and a bounded writer lease. Cross-window consistency is
best effort rather than a distributed transaction: in an extreme stale-writer
overlap, the last completed atomic write can win.
Terminal Behavior
Rendering and replay
The extension understands Dinotty output, resize, reconnect, replay,
synchronized-output, shell-info, and session-exit messages. Replay and nested
synchronized output are committed as one frame while small; large frames are
streamed in bounded chunks so valid scrollback is not rejected.
Geometry
VS Code panel capacity and Dinotty render geometry are tracked independently.
A remote grid that fits can be displayed with a dimensions override. An
oversized remote grid pauses incremental rendering. Actual user input or a
terminal dimension change can reclaim the local geometry; the most recently
active terminal and window focus alone never resize the shared Dinotty PTY.
Reconnection
Temporary transport failures reconnect to the original pane after
1s, 2s, 4s, 8s, 15s, and then 30s. Retries stop after 10 attempts
or 5 minutes. Authentication failures, missing panes, and authoritative session
exits do not reconnect.
Input entered while a terminal is being created, connected, or reconnected is
held in a bounded queue. Input that was already sent is never replayed
automatically.
Appearance
Set dinotty.terminalAppearanceMode to control the appearance of newly opened
Dinotty terminals:
| Value |
Default |
Behavior |
native |
Yes |
Use the VS Code terminal theme and do not request Dinotty colors. |
base |
No |
Apply Dinotty foreground, background, and cursor colors. |
exact |
No |
Apply base colors and the Dinotty ANSI 0-15 palette. |
The extension does not modify terminal.integrated.*,
workbench.colorCustomizations, terminal fonts, contrast settings, or the
global VS Code theme.
The legacy dinotty.syncAppearanceFromDinotty setting is deprecated. An
explicit true maps to exact, while false maps to native. The new setting
always takes precedence.
Commands
| Command |
Purpose |
Dinotty: Add Connection |
Save a local Dinotty server profile. |
Dinotty: Connect |
Choose a profile and open a new Dinotty terminal. |
Connect |
Open the selected profile from the Connections view. |
Test Connection |
Validate HTTP reachability and authentication. |
Set as Default |
Mark the profile shown first in the connection picker. |
Edit Connection |
Update a profile or replace/clear its access code. |
Delete Connection |
Remove a local profile without affecting open terminals. |
Dinotty: Refresh Connections |
Reload shared profile state from disk. |
Dinotty: Show Log |
Open the redacted Dinotty output channel. |
Known Limitations
- The extension creates a new Dinotty tab and pane for every terminal; it does
not list, reopen, rename, split, or delete existing Dinotty resources.
- Closing a VS Code terminal does not delete its remote Dinotty tab.
- Remote workspace paths are not mapped to the Dinotty host.
- Dinotty geometry is shared across clients on a last-resize-wins basis.
snapshot_request and resize events cannot provide strict multi-client
geometry consistency without additional server protocol support.
- Appearance settings are global Dinotty settings, not per-session values, and
are frozen when a terminal is created.
Troubleshooting
- Run Dinotty: Test Connection to check the selected URL and access code.
- Open Dinotty: Show Log for redacted connection and protocol diagnostics.
- If authentication fails, edit the profile and explicitly replace or clear
its saved access code.
- If shared profile storage becomes temporarily unavailable, the Connections
view can continue using its last valid snapshot in read-only mode. Run
Dinotty: Refresh Connections after resolving the storage problem.
Development
npm ci
npm run check
Useful commands:
| Command |
Purpose |
npm run typecheck |
Type-check the extension source. |
npm run test:typecheck |
Type-check source and test projects. |
npm run test:unit |
Run Node-based unit tests. |
npm run test:integration |
Run the VS Code extension-host smoke test. |
npm run bundle |
Build dist/extension.js for production. |
npm run package:vsix |
Run all checks and create the VSIX package. |
The integration test downloads or reuses VS Code 1.90.0. Linux CI requires
xvfb-run for extension-host tests. The VSIX uses an allowlist and contains
only the manifest, README, license, media assets, and the generated production
bundle.
License
MIT