Commit Graph
74 Commits
Author SHA1 Message Date
Raven Scott 2595a01f65 feat: autopass-based cross-device sync for Holesail Browser
CI / Build & Test (push) Successful in 4m27s
- Native host: add autopass + corestore deps, sync-manager (createInvite, pairWithInvite, push/pull)
- Apply synced state via same flow as backup restore (state.json only, no certs)
- Holesail-manager: setOnStateSaved hook for sync push
- Extension: Sync dashboard page, getSyncStatus/createSyncInvite/pairWithInvite, syncApplied event
- Docs: NATIVE-HOST.md sync commands, SYNC.md
2026-03-15 01:31:51 -04:00
Raven Scott 410fd87357 feat(dashboard): native host onboarding when disconnected
CI / Build & Test (push) Successful in 3m19s
- Add install-command helper (getInstallCommand + platform detection)
  with OS-specific one-liners and configurable base URL
- Show onboarding card on Overview when !hostConnected: copy button,
  platform switcher (macOS/Linux / Windows), and "Check again" button
- "Check again" triggers refresh and shows success/disconnected toast
- refresh() returns state so callers can react to hostConnected
- Add unit tests for install-commands (all platforms, base URL)
- Document "Native host not found" flow in README and INSTALLATION
2026-03-15 01:12:29 -04:00
Raven Scott 6fcd9fcf2b eat: implement Holesail-Browser enhancement plan
CI / Build & Test (push) Successful in 3m19s
- Add unit tests (hostname-validator, TLDs, payload-schemas) and integration tests for message handler registry
- Refactor native host message router into handler registry (handlers/state, tunnels, ssh, rdp, backup, ca, connections)
- Add ESLint config and npm test + lint steps in CI
- Dashboard: visibility-based refresh pause, configurable refresh interval (2s/5s/10s/paused)
- Accessibility: ARIA on nav and modals, focus trap and restore, prefers-reduced-motion
- Empty states: primary action buttons for virtual hosts, servers, service tunnels
- Native host rate limiting for backup and CA operations; update SECURITY.md
- CONTRIBUTING: "Adding a new dashboard page", dev workflow; add npm run dev script
2026-03-15 00:24:31 -04:00
Raven Scott 8df1ef3ec6 fix(extension): update PAC for all virtual hosts after backup restore
CI / Build & Test (push) Successful in 3m10s
- Trigger getState + applyPAC after successful restoreBackup (same as setVirtualHost/removeVirtualHost)
- Always re-apply PAC when getState returns state so restored/different vhost TLDs are reflected
2026-03-14 23:55:12 -04:00
Raven Scott e2518f8c38 Update CSS - GN
CI / Build & Test (push) Successful in 3m2s
2026-03-03 04:26:27 -05:00
Raven Scott 3a13334779 feat(virtual-hosts): add TLS option for HTTPS/443 backends
CI / Build & Test (push) Failing after 2m44s
- Add "Use TLS (secure connection)" checkbox in Add Virtual Host modal
- Persist and restore useTls in state; show TLS badge in table
- When enabled, HTTPS proxy connects to tunnel backend over TLS (SNI =
  hostname) for HTTP and WebSocket; supports services on port 443
2026-03-03 03:59:53 -05:00
Raven Scott 90646d6cb1 Expand Firefox CSP: allow Google Fonts and data: image URIs
CI / Build & Test (push) Successful in 2m53s
Add fonts.googleapis.com and fonts.gstatic.com to style-src and font-src
so dashboard fonts load. Add data: to img-src for RDP bitmap rendering.
2026-03-03 03:31:49 -05:00
Raven Scott 21184f4d76 Allow inline styles in Firefox CSP for dashboard JS
CI / Build & Test (push) Successful in 3m9s
Add style-src 'self' 'unsafe-inline' to manifest_firefox.json CSP so
element.style assignments in dashboard pages are not blocked by Firefox.
2026-03-03 03:24:13 -05:00
Raven Scott 99782ce209 Fix Firefox CSP upgrading ws:// to wss:// for local WebSocket connections
CI / Build & Test (push) Successful in 2m58s
Firefox's default MV3 CSP includes upgrade-insecure-requests, which upgrades
ws://127.0.0.1 to wss:// and breaks SSH/RDP WebSocket connections to the
local native host. Add explicit content_security_policy to manifest_firefox.json
allowing ws://127.0.0.1:* and http://127.0.0.1:* on extension pages.
2026-03-03 03:18:17 -05:00
Raven Scott 39e65b2e9c Fix Firefox native messaging: separate manifests and expose disconnect reason
CI / Build & Test (push) Successful in 3m9s
- Firefox rejects native messaging manifest if allowed_origins is present.
  Install script now writes Chrome-only manifest (allowed_origins) and
  Firefox-only manifest (allowed_extensions) to their respective locations.
- Fix local Firefox manifest by removing allowed_origins.
- Log disconnect reason from port.error (Firefox) in addition to
  runtime.lastError (Chrome) so native messaging failures are visible.
- Log getState failures on disconnect for easier debugging.
2026-03-03 03:08:53 -05:00
Raven Scott ef3bb470c4 Use Firefox proxy API format so PAC applies: proxyType + autoConfigUrl
CI / Build & Test (push) Successful in 2m59s
2026-03-03 02:39:41 -05:00
Raven Scott a1b5087269 Fix Firefox proxy PAC loop: handle proxyType and avoid re-apply when we have control
CI / Build & Test (push) Successful in 3m12s
- Treat PAC as active when mode === 'pac_script' (Chrome) or proxyType ===
  'autoConfig' (Firefox) so we don't mis-detect "not active" in Firefox.
- In proxy.settings.onChange, only call applyPAC() when levelOfControl !==
  'controlled_by_this_extension'. When we still have control, return without
  re-applying to stop the set -> onChange -> applyPAC loop.
2026-03-03 02:31:58 -05:00
Raven Scott e84609d64d Fix Firefox web_accessible_resources: use extension_ids instead of moz-extension matches
CI / Build & Test (push) Successful in 3m1s
Firefox's match pattern validator does not allow the moz-extension:// scheme
in matches. Use extension_ids: ["*"] so extension pages can load the
resources without invalid manifest error.
2026-03-03 02:22:19 -05:00
Raven Scott 34303e7a80 Fix Firefox install: use background.scripts instead of service_worker
CI / Build & Test (push) Successful in 3m22s
Firefox MV3 does not support background.service_worker. Split background
into background-boot.js (globals) and background-main.js (startup logic);
Chrome keeps using importScripts() in background.js, Firefox manifest uses
background.scripts with the same file list so the extension loads in both.
2026-03-03 02:15:03 -05:00
Raven Scott 5fdafbcc33 Add Firefox-specific manifest and split packaging for Chrome zip vs XPI
CI / Build & Test (push) Successful in 3m21s
- Add extension/manifest_firefox.json (no key, moz-extension://*/* for
  web_accessible_resources) for correct Firefox MV3 behavior
- Update pack-extension.js: zip excludes manifest_firefox.json; XPI
  built separately with manifest_firefox.json as manifest.json
- Update generate-extension-id.js to set gecko.id in manifest_firefox.json
  when present (no key in Firefox manifest)
- Document dual-manifest layout and pack/generate-id behavior in CONTRIBUTING.md
2026-03-03 02:06:20 -05:00
Raven Scott b0cb5c0647 style: fix btn-primary and xterm theming for dark/light mode
CI / Build & Test (push) Successful in 3m1s
Use var(--bg) for btn-primary text color and color-mix for hover to
correctly adapt across themes. Add --terminal-bg CSS variable and
_getXtermTheme() helper so the SSH terminal picks up the correct
palette at connection time.
2026-03-01 23:27:06 -05:00
Raven Scott 21b01f1461 revert: remove Statistics tab and all associated changes
CI / Build & Test (push) Successful in 3m7s
2026-03-01 23:07:55 -05:00
Raven Scott f9c651c6f5 fix: guard against non-array os.loadavg() in stats page
CI / Build & Test (push) Successful in 3m9s
Normalize loadAvg to [0,0,0] fallback in both the native host handler
and the dashboard renderer to prevent TypeError when bare-node-os returns
a non-array value for loadavg().
2026-03-01 22:43:56 -05:00
Raven Scott 98ecb695f4 dd Statistics tab with real-time native host monitoring
CI / Build & Test (push) Successful in 2m55s
- Add getProcessStats message handler to native host returning process
  memory (rss, heap used/total, external), PID, uptime, OS memory,
  CPU load averages, core count, platform/arch, and tunnel state counts
