Commit Graph
23 Commits
Author SHA1 Message Date
Raven Scott 24f189ec5c feat(dashboard, host): cross-repo parity — a11y, messaging, validation, tooling
CI / Build & Test (push) Has been cancelled
- Dashboard: skip link, main landmark, focus-visible, toast live region, keyboard
  shortcuts modal (?), aria-current on nav, shared state-panel CSS, theme spacing tokens
- messaging: sendToNativeResult + notifyNativeFailure; SSH/RDP use them for failures
- Host: validate setVirtualHost/removeVirtualHost/startServer/stopServer in message-router;
  log on handler errors; logWarn in logger
- SW: skipWaiting + clients.claim; register-sw controllerchange hook
- Tests: test/paths.js + env HOLESAIL_HOST_ROOT / HOLESAIL_DASH_DATA_ROOT; mirror tests in
  Holesail; data/package.json for CJS under ESM root; eslint.config.cjs + lint script
- Data: install-commands cross-repo note; extension/dashboard/data package.json (Browser)
2026-03-27 02:11:19 -04:00
Raven Scott bd48847bf0 feat(dashboard): debounced filter for linked devices table on Sync page
CI / Build & Test (push) Successful in 4m25s
Add search input (name, ID, type) with 250ms debounce; mirror in extension
and renderer dashboards. Update parity docs note in Browser repo only.
2026-03-27 01:42:50 -04:00
Raven Scott 64d8eb4d7c feat(sync): device label, runtime kind, and Sync UI parity (Browser + Pear)
CI / Build & Test (push) Successful in 4m12s
- Persist optional display name locally; publish effective name + runtime to peers
- Map deviceRuntimes (browser extension vs desktop) alongside deviceNames
- Dashboard: badges, dirty/focus guards against auto-refresh, hero + Change name
2026-03-27 01:20:24 -04:00
Raven Scott 8d153d74ba Boot splash
CI / Build & Test (push) Successful in 4m29s
2026-03-27 00:57:38 -04:00
Raven Scott 9eeb387941 feat(settings): add Sync Servers toggle (off by default)
CI / Build & Test (push) Successful in 4m29s
- Add syncServers setting (default false) to extension and native host state
- Add "Sync Servers" toggle under Settings → Sync; when disabled, server
  tunnels stay local and are not synced across linked devices
- On push: omit servers from snapshot when syncServers is false
- On apply: keep local servers and nextServerId when syncServers is false
  (incremental and full restore)
2026-03-16 17:25:58 -04:00
Raven Scott 3d70f322cc test updates
CI / Build & Test (push) Successful in 4m5s
2026-03-15 06:00:44 -04:00
Raven Scott db7bf8c864 fix(sync): persist and cache device names so they are never lost
CI / Build & Test (push) Successful in 4m18s
- state.js: add lastLoadedDeviceNames cache, getDeviceNames(),
  setDeviceNames(); saveStateSync() always merges and writes
  deviceNames so saves never strip them.
- holesail-manager: include deviceNames in saveState() and
  getStateSnapshot(); applySnapshotData() updates cache from
  synced snapshot. buildDefaultState and legacy migration
  include deviceNames: {}.
Prevents hostnames reverting to "Device 1" etc. after saves or sync.
2026-03-15 05:33:08 -04:00
Raven Scott 925376a6bd fix(sync): stop sync loop; add link warning and linked-devices table
CI / Build & Test (push) Successful in 4m22s
- Await restorePersistedTunnels so applyingSync stays true for full restore,
  preventing saveState() during tunnel startup from pushing back and looping
- Debounce onRemoteUpdate (600ms) and skip apply when state unchanged
  (canonical fingerprint) to avoid redundant restarts
- Add confirm modal before "Link device": warns that current state will be
  replaced and suggests creating a backup first
- Add Linked devices table when linked: show This device ID (writerKey) and
  Sync group ID (discoveryKey); getSyncStatus returns deviceId and syncGroupId
2026-03-15 01:47:34 -04:00
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 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 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 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 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 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 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 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 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 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 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