Repository navigation
feat: name runtime machines - #22094
Conversation
There was a problem hiding this comment.
Important
Two defects sit in the new orca host name handler: the --name path prints undefined because the settings.update reply is { settings }, and the read path stamps a routed answer with _meta.runtimeId: "local".
Reviewed changes
- New
orca host nameCLI command — reads the answering runtime's name/platform fromstatus.get, or writes one throughsettings.update;host nameis now routable whilehost liststays pinned local (index.ts:37). - Runtime machine name —
RuntimeMachineNameresolves a configured override, else a detected name (scutil --get ComputerNameon macOS,os.hostname()otherwise), published as an optionalmachineNameonRuntimeStatus. - Settings plumbing —
machineNameadded toGlobalSettings(default''), trimmed on load and IPC, projected to paired clients, and accepted by the strictSettingsUpdate. host list/environment listoutput — each paired environment is now queried for its name/platform, and listings show(machineName)and platform.- Desktop pairing screen — new machine-name field on
MobilePairingSetupSectionfed by auseDetectedMachineNamehook, with the pairing output sections extracted intoMobilePanePairingOutput. - Mobile —
machineNamethreaded throughhost-status-gates.ts,use-mobile-home-host-connections.ts, and theMobileHomeHostListprop type.
ℹ️ SettingsUpdate is strict, so machineName is rejected wholesale by an older host
SettingsUpdate ends in .strict() (client-settings-params.ts:123), and old hosts do not know the new key. host name is now routable, so orca host name --name X --environment old-server sends machineName to a host whose decoder rejects the entire payload — the user gets an opaque validation error rather than "that runtime can't be renamed". A new optional reply field is safe, but a new request field is only safe if the peer tolerates unknown keys, which strict decoding does not.
Technical details
# New request field against a strict decoder
## Affected sites
- `src/shared/rpc-contract/client-settings-params.ts:82-123` — `SettingsUpdate` is `.strict()`, so `machineName` fails validation on a host predating it.
- `src/cli/handlers/environment.ts:30-36` — the only new sender; can be routed via `--environment` / `ORCA_ENVIRONMENT` to an older paired server.
- `mobile/src/tasks/task-runtime-reply-schema.ts:110-119` — notes `settings.update` sent from mobile is fire-and-forget, so a rejection there is currently invisible.
## Required outcome
- Decide whether renaming a host that predates the field should fail as unsupported (preferred) or be silently ignored, and make the failure legible. If the field must stay, verify the host-side decode path does not reject the whole update.
## Open questions for the human
- Is `settings.update` from mobile expected to carry `machineName` in a later PR? If so, an old host rejecting the payload would also drop whatever else that update carried.DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
d7ade23 to
ac6450c
Compare
Listing paired servers read each one's machine name by dialing it, so both listings made a network round trip per server and waited out a timeout on any that were offline. They answer from this machine's own pairing store; `orca host name --environment <name>` reads one server's name.
The caption read the runtime's published name once, when the pane opened, so saving an override left it naming the old computer while phones already showed the new one. It now re-reads whenever the saved override changes; the settings write lands in the main process before the store publishes it, so that read already sees the new name. The name is interpolated rather than baked into the fallback, and the caption, label and placeholder are in the English catalog.
b30b287 to
1191973
Compare
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (24)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: Your plan provides up to 10 included reviews per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe change adds configurable machine names to shared settings and runtime status. The runtime detects a default name and reports the configured or detected value. The CLI can display or set a runtime name, and the mobile settings pane can edit it. Runtime-backed web settings read and update the name. Remote-workspace presence and the terminal handoff host label use the runtime’s current name. Priority: ➖ Normal Merge Risk: 🟡 Moderate · up to Settings can show the wrong machine name or report a rename as saved when the paired runtime rejected it. Resolve those mismatches before merging; the transient mobile caption failure is narrower. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: 726a02d4-3969-4e64-b36b-e41dd6b16389
📒 Files selected for processing (29)
src/cli/format.tssrc/cli/handler-group-manifest.tssrc/cli/handlers/environment.tssrc/cli/index-local-command-routing-flags.test.tssrc/cli/index.tssrc/cli/specs/environment.tssrc/cli/workspace-format.tssrc/main/ipc/settings.tssrc/main/persistence/loading-store/normalize-loaded-global-settings.test.tssrc/main/persistence/loading-store/normalize-loaded-global-settings.tssrc/main/runtime/orca-runtime-get-status.tssrc/main/runtime/orca-runtime-state-fields.tssrc/main/runtime/runtime-client-settings-minimax-projection.test.tssrc/main/runtime/runtime-client-settings.tssrc/main/runtime/runtime-extraction-regressions.test.tssrc/main/runtime/runtime-machine-name.test.tssrc/main/runtime/runtime-machine-name.tssrc/main/runtime/runtime-store-contract.tssrc/renderer/src/components/settings/MobilePairingSetupSection.test.tsxsrc/renderer/src/components/settings/MobilePairingSetupSection.tsxsrc/renderer/src/components/settings/MobilePane.tsxsrc/renderer/src/components/settings/MobilePanePairingOutput.tsxsrc/renderer/src/components/settings/use-published-machine-name.test.tsxsrc/renderer/src/components/settings/use-published-machine-name.tssrc/renderer/src/i18n/locales/en.jsonsrc/shared/default-global-settings.tssrc/shared/global-settings-types.tssrc/shared/rpc-contract/client-settings-params.tssrc/shared/runtime-session-contracts.ts
Included review availability: Your plan provides up to 10 included reviews per hour; 4 remain after this review.
| machineName: | ||
| typeof parsed.settings?.machineName === 'string' ? parsed.settings.machineName.trim() : '', |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
Enforce the length limit when loading persisted settings.
A hand-edited or imported profile bypasses SettingsUpdate and sanitizeRendererSettingsUpdate. This path trims machineName but does not apply the 255-character limit. The runtime can then publish an oversized name to connected clients. Slice the normalized value to the same limit and add a persisted-profile test case.
There was a problem hiding this comment.
ℹ️ No new blocking issues in this delta — one minor suggestion inline. The two
orca host namedefects flagged in the prior review are untouched by these commits and remain open.
Reviewed changes
- Listings stay local —
host listandenvironment listno longer dial each paired server for a name/platform;host listreads the local runtime's own name once, so an offline server can no longer stall the listing. - Machine-name caption re-reads —
useDetectedMachineNamebecomesusePublishedMachineName, re-reading the published name whenever the saved override changes so the caption never names the computer it replaced. - Pairing output extracted — the QR, firewall, paired-device, and auto-restore sections move into
MobilePanePairingOutput(MobilePane hit max-lines), withselectedAddressretyped tostring | undefinedto match its caller.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
The trim and length rules for `machineName` were spelled out separately at the renderer IPC (trim + 255), the settings load path (trim only, no cap), the RPC schema (zod trim + 255) and the runtime reader (trim). A hand-edited or legacy profile could therefore load a longer name than any writer accepts. `src/shared/machine-name.ts` now owns `MACHINE_NAME_MAX_LENGTH` and `normalizeMachineName`, and every writer and the load path use it. The RPC schema keeps rejecting over-long names but derives its cap from the constant, and the runtime settings controller normalizes an RPC write before storing it.
Every runtime constructed in a process (the app, plus each one a test builds)
ran its own `scutil` lookup. The friendly name is a property of the host, so the
lookup is now a single shared promise; construction still never blocks on it,
and a rejected lookup can no longer surface as an unhandled rejection.
The structured-chat handoff banner ("Agent is open in terminal on X") named this
host with the bare `os.hostname()` while paired devices saw the published name.
The transport now reads the same `RuntimeMachineName`, through a getter so a
rename in Settings is reflected without rebuilding the transport.
`orca host name --name X` printed `undefined`: `settings.update` replies with
`{ settings }`, but the handler read a bare `machineName` off the reply, and the
test fixture mirrored the wrong shape so it passed. After a write the command
now re-reads `status.get` and prints what the runtime publishes, so a blank
`--name` prints the detected name it returned to rather than an empty string.
The read path wrapped a possibly routed answer in a local envelope, stamping
`_meta.runtimeId: "local"` on a reply from another server. It now returns the
`status.get` envelope itself, and an unreachable runtime is reported as the
usual error instead of an invented "unknown" name.
`environment list` had gained machine-name and platform columns that no caller
populated, so every row printed "platform unknown"; the columns are removed.
The caption under the field re-read runtime status every time the saved value changed, relying on a comment about write ordering to show the new name. A saved override already is what paired devices see, so the hook now derives the caption from it and asks the runtime only for the detected name; a stale status read can no longer show the previous name. `MobileMachineNameField` owns the store read, the published-name hook and the debounced input, so `MobilePairingSetupSection` returns to its prop shape and the pass-through `MobilePanePairingOutput` wrapper is gone. Paired-device revocation moves into `useMobilePairedDeviceRevocation`, which keeps `MobilePane` within its line budget with an extraction that carries behavior. The web client mounts this pane too, but its settings store kept the name locally where nothing published it. `machineName` now rides the existing runtime-backed settings sync so the field renames the paired runtime.
There was a problem hiding this comment.
Actionable comments posted: 3
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: cc96bae0-92a4-4f7d-a9d3-b748ccb65322
📒 Files selected for processing (25)
src/cli/format.tssrc/cli/handlers/environment.tssrc/cli/index-local-command-routing-flags.test.tssrc/main/ipc/settings.test.tssrc/main/ipc/settings.tssrc/main/persistence/loading-store/normalize-loaded-global-settings.test.tssrc/main/persistence/loading-store/normalize-loaded-global-settings.tssrc/main/runtime/orca-runtime-get-worktree-ps.tssrc/main/runtime/runtime-client-settings-minimax-projection.test.tssrc/main/runtime/runtime-client-settings.tssrc/main/runtime/runtime-extraction-regressions.test.tssrc/main/runtime/runtime-machine-name.test.tssrc/main/runtime/runtime-machine-name.tssrc/renderer/src/components/settings/MobileMachineNameField.test.tsxsrc/renderer/src/components/settings/MobileMachineNameField.tsxsrc/renderer/src/components/settings/MobilePane.tsxsrc/renderer/src/components/settings/use-mobile-paired-device-revocation.tssrc/renderer/src/components/settings/use-published-machine-name.test.tsxsrc/renderer/src/components/settings/use-published-machine-name.tssrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/web/preload-api/web-preferences-store.tssrc/renderer/src/web/web-preload-api-machine-name.test.tssrc/shared/machine-name.test.tssrc/shared/machine-name.tssrc/shared/rpc-contract/client-settings-params.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- src/main/persistence/loading-store/normalize-loaded-global-settings.test.ts
- src/renderer/src/i18n/locales/en.json
Included review availability: Your plan provides up to 10 included reviews per hour; 2 remain after this review.
| return () => { | ||
| cancelled = true | ||
| } | ||
| }, [override]) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Retry a transient status-read failure.
If getStatus() rejects while the runtime starts, the effect does not read status again while override stays blank. The field keeps its generic placeholder even after the runtime becomes ready. Retry while the field is mounted, and cancel the retry on cleanup. React reruns this effect only when its dependency changes. (react.dev)
| if (typeof updates.machineName === 'string') { | ||
| runtimeUpdates.machineName = normalizeMachineName(updates.machineName) | ||
| } |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Do not report a machine-name update before the runtime accepts it.
If settings.update fails, settings.set has already persisted the new name locally. syncRuntimeBackedSettings then returns localNext for this update, so the UI reports a successful rename while the paired runtime still publishes its old name. Require an acknowledged machineName update before retaining the local value; propagate failure or restore the previous value. Cover the failure path in a test. (raw.githubusercontent.com)
Every writer (desktop IPC, web RPC, CLI) reaches the store through updateSettings, which already normalizes the other free-text settings there. Trim and bound the machine name in that one place instead of at two upstream edges, so a future main-process writer is covered too.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
This run re-reviewed the four commits pushed since the prior pullfrog review at 1191973. Both open orca host name defects and the environment list formatting note are now fixed, and the follow-on refactors are clean.
orca host nameprints the runtime's own answer — the write path no longer reads.machineNameoff thesettings.update{ settings }envelope; both paths now print thestatus.getresult inside that runtime's envelope, so a routed answer carries its real_meta.runtimeIdand a blank--nameprints the detected name.- One machine-name normalizer —
normalizeMachineName/MACHINE_NAME_MAX_LENGTHmove intosrc/shared/machine-name.tsand are applied on persisted load, renderer IPC sanitize, paired-client projection, the RPC schema, and the web preferences store. - Detection runs once per process —
detectRuntimeMachineNameOnceshares the macOSscutillookup across runtimes, and the structured-handoff transport labels hosts through ahostLabelgetter that reads the published name live, so a Settings rename reaches later handoffs. - Machine-name field extracted — the field becomes its own
MobileMachineNameFieldcomponent with its own test, and paired-device revocation moves touseMobilePairedDeviceRevocation. formatEnvironmentListcolumn reverted —environment listno longer prints aplatform/machineNamecolumn it has no source for.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at 159aa4d.
- Machine-name normalization moved to the store boundary —
normalizeMachineNamenow runs inupdateSettings(src/main/persistence/applying-settings/settings-update.ts), the one boundary desktop IPC, the web RPC and the CLI all cross, so the persisted name is the trimmed, bounded form no matter which client wrote it. The now-redundant copies insanitizeRendererSettingsUpdateandRuntimeClientSettingsController.updateare removed. - Projection reads the stored value —
RuntimeClientSettingsController.get()returnssettings.machineName ?? '', relying on the boundary to have normalized it. - Boundary test added —
settings-update-machine-name.test.tscovers trimming, the length cap, blank/non-string writes, and that listeners receive the normalized value; the old IPC-level test is removed.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
…field searchable The shared machine-name lookup test spawned the real `scutil` twice and compared the answers, so a slow runner could time one spawn out to the hostname and fail. It now mocks the subprocess, proves the hostname answers until the one shared lookup lands, and that a second runtime does not spawn again. `host name` is no longer pinned local, but only the explicit `--environment` route was covered; an ambient `ORCA_ENVIRONMENT` now has its own test so the pin cannot silently grow back. The Machine name field is added to the Mobile pane's search catalog at the tail, keeping every existing row's tie-break index.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor test-coverage suggestion inline.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at 87e4967.
- Machine name is now searchable —
getMobilePaneSearchEntriesgains a "Machine name" entry withmachine/hostname/computer/renamekeywords, the matching keys are added toen.json, and the catalog test's expected titles are extended. host namerouting pinned by test — a new CLI case proveshost namehonours an ambientORCA_ENVIRONMENT(the client is built withundefined, undefined, not the localnull, null), unlike the pinnedhost list.- Shared detection test reworked —
runtime-machine-name.test.tsmocksrunProcessand asserts two runtimes plus a repeatedstart()share one lookup, replacing the flaky live-scutilassertion.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
A status read answered in the first few milliseconds after launch published the bare hostname because the friendly-name lookup had not landed yet, and a caption fetched in that window never corrected itself. RuntimeMachineName now exposes the settled lookup as a promise, and both status publishers (the status.get RPC and the desktop runtime:getStatus IPC) await it before reading. Construction, listen, and every other method stay unblocked; the worst case is one wait of at most a second on the first read.
…name An older Orca runtime rejects the unknown settings field with a bare invalid_params, so 'orca host name --name' routed at one failed with no explanation. The runtime that does not publish machineName on status cannot store one either, so the CLI reads status first and refuses with incompatible_runtime and a message that says to update that host, before writing anything.
When this desktop connected to a remote workspace host it announced itself under a hostname captured once at module load, so a renamed machine kept its old name on every other device's connected-clients list. The client name is now read at send time from the runtime's machine name (the configured override, else the detected one), passed in where the remote workspace handlers are registered, so a rename reaches the next presence frame without a relaunch.
There was a problem hiding this comment.
ℹ️ No new issues in this delta — the three commits are clean. One earlier test-coverage thread remains open (
runtime-machine-name.test.ts's shared-lookup assertion is macOS-only), so this is not an approval.
Reviewed changes
This run re-reviewed the three commits pushed after the prior pullfrog review at c4a228e.
- Remote workspace presence introduces this desktop by its published name —
remote-workspace-client-identity.tsdrops the module-loadCLIENT_NAMEconstant forreadClientName, which readsruntime.readMachineName()per presence frame, so a Settings rename reaches the nextworkspace.presenceframe without a relaunch.registerRemoteWorkspaceHandlersandlistRemoteWorkspaceConnectedClientsnow take aRemoteWorkspaceClientNameSource, threaded fromattach-main-window-services.ts. - Status waits for the machine-name lookup —
status.getandruntime:getStatusnowawait runtime.machineNameReady(), andRuntimeMachineNamegainsready(), so a status answered while the macOS friendly-name lookup is in flight never publishes the bare hostname. - CLI refuses to rename an unsupported runtime —
orca host name --namereadsstatus.getfirst and raisesincompatible_runtimewhen the answering runtime publishes nomachineName, instead of sending asettings.updatethat an older strict schema rejects wholesale. - Tests — new
remote-workspace-connected-clients.test.tsandstatus.test.ts, aruntime:getStatusgate test, andmachineNameReadyadded to the affected runtime fakes.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
Status publishers now wait for the one-time name lookup, and `orca status` probes them with a one-second budget. scutil answers in milliseconds, so a half-second cap keeps a stalled lookup from making a healthy runtime read as "starting" while still preferring the friendly name.
There was a problem hiding this comment.
ℹ️ No critical issues — one stale comment inline.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at 6943454.
- macOS friendly-name lookup capped at 500 ms —
MACOS_COMPUTER_NAME_TIMEOUT_MSdrops from 1 s to 500 ms, with a comment recording why:status.getnow waits on this lookup, andorca statusprobes that reply with a 1 s timeout (src/cli/runtime/status.ts:40), so a full-secondscutilstall could make a healthy app read asstarting.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
The Mobile settings section is desktop-only, so the paired web client can never render the field. Forwarding the name through the web settings sync was dead code, and against an older host the strict update contract would have rejected it while the local mirror kept the value. Remove it until a web surface exists.
…erver rows Add the Machine name field and its Settings search entry to the five non-English catalogs, explain in the host list spec why paired-server rows report an unknown platform, and drop a stale timeout figure from a test comment.
There was a problem hiding this comment.
ℹ️ No new issues in this delta — the two commits are clean. One earlier test-coverage thread (
runtime-machine-name.test.ts's shared-lookup assertion is macOS-only, so CI never exercises it) remains open, so this is not an approval.
Reviewed changes
This run re-reviewed the two commits pushed after the prior pullfrog review at 8be3f060.
- Translated the machine-name strings — the
machineNamesearch subtree andMobileMachineNameFieldstrings now exist ines,fr,ja,ko, andzhalongsideen;pnpm verify:localization-catalogpasses and every locale file parses. - Dropped the web machine-name path —
web-preferences-store.tsno longer projectsmachineNamefrom the host or forwards it onsettings.update. Nothing undersrc/renderer/src/webreferences the key and the web build does not importcomponents/settings, so the desktop field remains the only writer and this is a no-op. - Documented paired-server rows — the
host listhelp now states that paired-server rows come from the pairing store and reportplatform unknown, pointing atorca host name --environment <name>for a server's own name. - Fixed the stale timeout comment —
runtime-machine-name.test.tsnow says "lookup timeout" instead of "the 1 s timeout", closing the prior review's inline nit.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
Review status: ready for merge at
|
… a General home The name other devices and hosts list this computer under is not a mobile setting. Rename MobileMachineNameField to MachineNameField, give it a per-mount id, and put its primary home in Settings > General under "This computer". The Mobile pane keeps the same field. One shared search entry feeds General, the Mobile pane, and the copy now says "other devices and hosts" in all six locales. The web client has no machine of its own to name and its settings mirror cannot persist one, so the field renders nothing there and General omits the section.
The "Pair this computer" step now shows the same machine name field above the connection choice and code, so a user pairing a phone from the sidebar page can name the computer right there.
Share this host produces the access link other devices use to reach this machine, so it mounts the machine name field first. The pane's search entry takes the shared machine-name keywords so a search lands there.
This desktop introduces itself to a new SSH host or remote server under its machine name, so the Add Remote Host dialog mounts the field once, between the header and the host fields, in both modes. Submit logic is unchanged.
The SSH pane's add form mounts the machine name field above the host fields. Editing a saved host leaves it out; that host already met this computer.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor suggestion inline.
Reviewed changes
This run re-reviewed the five commits pushed after the prior pullfrog review at 1d3f75b, which turn the machine-name field into a machine-wide setting and add five mount points.
- Machine-name field is now machine-wide —
MobileMachineNameFieldbecomesMachineNameFieldwith a per-mountid, hides itself on the web client, and commits on Enter without submitting an enclosing add-host form; Settings → General gains a "This computer" section and the search entry moves to a sharedmachine-name-search.tscatalog reused by the Mobile pane and Remote Orca Servers. - Mobile pairing step names this computer —
MobileHeroPairingStepmounts the field above the Relay options, with newmachine/relaygrid areas inmobile-page.css. - Share this host names this host —
RuntimeServerShareSectionmounts the field above the link generator. - Add-host surfaces name this desktop —
AddRemoteHostDialogthreads the field into both the SSH and remote-server form panels via a newchildrenslot, andSshTargetFormmounts it in add mode only. - Translations — the machine-name strings move to
machine.name.search.*/MachineNameField.*across all six locales, and the oldmobile.pane.search.machineNamekeys are removed.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
The pairing step wrapped MachineNameField in its own grid-area div. On the web client the field renders nothing, so the wrapper left an empty row and an extra row gap between the copy and the connection options. The field now takes a className for its root, so the grid slot disappears with it.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor suggestion inline.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at 0042190, which reworks how the machine-name field is mounted in the mobile pairing layout.
- The pairing grid class is passed to the field itself —
MachineNameFieldgains an optionalclassNamemerged onto its root viacn, andMobileHeroPairingStepdrops themp-pairing-machinewrapper<div>and passes the class directly, so the field's root is the grid item. Tests assert the class now rides on the field root rather than a parent.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
…ke sibling inputs The field intercepted Enter to blur and commit instead of submitting the enclosing SSH add form. The draft is already flushed on blur and on unmount, and the name is read from the store whenever a peer asks, so nothing is lost when the form submits first. Enter now behaves like the neighbouring inputs; the test proves the submit fires and the name still commits when the form closes.
A dedicated grid row stayed in the template on the web client, where the field renders nothing, adding an empty track and a second row gap between the copy and the connection options. The field now sits at the end of the copy cell with the same 18px rhythm, so an absent field leaves nothing behind.
There was a problem hiding this comment.
ℹ️ No new issues in this delta — both commits address prior Pullfrog feedback cleanly. The earlier test-coverage thread (
runtime-machine-name.test.ts's shared-lookup assertion is macOS-only, so CI never exercises it) remains open, so this is not an approval.
Reviewed changes
This run re-reviewed the two commits pushed after the prior pullfrog review at efa7dbb8.
- Enter in the machine-name field now submits its enclosing form —
MachineNameFielddrops its customonKeyDownguard, so Enter behaves like sibling inputs; the typed draft still commits through the debounce/blur/unmount flush inuse-debounced-settings-text-draft.ts. This resolves the prior IME-composition thread: no custom handler is left to bypass composition, and browsers suppress native implicit submission while composing. - The pairing grid no longer carries an empty
machinerow — the field moves inside.mp-pairing-copyandmobile-page.cssdrops themachinearea from both.mp-pairing-layoutand.has-failure;.mp-pairing-machineis now justmargin-top: 18px. This is the structural fix the prior review asked for, so the web client no longer reserves the track. - Tests — the mobile pairing test now asserts the field's parent is
.mp-pairing-copy, and the field test asserts Enter submits the enclosing form once while the name still commits on unmount.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
…the hostname On a loaded Mac the scutil lookup missed its 500 ms cap during app boot, and because the fallback was memoized for the process, every status read and the Settings caption showed the bare hostname for the rest of the session. The lookup now gets a 5 s timeout, a failed attempt (timeout, spawn error, non-zero exit, empty output) clears the shared memo so a later ready() retries after a 30 s interval, and status publishers wait only up to a 750 ms publish budget before answering with what read() has now. A friendly name and the non-darwin hostname stay final.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor correctness note inline. A slow macOS name lookup can leave a Settings caption on the bare hostname, and one new comment says otherwise.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at b554034, which makes a failed friendly-name lookup retryable instead of latching the hostname for the process.
- A failed lookup is retried, not memoized —
detectRuntimeMachineNamenow returns{ name, final }, and module state keepssharedDetectedName/lastFailedLookupAt, so ascutiltimeout, empty answer, or spawn error leaves the hostname in place but re-derives the name afterMACHINE_NAME_RETRY_INTERVAL_MS(30 s) on a laterready(). - Status waits are bounded —
machineNameReady()becomesreadyWithin(MACHINE_NAME_PUBLISH_WAIT_MS)(750 ms) and thescutiltimeout rises to 5 s, so a status reply never blocks past 750 ms; a slow lookup lands in the background and the next read carries the friendly name. - Tests —
status-machine-name-publish-budget.test.tsproves a status answered mid-lookup publishes the hostname and then the friendly name, andruntime-machine-name.test.tsgains retry, spawn-churn-bound, final-answer, andreadyWithincases that forcedarwinon every platform (retiring the prior macOS-only coverage gap).
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
| ipcMain.handle('runtime:getStatus', (): RuntimeStatus => { | ||
| ipcMain.handle('runtime:getStatus', async (): Promise<RuntimeStatus> => { | ||
| // Why: same capped wait as `status.get`, so the renderer caption sees the friendly name unless | ||
| // the lookup is still running; it refetches status and picks the name up on the next read. |
There was a problem hiding this comment.
This comment says the renderer caption "refetches status and picks the name up on the next read", but usePublishedMachineName (use-published-machine-name.ts:16-38) issues exactly one getStatus() per override change — no timer, subscription, or visibility re-read. Because machineNameReady() now stops waiting at 750 ms while scutil may run for 5 s, a caption mounted inside that window keeps the bare hostname until the component remounts. Either have the hook re-read once the lookup settles, or drop the self-correction claim from the comment.
Technical details
# Renderer caption never re-reads after the capped status wait
## Affected sites
- `src/main/ipc/runtime.ts:56-57` — the new comment claims the caption refetches and self-corrects.
- `src/renderer/src/components/settings/use-published-machine-name.ts:16-38` — a single `getRuntimeStatus()` call inside a `useEffect` keyed only on `override`; no polling, visibility listener, or runtime subscription.
- `src/main/runtime/orca-runtime-get-status.ts:155-157` — `machineNameReady()` calls `readyWithin(MACHINE_NAME_PUBLISH_WAIT_MS)`.
- `src/main/runtime/runtime-machine-name.ts:9,114-116` — `MACOS_COMPUTER_NAME_TIMEOUT_MS = 5_000` now outlives the 750 ms publish budget.
## Required outcome
- A caption mounted while a slow lookup is in flight must not stay on the hostname after the lookup lands: either re-read `runtime.getStatus()` when the lookup settles (poll once, or subscribe), or state in the comment that the value is a best-effort snapshot that only self-corrects on remount.
## Note
- The handoff `hostLabel` getter (`orca-runtime-get-worktree-ps.ts:184`) and the CLI both read `machineName.read()` live, so only the renderer caption has this gap.
Update: machine-wide name, one field everywhere, and a latch fix — head
|
…in this computer The Add Remote Host dialog, the SSH pane add form, and General all describe another machine, so a field about this computer's own name read as a third kind of label there. The field now mounts only where other devices pair with or connect to this computer: the Mobile pane, the Orca Mobile pairing step, and Remote Servers > Share this host.
There was a problem hiding this comment.
ℹ️ No critical issues — one minor test-comment note inline, plus a stale-description note below.
Reviewed changes
This run re-reviewed the single commit pushed after the prior pullfrog review at 4f5edbcc.
- The field now mounts only where other devices join this computer —
f11b974removesMachineNameFieldfrom Settings → General ("This computer"), both Add Remote Host panels, and the SSH pane add form, leaving the Mobile pane, the Orca Mobile pairing step, and Remote Servers → Share this host. Thechildrenslots on the two add-host panels,GeneralPane'sshowDesktopOnlySettingsprop, and theGeneralPane.thisComputeri18n key in all six locales go with them. - The shared search catalog is rehomed —
machine-name-search.tsstays the single source; the Mobile pane keeps the entry with an addedmobilekeyword, and the desktop Remote Orca Servers entry spreads the shared keywords sohostname/renamestill land there.getGeneralPaneSearchEntriesno longer includes the machine name. - Paired-device revocation extracted —
MobilePane's inlinerevokeDevicemoves touseMobilePairedDeviceRevocation, keeping the pane under the max-lines ratchet as it gains the field.
ℹ️ PR description still documents the removed mount sites
The description says the field's home is Settings → General under a "This computer" heading and lists the Add Remote Host dialog and the SSH pane add form among the surfaces, with screenshots and Testing steps for each. f11b974 deliberately removed those three mounts, so the reviewer-facing spec, the "every surface, same field" screenshot table, and the validation steps no longer match the code. Worth updating the description before merge so it reflects the three remaining surfaces.
Technical details
# PR description lists surfaces the new commit removed
## Affected sites
- `src/renderer/src/components/settings/GeneralPane.tsx` — the "This computer" section and its `MachineNameField` mount were removed.
- `src/renderer/src/components/sidebar/AddRemoteHostDialog.tsx` — the `children` slot carrying the field was removed from both form panels.
- `src/renderer/src/components/settings/SshTargetForm.tsx` — the add-mode `MachineNameField` was removed.
- PR body — "Settings → General under a new 'This computer' heading (its home)", the Add Remote Host / SSH pane bullets, and the six-surface screenshot table.
## Required outcome
- The description, screenshots, and Testing steps name the three remaining mount sites (Mobile pane, Orca Mobile pairing step, Remote Servers → Share this host).
## Open questions for the human
- If any removed surface is meant to come back (e.g. a rename prompt when first connecting to a remote host), the description should say so; otherwise it can be dropped.DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
| }) | ||
|
|
||
| it('lets Enter submit an enclosing host form like its sibling inputs, and still commits the name', async () => { | ||
| // Why: the SSH add form mounts this field beside inputs where Enter submits. A name typed just |
There was a problem hiding this comment.
This test still justifies itself with "the SSH add form mounts this field beside inputs where Enter submits", but f11b974 removed that mount and no remaining mount site sits inside a <form>. The behaviour guard is harmless to keep, but the rationale and the ssh-target-machine-name id (lines 88 and 105) now point at a surface that no longer exists.
Update: field narrowed to where other devices join this computer — head
|
Conflict resolved and CI green — head
|





ELI5
Each computer running Orca can now say what it is called, and paired phones and the CLI can ask it. Today a phone lists every paired desktop as "Host 1", "Host 2", and so on, so people name them from memory, and a wrong guess sends work to the wrong computer. This is the desktop half: the machine publishes its own name. The phone half that shows it is #22104.
What Changed
Before: nothing a desktop sends ever names the computer. The pairing screen shows a QR code and no machine identity, and the status reply carries the operating system but no name.
After:
orca host nameprints the name and platform of the runtime it is pointed at, inside that runtime's own reply envelope, soorca host name --environment <name>(or an ambientORCA_ENVIRONMENT) reports the remote's runtime id, not "local".orca host name --name <name>sets it and prints what the runtime now publishes;--name ""returns to the detected name. Against an older runtime that does not publish a name, the write is refused with a plain message instead of a schema error.orca host listshows this machine's own name on its local row.Why
This is one name for the whole machine, not a mobile setting: every client that reads status gets it, and this desktop introduces itself by it when it connects to remote workspace hosts. The name belongs to the machine that owns it, not to whoever typed a label for it: the runtime that answers reports its own name, and nothing is inferred from the phone or the network address. The phone keeps its own personal label on top (in #22104), so a machine-reported name never overwrites what a user chose to call it.
Alternatives considered:
runtimeId,hostPlatform), and "custom vs detected" is answered on the phone by whether its own label is set. A single string is the derivable, wire-stable choice.Two things deliberately stay as they were:
orca host listandorca environment listanswer from this machine's own pairing store. Asking each paired server for its name would make them slow and fail whenever one is offline, so a server's name is read one at a time withorca host name --environment <name>.Letting the host's user override the detected name is an addition on top of the common "host reports its detected name" shape; its nearest existing pattern is a host-detected value with a host-stored override so every device sees the same thing.
Linked Issue
Mobile P0: worktrees created on the wrong machine because paired desktops could not be told apart.
Visual Proof
Captured from the running app (hidden renderer over the debugging protocol) in fresh dev profiles. Mobile pane and CLI round-trip at
8be3f060b4:At the final head
f11b974ff8, cold start on a loaded machine (load average 33 to 41): the detected name from the first read, the same value on all three surfaces, and no field on General or the join-side forms.Those three re-shot at the merged head
f7879e4abf; General is unchanged fromf11b974ff8(no field).Earlier capture at
00421902ae(same three surfaces, override saved):Before this change the Mobile pane had no name field and the status reply carried no name, so there is no "before" state to screenshot beyond the pane without the field.
Testing
Validated in the running app on macOS (
8be3f060b4for the Mobile pane and CLI round-trip,00421902aefor every surface,4f5edbcc73for cold start under load,f11b974ff8for the narrowed surfaces):Brennan’s MacBook Pro) as the placeholder and in the caption;window.api.runtime.getStatus().machineNamereturns the same string.QA Override Deskand leaving the field updates the caption, the store, andgetStatus()to the override; clearing it returns all three to the detected name.orca host nameprintsBrennan’s MacBook Pro (darwin);--name "CLI Named Desk"printsCLI Named Desk (darwin);--jsoncarries the answering runtime's id;host listshowsthis machine (CLI Named Desk);--name ""prints the detected name again. The still-open Settings page reflected the CLI rename without a reload.Automated:
pnpm tc;pnpm run check:code-quality:changed;oxlintandoxfmton every changed file; all localization and RPC-catalog verifiers.8be3f060b4(src/cli,src/main/runtime,src/main/ipc,src/main/persistence,src/shared,src/relay, renderer settings and web); at4f5edbcc73, renderer settings/mobile/sidebar/i18n 4147 tests / 0 failures and main-process runtime + IPC 6866 tests / 0 failures.AI Disclosure
Review
Agent skill upstream boundary
Notes
orca host name --name <very long>errors rather than silently shortening).settings.updatewas already on the mobile method allowlist, so a paired phone can rename the desktop through the existing setting path; nothing new is exposed.src/main/ipc/settings.ts; that edge normalizer was removed here in favor of the store boundary and should be dropped there before it lands.Checklist