- Add stats-tracker.js to background SW tracking cumulative connections,
  reconnect count, last disconnect time, and per-minute connection rate
  ring buffer (30 buckets) for sparkline display
- Include statsHistory and activeConnections array in all getState responses
- Add Statistics dashboard page with six sections: Native Host Process,
  System Resources, Tunnel Health, Proxy Traffic, Peer Connections
  (with SVG sparkline), and Extension & Proxy Info
- Preserve checkbox selection across table re-renders on all bulk-action
  tables (virtual hosts, servers, service tunnels)
- Add theme-aware custom checkbox styling for bulk selection rows using
  design system tokens, with white checkmark override for light theme
2026-03-01 22:35:56 -05:00
Raven Scott 4210fd4f23 style: theme-aware custom checkboxes for bulk selection rows
CI / Build & Test (push) Successful in 3m3s
Replace native browser checkbox appearance on table row and select-all
checkboxes with fully custom styled controls using design system tokens,
with a white checkmark override for the light theme's darker cyan.
2026-03-01 22:17:19 -05:00
Raven Scott ad292958a8 fix: preserve checkbox selection across table re-renders
CI / Build & Test (push) Successful in 3m1s
Snapshot checked row IDs before each innerHTML swap in the virtual hosts,
service tunnels, and server tunnels tables so that periodic refresh cycles
no longer reset multi-selection state.
2026-03-01 22:03:59 -05:00
Raven Scott 58a41f6965 fix(permissions): request host permissions during user gesture, not in background
CI / Build & Test (push) Failing after 2m42s
chrome.permissions.request() must be called synchronously within a user
gesture. Moving it from the background message-router (where the gesture
context has expired) into the addVhostSubmit click handler in virtual-hosts.js
fixes the "Unchecked runtime.lastError: This function must be called during
a user gesture" console error.
2026-03-01 13:24:04 -05:00
Raven Scott f069058c98 evert: remove experimental my.dash.board PWA virtual host
CI / Build & Test (push) Successful in 2m52s
Reverts the experimental feature that attempted to serve the dashboard
via a local HTTP server registered as a hardcoded `my.dash.board` virtual
host, intended to satisfy Chrome's PWA "secure origin" installability
requirement. The approach caused proxy connection errors and file-not-found
issues that were not worth resolving.

Removed: native-host/dashboard-server.js, native-host/test-chain.mjs
Reverted: startup.js, message-router.js, virtual-hosts.js, index.js,
          build-distributable.js, extension/pages/virtual-hosts.js,
          CI workflows (ci.yml, release.yml)
2026-03-01 04:00:29 -05:00
Raven Scott e6658d4421 fix(pwa): resolve proxy connection reset and manifest same-origin warnings
CI / Build & Test (push) Successful in 2m47s
Fix "Proxy error: connection reset by peer" caused by dashboard-server.js
looking for files in native-host/ instead of extension/dashboard/. Remove
the devBasePath parameter and resolve DEV_DASHBOARD_DIR directly from
__dirname so dev and distribution mode both find the correct files.

Fix all manifest warnings (start_url/id/scope/protocol_handlers ignored)
by reverting manifest.webmanifest to relative/extension-origin URLs for
the chrome-extension:// context, and having dashboard-server.js dynamically
generate a manifest at /manifest.webmanifest with absolute
https://my.dash.board/ URLs — satisfying Chrome's same-origin requirement
for PWA installability.

Also serve extension icons at https://my.dash.board/icons/<file> with
correct bundle key mapping, and embed them in the distributable binary
via build-distributable.js.
2026-03-01 03:10:11 -05:00
Raven Scott a838c3a345 feat(pwa): experimental — add my.dash.board virtual host for secure PWA install
CI / Build & Test (push) Successful in 2m51s
Serve the dashboard over a local HTTPS virtual host (my.dash.board) so
Chrome treats it as a secure origin and shows the PWA install prompt.

- Add native-host/dashboard-server.js: bare-http1 static file server
  backed by bare-bundle assets in distribution mode, disk fallback in dev
- Add setLocalVirtualHost() to virtual-hosts.js; type:local entries are
  protected from removal and filtered out of saveState persistence
