Repository navigation
feat: adopt upstream v1.21.0 and release 1.21.0+ys.1 - #92
Merged
Merged
Conversation
… home indicator The Keys sheet says Share instead of Copy to another device, the intro and the empty import line lose the device talk, and the Keys dock header holds only the KEYS label and the pencil. The tall sheet ends 1.5rem plus the safe area clear of the screen edge, and Restore default is an outlined button. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…and sharing by code The ADR is renamed to say the pad is a board you arrange, records the area rules, schema 2 and the new Default, and drops the per-device framing. The configure page says where the pad is stored in one sentence. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A key is anchored at one cell and spans 1 to 3 columns and 1 or 2 rows, never over another key and never off the board. Drops move the whole area, a drop on a key of the same size swaps, any other overlap is refused with a grey outline and a line naming the key in the way. Width and Height sit in the editor toolbar. The dock and the editor place keys with CSS grid spans. The Default and the presets use a three-cell Space. Layout codes and storage move to schema 2 and still read schema 1. The chord builder gains a Modifier kind that saves a sticky Ctrl, Alt or Shift key, and an armed modifier lets go when its key leaves the board. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A small label on the mirror's bottom-right corner, above the belt, names
the model the pane's agent is on ("Opus 5.5"). The bridge already read the
model on every cache probe; the tracker now keeps it per session on its own
map (the engine drops the cache entry when it has nothing to say, and a
model is worth showing even then), and the snapshot attaches it as
PaneWire.model beside `cache`. A Claude `/model` written after the newest
turn wins over that turn's own model, so the label is right before the next
turn runs. The web shortens Claude ids to Claude Code's own words, drops
provider and gateway prefixes, and draws nothing without a model.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Code's configured statusline, Codex's footer, omp's statusline and pi's
footer print the model themselves, so the label above the belt said it twice.
The label now stands down when the rows the phone draws near the bottom name
the same model: the lifted statusline strip for a harness with an adapter (in
Chat as well, the strip stands below both bodies), the last raw rows for one
without (pi) and in raw-terminal mode, which only the Terminal body draws. The
bridge parses no screen, so the web's already computed statusLines is the
signal. Words are compared, not substrings, across id and display spellings
("claude-opus-4-8" vs "[Opus 4.8]"), so "Opus 5" is not found in "Opus 5.5".
The answer is held: a naming row hides the label at once, a frame with no rows
changes nothing, and three frames in a row of rows that lack the name bring it
back, so a dialog or a redraw cannot blink it. The label is absolute and owns
no line, so it arriving or leaving moves nothing.
Its screen-reader string is now one sentence per locale ("Model {name}", like
branch.aria) instead of a word and a hard-coded colon.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…or's turn Claude Code 2.1.291 takes a message into a running turn and writes no user row for it, only a queued_command attachment after the absorbed_mid_turn remove. The reducer cleared the waiting place and dropped the attachment, so the message vanished from Chat. A human prompt attachment now becomes a user row (same classifyUserText path, the attachment's own time, one row per delivery_id). Other origins and non-prompt modes stay off screen. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ent works Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… works Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
On Windows the bridge can stay alive and stop answering every request, /api/health included (0% CPU, port open, sockets in CLOSE_WAIT). The Task Scheduler launcher only relaunched a bridge that exited, so it stayed down until `collie stop` + `collie start` by hand (AltanS#386). - The launcher asks the bridge's health route every 30 s after a 2 min grace, and three misses in a row (~90 s of silence) end the bridge so the existing loop relaunches it. Any HTTP answer counts as alive, so a deposed member or a cold standby door is never ended. - The check is resolved at launch from the bridge's own environment (loadContext gains an `ambient` option) and asks where the update health gate asks (probeTarget). A peer with no standby door, mutual TLS only, gets no checks. - A kill that does not take is repeated at the next silent check. - probeTarget dials loopback for a wildcard bind and brackets an IPv6 literal; both were broken URLs for the update gate too. Refs AltanS#386 (cherry picked from commit 12fa274)
Bun's fetch sends even a loopback request through HTTP_PROXY. With a proxy in the launcher's environment, every check of a healthy bridge went to the proxy: a dead one read as a silent bridge and ended it every few minutes, a live one answered for a bridge that had stopped. The check now asks with node:http, which reads no proxy variable, and uses no agent so no kept-alive socket outlives it. An address node:http cannot parse is a miss, not a throw. Adds the Unreleased line for the fold of PR AltanS#387. Refs AltanS#386 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… door realFrontDoorExec ran `tailscale serve` with spawnSync and no timeout. A deposition that arrives on the wire runs it on the bridge's one thread while the bridge serves, so a tailscale that never returned froze every route, /api/health included, for good. Each call is now killed after 30 s and reads as a failure, which the teardown already reports as one warning. Not the cause of AltanS#386 (that bridge is solo and records no mapping), found while sweeping the bridge for synchronous calls without a bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bun keeps a proxy it has read from the environment for the life of the process, and deleting HTTP_PROXY afterwards does not clear it. Setting it in the test process sent a later suite's loopback fetch to a dead proxy (sys.test.ts, realNet and a rehearsal mirror). The probe now runs in a child that has the proxy, and this process never sees one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… launchers Docs-only. Adds a Start-from-the-phone bullet, rewrites the Keys bullet and caption, and lists launchers in the Configure row. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rade notes Docs-only. claude-code-on-your-phone gains a section on the New page; crew.md says each machine detects its own agents; multiplexers, troubleshooting and upgrading cover the New worktree reason, greyed agents, folder refusals and the 1.19.0 changes. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
README only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check-mux-names refuses a multiplexer name in web/src, and the preset id and label "tmux" tripped it (8 failures in bun run test). The preset keeps its board and its line; only the id and the name change, in all 12 locales, the README, docs/configure.md and ADR 0092. SKIP_VERSION_CHECK: the Keys pad is unreleased; the release commit rewrites its Unreleased bullet with the new preset name, so no new bullet is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release counsel: commands-recent.json kept on disk, and listed on every New page, a secret typed once (TOKEN=abc deploy). looksSecret flags an assignment word, a URL with a password, and words such as token, secret and password; such a line runs as usual and is not recorded. A guess that errs towards keeping too little. ADR 0095 amended (rules 16 and 17), configure.md and security.md say so. SKIP_VERSION_CHECK: one-off commands are unreleased; the release commit writes their bullet with this rule in it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 1.19 board Two e2e failures in the release gate. The New page dropped the sheet's focus move after a tap on a Favourite or Recent folder, so the field kept focus and a phone kept its keyboard open; Start now takes focus after the render, counted per tap because the tapped folder may already be in the field. nav-tray-enter still measured Enter across two rows; since the 1.19 board Space is three cells and Enter one, so it measures that. SKIP_VERSION_CHECK: both are inside unreleased 1.19.0 work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tests read native paths windows.yml failed 17 bridge tests on the 1.19.0 release commit. One was a real bug: Git for Windows answers --git-common-dir with forward slashes, so the `\.git` check missed and a linked worktree passed for its own main checkout; the path is normalised first. A folder typed as `~\projects` now means home on Windows, as `~/projects` does. The other sixteen were tests that expected POSIX paths or 0600 modes; they build paths with join and skip the mode check on NTFS, as the older state-file tests do. SKIP_VERSION_CHECK: fixes inside the 1.19.0 work; the 1.19.0 section names the `~\` spelling, and the tag goes on this commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit e92eb26)
…air (AltanS#393) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ltanS#392) `collie update --help` began the real update, because every verb is registered with commander's help off and received `--help` as an argument. A guard in front of every verb and sub-verb body now prints the usage for `-h` and `--help` and returns 0. The bootstrap verbs (`build`, `_apply-update`) hand a help request on to the table. An argument after `--` is not a help request. Parent verbs keep their own usage action. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drop the pointer to the external collie skill, state nothing outside the repo, and use generic placeholders for pane ids and capture paths. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mid-send stall The /models-style overlay paints its own bordered box over the screen while the composer tail stays intact, so composerReady still answers true although typing would land in the overlay's filter, never the input box (the Navi stall). A new optional adapter predicate, overlayHoldsKeyboard, matches only the closed box (bar rows the heavy ┃ opens AND closes); it is consulted at the three reads that already exist — the pre-flight probe, the sweep's re-confirm, the chunked-send read — so no send path grows a new pane read and force keeps overriding exactly like a missing composer. A stall whose last verify screen shows a dialog, menu or overlay names it via reply.stalled.modal (new key in all twelve bundles), except under force where the key-landed warning stays.
… stall string overlayHoldsKeyboard matched any single bar row that the heavy bar opens and closes. A user message echoing a pasted table drawn in heavy bars (rich, eza, lazygit) would refuse every send until it scrolled away. Now a run of at least three consecutive closed rows is required; a bare or plain row ends the run. The slash-palette capture has ten such rows in a row. The doc comment names the remaining gap. Also: reply.stalled.modal in Turkish said "yer paylasimi" (location sharing) for overlay; it now says "ust katman". Fix an indent slip on modalOnScreen in types.ts. Add the changelog bullet for AltanS#391. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tor does (AltanS#383) On macOS os.freemem() is only free plus speculative pages, so the file cache read as used and a Mac sat at 88 to 98 percent. The sampler now starts /usr/bin/vm_stat on darwin, async and never awaited (killed after 1 s, one in flight at a time), and serves its last parsed answer on the next sample: app (anonymous minus purgeable) plus wired plus compressor pages, in the page size vm_stat prints. Until the first answer, when it is older than three idle intervals, or after a failure, memory is totalmem - freemem. The command goes through a new optional async run seam on MachineReaders. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A `_` verb (`_apply-update` and the other verbs only another Collie spells) answers `--help` with exit 2 and runs nothing, so a wrong argv in an update fails loudly instead of reporting success. - The /auth/ placeholder escapes the mount before it lands in the HTML. - The macOS vm_stat run gets a fixed C locale. - The AltanS#383 changelog line says the change is not yet checked on a Mac. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… removed Restores, from main: the PINNED corpus list and its count test (with the nine 18.10 captures added), the cohort guards, the FOREIGN and corpus size checks, the stripChrome same-reference tests (limited to captures that end in content, since the nine new captures end in a file newline), and the full contract header of ask.ts with sections for batched questions, the review screen and the Ctrl+O expand state. ASK_NOTES.md says batches and the review are lifted only for the default glyph preset. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
TranscriptStore.page now reads through a new cached(), which returns the parsed window and whether the file's head was clipped, without slicing it. Behaviour of page is unchanged. The next commit reads the live window's missing prompt from this cache instead of opening the log again. Co-Authored-By: Claude <noreply@anthropic.com>
scrollToChild moves a child's top edge to the top of the scrollport and stops following the tail. It aligns to the padding edge, so a band inset over the top does not hide the child, and it declines when the reader has scrolled away unless the caller passes force for a control the reader pressed, so arriving content never overrides backscroll. ChatMessageList exposes it on its handle. The pinned prompt in a later commit jumps with it. Co-Authored-By: Claude <noreply@anthropic.com>
A first paint is 40 turns, and a long run of tool calls pushes the prompt that started it out of that page. The window reports the newest operator prompt it knows as a state field beside queued, capped at 1000 characters and masked like the rest of the body. A window whose opening tail landed mid-run knows none; it looks the prompt up once per generation through the History read without holding the answer, which reuses a valid History cache and otherwise costs that read once. Notes the agent sent itself and textless user rows (orphaned tool results) never count. ADR 0073 gains an amendment under queued. Co-Authored-By: Claude <noreply@anthropic.com>
An overlay over the top of the Chat scroller, fixed at two lines so it moves nothing, names the prompt the topmost visible turns follow. A held prompt is a tap away; a prompt the first page left out comes from the bridge's lastPrompt and a tap walks older pages to it, at most ten; with neither, the pin offers older turns. A prompt that is not held pins over 'Load older' too, since a forty-call run folds into one card that fits the screen and the pin's tap does what that row does. Off on a saved copy. A walk looks for the prompt that was tapped, so a newer prompt landing live meanwhile does not become the target. A jump lands on the prompt at the scroller's padding edge, the line the pin reads, and clears the pin. Blocks overlap by 24px (each block's -12px margin top and bottom), so the top block is measured past that overlap. Older blocks that never rendered sit at their content-visibility placeholder and take their real size after the first scroll, so the jump re-aligns at 100, 250 and 500ms; it stops when the reader touches the list or the latest-turn button beside it, and a new jump or an unmount ends the one before. A walk to an older prompt is called off the same way if the reader moves while its pages load. Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Ran the two English placeholders (ask.notTaken, connection.tokenRefused) through wordsmith, then matched each catalog's register by hand. The zh and zh-TW ask.notTaken lines are hand-written, because the length guard kept the English. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…sts say so Windows has no socket transport. chooseDurableTransport takes the platform as a parameter and answers a socket path on win32 with one config error that names COLLIE_DURABLE_URL and COLLIE_DURABLE_TOKEN. The boot line, the adapter and the durable-env doctor row print that sentence, and the socket rows skip with the reason. The fixture gains startWire and wire: on Windows (or with COLLIE_TEST_LOOPBACK=1) the fake program listens on 127.0.0.1 and the adapter keeps the socket budgets, so the control, ask, answer, receipt, events and Chat tests run on the wire there. Tests about the socket itself skip on win32, and the Windows skip budget names them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Also moves ADRs 0099 to 0103 (durable programs, asks as data, screenless controls, starters, the two transports) from Proposed to Accepted, shipped in 1.21.0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Merge upstream v1.21.0 while retaining fork authorization, offline cache, update selection, terminal preferences and source-only publishing boundaries. Refs: #88 Signed-off-by: @yousecjoe
Mask durable asks on local and crew responses. Keep anonymous additions transient and distinguish header attribution from paired device revocation, including optional crew provenance. Refs: #88 Signed-off-by: @yousecjoe
Signed-off-by: @yousecjoe
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
Important Review skippedToo many files! This PR contains 863 files, which is 763 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters: 4
📒 Files selected for processing: 863
You can disable this status message by setting the
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 |
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.
Summary
Adopt upstream Collie v1.21.0 and cut source-only fork release
1.21.0+ys.1, preserving fork-specific behavior. Targetmain, the default branch and current home of1.18.1+ys.2; remotedev-joeis two commits behind main. The original checkout and deployed versions remain untouched.Commits
Changes
COLLIE_REDACT=off.X-Crew-Device-Kindattribution provenance. Crew protocol remains 2; existing admission factors are unchanged. Both lead and member must be updated for the new opt-out behavior.docs/adoption/v1.21.0.md.Release
Published source-only release: https://github.com/youngsecurity/collie/releases/tag/v1.21.0%2Bys.1
The annotated tag points to
094c555a6c3ac26555b9f4bf76784dd80217a87a. The only uploaded asset iscollie-release.json; the notes preserve the fork's update instructions and migration warnings. Published notes and the downloaded sidecar are verified against the tagged source before this PR is opened. This does not mean main has adopted the release yet.Out of scope
sharpadvisory, GHSA-wq5f-xc86-pv6w, propagated through Miniflare, Wrangler and the Vitest plugin. It is outside Collie's root runtime dependencies. No automatic dependency upgrades or Cloudflare deployment were performed; avoid untrusted-image processing with those development tools until updated.Related
All seven upstream tags are verified ancestors of this branch. These issues concern adoption into main, so closure is deferred to this PR's merge rather than performed merely because a release tag or PR exists.
Closes #88
Closes #87
Closes #86
Closes #85
Closes #84
Closes #83
Closes #80
Test plan
v1.18.1was incorporated; all seven later adoption targets are now ancestors of the branch.456e08c4. The exact release commit094c555achanges only four release metadata files; its full build, root suite and frontend suite were rerun successfully.1.21.0+ys.1; generated notes andcollie-release.jsonpass the source-only release contract. The sidecar SHA-256 ise48a8deb6444f139c9e5a5edf87eb933a4f092786304188861cad6103cca6c67.456e08c4, with 1,443 and 259 targeted tests passing respectively.The first concurrent root/frontend run timed out in an upstream SQLite fixture setup. The root suite passed when run alone, without changing the fixture or loosening its timeout. An imported CJK rendering test was corrected to explicitly enable wrapping rather than assume upstream's default.