9remote 2.1.5 → 2.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1028,6 +1028,9 @@ button {
1028
1028
  .top-0\.5{
1029
1029
  top: 0.125rem;
1030
1030
  }
1031
+ .top-1\.5{
1032
+ top: 0.375rem;
1033
+ }
1031
1034
  .top-1\/2{
1032
1035
  top: 50%;
1033
1036
  }
@@ -1233,6 +1236,9 @@ button {
1233
1236
  .max-h-\[calc\(100dvh-14rem\)\]{
1234
1237
  max-height: calc(100dvh - 14rem);
1235
1238
  }
1239
+ .max-h-full{
1240
+ max-height: 100%;
1241
+ }
1236
1242
  .min-h-0{
1237
1243
  min-height: 0px;
1238
1244
  }
@@ -1634,6 +1640,9 @@ button {
1634
1640
  .border-t-2{
1635
1641
  border-top-width: 2px;
1636
1642
  }
1643
+ .border-dashed{
1644
+ border-style: dashed;
1645
+ }
1637
1646
  .border-border{
1638
1647
  border-color: var(--border);
1639
1648
  }
@@ -1662,6 +1671,9 @@ button {
1662
1671
  .bg-bg{
1663
1672
  background-color: var(--bg-main);
1664
1673
  }
1674
+ .bg-black\/30{
1675
+ background-color: rgb(0 0 0 / 0.3);
1676
+ }
1665
1677
  .bg-black\/40{
1666
1678
  background-color: rgb(0 0 0 / 0.4);
1667
1679
  }
@@ -1728,6 +1740,9 @@ button {
1728
1740
  -o-object-fit: cover;
1729
1741
  object-fit: cover;
1730
1742
  }
1743
+ .p-0{
1744
+ padding: 0px;
1745
+ }
1731
1746
  .p-0\.5{
1732
1747
  padding: 0.125rem;
1733
1748
  }
@@ -1755,6 +1770,9 @@ button {
1755
1770
  .p-6{
1756
1771
  padding: 1.5rem;
1757
1772
  }
1773
+ .p-px{
1774
+ padding: 1px;
1775
+ }
1758
1776
  .px-0\.5{
1759
1777
  padding-left: 0.125rem;
1760
1778
  padding-right: 0.125rem;
@@ -2299,44 +2317,45 @@ button {
2299
2317
  .dot-bounce {
2300
2318
  animation: dot-bounce 1s ease-in-out infinite;
2301
2319
  }
2302
- /* Terminal pane — fix xterm helpers overlay + focus glow (synced with web) */
2320
+ /* Terminal pane — fix xterm helpers overlay + focus glow (synced with web). */
2303
2321
  .terminal-wrapper { overflow: hidden !important; }
2304
2322
  .terminal-wrapper .xterm-viewport {
2305
2323
  overflow-y: auto !important;
2306
2324
  scrollbar-width: thin;
2307
- scrollbar-color: rgba(var(--brand-rgb), 0.5) transparent;
2325
+ scrollbar-color: transparent transparent;
2308
2326
  }
2327
+ /* Native webkit thumb: transparent until viewport hovered (auto-hide) */
2309
2328
  .terminal-wrapper .xterm-viewport::-webkit-scrollbar { width: 6px; }
2310
2329
  .terminal-wrapper .xterm-viewport::-webkit-scrollbar-track { background: transparent; }
2311
2330
  .terminal-wrapper .xterm-viewport::-webkit-scrollbar-thumb {
2312
- background: rgba(var(--brand-rgb), 0.5);
2331
+ background: transparent;
2313
2332
  border-radius: 3px;
2314
2333
  }
2315
- .terminal-wrapper .xterm-viewport::-webkit-scrollbar-thumb:hover {
2316
- background: rgba(var(--brand-rgb), 0.8);
2334
+ .terminal-wrapper:hover .xterm-viewport::-webkit-scrollbar-thumb {
2335
+ background: rgba(128, 128, 128, 0.4);
2317
2336
  }
2318
- /* XTerm custom overlay scrollbar (JS-rendered div) — 7px brand-colored, no fade. */
2337
+ .terminal-wrapper:hover .xterm-viewport::-webkit-scrollbar-thumb:hover {
2338
+ background: rgba(128, 128, 128, 0.8);
2339
+ }
2340
+ /* XTerm overlay scrollbar (JS-rendered div) — auto-hide: only .visible while scrolling/hovering. */
2319
2341
  .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar {
2320
- width: 7px !important;
2321
- opacity: 1 !important;
2322
- pointer-events: auto !important;
2323
- transition: none !important;
2342
+ width: 5px !important;
2343
+ opacity: 0 !important;
2344
+ pointer-events: none !important;
2345
+ transition: opacity 0.18s ease !important;
2324
2346
  }
2325
2347
  .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar .slider {
2326
- width: 7px !important;
2327
- border-radius: 4px !important;
2328
- background: rgba(var(--brand-rgb), 0.5) !important;
2348
+ width: 5px !important;
2349
+ border-radius: 3px !important;
2350
+ background: rgba(128, 128, 128, 0.5) !important;
2329
2351
  }
2330
2352
  .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar .slider:hover {
2331
- background: rgba(var(--brand-rgb), 0.8) !important;
2353
+ background: rgba(128, 128, 128, 0.8) !important;
2332
2354
  }
2333
- /* Force the overlay scrollbar solid at all times when scrollable. xterm fades
2334
- it to .invisible after an idle timeout; override both visibility classes. */
2335
- .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar.visible,
2336
- .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar.invisible {
2355
+ /* Show overlay scrollbar only while xterm marks it .visible (scrolling / hovering track). */
2356
+ .terminal-wrapper .xterm .xterm-scrollable-element > .scrollbar.visible {
2337
2357
  opacity: 1 !important;
2338
2358
  pointer-events: auto !important;
2339
- transition: none !important;
2340
2359
  }
2341
2360
  .terminal-wrapper .xterm-screen { touch-action: pan-y !important; }
2342
2361
  .xterm .xterm-helpers { z-index: 0 !important; }
@@ -2375,12 +2394,40 @@ button {
2375
2394
  0%, 100% { opacity: 1; }
2376
2395
  50% { opacity: 0.3; }
2377
2396
  }
2397
+ /* AI agent status dots — idle/working/blocked/done (see lib/statusVisual.js) */
2398
+ /* KEEP IN SYNC with web/app/globals.css (separate build) */
2399
+ /* Working = spinning ring (border-top + border-right visible, others transparent). */
2400
+ .term-dot.pulse-soft {
2401
+ background: transparent !important;
2402
+ width: 0.6rem !important;
2403
+ height: 0.6rem !important;
2404
+ border: 2px solid rgba(59,130,246,0.25);
2405
+ border-top-color: #3b82f6;
2406
+ border-right-color: #3b82f6;
2407
+ animation: statusSpin 0.7s linear infinite;
2408
+ }
2409
+ @keyframes statusSpin { to { transform: rotate(360deg); } }
2410
+ .term-dot.pulse-strong { animation: statusPulseStrong 0.9s ease-in-out infinite; }
2411
+ @keyframes statusPulseStrong {
2412
+ 0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(239,68,68,0.6); }
2413
+ 50% { transform: scale(1.3); box-shadow: 0 0 0 4px rgba(239,68,68,0); }
2414
+ }
2415
+ /* SessionList card status border — dashed + state color. */
2416
+ .status-border-working { border: 1px dashed #3b82f6 !important; }
2417
+ .status-border-blocked { border: 1px dashed #ef4444 !important; }
2418
+ .status-border-done { border: 1px dashed #f59e0b !important; }
2378
2419
  /* Overlay slide-in (web parity) */
2379
2420
  @keyframes slide-in-right { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
2380
2421
  .slide-in-right { animation: slide-in-right 0.3s ease-out; }
2381
2422
  /* Terminal header hover (web parity) */
2382
2423
  .term-btn:hover { background: var(--surface-2); filter: brightness(0.95); }
2383
- .term-tab:not(.term-tab-active):hover { color: var(--text-main) !important; }
2424
+ .term-tab { border-radius: 8px; }
2425
+ .term-tab:not(.term-tab-active):hover { color: var(--text-main) !important; background: color-mix(in srgb, var(--surface-2) 60%, transparent); }
2426
+ .term-tab-active {
2427
+ color: var(--text-main) !important;
2428
+ font-weight: 600;
2429
+ background: color-mix(in srgb, var(--brand-500) 35%, transparent);
2430
+ }
2384
2431
  .term-group-item:hover { background: var(--surface-2); }
2385
2432
  /* Connection cards — borderless on dark, subtle border on light (session parity) */
2386
2433
  .conn-card { border: none; }
@@ -14,8 +14,8 @@
14
14
  const savedTheme = localStorage.getItem("9remote-theme") || "dark";
15
15
  document.documentElement.setAttribute("data-theme", savedTheme);
16
16
  </script>
17
- <script type="module" crossorigin src="/assets/index-x-cLAYQY.js"></script>
18
- <link rel="stylesheet" crossorigin href="/assets/index-DxFTXB_J.css">
17
+ <script type="module" crossorigin src="/assets/index-6avVMwsi.js"></script>
18
+ <link rel="stylesheet" crossorigin href="/assets/index-ByjrCweb.css">
19
19
  </head>
20
20
  <body>
21
21
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9remote",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "type": "module",
5
5
  "description": "Remote terminal access from anywhere",
6
6
  "main": "dist/server.cjs",
@@ -33,28 +33,29 @@
33
33
  "@xterm/addon-fit": "^0.11.0",
34
34
  "@xterm/addon-unicode11": "^0.9.0",
35
35
  "@xterm/xterm": "^6.0.0",
36
- "bufferutil": "^4.1.0",
36
+ "bufferutil": "4.1.0",
37
37
  "chalk": "^5.4.1",
38
38
  "chokidar": "^3.6.0",
39
39
  "edge-tts-node": "^1.5.7",
40
40
  "http-proxy": "^1.18.1",
41
41
  "inquirer": "^9.3.8",
42
42
  "multicast-dns": "^7.2.5",
43
- "node-datachannel": "^0.32.3",
44
43
  "node-machine-id": "^1.1.12",
45
44
  "node-screenshots": "^0.2.8",
46
45
  "ora": "^8.1.1",
47
46
  "preact": "^10.26.2",
48
47
  "qrcode": "^1.5.4",
49
48
  "qrcode-terminal": "^0.12.0",
50
- "sharp": "^0.33.5",
49
+ "sharp": "0.33.5",
51
50
  "socket.io": "^4.8.3",
52
51
  "socket.io-client": "^4.8.3",
53
- "utf-8-validate": "^6.0.6",
52
+ "utf-8-validate": "6.0.6",
54
53
  "web-push": "^3.6.7"
55
54
  },
56
55
  "optionalDependencies": {
57
56
  "@hurdlegroup/robotjs": "^0.12.1",
57
+ "@julusian/jpeg-turbo": "3.0.1",
58
+ "node-datachannel": "0.32.3",
58
59
  "node-pty": "1.2.0-beta.12"
59
60
  },
60
61
  "devDependencies": {