- Export setLocalVirtualHost from holesail-manager/index.js
- Start dashboard server in startup.js after proxies are ready and
  register my.dash.board as a local virtual host
- Stop dashboard server in message-router.js cleanup()
- Update manifest.webmanifest: start_url, id, scope → https://my.dash.board/
- Embed all extension/dashboard/ files as bare-bundle assets in
  build-distributable.js patchBundle() — no installer copy step needed
- Hide checkbox, hs:// URL, Reconnect, and Remove controls for built-in
  my.dash.board row in the virtual hosts table UI
2026-03-01 02:58:52 -05:00
Raven Scott cbc663cacb fix(native-messaging): suppress "Native host has exited" console error
CI / Build & Test (push) Successful in 2m44s
Read runtime.lastError in the onDisconnect callback so Chrome does not
log "Unchecked runtime.lastError: Native host has exited" to the
extensions console. The disconnect reason is forwarded to debugLog so
it remains visible when Debug Mode is enabled.
2026-03-01 02:42:06 -05:00
Raven Scott e665a814d7 fix(pwa): remove no-op fetch handler from service worker
CI / Build & Test (push) Successful in 2m52s
Chrome warns that an empty fetch listener adds navigation overhead.
Removed the handler entirely — a registered SW without a fetch handler
still satisfies Chrome's PWA installability requirement since v112.
2026-03-01 02:37:23 -05:00
Raven Scott d587441cf5 fix(pwa): move inline SW registration script to external file to satisfy CSP
CI / Build & Test (push) Successful in 2m56s
The inline <script> for service worker registration was blocked by the
extension's script-src 'self' Content Security Policy. Extracted it to
register-sw.js and replaced the inline block with a <script src>.
Added register-sw.js to web_accessible_resources.
2026-03-01 02:30:00 -05:00
Raven Scott 5e40b14a91 fix(overview): center empty state messages and disable scroll when list is empty
CI / Build & Test (push) Successful in 2m55s
Add ov-empty CSS class to .ov-scroll-area when an overview list has no
items — disables overflow scrolling and uses flexbox to vertically and
horizontally center the empty message. Class is removed automatically
when data is present. Keeps the normal scrollable layout intact for
populated lists.
2026-03-01 02:23:59 -05:00
Raven Scott dab9731573 fix(ui): correct Proxy & CA descriptions to reflect any private TLD
CI / Build & Test (push) Has been cancelled
The Root CA card and Install CA modal incorrectly stated the CA only
covers *.hole.sail domains. Updated both to accurately describe that
the CA covers all virtual host domains using any private TLD
(e.g. myapp.hole.sail, api.my.internal).
2026-03-01 02:21:11 -05:00
Raven Scott 0ec696c00d feat(pwa): add service worker and scope for full PWA installability
CI / Build & Test (push) Successful in 3m1s
Add a minimal sw.js with an empty fetch handler — required by Chrome
for the PWA install prompt to appear. Register it at the bottom of
dashboard.html with a silent catch. Add "scope": "." to the manifest.
Register sw.js in web_accessible_resources so Chrome can fetch it from
the extension origin.
2026-03-01 02:16:37 -05:00
Raven Scott 96e40d1b96 fix(pwa): resolve manifest warnings for cleaner PWA install experience
CI / Build & Test (push) Successful in 2m52s
- Fix icon purpose from "any maskable" to "any" to avoid incorrect
  padding on some platforms
- Add explicit id field matching start_url to stabilise the App ID
- Add display_override with window-controls-overlay for native title bar
- Register web+holesail:// protocol handler so installed app can be
  launched directly from custom protocol links
