Background generation, unread replies, send/stop, PLAN.md
**Replies now run in the background.** Generation was driven by the SSE request, so navigating away or opening another chat cut the answer off mid-sentence. services/generation.py owns the work as its own task and the SSE endpoint merely follows it. Verified: attached briefly, closed the connection, went to another page -- the reply finished anyway, 832 characters, not marked stopped, auto-titled. Reattaching works because both `render` and `reasoning` frames now carry the whole block rather than a delta. A follower arriving late has no earlier fragments to append to, so deltas would leave it permanently missing the beginning. Verified: attached six seconds in and the first frame already contained 517 characters written while nobody watched. **Unread indicator.** A reply that lands with no follower attached marks its chat unread; the sidebar polls every 10s for out-of-band dot spans plus an HX-Trigger that raises a toast. Polled rather than pushed: a browser sitting on another chat has no connection to the one that finished, and an always-on channel per tab is a lot of machinery for a green dot. `unread_notified` stops the same arrival being announced every tick. Follower count is what decides "was anyone watching", so reading it as it arrives does not mark it unread -- verified both ways. **Stop is the send button.** While a reply is being written the send button becomes a red stop square, found via a MutationObserver on the thread since the composer and the streaming bubble are far apart in the document. The in-bubble Stop is gone. **Attachment border removed.** As asked -- an attachment is a picture, and the frame only ever drew at the wrong width. The anchor now shrink-wraps and the img's width/height attributes are overridden so a small image shows at its own size. Adds PLAN.md: what is built, what is not, known limits, and the decisions that look like oversights until you know the reason. 239 tests, ruff clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -41,6 +41,8 @@ runtime. Clone it, `pip install -e .`, run it.
|
||||
- **Live Markdown** — formatting appears as the model writes, not at the end
|
||||
- **Stop and rewind** — cut a reply short and keep what arrived, or edit an
|
||||
earlier message and run the conversation on from there
|
||||
- **Replies keep running in the background** — navigate away, open another
|
||||
chat, close the tab; a green dot and a notification tell you when it lands
|
||||
- **Attachments** — drag, paste or pick images, PDFs and text files. Images are
|
||||
downscaled and sent to vision models; PDF and text content is extracted and
|
||||
put in the prompt
|
||||
@@ -65,6 +67,8 @@ runtime. Clone it, `pip install -e .`, run it.
|
||||
Built-in tools with admin settings · custom tools and MCP servers · agentic
|
||||
execution (local and over SSH) · image generation · OCR for scanned PDFs.
|
||||
|
||||
See [PLAN.md](PLAN.md) for what is built, what is not, and why.
|
||||
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user