Repository navigation
chore(integration-builds): 同步上游 8cd6a7e5ee(3216 个提交) - #78
Merged
Merged
Conversation
…oad its tsconfig references (stablyai#36715)
…tablyai#37095) Reading an agent on the desktop rebuilt notification ids for turns that never alerted (every chat pane, silenced workers) and forwarded each one to the phone as a silent dismiss push plus a dismissal-store record. Only forward a clear when the store holds a live delivery for that id.
…dev watch shot pendingRequests (stablyai#37090) - shot <key|dir> --scenario <name> renders the panel in that check scenario through the check runner (a separate Node process on a mock host and mounted worker), sends the validated drawn tree to a new plugins.shotReplay, and captures it in a throwaway preview surface: no guest, no live host, no real storage or settings, no real worker, images as placeholders. Window hidden or minimized only; --act, --environment and bridged shells refused; an older host answers method_not_found (runtime_unsupported) rather than doing a live shot. - dev watch's shot event carries pendingRequests.
…stablyai#37050) The Commits list now stops where the branch left its base. It groups commits into Not pushed (hollow dots, with Push) and On origin, ends at "Branched from <base>" with Update branch, and loads more past 50. A commit opens its own page: message, author, date, pushed state, files with +/-, and Copy SHA / Open on GitHub in the menu. Older hosts ignore the new params, so the list falls back to the full history without groups or the base marker.
… the diff screen (stablyai#37073) * feat(mobile): GitHub threads, viewed sync and line comments on the diff screen Committed files of a GitHub pull request now show its review threads under their lines with Reply and Resolve, take their viewed state from GitHub and sync the checkbox and Viewed · next file back through setPRFileViewed. A tap or a long-press drag picks lines and opens a sheet that sends the note to the workspace's agent through the existing send path, or posts it as a review comment. Threads and GitHub comments appear only while the local branch is at the PR head, the same contents desktop shows them on; otherwise the file says to push. openDiffForFile takes an optional line for a thread's Open in diff. * test(mobile): use a type import for the line-mutations recording adapter * fix(mobile): name the staged or unstaged side in the jump sheet's file labels
…new tabs (stablyai#37102) * fix(browser): open target=_blank links from streamed server pages as tabs Headless serve pages have no renderer, so a page's new-tab request was denied. The runtime now opens the link as a tab beside the page, in front only for the paired client whose click or key press opened it. * test: add the offscreen tab opener to browser manager fakes * test(e2e): drive the blank-link check through the host client * fix(browser): credit a link only to the client whose input opened it A click waiting in the page's command queue keeps its client until it is delivered, input with no paired client clears an older one, and an unattributed link no longer moves the agent's tab. * refactor(browser): credit link opens from the page's command queue Record the paired client at the bridge's per-page command lease, which sees the resolved page and every command kind, instead of in four RPC handlers. A page without a workspace keeps denying new-tab links. * fix(browser): credit a link to the client whose click reached the page Credit at the guest's activating input, under the popup owner's tab, to the command delivering it, so a watcher's scroll can't claim an agent's link. Announce a background tab at once since bridge selection no longer does. * fix(browser): credit a phone's DOM-activated tap before it runs A tap with a touch radius clicks the element through Runtime.evaluate, which fires no guest input event, so credit the tapping client first. * test(e2e): assert the blank-link tab through the page, not the store * refactor(browser): simplify page-link credit and tab opening The queue owns the page command credit instead of the agent lease, the credit skips work while idle and shares the gesture's freshness rule, one opener serves both link paths, and one opensPageLink marker replaces the paired follows/leavesAgentTab flags. * test(e2e): give the blank-link spec's timeout its reason
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…simulators in the picker (stablyai#37122) Same-named simulators on different iOS runtimes looked identical, and records whose runtime is gone could be picked and then failed to connect. The pane already received runtime and isAvailable from simctl; the toolbar ignored both.
Tapping a file on the commit page now opens the shared diff screen for that file in that commit (openDiffForFile kind 'commit'), in today's Commits tab and inside the hub's Commits page.
) * Preserve rich Markdown viewport through bare focus returns * Retire viewport ownership on editor remount * Complete no-op navigation and body Tab coverage * Keep patch metadata keys separate from dependency snapshots * Retire the viewport before root detach callbacks * Give the engine writer fixture its native selection * Keep native focus navigation current in Markdown * fix: leave smooth Markdown scrolling to native focus cancellation * Cover focus wrapper removal and routed Markdown writers * Type the viewport scroll spy and mark the focus-recovery wait as deliberate * Scope Markdown viewport wheel and touch guards to the editor scroller
* Route hosted review refreshes to their owning host * Route remote review operations to their owning host - Refresh the correct hosted review after remote git operations - Scope comment mutations and AI acknowledgements to the owner cache * Route legacy paired SSH reviews through their server owner - Recover proxied runtime owners for older SSH worktree listings - Preserve direct and ambiguous host routing safeguards * Preserve review ownership across remote workspace operations - Route checks, comments, and linked-review clears through the selected repository owner - Reject ambiguous or mismatched host context to prevent cross-machine mutations * Keep check detail tabs scoped to their remote owner * Preserve remote worktree ownership across reconstructed check tabs * Preserve direct SSH check tabs when proxy listings overlap * Scope PR refresh ownership state and safely roll back comment mutations - Preserve linked-review clear scopes beyond cache eviction and clean them up on expiry - Handle failed or refused comment reactions and thread resolutions without stale optimistic UI * Preserve remote review ownership when SSH copies overlap * Fix review routing for overlapping remote repository hosts - Preserve server-owned review refreshes when a direct SSH copy exists - Fail comment mutations and refetches safely when ownership becomes invalid - Resolve check and sidebar data through the workspace’s owning host * Relax cache-sensitive test expectations * Route check refreshes to runtime owners and isolate restored requests * Scope reconstructed check detail tabs by execution owner * Fix review refresh ownership for shared remote hosts - Prefer explicit execution owners when matching worktrees. - Avoid repeated tab scans when restoring check details. * Fix hosted review polling for workspaces on multiple hosts * test: trim redundant review ownership scenarios
…i#34913) * fix(emulator): preserve iOS helpers when ps output overflows * fix(emulator): preserve orphan helper cleanup * refactor(emulator): read helpers with one ps call at the shared buffer ceiling --------- Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
* feat(chat): show split shortcut in pane header tooltip * Show split chat shortcuts clearly in tooltip
* Make the empty omnibox caret thicker and faster * Soften the empty omnibox caret contrast * Fix moved structured session imports in lifecycle test
…tablyai#36848) * Show a card in the chat when its agent hands work to another agent An agent that hands work off with 'orca agent launch' from a native chat now leaves a 'Handed off to agent' card there, linking to the new chat or terminal, the way a supervised worker-start leaves 'Started worker'. The CLI names its chat on agent launches (same-host only); the host records a display-only agent-handoff item after a successful launch with a submitted prompt, once per launch operation. Nothing about the card can refuse or delay the launch. Tracked in STA-13209. * Keep orca commands working in a native chat that has no terminal handle The launch-caller evidence read the host stamp off an absent evidence object, so every orca command from an ordinary native chat threw before sending. Adds CLI tests for which requests name the launching chat, restores the lockfile to the base, and fixes the Korean heading. * Read a card's heading from its creation flags together A caller passing only the started flag drew a handoff as Started worker; the heading now takes the message's flags as one argument. * Show the handoff card for every agent a chat launches A launch without a delivered task now records the card too, with no task text, as the common pattern records every agent a chat creates. The handoff tests now run the real chat host and journal: one card per launch operation, none on replay, a removed card stays removed across a restart, and the clock is fixed. * Head a launch card Started agent when no task reached the new agent Handed off to agent now appears only when the card carries a task; a card for an agent started with no task (no prompt, a draft, or a prompt that wasn't delivered) reads Started agent. The heading is derived from the card's text, so nothing new is saved. Also drops a self-launch check the launch path already refuses first. * Show the handoff headings on the phone's agent cards The phone card passed only the started flag, so with the new heading rules it would draw every creation card as a plain message. It now passes the message and has a heading for every case, so a missing one fails the build. The heading function now requires the message's creation facts, so no caller can leave them out. Adds the phone strings in every language, and the Japanese "Started agent" now uses the catalog's term for agent. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…blyai#37128) * fix(emulator): detect Android devices with only adb installed SDK discovery required both adb and the emulator binary under an SDK root, so hosts with platform-tools only, or a standalone adb such as a distro android-tools package, saw no Android devices at all. Discovery now needs only adb, falls back to adb on PATH, and AVD listing and boot are skipped when the emulator package is missing. Fixes stablyai#32126 Co-authored-by: s546126 <268420947+s546126@users.noreply.github.com> * test(emulator): drop type assertion in adb-only inventory test --------- Co-authored-by: s546126 <268420947+s546126@users.noreply.github.com>
…yai#37104) * feat(mobile): one next-step bar under both Source Control tabs Changes and Pull request are the only segments. A bar at the foot of both shows the branch's one next action: the commit box, push or pull, create the review, resolve or fix with the workspace's agent, merge when ready, merge, or why it can't. Commits opens as a pushed screen. * fix(mobile): keep Merge reachable and show bar failures on both tabs * test(mobile): expect the two Source Control segments in the page render test
…i#37139) The pane's keyboard only sent serve-sim HID frames over the iOS WebSocket. Android sessions have no serve-sim socket, so every key was dropped and every paste failed with "device is not ready". Android panes now send typed characters, paste and editing keys over a new emulator:scrcpyKeyboard IPC beside emulator:scrcpyTouch, keyed by the streamed serial. Main writes them straight to the live scrcpy control socket (text injection, and keycodes with SHIFT_LEFT held for Shift), so keys keep their order with touches. iOS keeps the HID path.
…ai#37118) * fix(chat): move forward readers to the covered tip after a no-op save A write whose fold changes nothing stores no outcome record, so its sequence never appears in a forward read. Readers placed themselves at the last returned row and stayed behind the live cursor, so open chats re-read an empty page and recomputed the prompt projection on every later delivery until the next real save. Forward journal reads now report the highest sequence they covered. History pages move there when the read was complete, prompt reuse and native responses compare against it, and a read cut short by its limit, byte budget or damage still stops at the last returned row. * fix(chat): append unlimited outcome reads without spreading, and report coverage from the mobile journal fake * fix(chat): skip the retention scan for batches that change no journal items
…fault (stablyai#37043) * fix(wsl): the Codex quota poll gates the distro it probes, not the default The poll's gate asked whether the wsl -l default was running, then the home lookup resolved its own default (and could name an account home in another distro), so the probe could start a stopped distro the gate never read. The distro is now resolved once, gated, and pinned for the home lookup; a home in any other distro skips the poll. * fix(wsl): pin the gated distro for paths only; keep the account lane Pinning the resolved default into the target also moved the account lookup off the default lane, so a default-lane account read the system home. The distro is now pinned for paths and probes only: the account is that distro's lane, then the default lane the target named. The default distro comes from resolveWslDefaultDistro, as the exec gate's does. * fix(wsl): the pinned quota poll reads the account lane launch reads Drop the default-lane fallback: a pin names the distro, so the account is that distro's lane, exactly as launch reads its named target. The test now asserts the poll and launch's own home lookup agree.
…tablyai#36999) The PR tab now leads with the PR's identity, one row per merge gate (checks, unresolved threads, approvals, conflicts) that opens the screen or sheet that resolves it, a changes card and a collapsed description. Close, Unlink, Auto-merge, Edit title and Copy link move into the ⋯ menu. Checks and Comments become pushed screens: failures open with their annotation and Fix / Rerun / Open / Log on the failure, running checks next, passed folded; comments filter by Unresolved / All / Hide bots with Resolve and Reply on each thread and a comment box at the bottom. Merge opens a sheet that lists only the methods the repo allows, starting on its default. Reviewers move into a sheet with search to add and remove. Every Create PR entry point opens one sheet: title and description seeded from the branch's commits (shared seed rule in src/shared, GitHub's own default), Write with AI, base picker and draft. It pushes first when needed, works for all five providers and lands on the PR tab for GitHub.
* docs: add a Risk section to the PR template * docs: keep the change to the PR template
* Allow automation CLI setup choices for new workspaces * Explain automation --setup refusals and read back the saved choice Name why --setup is refused and what to pass, show the setup choice in text output, document --setup in the CLI guide, fail when a host drops the choice, and cover the app-open Terminal dispatch. * Refuse automation --setup on hosts that can't keep it, and fence the edit's mode Explicit --setup now needs the host's new setup-choice capability, checked before any write; commands without --setup are unchanged. An edit whose setup choice relies on the current new-per-run mode sends a mode precondition the store checks against the saved record, so a concurrent switch to an existing worktree refuses the whole edit. Text output shows the saved choice or "not set", the existing-workspace refusal offers a remedy that works for every input, and the after-write readback is gone. * Make the too-old --setup message true for edit and cover a saved setup edit Omitting --setup on edit keeps the saved choice, so the refusal now says to run the command without --setup. A new test saves a --setup run edit through the controller into the store and reads it back after reload.
…he agent to fix bot findings (stablyai#37023) The PR tab and the Checks and Comments screens refresh by themselves while they are open and the app is in the foreground, on desktop's checks-panel cadence (policy moved to src/shared). A failed background read keeps the PR on screen and backs off instead of replacing it with an error. Review threads show the lines they are about: the host forwards the tail of each thread root's diff hunk, and mobile numbers it back from the thread's line. Bot findings get "Ask <agent> to fix", which launches desktop's Resolve comments prompt (moved to src/shared) for that thread. Fix and Ask buttons name the agent that would start.
…rking Connect (stablyai#37146) * fix(emulator): show a dead Android preview as disconnected so Connect restarts it When the scrcpy session ended, the video registry dropped its subscribers silently and a later subscribe was a no-op, so the pane kept saying Connected over a blank 'Stream disconnected' screen with no way to retry. The registry now tells subscribers the session ended, the IPC relays it on the stream error channel, and the pane marks the session disconnected so the toolbar's Connect button restarts scrcpy. * fix(emulator): retry a lost Android preview by AVD name and keep stale errors off new streams * fix(emulator): keep a live emulator serial and fall back to its AVD name only once it is gone * fix(emulator): keep the AVD target across failed reconnects and reused serials * fix(emulator): reboot a vanished emulator by AVD name only when the host no longer finds its serial Replaces the pre-attach device refresh: the live serial always goes first, and the AVD name is tried only after the host answers emulator_device_not_found. * refactor(emulator): read the host error code plainly in the AVD fallback * refactor(emulator): type the attach result without a cast and derive WebCodecs support in render * fix(emulator): type the fallback test's attach result and allowlist the WebCodecs diagnostic
* test: remove low-value renderer and terminal tests * test: align floating tab geometry with content-fit sizing
Merge stablyai/orca main a444233 (3201 commits since 2eae220) into fork/integration. 179 conflicts resolved feature by feature on top of the upstream code; every feature in config/fork-features.jsonc keeps working. - Seams follow upstream file moves (native-chat/, worktree-jump/, agent-status/, mobile-web-app/, ipc/pty/spawn-execute, skill-guides artifacts.md); registry and architecture policies updated to match. - Retire cli-writer-login-shell: upstream now refuses only a CLI writer process observed live, so the login-wrapper root-pid misjudgement is gone. - Fork code adapted to renamed upstream modules and APIs; catalogs, RPC params and bundled skill guides regenerated. - Fork mobile strings localized for upstream's new mobile i18n gates. - Keep files under max-lines by moving fork lines out of listener-state.ts and NativeChatStructuredSession.tsx without changing behavior. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mobile catalogs, adapted upstream tests, skill-sharing copy and protected copy keys now carry fork changes; register them as seams and in the diff budget. Keep upstream's mobile runtime catalog: the fork never needed to change it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce after upstream sync Activity ranks a native chat's host-saved name as a manual name (REQ-025); skip the fork owner probe when upstream already probed it. Adapt tests to upstream's deliberate Codex thread and push payload changes, and register the adapted upstream test as a seam. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…llback Upstream 4597d3f falls back to preview instead of source for unsupported rich Markdown; Open anyway now sits in that banner. REQ-401 and TC-601 follow the upstream default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…upstream now provides Upstream stablyai#33978 binds a later recorded leaf into the restored tab, closing residual P2-4; the test now asserts one tab with both original leaves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream stablyai#36772 made the production home guard reach orcad-idle-exit, whose module-level zod schema landed in the LaunchServices preflight bundle; mark in-repo imports side-effect free so only the guard's real modules are bundled. Record the upstream sync in the journal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pstream sync Upstream added files.readDocPreviewChunk beside the fork's chunked files.readDocPreview; mock both and assert the 20 MiB guarantee over bounded replies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ites Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mock the ActiveWorkspaceSyncGate upstream mounted in background services, and find the link entry by upstream's new Add reference button. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…worktree block reason Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m's reveal reads Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d TTL checks Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… bump Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…browser tab retirement The 2026-11-02 sync resolved the retireRuntimeOwnedBrowserSessionTab conflict by keeping the fork's snapshot.publicationEpoch, dropping upstream stablyai#31665's getMobileSessionPublicationEpochAfterHeadlessBrowserClose. Upstream's method already keeps a renderer generation's epoch (REQ-701) and only re-stamps a host-built publication, which has no renderer generation to fence. The file now matches upstream, so its seam and budget entry are retired; a new case pins the host-built re-stamp so this branch cannot drop silently again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n forks Upstream added an unguarded blacksmith-4vcpu-ubuntu-2404 leg to the warm job in ci-cache-warmup.yml and to warm-linux-package-fixtures. fork/integration is the Fartown default branch, so every 6-hour scheduled warmup would leave a leg queued until GitHub drops it; main's mirror already shows three such runs. Both matrices now follow warm-linux-runtime: Blacksmith only for stablyai/orca. The portability test covers every job in both warmup workflows instead of one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's new memo-translate-subscription ratchet flags memoized components that call translate() without subscribing to the language revision. LocalTaskList and LocalTaskRow are memoized, so a language switch left their labels stale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e session Upstream's new "bounds unknown retry work" test caps the tab-row reads a host-kept-asleep restore may do per retry. The cold-restore-resume breadcrumb's candidate evidence scanned the workspace's tabs twice on every retry, so 100 tabs read 800 rows against a 600 bound. The breadcrumb now lives in the feature's cold-restore-origin.ts: the first attempt of a pane session carries candidate evidence, retries record origin and launch evidence only. The upstream call site shrinks to one line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's orcad entry build now rejects non-ASCII characters in the server bundle. The low-information prompt regex spelled its Chinese replies literally, which failed every orcad build in CI. The same characters are now \uXXXX escapes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… ASCII-only orcad bundle The Windows reserved-name regex spelled the superscript digits literally; the orcad entry build rejects non-ASCII source. They are now \uXXXX escapes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
把上游
stablyai/orca从2eae220b2e同步到8cd6a7e5ee,共 3216 个上游提交,所有已登记的 fork 功能都保留。这次同步主要是为了带进上游 stablyai#36315:手机端从历史恢复一个正被聊天占用的会话时,不再只留下一个空终端。Important
合并时不要 squash,也不要 rebase,否则上游合并提交会丢,下次同步会重新冲突一遍。CI 通过后用 merge commit 合入,或者把同一批提交直接快进推到
fork/integration。冲突怎么解的
pnpm sync:upstream又无冲突地自动合进了两批上游提交。cli-writer-login-shell:上游现在只在确认 CLI 写入进程还活着时才拒绝。推送前的复核
对每个冲突文件,比较旧基准、合并前的 fork、上游、最新上游和合并结果,找出 fork 新增后来没了的行、上游新增后来没了的行。84 个文件有疑似丢失,逐个核对后确认两处真丢了,都已修好:
fix(session-tabs-publication-lineage):浏览器标签退役时改用上游 fix(mobile): keep unmounted desktop browser tabs visible and closable stablyai/orca#31665 的 epoch 规则。之前合并保留了 fork 的旧写法,丢了上游对 headless 发布的处理。ci(integration-builds):上游新加的两个缓存预热任务用了 blacksmith runner 却没判断仓库,在 fork 的定时任务里会一直排队。现在只有stablyai/orca才用 blacksmith。其余都是代码搬了位置、改了写法,或已被上游的同类实现取代。
推送前跑
check:changed时,又发现两处是上游新加的约束碰上了 fork 已有的代码,也已修好:fix(local-tasks):上游新加了「memo 组件里的翻译要订阅语言版本」的规则,LocalTaskList和LocalTaskRow没有订阅,切换语言后文字不刷新。fix(terminal-launch-diagnostics):上游新加的单测要求冷恢复重试的工作量有上限,fork 的启动诊断每次重试都扫两遍全部标签。现在每个窗格只扫一次,上游文件里的这段调用也从 11 行收成了 1 行。验证
pnpm tc、check:fork-features、check:fork-docs、check:architecture-policies通过。win32-test-lane-registration是被本机 git 忽略的tmp/tasks干扰,CI 上没有这个目录。Fartown/main为基准跑了一遍check:changed,范围是 fork 相对上游改动的 1575 个文件:check:changed,29 项全部通过。还没做
mobile-terminal-surface-recovery、remote-host-path-open。remote-host-path-open打开的标签读文件用的是 fork 的 grant,保存时会换成上游新发的 grant。保存后再用旧 grant 读,可能因为文件已变而失效。fork/integration更新。🤖 Generated with Claude Code