Commit Graph
100 Commits
Author SHA1 Message Date
Raven Scott b8344d2163 enhanced logging
CI / Build & Test (push) Successful in 4m16s
2026-03-27 04:52:53 -04:00
Raven Scott bd5c8d1b52 fix(dashboard): move focus before aria-hidden when closing modals
CI / Build & Test (push) Successful in 4m18s
Restoring or blurring focus before setting aria-hidden on the backdrop
avoids the browser warning when a control inside the modal (e.g. SSH
Disconnect) still had focus.
2026-03-27 04:17:55 -04:00
Raven Scott 9f1ac62edc fix(dashboard): restore data script loading by removing data package type overrides
CI / Build & Test (push) Successful in 4m28s
Remove folder-level package.json files from dashboard data directories in both repos.
Those overrides caused esm-wrap parsing of plain script data files
(tlds.js, hostname-validator.js, install-commands.js), triggering
"Unexpected token 'export'" at runtime.
2026-03-27 02:15:15 -04:00
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 5867087960 fix css for sync
CI / Build & Test (push) Successful in 4m23s
2026-03-27 01:57:08 -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 17c579e56e install cert into nssdb as well as os level for linux
CI / Build & Test (push) Successful in 4m35s
2026-03-26 03:16:02 -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 6984ff70ac Add releases to gitignore - Update README
CI / Build & Test (push) Successful in 4m34s
2026-03-16 16:21:35 -04:00
Raven Scott 54f57be9d7 Update Copyright
CI / Build & Test (push) Successful in 4m33s
2026-03-16 15:52:48 -04:00
Raven Scott 6067aadcce backup: make create transparent to sync/autopass
CI / Build & Test (push) Successful in 4m16s
- Stop calling closeSyncForBackup() during backup create so sync and
  autopass keep running; backup already excludes autopass/ from the
  archive.
- Restore still quiesces sync and removes autopass/ so storage can be
  replaced safely; sync reconnects on next use.
- Clarify setSyncManager comment (restore-only). Update BACKUP.md,
  SYNC.md, and ARCHITECTURE.md accordingly.
2026-03-15 16:56:20 -04:00
Raven Scott fd5ebdae99 Update docs
CI / Build & Test (push) Successful in 4m11s
2026-03-15 07:04:44 -04:00
Raven Scott ba2eae64c2 fix 2
CI / Build & Test (push) Successful in 4m4s
2026-03-15 06:55:35 -04:00
Raven Scott 130c8a382f attempt fix
CI / Build & Test (push) Successful in 4m6s
2026-03-15 06:46:47 -04:00
Raven Scott 68b830393f fix(sync): prevent master state from clearing when a peer pairs
CI / Build & Test (push) Successful in 4m10s
When a device pairs with the master, the master's autopass can emit an update
and applyRemoteUpdate would sometimes apply an empty or weaker snapshot from the
merged view, overwriting the master's state. Skip applying remote state when
we're the master and the incoming snapshot has less content (servers + vhosts +
serviceTunnels) than current state.
2026-03-15 06:35:04 -04:00
Raven Scott ad9c22f1b6 feat(sync): Delink and Disband with master state retention
CI / Build & Test (push) Successful in 4m4s
- Delink: any peer can leave; removeWriter notifies others, local state reset to defaults.
- Disband: master only; push syncGroupDisbanded so peers reset; master exports state to
  state.json, then reloads (cleanup + restorePersistedState + restorePersistedTunnels).
