Commit Graph
45 Commits
Author SHA1 Message Date
Jinwoo-HandOrca 65d44d72f7 docs(ssh): gate arm64 build-input diagnostic
Co-authored-by: Orca <help@stably.ai>
2026-07-14 14:18:47 -04:00
Jinwoo-HandOrca 0d3a0c9d3f test(ssh): diagnose generated arm64 build inputs
Co-authored-by: Orca <help@stably.ai>
2026-07-14 14:16:12 -04:00
Jinwoo-HandOrca a6b423f33f docs(ssh): gate MSVC determinism correction
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:58:15 -04:00
Jinwoo-HandOrca a51093f009 docs(ssh): record full PE scan gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:39:07 -04:00
Jinwoo-HandOrca 27c6a5718c docs(ssh): record bounded PE diagnostic evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:21:13 -04:00
Jinwoo-HandOrca 39ee3451b8 build(ssh): diagnose Windows PE reproducibility drift
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:19:46 -04:00
Jinwoo-HandOrca a7151f9750 docs(ssh): record arm64 reproducibility boundary
Co-authored-by: Orca <help@stably.ai>
2026-07-14 13:08:01 -04:00
Jinwoo-HandOrca de541efd11 docs(ssh): record builder parser correction
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:54:04 -04:00
Jinwoo-HandOrca 25ca53910d docs(ssh): record builder parser boundary
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:52:02 -04:00
Jinwoo-HandOrca 54df2cb998 docs(ssh): record native linker correction
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:40:31 -04:00
Jinwoo-HandOrca c62b0d0a95 docs(ssh): record native reproducibility red
Co-authored-by: Orca <help@stably.ai>
2026-07-14 12:08:20 -04:00
Jinwoo-HandOrca 09b047f4ee docs(ssh): record clean-build oracle gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:52:07 -04:00
Jinwoo-HandOrca c70e96374c test(ssh): gate runtime clean-build identity
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:49:48 -04:00
Jinwoo-HandOrca d35ab55b9f docs(ssh): record native Windows runtime proof
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:35:19 -04:00
Jinwoo-HandOrca d9a556b9c8 docs(ssh): record ConPTY worker settlement gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:23:18 -04:00
Jinwoo-HandOrca c04b4f6300 fix(ssh): settle copied Windows ConPTY worker
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:20:42 -04:00
Jinwoo-HandOrca 2aaea70465 docs(ssh): record Windows resource diagnostic gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:05:43 -04:00
Jinwoo-HandOrca 6bba900209 test(ssh): classify lingering Windows smoke resources
Co-authored-by: Orca <help@stably.ai>
2026-07-14 11:05:09 -04:00
Jinwoo-HandOrca b6291e55b1 docs(ssh): record Windows smoke settlement gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:53:50 -04:00
Jinwoo-HandOrca ddf28eb8db test(ssh): settle Windows runtime PTY smoke
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:52:54 -04:00
Jinwoo-HandOrca df661e3701 docs(ssh): record Windows smoke timeout gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:36:47 -04:00
Jinwoo-HandOrca 3aab5aff8c test(ssh): preserve runtime smoke failure details
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:36:28 -04:00
Jinwoo-HandOrca 42aa02fa9e docs(ssh): record Windows GPG path gate
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:24:00 -04:00
Jinwoo-HandOrca b6903b2205 fix(ssh): keep GPG verification paths portable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:23:38 -04:00
Jinwoo-HandOrca b387ac48cd test(ssh): preserve Windows verification fixtures
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:14:48 -04:00
Jinwoo-HandOrca ef94c90663 test(ssh): keep relay CLI modules importable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:11:21 -04:00
Jinwoo-HandOrca 55f7137c6e test(ssh): make relay tar fixture portable
Co-authored-by: Orca <help@stably.ai>
2026-07-14 10:07:55 -04:00
Jinwoo-HandOrca 539cd060e7 docs(ssh): record Windows runtime artifact gates
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:59:58 -04:00
Jinwoo-HandOrca 922edb6ff2 build(ssh): add Windows relay runtime artifacts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:58:21 -04:00
Jinwoo-HandOrca c308107a96 docs(ssh): record native runtime artifact CI
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:23:40 -04:00
Jinwoo-HandOrca 151628992f fix(ssh): canonicalize runtime watcher smoke paths
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:10:28 -04:00
Jinwoo-HandOrca f8a230ef30 docs(ssh): record runtime artifact draft PR
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:04:47 -04:00
Jinwoo-HandOrca f2b387b21b build(ssh): assemble relay runtime artifacts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 09:03:25 -04:00
Jinwoo-HandOrca 0c299fe189 docs(ssh): record relay contract CI
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:58:41 -04:00
Jinwoo-HandOrca 6732d911a8 docs(ssh): link relay contract evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:44:23 -04:00
Jinwoo-HandOrca b9d80a4cbc feat(ssh): define relay runtime artifact contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:43:28 -04:00
Jinwoo-HandOrca 959bc05cac docs(ssh): link safety decision evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:15:52 -04:00
Jinwoo-HandOrca 5c37e8efeb docs(ssh): close relay safety contracts
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:14:40 -04:00
Jinwoo-HandOrca 12291e1ad0 docs(ssh): link baseline decision evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:01:19 -04:00
Jinwoo-HandOrca a84d52dc63 docs(ssh): close runtime baseline decisions
Co-authored-by: Orca <help@stably.ai>
2026-07-14 07:00:30 -04:00
Jinwoo-HandOrca 9a8f98fd9b docs(ssh): record WP0 CI evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:51:29 -04:00
Jinwoo-HandOrca 94e58d83ea docs(ssh): record WP0 draft PR evidence
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:35:12 -04:00
Jinwoo-HandOrca 2b67de8701 docs(ssh): add relay runtime distribution plan
Co-authored-by: Orca <help@stably.ai>
2026-07-14 06:28:26 -04:00
Jinwoo HongandOrca 25ecf2eea2 fix: reconcile SSH repo rows after host re-add (#8201)
Co-authored-by: Orca <help@stably.ai>
2026-07-11 03:20:55 -07:00
299bc421e2 feat(mobile-pairing): combobox with manual network address entry (#6501)
* docs(spec): manual network address entry for mobile pairing

* docs(plan): manual network address entry for mobile pairing

* docs(plan): fix two test-spec issues in Task 1

* feat(mobile-pairing): add parseManualNetworkAddress validator

* docs(plan): fix buildComboboxEntries filter rule

* feat(mobile-pairing): buildComboboxEntries for network interface combobox

* feat(mobile-pairing): combobox with manual address entry

* docs(spec): align buildComboboxEntries behavior with corrected plan

* fix(mobile-pairing): use text-destructive token for inline error

* fix(mobile-pairing): route Use row through translate() with i18next interpolation

* refactor(mobile-pairing): extract NetworkInterfaceCombobox shared by MobileHero and Settings section

The Popover + Command + manual-entry UX lived only in the Settings →
Mobile → Network Interface section. The mobile pairing screen
("Step 2 of 2 — Pair this computer") had its own copy of the same
Select-based dropdown that did not support manual address entry. A
user trying to pair with a Tailscale MagicDNS hostname from the
pairing screen could not enter it.

Extract the typeable combobox into a shared
`NetworkInterfaceCombobox` component. Both surfaces now render the
same Popover + Command with manual address entry, the `Use "..."`
row, the inline validation error, and the `(custom)` trigger label.
Settings keeps its own Generate QR button, Refresh + Tooltip, and
Tailnet accordion around the combobox. The pairing screen keeps its
existing layout (label + combobox + refresh icon).

Net deletion: ~160 lines. Net behavior gain: manual address entry is
now reachable from both surfaces, not only Settings.

* style(ui): give CommandInput a visible background so the search box is not lost

The Popover content above the CommandList renders the cmdk CommandInput
with only a thin bottom border. Against a white popover background it
visually disappears, especially in the mobile pairing screen where the
popover sits inside a dark phone mockup. Add a subtle `bg-muted/30` +
`py-1` so the input row is unambiguous, without changing the input's
shape or behavior.

* fix(mobile-pairing): drop cmdk CommandItem, use plain buttons inside Popover

In `pnpm dev` HMR cycle the cmdk CommandItem `onSelect` dispatch was
unreliable — clicking the item fired the synthetic event but the parent
React state never received it, so the trigger label never updated after
the user picked a manual address or a refreshed interface.

Replace the `Command` + `CommandItem` primitives inside
NetworkInterfaceCombobox with a native `<input>` + `<button>` list
wrapped by Radix `Popover`. The list now responds to the user's first
click without any intermediate effect that could be skipped in dev mode.
The combobox keeps the same props contract, the same placeholder, the
same inline validation, and the same `Use "<address>"` row at the
bottom of the list.

Update MobileNetworkInterfaceSection.test.tsx selectors from
`role=option` (cmdk's) to `role=button` so the integration test still
asserts the right element. All 479 feature tests still pass.

* debug(mobile-pairing): log handleSelect* invocations to confirm click path

* fix(mobile-pairing): commit on pointerdown to beat Radix Popover close race

In dev mode Radix Popover's close-on-pointerdown handler occasionally
fires before React's synthetic click dispatch reaches the option button,
so the parent's selectedAddress never updates after the user picks a
manual address. Bind the commit handler to pointerdown (synchronous,
before any pointer-up / click synthesis) and call event.preventDefault()
to avoid text-selection side effects. Keep onClick as a fallback so
keyboard / touch / programmatic-dispatch paths still work.

* fix(mobile-pairing): keep manually-typed addresses across network refresh

`selectRefreshedNetworkAddress` used to fall back to the first OS
interface whenever `currentAddress` wasn't in the OS-enumerated
list — so a user who typed a Tailscale MagicDNS name saw their
selection snap back to LAN every time `loadNetworkInterfaces`
returned. Treat manual entries as sticky by passing an
`isManual` flag from the caller; `selectRefreshedNetworkAddress`
now keeps the address when the caller says the user typed it.

`MobilePage` tracks `addressIsManual` alongside
`selectedAddress`: `handleAddressChange` flips it on when the
picked address is not in the OS list, and `loadNetworkInterfaces`
passes it through so refresh keeps the choice.

* chore(mobile-pairing): remove debug logs and sync new-combobox-listbox i18n key

* fix(mobile-pairing): address CodeRabbit review on manual-address lifecycle

Three real bugs from review, plus a regression test:

1. NetworkInterfaceCombobox in MobileHero was disabled when
   `networkInterfaces.length === 0`, which locked users out of the
   only path to type a manual address during a transient empty
   discovery. Pass `disabled={false}` and let the combobox's
   own empty-state copy explain the situation.

2. `selectRefreshedNetworkAddress` returned `undefined` whenever
   `interfaces.length === 0`, even if the user had a manual
   address and `currentAddressIsManual` was true. Keep the manual
   address so a recovering discovery doesn't clobber it.

3. `loadNetworkInterfaces` could rewrite `selectedAddress` (e.g.
   when a refresh swaps to a freshly-discovered tailnet) but never
   updated `addressIsManual`, so the next refresh could revert
   the user back to LAN. Re-derive `addressIsManual` from the
   new address after every refresh.

Adds a regression test in
`mobile-network-interface-selection.test.ts` exercising the
empty-refresh + manual path.

* style(mobile-pairing): trim disabled-false comment to two lines

* refactor(mobile-pairing): replace typeable combobox with select + custom-address dialog

The Settings/MobileHero network selector used a Popover+search-input hybrid
that looked uneven and hid its validation error behind the open popover.

Replace it with a plain Select of discovered interfaces plus an
'Add custom address…' footer row that opens a small dialog for entering a
Tailscale hostname or static IP. Drops the 'MagicDNS' jargon for plainer
copy, keeps the '(custom)' trigger label, and routes all strings through
translate() with real es/ja/ko/zh translations. Removes the now-dead
buildComboboxEntries helper. Also adds the missing scrollbar-sleek class
the old list omitted (was failing pnpm lint).

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: ppw-stack <ppw-stack@users.noreply.github.com>
Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com>
Co-authored-by: Orca <help@stably.ai>
2026-06-29 00:32:36 -07:00