Commit Graph

173 Commits

Author SHA1 Message Date
Jinwoo Hong 8afa84af82
Fix terminal switch input lag from daemon session listing (#7002)
Co-authored-by: Orca <help@stably.ai>
2026-07-01 13:19:50 -07:00
Dhilip Subramanian 9694830764
Document headless Linux server setup (#6802)
* docs: add headless Linux server guide

* docs: add ldd/appimage-extract tip for diagnosing missing libraries

Salvaged from #6817 before closing it as a duplicate.

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

---------

Co-authored-by: Jinwoo-H <jinwoo@stably.ai>
Co-authored-by: Orca <help@stably.ai>
2026-06-30 00:04:47 -07:00
ppw-stack 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
Brennan Benson c37ab96b57
Remove split terminal from onboarding checklist (#6340)
Co-authored-by: Orca <help@stably.ai>
2026-06-25 01:49:56 -07:00
OrcaWin 7e1c4ee929
Follow up Windows terminal onboarding polish (#5530)
Co-authored-by: Neil <neil@stably.ai>
2026-06-16 14:59:35 -07:00
OrcaWin 68abadba81
Add Windows terminal onboarding step (#5488)
Co-authored-by: Neil <neil@stably.ai>
2026-06-16 14:07:26 -07:00
Brennan Benson 64acad300d
Add Floating Workspace contextual tour (#5062)
* Add floating workspace contextual tour

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

* Clarify floating workspace tour intro copy

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

* Differentiate floating workspace tour steps instead of repeating examples

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

* Lead floating workspace tour with the user benefit

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

* Pitch floating workspace tour around cross-repo agents

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

* Refine floating workspace tour step 1 copy

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

* Anchor floating workspace tour step 2 on the minimize control

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

* Restore floating workspace tour step 2

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

* Anchor floating workspace tour steps on New Terminal and New Markdown Note

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

* Retitle floating workspace tour step 2 as scratchpad

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

* Add why-comments for tour selector fallback and placement flipping

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

---------

Co-authored-by: Orca <help@stably.ai>
2026-06-10 14:12:07 -07:00
Brennan Benson 2fa2cc8cb1
Fix git repo telemetry for repo adds (#5121)
Co-authored-by: Orca <help@stably.ai>
2026-06-10 13:24:49 -07:00
Jinjing 263c4f9bd2
fix: address review findings (#4865) 2026-06-07 22:17:52 -07:00
Jinwoo Hong bed394ca11
Send OpenCode source-control prompts over stdin (#4859)
Co-authored-by: Orca <help@stably.ai>
2026-06-07 21:00:20 -07:00
Jinwoo Hong 3ef63c972a
Persist agent session metadata for workspace resume (#4706)
Co-authored-by: Orca <help@stably.ai>
2026-06-07 19:41:25 -07:00
Brennan Benson 7b6e8e0ced
Remove final code onboarding step (#4524)
Co-authored-by: Orca <help@stably.ai>
2026-06-03 23:57:53 -07:00
Brennan Benson 5142a24536
Simplify project add handoff (#4530)
Co-authored-by: Orca <help@stably.ai>
2026-06-03 16:50:35 -07:00
Brennan Benson 38f12e8df4
Track parallel work education telemetry (#4449)
Co-authored-by: Orca <help@stably.ai>
2026-06-01 23:29:28 -07:00
Brennan Benson d4a4a2aee4
Remove covered onboarding steps (#4445)
Co-authored-by: Orca <help@stably.ai>
2026-06-01 23:00:26 -07:00
Brennan Benson 5b1f297078
Add contextual feature tours (#2734)
Co-authored-by: Orca <help@stably.ai>
2026-06-01 21:20:15 -07:00
Neil c0eb15b311
chore: remove tracked audit ledgers (#4031) 2026-05-31 01:52:33 -07:00
Neil b4dba9af73
fix: detach macos resolver probe listeners
Detach scutil stream and child process listeners when the macOS resolver probe settles, with listener-count regression coverage. Risk: low.
2026-05-31 01:48:30 -07:00
Neil 41cbdb1d1d
fix: clear completed PR request generations 2026-05-31 01:35:21 -07:00
Neil ddbb6a1e7d
Update oxlint and oxfmt 2026-05-30 13:09:17 -07:00
Neil 80a2b6195b
docs: remove local memory leak audit tracker (#3381) 2026-05-29 16:53:21 -07:00
Neil 22bc5fdc07
Remove tracked React perf audit ledger (#3379) 2026-05-29 16:50:44 -07:00
Neil 431b336f1b
Document project column preference audit (#3375) 2026-05-29 16:39:10 -07:00
Neil 0cc3bd77bc
docs: update final memory leak comb after rebase (#3373) 2026-05-29 16:34:08 -07:00
Neil a99c376f3b
Document upstream feature tip effect audit (#3372) 2026-05-29 16:32:21 -07:00
Neil a1496d54d4
Document upstream React effect baseline (#3369) 2026-05-29 16:25:10 -07:00
Neil aeadf5a035
Document activity portal subscription audit (#3368) 2026-05-29 16:20:02 -07:00
Neil 399ad3e42d
Document workspace board interaction audit (#3366) 2026-05-29 16:13:49 -07:00
Neil 5ec0e9ad5b
Document Space page interaction audit (#3362) 2026-05-29 16:05:24 -07:00
Neil f150310561
Document contextual copy cleanup audit (#3357) 2026-05-29 15:58:04 -07:00
Neil c7cd858503
Document diff comment card resize audit (#3355) 2026-05-29 15:51:55 -07:00
Neil 498a824fa9
Document SSH passphrase focus audit (#3353) 2026-05-29 15:45:03 -07:00
Neil 2da2a86c3f
Document font autocomplete effect audit (#3350) 2026-05-29 15:32:57 -07:00
Neil 52344fc7c2
Document file explorer inline focus audit (#3348) 2026-05-29 15:26:37 -07:00
Neil c5868af126
Document terminal search effect audit (#3345) 2026-05-29 15:18:43 -07:00
Neil 7751af26c4
Document status bar account usage perf PR (#3342) 2026-05-29 15:11:01 -07:00
Neil 5dfc0454ed
Document markdown annotation focus perf PR (#3339) 2026-05-29 15:04:14 -07:00
Neil 5bb8b106a0
Document diff comment popover focus perf PR (#3336) 2026-05-29 14:58:17 -07:00
Neil 5a55d5828e
Document file search focus perf fix (#3331) 2026-05-29 14:53:21 -07:00
Neil 6cfdb77b56
Document editor header rename focus perf PR (#3329) 2026-05-29 14:44:10 -07:00
Neil 22266895fa
Document rich markdown menu selection perf PR (#3327) 2026-05-29 14:37:14 -07:00
Neil bb5a435ae8
Record markdown preview search focus audit PR (#3323) 2026-05-29 14:25:32 -07:00
Neil e1c3fb74c8
Record image viewer preview audit PR (#3319) 2026-05-29 14:19:00 -07:00
Neil a8d2376703
Record markdown link bubble focus audit PR (#3317) 2026-05-29 14:09:33 -07:00
Neil edc839ff4a
Record terminal tab rename focus audit PR (#3315) 2026-05-29 14:02:00 -07:00
Neil 9c0ee0a2d6
Record tab entry selection reset PR (#3312) 2026-05-29 13:44:33 -07:00
Neil f99492927c
Record upstream React effect count drift (#3309) 2026-05-29 13:35:35 -07:00
Neil ca15aeb466
docs: record final memory leak audit comb (#3308) 2026-05-29 13:31:20 -07:00
Neil d4b67da8b6
Record editor tab rename focus PR (#3304) 2026-05-29 13:22:28 -07:00
Jinwoo Hong 606eef5839
Add direct URL and file entry to tab menu (#3026)
Co-authored-by: Orca <help@stably.ai>
2026-05-29 13:14:57 -07:00