- Skip handleDisbandFromMaster when receiver is master so master state is not reset.
- Store syncMasterDeviceId in synced state so MASTER badge shows on all devices.
- UI: show Delink for peers, Disband for master only; confirm modals for both.
2026-03-15 06:22:40 -04:00
Raven Scott 1f5ec4bd14 hide delink button for master
CI / Build & Test (push) Successful in 4m4s
2026-03-15 06:11:43 -04:00
Raven Scott 3d70f322cc test updates
CI / Build & Test (push) Successful in 4m5s
2026-03-15 06:00:44 -04:00
Raven Scott c29968b079 update docs
CI / Build & Test (push) Successful in 4m20s
2026-03-15 05:51:02 -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 f1fbc6f01f fix(sync): keep autopass writable after native-host restart
CI / Build & Test (push) Has been cancelled
When reopening with existing identity, do not pass discovery key to
Autopass. That makes Autobase bootstrap from this device's local core
(name: 'local') instead of bootstrap.getUserData('autobase/local'),
which can point at another device's writer and open it read-only.
2026-03-15 05:22:21 -04:00
Raven Scott 44aebc49a0 Sync: generate a new invite each time; call deleteInvite before createInvite when linked
CI / Build & Test (push) Successful in 4m6s
2026-03-15 04:01:49 -04:00
Raven Scott 1d9bf22439 Sync: Master model and same-group invites
CI / Build & Test (push) Successful in 4m15s
- Device that creates sync group is the Master; MASTER label in Linked devices table
- Create invite when already linked generates invite for same sync group (no wipe)
- Any peer can create invites so devices can be added when Master is offline
- Identity file stores isMaster; same sync group reused across native host restarts
- Update SYNC.md, NATIVE-HOST.md, ARCHITECTURE.md, CHANGELOG.md
2026-03-15 03:48:20 -04:00
Raven Scott 0f4b82681d Apply sync incrementally so unchanged tunnels stay running
CI / Build & Test (push) Successful in 4m21s
- Add getStateSnapshot, applySnapshotData, setStateSaveSuppressed to holesail-manager
- Sync diffs snapshot vs current state and only removes/adds/updates changed tunnels
- Suppress saves during apply and write state.json once at the end
- Fall back to full cleanup + restore when incremental APIs are unavailable
2026-03-15 03:28:47 -04:00
Raven Scott cce71920e9 fix(backup): exclude autopass dir from backup, remove after restore
CI / Build & Test (push) Has been cancelled
- Backup: do not include autopass/ (may be in use); always include
  autopass-identity.json so sync identity is never lost
- Restore: remove autopass/ after extract so autopass can recreate from
  restored identity
- Docs: BACKUP.md, SYNC.md, ARCHITECTURE.md updated
2026-03-15 03:25:07 -04:00
Raven Scott e00028ca8e update docs
CI / Build & Test (push) Successful in 4m20s
2026-03-15 03:06:37 -04:00
Raven Scott 80f31e13af fix(sync): use autopass API correctly in pair and create paths
CI / Build & Test (push) Successful in 4m17s
- pairWithInvite: await store.ready() before pair; await pass.ready()
  after pair.finished(); on error call pair.close() then closePass()
- createSyncInvite: on error await closePass() instead of nulling refs
2026-03-15 02:56:20 -04:00
Raven Scott 1eaa6e21ba fix(sync): autopass device-file on restart and new invite
CI / Build & Test (push) Successful in 4m46s
- Remove autopass dir before createSyncInvite/pairWithInvite so Corestore
  gets a fresh device-file (device-file throws when inode/mtime changes)
- Await sync/rdp/holesail cleanup on host shutdown so corestore closes
  before process exit
- Reset initPromise on init failure so Create invite can retry after
  removing corrupt autopass dir
2026-03-15 02:50:53 -04:00
Raven Scott 7d88cdf841 feat(sync): publish hostname and quiesce sync for backup
CI / Build & Test (push) Successful in 4m20s
- getSyncStatus: fire-and-forget push device hostname when missing so
  linked peers see names after opening Sync page
- Backup/restore: close sync (corestore) before copy/extract so autopass
  data is consistent; backup includes autopass/ and autopass-identity.json
- Installer: preserve sync data on re-run (comments and messages)
- Docs: BACKUP.md sync-in-backup and pause behaviour; SYNC.md backups
  include sync data
2026-03-15 02:34:44 -04:00
Raven Scott 7df3975bb0 feat(sync): show device hostnames in Linked devices table; document sync fully
CI / Build & Test (push) Successful in 4m20s
- Sync: use OS hostname for each device in Linked devices table; persist
  deviceNames in state and merge on save/apply so peers see each other's names
- Docs: expand SYNC.md (linked devices table, replace-state modal, multi-device,
  offline); NATIVE-HOST getSyncStatus (deviceId, syncGroupId, linkedDevices,
  deviceName/name); ARCHITECTURE sync-manager and autopass paths; README
  features/dashboard/file locations/doc link; BACKUP and SECURITY cross-refs
2026-03-15 02:22:11 -04:00
Raven Scott 594ac19ca2 update docs
CI / Build & Test (push) Successful in 4m25s
2026-03-15 02:15:50 -04:00
Raven Scott 90613511ed feat(sync): list all linked devices in Sync table
CI / Build & Test (push) Successful in 4m25s
- getSyncStatus() now iterates pass.base.activeWriters and returns
  linkedDevices: [{ id, isCurrent }] for each writer in the sync group
- Dashboard Linked devices table shows every device: "This device" plus
  "Device 2", "Device 3", etc. with their IDs; rows sorted by id
