Wire the offline write-queue into the desktop write path #64
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/wire-offline-write-queue"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The offline write-queue (
packages/core/src/queue/write-queue-v0.ts, #33) was a fully-tested pure module that nothing in the desktop imported. Approving a change while gitea was unreachable madegitea:applyChangecall the client directly and throw, losing the write. This wires it in end to end.What changed
queue-store.tspersists the queue next to the snapshot store, with the same degrade-to-empty-on-corruption discipline and an injectable path for tests.applyChangeextracts the guarded write intoapplyChangeLiveand, on unreachability (any error that is not aGiteaApiErrorrejection), enqueues the intent — coalesced by(issue, axis)— instead of throwing, returning{ ok, queued, pending }. A genuineGiteaApiErrorstill surfaces, so a doomed write never replays forever.reconciledrains the queue once a successful read proves gitea is reachable, re-reading so the board reflects the replays. Replays are idempotent (labelplan.noop; assignee/milestone re-set to the same value).boot+ stalereconcilereport the pending count so the badge shows immediately offline.use-backlogthreadspending; theOfflineBannershows "N queued"; the chat approve message distinguishes a queued (offline) approval from an applied one.Incidental
vitestinto the desktop workspace (it was missing, so the main-process suite could not run viayarn test).Verification
queue-store.test.tscovers persist / reload / coalesce / replay-drain using the real core functions and real fs.GITEA_LIVEsmoke drove the real IPC handler against the real repo: an online re-estimate landed and self-reverted (est/2d→est/8d→est/2don #34), and an offline approve returned{queued:true, pending:1}then drained topending:0on reconnect with the issue untouched. Not committed, per the repo convention that no test mutates gitea.Scope: the propose→approve edit path (
IssueChange). Capture→file (new-issue creation) is intentionally out of scope — a new issue has no number to coalesce on.