2026-06-18 08:14:00 -04:00
|
|
|
{
|
|
|
|
|
"name": "archnest",
|
|
|
|
|
"private": true,
|
|
|
|
|
"version": "0.0.0",
|
|
|
|
|
"type": "module",
|
|
|
|
|
"scripts": {
|
|
|
|
|
"dev": "vite",
|
|
|
|
|
"build": "tsc -b && vite build",
|
|
|
|
|
"lint": "eslint .",
|
|
|
|
|
"preview": "vite preview"
|
|
|
|
|
},
|
|
|
|
|
"dependencies": {
|
|
|
|
|
"@tailwindcss/vite": "^4.3.0",
|
Add Phase 1a: core SSH terminal (Termix migration)
Implements the minimal-viable terminal described in TERMIX_MIGRATION.md
Phase 1a: a real interactive SSH session in the browser over a
WebSocket, using xterm.js on the frontend and ssh2 on the backend.
Reuses ArchNest's existing SSH integrations (host/port/username/
password/privateKey/passphrase) instead of introducing a second,
duplicate host-management system the way Termix has one.
Backend: new /api/terminal WebSocket route (registered via
@fastify/websocket) handling connect/input/resize/disconnect messages,
authenticated via a JWT passed as a query param (browsers can't set
custom headers on the WS handshake). Extracted the integration secret
loader out of routes/integrations.ts into db/secrets.ts so the new
terminal route can reuse it without duplicating the decrypt logic.
Frontend: new Terminal.tsx page listing configured SSH hosts and
rendering an xterm.js terminal wired to the WebSocket; wired into
App.tsx at /terminal. vite.config.ts's dev proxy now forwards
WebSocket upgrades (ws: true) so this works under `npm run dev`.
Verified end-to-end against a real (test) ssh2-based SSH server:
connect, shell banner, keystroke echo, and prompt redraw all worked
correctly over the actual WebSocket protocol.
Deliberately deferred to Phase 1b/1c per the migration doc: jump-host
chaining, tab/split-pane UI, terminal theme/font settings, OPKSSH cert
auth, tmux session monitor, session recording.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BbJV5nm8KPVH1oNJYKpnoF
2026-06-19 10:52:04 +00:00
|
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
|
|
|
"@xterm/xterm": "^6.0.0",
|
2026-06-19 15:25:10 +00:00
|
|
|
"guacamole-common-js": "^1.5.0",
|
2026-06-18 08:14:00 -04:00
|
|
|
"lucide-react": "^1.17.0",
|
|
|
|
|
"react": "^19.2.6",
|
|
|
|
|
"react-dom": "^19.2.6",
|
2026-06-18 16:15:34 +00:00
|
|
|
"react-router-dom": "^7.18.0",
|
2026-06-18 08:14:00 -04:00
|
|
|
"recharts": "^3.8.1",
|
|
|
|
|
"tailwindcss": "^4.3.0"
|
|
|
|
|
},
|
|
|
|
|
"devDependencies": {
|
|
|
|
|
"@eslint/js": "^10.0.1",
|
|
|
|
|
"@types/node": "^24.12.3",
|
|
|
|
|
"@types/react": "^19.2.14",
|
|
|
|
|
"@types/react-dom": "^19.2.3",
|
|
|
|
|
"@vitejs/plugin-react": "^6.0.1",
|
|
|
|
|
"eslint": "^10.3.0",
|
|
|
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
|
|
|
"eslint-plugin-react-refresh": "^0.5.2",
|
|
|
|
|
"globals": "^17.6.0",
|
|
|
|
|
"typescript": "~6.0.2",
|
|
|
|
|
"typescript-eslint": "^8.59.2",
|
|
|
|
|
"vite": "^8.0.12"
|
|
|
|
|
}
|
|
|
|
|
}
|