- Fallback to single "This device" row when activeWriters is missing
2026-03-15 02:03:37 -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 33ea92cd43 fix(sync): stop sync loop and apply remote state once
CI / Build & Test (push) Has been cancelled
- Await restorePersistedTunnels in applySyncedState so applyingSync stays
  true for the full restore. Prevents saveState() during tunnel startup
  from pushing back to autopass and causing a feedback loop.
- Debounce onRemoteUpdate (600ms) so bursts of autopass 'update' events
  trigger a single apply.
- Skip apply when remote state matches current state (canonical fingerprint)
  to avoid redundant restarts and re-pushes.
- Clear remoteUpdateDebounceTimer in cleanup().
2026-03-15 01:44:46 -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 02094e8605 docs: document unit tests and add Unit tests step to CI
CI / Build & Test (push) Successful in 3m21s
- CI: rename Test step to Unit tests
- README: add Testing and linting subsection, link to Contributing
- CONTRIBUTING: expand Testing with test layout table and CI note
- ARCHITECTURE: add Testing section
- INSTALLATION: add npm test to build-from-source steps
2026-03-15 00:34:07 -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 b48734e28b Cleanup: Remove test release certs
CI / Build & Test (push) Successful in 3m21s
2026-03-14 23:42:48 -04:00
Raven Scott 609f5d9353 feat(native-host): kill previous instance on startup and in installers
CI / Build & Test (push) Successful in 3m20s
- Add kill-previous-instance.mjs with PID lock file under BASE_DIR; on
  startup send SIGTERM to any existing native-host before binding ports
- Register removePidFile on shutdown and exit
- Run "stop any running native host" at the start of install.sh and
  install.ps1
- Use ESM with static imports so bare-pack includes the module in the
  bundle (dynamic require was not included and broke the built binary)
- Add kill-previous-instance.mjs to CI syntax check
2026-03-14 23:31:34 -04:00
Raven Scott 3bf9851390 feat(native-host): kill previous instance on startup and in installers
CI / Build & Test (push) Failing after 3m39s
- Add kill-previous-instance.js with PID lock file under BASE_DIR
- On startup, send SIGTERM to any existing native-host process before binding ports
- Register removePidFile on shutdown and exit so the lock is cleared
- Run "stop any running native host" at the start of install.sh and install.ps1
- Add kill-previous-instance.js to CI syntax check
2026-03-14 23:22:43 -04:00
Raven Scott 2693e39040 docs: align docs with implementation
CI / Build & Test (push) Successful in 3m46s
- CONTRIBUTING: use holepunchto/bare repo URL
- NATIVE-HOST: getState servers use url (not hsUrl), no state field
- BACKUP/NATIVE-HOST: backup filenames use holesail-backup- prefix and _ timestamp
- NATIVE-HOST: document createBackup/listBackups path and createdAt
- SSH: clarify that saved password is stored as passwordB64 in state.json
- ARCHITECTURE: note extra state.json settings in SETTINGS_DEFAULTS
2026-03-07 17:35:17 -05:00
Raven Scott ab2660b71a remove releases dir
CI / Build & Test (push) Successful in 3m57s
2026-03-07 17:16:05 -05:00
Raven Scott eed025141a update details about windows
CI / Build & Test (push) Has been cancelled
2026-03-07 17:11:06 -05:00
Raven Scott a07f273e05 seperate bundle for windows
CI / Build & Test (push) Successful in 3m19s
2026-03-07 02:38:03 -05:00
Raven Scott 586a32cc49 revert
CI / Build & Test (push) Successful in 3m45s
2026-03-07 02:18:35 -05:00
Raven Scott 5a5edc4b9f debug logging
CI / Build & Test (push) Failing after 3m22s
2026-03-07 02:12:04 -05:00
Raven Scott 5405e333da tests
CI / Build & Test (push) Successful in 3m38s
2026-03-07 01:49:52 -05:00
Raven Scott 0338a30b41 more testing
CI / Build & Test (push) Successful in 3m49s
2026-03-07 01:34:40 -05:00
Raven Scott 375890d34c pathing for windows
CI / Build & Test (push) Successful in 3m35s
2026-03-07 01:14:46 -05:00
Raven Scott 7c306f182b add tests
CI / Build & Test (push) Successful in 4m14s
2026-03-07 01:02:46 -05:00
Raven Scott b4a9d4d708 fix
CI / Build & Test (push) Successful in 3m47s
2026-03-06 21:59:30 -05:00
Raven Scott 6a85d27bc1 attempts to fix
CI / Build & Test (push) Successful in 4m5s
2026-03-06 21:10:13 -05:00
Raven Scott 9756048636 attempted fix
CI / Build & Test (push) Successful in 3m48s
2026-03-06 21:03:12 -05:00
Raven Scott b54e19dc7d tests
CI / Build & Test (push) Successful in 3m40s
2026-03-06 20:56:51 -05:00
Raven Scott 5fc7edde0e try to fix code sign
CI / Build & Test (push) Successful in 3m44s
2026-03-06 20:50:14 -05:00
Raven Scott ea2daadac5 fix(native-host): resolve "Unexpected end of JSON input" on Windows
CI / Build & Test (push) Successful in 4m6s
Write all path variants for every .json in the bundle when building
for win32 (backslash, with/without leading slash) so bundle.read()
returns content regardless of runtime key normalization. Refill empty
or invalid JSON from alternate key or disk before writing variants.
Explicitly write tt-native package.json under Windows path variants
in Fix 1. Document in CHANGELOG.
2026-03-06 20:33:02 -05:00
Raven Scott 600a1d4f38 fix(native-host): make tt-native load on Windows (SSH PTY)
CI / Build & Test (push) Successful in 3m57s
Use forward-slash addon resolution key for all platforms in the
distributable build so the runtime finds the tt-native prebuild when
the bundle normalizes paths on Windows. Update CHANGELOG and
CONTRIBUTING to document the fix.
2026-03-06 20:22:23 -05:00
Raven Scott 97792dfde0 cleanup
CI / Build & Test (push) Has been cancelled
2026-03-06 20:18:32 -05:00
Raven Scott fe8930b1fd Write tt-native package.json under both bundle key shapes on Windows
CI / Build & Test (push) Successful in 3m49s
After unmount, the runtime may resolve #package with or without a
leading slash. Write the same content to both keys so the .json
loader never gets an empty entry and the host no longer crashes with
"Unexpected end of JSON input" on Windows.
2026-03-06 19:05:51 -05:00
Raven Scott 0e0822aa81 - Build: explicitly write tt-native package.json into the bundle in
CI / Build & Test (push) Successful in 3m47s
patchBundle so the runtime never gets empty content for that key
  (fixes "Unexpected end of JSON input" in Module._extensions..json
  when the host is started by the extension on Windows).
