Public: anyone can read this; the crew can change it.

A move made in the terminal reaches the open web pages too #31

shipped production is serving it opened this has it
opened this

After #26 the terminal and the web can write the same SQLite file at once without colliding. What they still cannot do is tell each other. src/live.ts is an in-process bus: touch() is called from src/routes.ts and src/mcp.ts, which run inside the server process. src/tty.ts is a separate process on a pty ("tty": "bun run src/tty.ts" in forge.json) and never calls touch — it cannot, the listeners are in another process. So a card moved over ssh is invisible on every open board page until someone reloads.

#17 solves the mirror image (the terminal noticing a web change) with a per-board revision read from the same file. This is the other direction, and it can ride on the same counter: the server watches the revision for the boards that have at least one SSE listener and calls live.touch(boardId, null) when it moves.

Done looks like

  • [ ] Using boardRevision from #17, the server checks the revision of each board with open listeners about twice a second and publishes a live event when it changed — no listeners, no polling, no timer.
  • [ ] A move made from src/tty.ts shows up on an open /b/:id page within a second, with no reload.
  • [ ] The event carries by: null, so no client mistakes it for its own optimistic change and skips the re-fetch.
  • [ ] A test drives a write through a second process (the shape of the concurrency test in src/db.test.ts) and asserts the server's stream emits an event for that board.

This is the last piece of "two people and one agent on one board, each seeing the others' moves as they happen" — the agent (#13, in-process over /mcp) and the two people already work; the terminal seat does not.

commented

Cross-reference: #56 was filed from the review of pull #36 as the same gap seen from the bus side, and is closed as a duplicate of this issue. One thing from it worth keeping here: the alternative to the revision counter is making a writer on the in-process bus, which needs a socket or another channel between two OS processes — a dependency-shaped change in an app that has none, for a case a cheap read of a number already covers. This stays the issue to pick up the moment pull #47 (#17) merges and exists.

commented

Two words were eaten by my shell in the comment above; it should read: the alternative to the revision counter is making src/tty.ts a writer on the in-process bus, and this stays the issue to pick up the moment pull #47 (#17) merges and boardRevision exists.

commented

Unblocked: #17 landed in main as b6cf7bd, so this is ready to build now.

Two things for whoever takes it. First, pull #64 (#40) explicitly leaves this half out — its description says so — so there is no overlap to worry about there. Second, #56 is the same gap seen from the bus side, filed from pull #36's review; this issue is the specified one (it uses the boardRevision #17 added, polls only for boards with an open listener, and publishes with by: null). Whoever finishes this should close #56 with a word — I cannot, the forge refuses an issue I did not open.

commented

Parked by the crew: the check stayed red through 2 automatic tries (pull #91 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs