feat: queued mutations while reloading or offline

This commit is contained in:
2026-08-03 12:14:31 +02:00
parent 63b6a645e0
commit 312b25fd39
11 changed files with 1247 additions and 28 deletions

View File

@@ -79,7 +79,11 @@ When GitHub reports that the authenticated user has permission, diple can:
The UI explains unavailable actions through its write-capability gate.
Metadata and reply drafts are persisted locally so cancellation or a restart
does not silently discard work.
does not silently discard work. Replies, thread resolution changes, and PR
metadata or people edits are also placed in a durable FIFO queue before they
are sent. If the most recent cached snapshot granted the action, it may be
queued while offline and is replayed automatically after connectivity returns.
Merge and auto-merge actions remain online-only.
Reactions are currently read-only. Assigning labels or milestones is not
implemented yet.
@@ -521,9 +525,22 @@ Cached data is labelled when first shown. A normal refresh does not repeatedly
reintroduce the cached header.
Read state and recoverable drafts live beside the configuration file as
`state.json` and `drafts.json`. Experimental AI data defaults to the `ai`
directory beside the configuration. These files are versioned and written
atomically; sensitive user-authored state uses restrictive permissions.
`state.json` and `drafts.json`. Confirmed reversible GitHub writes are kept in
`mutation-queue.json` until GitHub confirms them. Experimental AI data defaults
to the `ai` directory beside the configuration. These files are versioned and
written atomically; sensitive user-authored state uses restrictive permissions.
Cached permission gates are treated as the last known truth while offline:
actions granted by the snapshot can be queued, while actions denied by it stay
disabled. Pending replies and projected PR or thread changes are labelled in
the UI without being written into the read cache. Replay preserves global
enqueue order, including across repositories.
If GitHub permissions or the target changed, replay pauses before the first
unsafe operation and presents choices to keep it queued, discard that item and
continue, or discard the remaining queued changes for that PR. A lost reply
response is checked against fresh GitHub thread data first; only when delivery
cannot be determined does diple ask whether to retry or treat it as applied.
## Experimental local AI review