- State: treat empty or whitespace-only state.json (and legacy
  persist file) as missing and return default state instead of
  throwing in JSON.parse.
- State: add ensureStorageDir() and call it from message-router
  after setStoragePath so the storage directory exists on fresh
  install before any state is loaded or saved.
2026-03-06 18:51:53 -05:00
Raven Scott 59f0524739 Document Linux CA install: system store + manual browser import
CI / Build & Test (push) Successful in 3m46s
- SECURITY.md: Note that we install to system store and run
  update-ca-certificates; add that Chrome/Firefox may not use it.
- Add step-by-step instructions to manually import the CA into
  Chrome/Chromium and Firefox on Linux (path to ca.cert.pem).
- INSTALLATION.md: In first-time setup, add Linux note and link
  to SECURITY.md for manual import.
2026-03-06 18:11:45 -05:00
Raven Scott fa9026c481 se pkexec for Linux CA install to show GUI password prompt
CI / Build & Test (push) Successful in 3m37s
- Replace sudo with pkexec so PolicyKit shows a graphical auth dialog
  when the native host is launched by the browser (no terminal).
- Pass DISPLAY and XAUTHORITY into the pkexec env so the polkit
  agent can display the dialog in the current session.
- Keep copy + update-ca-certificates in a single pkexec sh -c for
  one password prompt.
- Update SECURITY.md and JSDoc to describe pkexec / PolicyKit.
2026-03-06 17:59:34 -05:00
Raven Scott ab2ead81c7 Remove test dir, remove releases dir, adds dev releases to ignore.
CI / Build & Test (push) Successful in 3m54s
2026-03-04 01:53:23 -05:00
Raven Scott 7fe1ab5ed1 fix(native-host): use host-specific tt-native resolution so Linux binary loads addon
CI / Build & Test (push) Successful in 3m50s
When building with --all, the bundle used a single addon resolution (darwin-arm64),
so the Linux binary tried to load the wrong prebuild and tt-native failed. Patch
tt-native binding with a nested resolution map (addon → bare → node → platform →
arch) so the runtime selects the correct prebuild per platform; SSH PTY then works
on Linux.

- scripts/build-distributable.js: build host-specific addonResolutions, write
  binding with full map; update comments
