Repository navigation
feat(host,desktop): the Issues list is pushed to the panels that draw it from Neon Realtime, read on no clock - #3918
Closed
charleslpan wants to merge 9 commits into
Closed
charleslpan wants to merge 9 commits into
charleslpan wants to merge 9 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
luke-agent
Bot
force-pushed
the
luke/issues-live-service
branch
from
October 20, 2026 01:40
5c796d5 to
e60c4ee
Compare
luke-agent
Bot
force-pushed
the
luke/issues-live-follow
branch
from
October 20, 2026 01:40
279205e to
de3e387
Compare
luke-agent
Bot
force-pushed
the
luke/issues-live-follow
branch
from
October 20, 2026 01:53
de3e387 to
698f1b1
Compare
luke-agent
Bot
force-pushed
the
luke/issues-live-service
branch
from
October 20, 2026 01:53
e60c4ee to
3fd71a5
Compare
… it from Neon Realtime, read on no clock The host follows a workspace's sealed issues statement with `liveRows` and emits `ISSUES_CHANGED`; main hands each change to the panels following it on `app:issues`, counting their follows as the automations follow does. The window follows the list while its page stands and drops the minute re-read and the re-read after every write; an issue's page draws the followed list's copy where it is newer, so it is live too. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com> # Conflicts: # apps/desktop/src/main/ipc/register-desktop-ipc.ts # packages/host/src/acts.ts # packages/host/src/bridge.ts # packages/host/src/compose-issues.test.ts # packages/panel/src/desktop/issues-page.test.ts
The in-process bridge and the web host answer the new issues follow acts and app:issues channel as a tab does every push: nothing, since it reads the list once. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Main's command palette tests mount the Issues list, which now follows its workspace's issues and listens on app:issues, so their fake bridges answer onIssues with nothing pushed. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
… change, as a window is The follow-counting rows move into `@luke/host/act-router`, generic over the sender; desktop main spreads them as before, and the web host spreads them too and says each change through the in-process bridge's `onIssues`. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
The issues composer gains a `reset` that clears its follows, which the gate closing runs beside the tasks', terminals', and coding agents', so the account that was signed in is subscribed to no more and pushes no more of its issues to the windows. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…t waits for it on the followed list Filing and changing an issue read `pg_current_xact_id()::text` in the write's own `RETURNING`, and the answer carries it as `txid`. Before it answers the window, the host waits for that transaction on the workspace's followed subscription with `awaitTxId`, bounded at five seconds, so the push already holds the write when the window lands it, as Neon's optimistic mutations guide does it. A write that changed nothing carries no txid and is not waited on, nor is one of a workspace no window follows. The issues live statement joins the live statements held to calling only immutable functions. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
… for good once signed out Each seal and renewal of a workspace's issues names the account signed in as the follow started, as #3287's follows do; a seal or renewal refused as signed out ends the follow rather than asking again, and a follow that broke says why in the log before it starts again. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent
Bot
force-pushed
the
luke/issues-live-service
branch
from
October 20, 2026 02:57
3fd71a5 to
b570b44
Compare
luke-agent
Bot
force-pushed
the
luke/issues-live-follow
branch
from
October 20, 2026 02:57
4428112 to
049d23d
Compare
…, and a write waits ten seconds for its txid The issues composer keeps the workspaces main follows across a sign-out, and the gate opening follows them again under the account now signed in, so a page that stayed open is live again without a remount; a workspace let go meanwhile is not. A write's answer waits up to ten seconds for its transaction, as the other follows and Neon's guide do. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Contributor
|
Closing as superseded: #4016 (merged Oct 20) removed Luke's own workspace issues from main, so there's no Issues list left to follow over Realtime. The branch is kept. |
This branch was successfully deployed
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.
Second of two PRs making the Issues list live over Neon Realtime, stacked on #3902 (which stacks on #3287).
What
issue-follow.tsfollows/api/live/issueswithliveRows(the shared socket from feat(host): every read the host follows over Realtime shares one socket (P1) #3287), builds the list withissuesOfLiveRows, and publishes it. If a seal goes unanswered or a subscription stops, it publishes the failure (if there is one) and reseals after 5 s. There's no fallback and nothing reads on a clock.compose-issues.tsaddsissues.follow/issues.unfollow(aFiberMapkeyed by workspace, gated like the other calls) and emitsissues.changed. The signed query never leaves the host.issue-follow-acts.tscounts each panel's follows and sends changes onapp:issuesonly to the panels following that workspace. It works the same way as the automations follow (feat(host,panel): the automations list and an automation's runs are pushed to the pages that draw them #3297).useIssuesfollows the list while the page is open. TheuseMinute()re-read and the re-read after each create or change are gone. The first read and Try again still useissues.list. The issue page now shows whichever is newer: the followed list's copy or its own read, souseIssueupdates live without new plumbing./api/issuesroute is unchanged.Tests
compose-issues.test.ts: live rows get pushed newest-first with no extra reads, and unfollowing unsubscribes. An unanswered seal is published as a failure and asked for again after the pause, then nothing more once unfollowed. Nothing is followed behind a closed gate.issues-page.test.ts: the list is followed while the page is open and drawn from pushes (a failed push keeps the list), then let go on unmount. An issue's page shows a teammate's change carried by the followed list.LUKE_UPDATE_FIXTURES=1:issue-view-issueFollowSchema.jsonandissue-view-issuesFollowedSchema.json. Both are new schemas only.After the restack
@luke/host/act-router(issue-follow-acts.ts) and are generic over the sender, as the inbox follows (feat(host): a window follows a plan's or an agent's inbox as a stream of pushed changes #3264/feat(panel,host): the windows' inbox reads become pushed follows, and the held inbox reads are retired #3306) are. Desktop main and the web host both use them, and the web host pushes each change through the in-process bridge'sonIssues.resetthat clears its follows, and the gate closing runs it beside the tasks', terminals' and agents' resets. The previous account's subscription closes and pushes nothing more. The test is incompose-issues.test.ts.createIssueandchangeIssuereturnpg_current_xact_id()::textin the write's ownRETURNING, and the answer carries it astxid. Before answering the window, the host waits for it with the followed subscription'sawaitTxId, with a 10 s timeout, so the push already holds the write when the window lands it. A write that changed nothing carries no txid and isn't waited on, nor is a write in a workspace no window follows. Golden diffs (LUKE_UPDATE_FIXTURES=1):issue-wire-issueAnswerSchema.jsonandissue-view-issueViewSchema.jsongain the optionaltxid, and nothing else changes.live-statements.test.ts, which holds every sealed statement tomutableFunctionsOf(...) = [].Checks run locally
lint, oxlint, knip, discarded-effect, repository checks, typecheck of gateway/features/host/panel/desktop, and the host, panel, and desktop test suites (excluding
app-menu.test.ts).issue-follow-acts.test.ts: two panels follow and the host follows once; one unfollows and the host follow stays while changes reach only the remaining panel; the last unfollows and it ends. A page that's gone releases every follow it held.Made with Luke