2026-03-01 01:56:30 -05:00
Raven Scott a2692b3760 feat(pwa): add screenshots to manifest for richer PWA install UI
CI / Build & Test (push) Successful in 2m54s
Add wide (1024x515) and narrow (390x844) screenshots to the web app
manifest so Chrome displays the richer install UI with a preview on
both desktop and mobile. Register screenshots directory in
web_accessible_resources so Chrome can fetch the images from the
extension origin.
2026-03-01 01:49:26 -05:00
Raven Scott ac7df32be7 feat(pwa): add proper icon sizes and update all icons from new 512px source
CI / Build & Test (push) Successful in 2m49s
Replace all extension icons (16, 32, 48, 128, 192, 512) with versions
derived from the new 512x512 brand icon for consistency. Add 192x192
and 512x512 entries to manifest.webmanifest — Chrome requires both
sizes to show the "Install page as app" option in the browser menu.
Mark the 512px icon as maskable for OS launcher compatibility.
2026-03-01 01:46:32 -05:00
Raven Scott e391d82316 feat(pwa): add PWA install support and update installation docs
CI / Build & Test (push) Successful in 2m50s
Add manifest.webmanifest to the dashboard so Chrome can install it as
a standalone app via the browser menu. Register the manifest in
web_accessible_resources and link it from dashboard.html. Add a
dedicated PWA install section to docs/INSTALLATION.md covering install
steps, uninstall, and the requirement that the extension remains
installed.
2026-03-01 01:36:37 -05:00
Raven Scott 4eeae78d9b chore(logs): demote noisy native messaging logs to debug level
CI / Build & Test (push) Successful in 2m56s
"Sending to native" and "Received from native" are emitted on every
poll cycle and clutter the logs panel. Moved both to debugLog so they
only appear when Debug Mode is enabled in Settings.
2026-03-01 01:19:18 -05:00
Raven Scott 32cd108480 fix(settings): fix latency ping and tunnel auto-reconnect defaults
CI / Build & Test (push) Successful in 2m54s
- Default latencyPingEnabled to false so badges are hidden until opted in
- Fix toggleLatencyPing sync condition from !== false to === true to match
  the new default correctly
- Default tunnelAutoReconnect to true so tunnels reconnect automatically
  out of the box
- Hide latency badges in virtual hosts and service tunnels tables when
  latency ping is disabled
2026-03-01 01:10:59 -05:00
Raven Scott b9a4e39e78 fix(settings): prevent refresh cycle from reverting unsaved toggle changes
CI / Build & Test (push) Successful in 2m55s
Track a _settingsDirty flag that is set whenever the user interacts with
a settings toggle or number input. updateSettingsUI() skips the sync while
dirty so the 2-second refresh cycle cannot revert in-progress edits.
The flag is cleared after a successful save or reset.
2026-03-01 00:54:33 -05:00
Raven Scott 4ed688a315 fix(dashboard): smooth latency badge updates, add ping settings
CI / Build & Test (push) Successful in 2m52s
- Snapshot and restore latency badge values across innerHTML re-renders
  so badges never flash back to "…ms" on the 2-second state refresh cycle
- Add CSS transition (color 0.4s ease) and in-flight opacity dim (.pinging)
  to .latency-badge for smooth color changes
- Decouple latency pinging from the state refresh cycle — pings now run on
  their own independent interval instead of being triggered by refresh()
- Add two new settings under a "Latency Ping" section in Settings:
  - Enable Latency Ping toggle (latencyPingEnabled, default: true)
  - Ping Interval in seconds (latencyPingIntervalMs, default: 5s)
- Restart ping interval immediately on settings save so changes take effect
  without a page reload
2026-03-01 00:46:37 -05:00
Raven Scott f1e98a7edd docs: add CONTRIBUTING.md, CHANGELOG.md, and JSDoc to entire codebase
CI / Build & Test (push) Successful in 2m54s
Add docs/CONTRIBUTING.md covering the build system, dev workflow, all
npm scripts, how to add new native host message types, code style, and
debugging guidance.

Add CHANGELOG.md at the project root documenting all features and fixes
across the 1.0.0 release.

Add JSDoc (@param, @returns) to all previously undocumented exported
functions across 35 JS files:
- native-host/holesail-manager/ (index, virtual-hosts, service-tunnels,
  servers, port-allocator)
- native-host top-level managers (startup, connect-proxy, https-proxy,
  certificate-authority, ssh-manager, rdp-manager)
- extension/background/ (logs, native-messaging, proxy, message-router)
- extension/dashboard/core/ (utils, navigation, init)
- extension/dashboard/ui/ (modal, toast, state-tag)
- extension/dashboard/pages/ (all 10 page files)
- extension/dashboard/refresh.js, events.js
- extension/dashboard/data/hostname-validator.js
- scripts/ (build-host, run-install)
2026-03-01 00:40:53 -05:00
Raven Scott f0917a2d31 feat: rename Peer Lookup to Holesail Lookup with result modal
CI / Build & Test (push) Successful in 3m1s
Replace the inline result div with a dedicated modal that displays
structured lookup data (host, port, protocol, private) returned by
Holesail.lookup(). Shows a loading state while the request is in
flight, and renders clear error/no-record states when the key is
not found or the lookup fails.
2026-03-01 00:13:41 -05:00
Raven Scott 0b31e7faa6 fix: resolve 35 memory leaks, resource leaks, and bugs across native host and extension
CI / Build & Test (push) Successful in 2m52s
CRITICAL:
- certificate-authority.js: declare `regenerated` variable in installRootCA Windows path to prevent ReferenceError crash

