Follow felis-web-component to felis v0.1.0 #1

Merged
natsukium merged 7 commits from follow-felis-105b0899 into main 2026-09-26 20:58:46 +09:00
Owner

Summary

Follows felis-web-component to its branch that moves the component to felis
v0.1.0 (https://github.com/felis-terminal/felis/releases/tag/v0.1.0), the
first public release. It speaks protocol 1.0 and felis-json v1 over the
gateway, so the 105b0899 wire this PR first targeted no longer applies.

The lock points at two branches, not main. Re-lock after they merge:

  • felis-web-component is locked to
    git+https://git.natsukium.com/natsukium/felis-web-component?ref=follow-felis-105b0899
    at 0c33110 (natsukium/felis-web-component pull 3).
  • Through the component, felis-web-gateway is locked at dadcf2b on
    follow-felis-v0.1.0 (natsukium/felis-web-gateway pull 4), and felis at
    github:felis-terminal/felis/v0.1.0.

After both merge, run
nix flake update felis-web-component once the component's own lock points
the gateway back at main. flake.nix already names main, so no source edit
is needed.

What changed here

  • flake.lock: re-locked as described above.
  • src/core/store.ts: v0.1.0 lists sessions in recency order. Tabs for newly
    seen sessions are now appended in creation order (sequence, the order a
    native window's session switching uses), sorted within each host.
  • scripts/rig.sh: the daemon refuses a socket directory that is not the
    uid's own with mode 0700, so the rig now chmod 700s it.
  • public/hello.fcast: the unreferenced legacy recording, converted to .fcast
    v3 so it does not break if something serves it.

Verification

  • npm run typecheck, npm run build: green.
  • npm run test:unit: 32/32 green.
  • nix build .#default: green.
  • npm test browser suite (test/mobile.mjs, Chromium device profile): run
    against an isolated felis v0.1.0 daemon (fish as $SHELL) and the
    gateway from pull 4 with a token. Result: 43/52. The 9 failures:
    • search finds a line that is only in scrollback fails. This is known and
      out of scope: the gateway routes neither the Search nor the Region family
      (natsukium/felis-web-component issue 2, natsukium/felis-web-gateway
      issue 1), so the component refuses search.
    • The search overlay then stays open, which takes 7 more checks down with
      it:
      • the snap-to-bottom check;
      • the two prompt-jump checks;
      • the dial tap;
      • the dial fan;
      • the "full-screen program takes the dial away" check (the dial is hidden
        while searching);
      • "tapping it copies it" (the search note intercepts the tap).
    • a sideways flick changes session, and comes back fails with "the first
      tap after a flick did nothing — the browser is holding its click". This is
      a Chromium gesture/click-timing check that does not touch the wire. It was
      not investigated further.
    • Everything else passes, including typing, prefix keys, the shortcut bar,
      theme, resize, pinch, session switching, row actions, kill and cleanup.
      It reports no unexpected console errors.
## Summary Follows felis-web-component to its branch that moves the component to felis **v0.1.0** (https://github.com/felis-terminal/felis/releases/tag/v0.1.0), the first public release. It speaks protocol 1.0 and felis-json v1 over the gateway, so the 105b0899 wire this PR first targeted no longer applies. **The lock points at two branches, not `main`. Re-lock after they merge:** - `felis-web-component` is locked to `git+https://git.natsukium.com/natsukium/felis-web-component?ref=follow-felis-105b0899` at `0c33110` (natsukium/felis-web-component pull 3). - Through the component, felis-web-gateway is locked at `dadcf2b` on `follow-felis-v0.1.0` (natsukium/felis-web-gateway pull 4), and felis at `github:felis-terminal/felis/v0.1.0`. After both merge, run `nix flake update felis-web-component` once the component's own lock points the gateway back at `main`. `flake.nix` already names `main`, so no source edit is needed. ## What changed here - `flake.lock`: re-locked as described above. - `src/core/store.ts`: v0.1.0 lists sessions in recency order. Tabs for newly seen sessions are now appended in creation order (`sequence`, the order a native window's session switching uses), sorted within each host. - `scripts/rig.sh`: the daemon refuses a socket directory that is not the uid's own with mode 0700, so the rig now `chmod 700`s it. - `public/hello.fcast`: the unreferenced legacy recording, converted to .fcast v3 so it does not break if something serves it. ## Verification - `npm run typecheck`, `npm run build`: green. - `npm run test:unit`: 32/32 green. - `nix build .#default`: green. - `npm test` browser suite (`test/mobile.mjs`, Chromium device profile): run against an isolated felis v0.1.0 daemon (fish as `$SHELL`) and the gateway from pull 4 with a token. Result: **43/52**. The 9 failures: - `search finds a line that is only in scrollback` fails. This is known and out of scope: the gateway routes neither the Search nor the Region family (natsukium/felis-web-component issue 2, natsukium/felis-web-gateway issue 1), so the component refuses search. - The search overlay then stays open, which takes 7 more checks down with it: - the snap-to-bottom check; - the two prompt-jump checks; - the dial tap; - the dial fan; - the "full-screen program takes the dial away" check (the dial is hidden while searching); - "tapping it copies it" (the search note intercepts the tap). - `a sideways flick changes session, and comes back` fails with "the first tap after a flick did nothing — the browser is holding its click". This is a Chromium gesture/click-timing check that does not touch the wire. It was not investigated further. - Everything else passes, including typing, prefix keys, the shortcut bar, theme, resize, pinch, session switching, row actions, kill and cleanup. It reports no unexpected console errors.
felis-web-component's own follow branch (natsukium/felis-web-component
pull 3) re-decodes GridMsg's collapsed RowDelta, the new Size and unit
RehydrateBegin shapes, and the SessionInfo-only attach reply. The
Terminal/FrameSource surface it emits (felis-terminal.d.ts) is
unchanged, so no call site here needed new plumbing.

Search and "copy last output" now refuse on every live session rather
than only on one lacking a capability bit: felis split those into
correlated SearchMsg/RegionMsg families, and the gateway's broker does
not route either yet (felis-web-component issue 2). The comments
guarding those catch handlers described the removed capability check;
update them so a reader is not sent looking for a negotiation that no
longer exists.

felis-client-core does not build with default-features = false at this
felis revision (felis issue 195), so the component's wasm has not been
rebuilt past its pre-reset artifact and the browser suite cannot pass
yet — tracked upstream, not fixable from here.
The pinned rev sent InputMsg::Resize flat, read GridMsg::ClipboardSet's
body without its `write` wrapper, and still dispatched on the removed
GridMsg::Notify (felis-web-component issues 4, 5 and 6), so against a
live daemon this app's resize reports were dropped by the gateway, every
OSC 52 arrived empty, and Terminal.onNotify never fired. The roster row
type also gained `exited` / `lastExitCode` (issue 7), which a session
picker here needs to tell a shell in the post-exit grace from a live one.

No call site changed: the Terminal surface is the same and the new
SessionEntry fields are additive.
felis v0.1.0 is the first public release (github.com/felis-terminal/felis),
and it speaks protocol 1.0 with felis-json v1 on the gateway's socket, not
the 105b0899 wire the previous lock was built against. The lock now takes
felis-web-component from its branch that follows the release, which brings
felis at the v0.1.0 tag and felis-web-gateway at its own follow branch
transitively; both inputs go back to main once those branches merge.

The component's surface this app uses is unchanged apart from roster rows
gaining `sequence`, so typecheck passes without edits here.
felis v0.1.0 lists sessions in recency order, so tabs opened from the
roster came out shuffled by whichever session was last used, and a
reload reordered them again. Each row now carries the daemon's creation
`sequence`, the same order a native window's session switching steps
through, so new tabs are appended in it. Sorting only within one host
keeps the per-host grouping, since sequences from different daemons do
not compare.
felis v0.1.0's daemon refuses to listen in a directory that is not owned
by the uid and mode 0700, and `mkdir -p` under a default umask leaves 0755
(or keeps whatever an earlier run left), so the rig's daemon failed to
start and every browser check behind it failed with it.
The component now refuses a recording whose header is not felis-fcast v3
with felis-json v1 frames, so the old v1 file would only produce a
console error if anything served it. It is converted in place with the
same frame-by-frame mapping the component used for its own recordings,
keeping this file's content rather than re-recording it.
natsukium changed title from Follow felis-web-component to 105b0899 to Follow felis-web-component to felis v0.1.0 2026-09-26 19:41:08 +09:00
felis-web-component#3 and felis-web-gateway#4 have merged, so the lock
leaves their PR branches (which the squash merges leave behind) for
main; felis stays at v0.1.0 through the component's own lock.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
natsukium/felis-web!1
No description provided.