Commit Graph
213 Commits
Author SHA1 Message Date
Raven Scott 2704dd8d4e fixes for z-index
CI / Build & Test (push) Successful in 3m27s
2026-07-26 02:26:46 -04:00
Raven Scott 775a9c44be sync changes
CI / Build & Test (push) Successful in 3m30s
2026-07-26 02:09:52 -04:00
Raven Scott 07647422e7 docs
CI / Build & Test (push) Successful in 3m40s
2026-07-26 01:53:13 -04:00
Raven Scott 0c360793ef ACLs
CI / Build & Test (push) Successful in 3m28s
2026-07-26 01:46:32 -04:00
Raven Scott 16f4ce3570 hs1 sync system test
CI / Build & Test (push) Successful in 3m25s
2026-07-26 01:33:04 -04:00
Raven Scott 5a5a9bee9c fix(sync): apply live Autopass updates including intentional empties
CI / Build & Test (push) Successful in 4m26s
Stop dropping peer deletes when the synced snapshot is empty (e.g. last
vhost removed with syncServers off). Trust Autopass LWW instead of
rejecting lower stateRevision, avoid bumping revision on device-name
status pushes, and retry push after sync warmup if Autopass was not open yet.
2026-07-26 00:55:14 -04:00
Raven Scott db640644bf fix(sync): stop syncServers=false from wiping local tunnels
CI / Build & Test (push) Successful in 4m24s
Default sync omitted servers as [], which made every remote apply delete
local servers and later saves persist the empty list. Omit unsynced
collections, serialize apply/push, reject stale revisions, and write
state.json atomically with backup recovery.
2026-07-25 23:23:23 -04:00
Raven Scott a3092fed78 Update Bare/Holepunch deps and adapt for bare-tls 3
CI / Build & Test (push) Successful in 4m29s
Bump host stack (autopass, corestore, bare-ws/https/tls/path) and bare-build 1.x; disable TLS verification for tunnel backends and pass device name into Autopass.pair.
2026-07-25 23:15:58 -04:00
Raven Scott dc29b6481c fixes for popouts
CI / Build & Test (push) Successful in 4m14s
2026-03-27 05:32:32 -04:00
Raven Scott 71da662e8c resolve warnings
CI / Build & Test (push) Successful in 4m19s
2026-03-27 05:01:59 -04:00
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