HIGH:
- virtual-hosts.js/service-tunnels.js: call hs.removeAllListeners() in catch blocks to prevent stale listeners on failed Holesail instances
- https-proxy.js: destroy rawSocket in TLS error handler to prevent file descriptor exhaustion
- message-router.js (native): move setEventEmitter() to module-level init instead of re-calling on every message
- ssh-manager.js: add error handler to WS server to prevent unhandled error crashes
- init.js: store setInterval ID and clear on beforeunload to prevent interval accumulation
- logs.js: store and remove chrome.runtime.onMessage listener on beforeunload; add duplicate-call guard
- events.js: move pending++ before async sendMessage call to fix SSH/RDP-only import showing "Nothing to import"
- ssh.js: store resizeTimer on activeSshSession and clear in disconnectSsh; fix auto-reconnect race with _sshConnecting lock
- native-messaging.js: track retry timer IDs in array and cancel all on disconnect
- rdp.js: reuse single offscreen canvas per session instead of allocating per bitmap

MEDIUM:
- virtual-hosts.js/service-tunnels.js: clear existing.reconnectTimer before replacing tunnel entries
- message-router.js (native): destroy pingTunnel socket on error path; clear 15s fallback timer via finally()
- startup.js: wrap setImmediate body in try/finally to always resolve proxiesReadyPromise
- https-proxy.js: fix pre-connect upstream error handler to avoid writing raw HTTP into piped TLS stream; move HOP_BY_HOP to module-level constant
- connect-proxy.js: destroy upstreamSocket on clientSocket close; track and destroy active sockets in stop()
- ssh-manager.js: call cancelPasswordWatch on WS disconnect during password collection
- rdp-manager.js: remove dead remotePort variable; add error handlers to both WS servers
- backup-manager.js: log cleanupStaging errors and non-zero exit codes
- rdp.js: null out ws callbacks before closing in disconnectRdp; disconnect MutationObserver on beforeunload
- proxy-ca.js: prune stale entries from validationResults Map in renderValidatorTable
- refresh.js: deduplicate in-flight pings per port via Set
- messaging.js: read chrome.runtime.lastError in sendToNative callback
- servers.js (dashboard): add null check for $('serverEditId') element

LOW:
- port-allocator.js: add dedup check before pushing to tunnelPortFreeList
- servers.js (native): add error listener to server-mode Holesail instances
- virtual-hosts.js: remove dead prevReconnectDelay variable
- tab-lifecycle.js: change swarmRefCount fallback from || 1 to || 0 to prevent premature swarm destroy
- ssh.js/rdp.js: disconnect MutationObservers on beforeunload
2026-03-01 00:10:20 -05:00
Raven Scott 849897f324 feat: implement 13 features — auto-reconnect, notifications, bulk actions, latency, traffic, theme, export/import, scheduled backups, peer lookup, SSH auto-reconnect, log filters, keyboard shortcut, and readyTimeout default
CI / Build & Test (push) Successful in 2m44s
- Change readyTimeoutMs default from 0 to 30000 in both state files
- Register Alt+Shift+H keyboard shortcut via manifest _execute_action command
- Add severity filter buttons (All/Info/Warn/Error) and Download .txt to Logs page; background logs.js now tags entries with proper level field
- Fire browser notifications on tunnelError events (notifyOnTunnelError setting)
- Add exponential-backoff auto-reconnect for virtual hosts and service tunnels (tunnelAutoReconnect setting, 5s–120s backoff)
- Add backupIntervalHours setting and scheduled auto-backup timer in message-router.js
- Add TCP connect latency badges to Virtual Hosts and Service Tunnels tables via new pingTunnel native message
- Add bytesIn/bytesOut/requests counters to https-proxy.js; expose in Overview status bar via getState
- Add Export/Import connection configs (JSON, no CA key) in Settings
- Add autoReconnect flag and exponential-backoff reconnect to SSH connection cards
- Add light theme CSS variables and theme toggle in Settings (persisted to localStorage)
- Add checkbox column and bulk Stop/Remove actions to Virtual Hosts, Service Tunnels, and Servers tables
- Add Peer Lookup UI card on Overview page using existing lookup message handler
2026-02-28 23:51:14 -05:00
Raven Scott 31f30b2974 fix: resolve 14 memory leaks and bugs across native host and extension
CI / Build & Test (push) Successful in 2m47s
Critical:
- ssh-manager: release ports/wsServer/holesail on ptySpawn failure
- rdp-manager: add 30s timeout to holesailInst.ready() to prevent infinite hang