- docs/ARCHITECTURE.md, CONTRIBUTING.md: document addon resolution patch
- CHANGELOG.md: add entry under bug fixes
2026-03-04 01:37:35 -05:00
Raven Scott 4165179ae3 ix(native-host): use host-specific tt-native resolution so Linux binary loads addon
CI / Build & Test (push) Successful in 3m49s
When building with --all, the bundle used a single addon resolution (darwin-arm64),
so the Linux binary tried to load the wrong prebuild and tt-native failed. Patch
tt-native binding with a nested resolution map (addon → bare → node → platform →
arch) so the runtime selects the correct prebuild per platform; SSH PTY then works
on Linux.
2026-03-04 01:31:47 -05:00
Raven Scott f9976559bf Builder
CI / Build & Test (push) Successful in 3m54s
2026-03-04 00:37:28 -05:00
Raven Scott b03f67b126 CI
CI / Build & Test (push) Successful in 3m8s
2026-03-04 00:32:31 -05:00
Raven Scott 38459b1855 Fix CI
CI / Build & Test (push) Successful in 2m31s
2026-03-04 00:26:34 -05:00
Raven Scott 80759f8b0c chore(native-host): group modules into proxy/, managers/, host/
CI / Build & Test (push) Successful in 3m12s
- Move connect-proxy and https-proxy into proxy/
- Move certificate-authority, backup-manager, ssh-manager, rdp-manager into managers/
- Move messenger.js into host/
- Move test-dirname.cjs into test/
- Update imports, CI lint paths, and ARCHITECTURE.md
2026-03-03 23:53:51 -05:00
Raven Scott 6c981f708f Remove native-host shims (host.js, holesail-manager.js)
CI / Build & Test (push) Successful in 3m10s
- Import host/message-router.js and holesail-manager/index.js directly
- Delete host.js and holesail-manager.js
- Drop shim entries from CI syntax checks
- Update ARCHITECTURE.md diagram and file table
2026-03-03 23:43:40 -05:00
Raven Scott e2518f8c38 Update CSS - GN
CI / Build & Test (push) Successful in 3m2s
2026-03-03 04:26:27 -05:00
Raven Scott 14683aa407 feat(virtual-hosts): add TLS option for HTTPS/443 backends
CI / Build & Test (push) Successful in 2m54s
- Changelog: document TLS (secure connection) option under new features
- Remove scripts/test-https-server.js and .test-https cert dir
2026-03-03 04:13:57 -05:00
Raven Scott 305bf4de97 add test server
CI / Build & Test (push) Successful in 3m5s
2026-03-03 04:04:50 -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 516d387aca docs: document Firefox support across changelog and docs
CI / Build & Test (push) Successful in 3m8s
- CHANGELOG: add Firefox support subsection (manifest_firefox, background
  scripts, proxy/native-messaging/CSP, installer, pack, extension-id)
- CONTRIBUTING: repo layout with background-boot/main, Firefox load steps
  and private-windows note, install.sh Chrome vs Firefox manifests,
  DEBUG_VERBOSE in background-boot.js
- ARCHITECTURE: manifest.json vs manifest_firefox.json, background.js
  importScripts, background-boot/main and proxy/native-messaging notes,
  native host lifecycle and separate manifests
- INSTALLATION: allowed_origins vs allowed_extensions, Allow in Private
  Windows for Firefox, extension ID updates both manifests
- SECURITY: PAC scope Chrome vs Firefox (autoConfig/data URL), proxy
  security and private-windows requirement
2026-03-03 03:46:16 -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 e18ad5109e Convert license to AGPLV3
CI / Build & Test (push) Successful in 3m8s
2026-03-02 16:35:53 -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 73eb9fe783 fix CI
CI / Build & Test (push) Successful in 2m53s
2026-03-01 13:39:21 -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 440fbf350e fix(ssh): add keyboard-interactive auth and fix SSH_ASKPASS scoping
CI / Build & Test (push) Successful in 2m50s
Most modern SSH servers disable plain password auth and only allow
keyboard-interactive. Excluding it from PreferredAuthentications caused
SSH to exhaust all auth methods and exit immediately.

Also scope SSH_ASKPASS_REQUIRE=force to only apply when a saved password
is provided. Setting it unconditionally broke keyboard-interactive auth
since that method ignores SSH_ASKPASS and reads from the PTY directly.
2026-03-01 11:21:45 -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 9e70c48d48 debug & ci
CI / Build & Test (push) Successful in 2m47s
2026-03-01 03:51:11 -05:00