High:
- ssh-manager: cancel password-watch timers on PTY exit/error
- ssh-manager: cap outputSoFar to 4096 chars to prevent unbounded growth
- connect-proxy: add 64KB header buffer cap to prevent OOM

Medium:
- startup: assign tunnelsRestoredPromise before resolve() to fix race
- https-proxy: register upstream error handler before connect callback
- connect-proxy: register upstreamSocket error handler before connect callback
- https-proxy: destroy socket on backend stream error (was sending truncated 200)
- logs: debounce broadcastLogs to prevent IPC storm on every log call

Low:
- rdp-manager: cap VNC outputBuffer entry count (not just bytes)
- https-proxy: track connections in FakeHttpServer.connections Set
  instead of private _connections API
- tab-lifecycle: clean up subscribedTabs/dashboardTabs on tab navigation
- dashboard/events: guard setupEvents() against duplicate listener registration
2026-02-28 23:28:10 -05:00
Raven Scott 5c4f0b4aba efactor(extension): modularize dashboard, background, and docs
CI / Build & Test (push) Failing after 28s
Split monolithic dashboard.js (2753 lines) into 18 focused modules
under dashboard/{core,data,ui,pages}/ with refresh.js and events.js
as orchestrators. Extracted ~900-line inline <style> into dashboard.css
and moved dashboard.html to dashboard/dashboard.html.

Split background.js (609 lines) into background/{logs,state,proxy,
native-messaging,tab-lifecycle,message-router}.js with a thin entry
point using importScripts().

Deleted dead files: wrong-domain.js (duplicate of inline script).
Updated manifest.json web_accessible_resources for new paths.
Updated docs/ARCHITECTURE.md to reflect the new file structure.

No functionality changed. No build step introduced.
2026-02-28 23:02:52 -05:00
Raven Scott 8cc76e580a overview updates and removal of duplicate title headers
CI / Build & Test (push) Successful in 4m55s
2026-02-28 22:10:48 -05:00
Raven Scott 6c1428c6f1 updates to server tunnels
CI / Build & Test (push) Successful in 2m45s
2026-02-28 21:47:40 -05:00
Raven Scott f5a299b9ec css fixes
CI / Build & Test (push) Successful in 3m29s
2026-02-28 21:34:30 -05:00
Raven Scott 8303c72140 further tests
CI / Build & Test (push) Successful in 3m44s
2026-02-28 21:07:39 -05:00
Raven Scott 82c75b289e fix: correct SSL cert for custom TLDs and immediate PAC update on vhost changes
CI / Build & Test (push) Successful in 3m18s
- Replace SNI callback approach (unsupported by bare-tls) with a multi-SAN
  wildcard cert covering all active base domains (e.g. *.hole.sail, *.heheh.jungle)
- Add buildMultiSanCert() in https-proxy.js — cert key encodes sorted domain list
  so cache invalidates automatically when TLDs are added or removed
- Add restart(baseDomains, callback) to https-proxy.js to stop and restart the
  proxy with a fresh cert without requiring a native host restart
- Add getActiveBaseDomains() and refreshProxyCert() in host.js; call after every
  successful setVirtualHost and removeVirtualHost
- Fix background.js send handler to fetch updated virtualHosts via getState and
  re-apply PAC immediately after setVirtualHost or removeVirtualHost succeeds,
  so new TLDs are routed without waiting for the next dashboard refresh
- Remove unused tls require from https-proxy.js
- Remove invalid "permissions" entry from manifest.json permissions array
2026-02-28 20:30:26 -05:00