Payload
{
"action": "edited",
"changes": {
"body": {
"from": "<!-- nixmac-storybook-preview -->\n### 🎨 Storybook preview\n\n[Open Storybook preview](https://c78c38dc.nixmac-storybook.pages.dev)\n\nUpdated for 3ada884d5249a46d9093a147ddfd47ae8c4cbbf1\n\n---\n\n### 🧭 Story changes\n\nCompared to `main` (snapshot diff at story level):\n\n🆕 **New stories (2)**\n\n- [Components/EvolveProgress › Build Check Streaming](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--build-check-streaming)\n- [Components/EvolveProgress › Streaming Response](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--streaming-response)\n\n✏️ **Changed stories (2)**\n\n- [Components/EvolveProgress › All Event Types](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--all-event-types)\n- [Components/EvolveProgress › Narration In Focus](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--narration-in-focus)\n\n\n> 💡 [Update snapshots ↗](https://github.com/darkmatter/nixmac/actions/workflows/update-snapshots.yaml) to regenerate baselines and open a PR."
}
},
"issue": {
"url": "https://api.github.com/repos/darkmatter/nixmac/issues/561",
"repository_url": "https://api.github.com/repos/darkmatter/nixmac",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac/issues/561/labels{/name}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac/issues/561/comments",
"events_url": "https://api.github.com/repos/darkmatter/nixmac/issues/561/events",
"html_url": "https://github.com/darkmatter/nixmac/pull/561",
"id": 4924333351,
"node_id": "PR_kwDOSB6EzM7znKyl",
"number": 561,
"title": "Evolve view: stream responses and build output live",
"user": {
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"labels": [],
"state": "closed",
"locked": false,
"assignees": [],
"milestone": null,
"comments": 5,
"created_at": "2026-07-19T20:48:07Z",
"updated_at": "2026-07-20T17:32:28Z",
"closed_at": "2026-07-20T17:30:25Z",
"assignee": null,
"author_association": "CONTRIBUTOR",
"issue_field_values": [],
"type": null,
"active_lock_reason": null,
"draft": false,
"pull_request": {
"url": "https://api.github.com/repos/darkmatter/nixmac/pulls/561",
"html_url": "https://github.com/darkmatter/nixmac/pull/561",
"diff_url": "https://github.com/darkmatter/nixmac/pull/561.diff",
"patch_url": "https://github.com/darkmatter/nixmac/pull/561.patch",
"merged_at": "2026-07-20T17:30:25Z"
},
"body": "## Summary\r\n\r\nLast part of the evolve view redesign (`docs/2026-07-15-evolve-view-ux.md`); follows up on #549.\r\n\r\nThis implements output streaming, the evolve view now shows the agent's work *as it happens* instead of only between steps. This hopefully adds fluidity to the interface and improves the subjective perception of speed of the agent.\r\n\r\nhttps://github.com/user-attachments/assets/6de4172d-4ab4-4fec-866a-d91b76548f2f\r\n\r\n### What changes for the user\r\n\r\n- **You can watch the build check run.** The dry-run build's output streams live under the active timeline row as a log tail, so a long `nix build` no longer looks like a frozen spinner — you see exactly which derivation it's chewing on. The tail auto-follows, but pauses following while you scroll up to read, and resumes when you scroll back down. When a build fails with oversized output, the excerpt is anchored on the error line rather than an arbitrary tail.\r\n\r\n- **You can watch the agent think (experimental).** With the new *Streaming responses* switch in Settings → Developer, the agent's response is typed into the active row token by token — including the reasoning it produces while composing tool calls, not just prose. Supported for Ollama and OpenAI-compatible providers.\r\n\r\n- **Retries are visible, not mysterious.** If the provider abandons a partial response and retries, the streamed tail resets with an immediate \"Retrying...\" notice instead of silently starting over, and the per-step timer stays anchored to real step boundaries so it doesn't lie about how long the current step has taken.\r\n\r\n- **Streaming never breaks a run.** If a provider or gateway rejects streaming, the run falls back to the regular blocking completion transparently (streaming stays off for the rest of that run); genuine model errors are still surfaced as errors rather than masked by the fallback.\r\n\r\n### Under the hood\r\n\r\n- New `StreamDelta`/`StreamReset` event details carry streamed slices; the raw deltas still flow to the Console mirror and session transcripts, while the timeline renders only the accumulated tail in the active row.\r\n\r\n- SSE (OpenAI-compatible) and NDJSON (Ollama) decoding handle raw-byte boundaries, surrogate pairs, and structured in-stream error payloads, which are classified with the same taxonomy as blocking errors.\r\n\r\n- Stream chunks are coalesced in the viewmodel to keep re-renders cheap; session transcript appends are serialized and flushed before `run_evolve` returns.\r\n\r\n## Test Plan\r\n\r\n- [x] `cargo check --tests` and the `evolve-progress` vitest suite pass after the rebase onto main\r\n- [ ] Manual pass: run an evolution with streaming on (Ollama + OpenAI-compatible) and off, watch build output, scroll during a build, interrupt a stream\r\n\r\n## Docs\r\n\r\n- [x] No docs update needed\r\n",
"reactions": {
"url": "https://api.github.com/repos/darkmatter/nixmac/issues/561/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"timeline_url": "https://api.github.com/repos/darkmatter/nixmac/issues/561/timeline",
"performed_via_github_app": null,
"state_reason": null
},
"comment": {
"url": "https://api.github.com/repos/darkmatter/nixmac/issues/comments/5017330991",
"html_url": "https://github.com/darkmatter/nixmac/pull/561#issuecomment-5017330991",
"issue_url": "https://api.github.com/repos/darkmatter/nixmac/issues/561",
"id": 5017330991,
"node_id": "IC_kwDOSB6EzM8AAAABKw5lLw",
"user": {
"login": "darkmatter[bot]",
"id": 283346107,
"node_id": "BOT_kgDOEOOEuw",
"avatar_url": "https://avatars.githubusercontent.com/in/3663660?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter%5Bbot%5D",
"html_url": "https://github.com/apps/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter%5Bbot%5D/followers",
"following_url": "https://api.github.com/users/darkmatter%5Bbot%5D/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter%5Bbot%5D/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter%5Bbot%5D/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter%5Bbot%5D/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter%5Bbot%5D/orgs",
"repos_url": "https://api.github.com/users/darkmatter%5Bbot%5D/repos",
"events_url": "https://api.github.com/users/darkmatter%5Bbot%5D/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter%5Bbot%5D/received_events",
"type": "Bot",
"user_view_type": "public",
"site_admin": false
},
"created_at": "2026-07-19T20:50:52Z",
"updated_at": "2026-07-20T17:34:47Z",
"body": "<!-- nixmac-storybook-preview -->\n### 🎨 Storybook preview\n\n[Open Storybook preview](https://c78c38dc.nixmac-storybook.pages.dev)\n\nUpdated for 3ada884d5249a46d9093a147ddfd47ae8c4cbbf1\n\n---\n\n### 🧭 Story changes\n\nCompared to `main` (snapshot diff at story level):\n\n🆕 **New stories (2)**\n\n- [Components/EvolveProgress › Build Check Streaming](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--build-check-streaming)\n- [Components/EvolveProgress › Streaming Response](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--streaming-response)\n\n✏️ **Changed stories (2)**\n\n- [Components/EvolveProgress › All Event Types](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--all-event-types)\n- [Components/EvolveProgress › Narration In Focus](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/components-evolveprogress--narration-in-focus)\n\n\n> 💡 [Update snapshots ↗](https://github.com/darkmatter/nixmac/actions/workflows/update-snapshots.yaml) to regenerate baselines and open a PR.\n\n---\n\n### ⚠️ Detected UI changes (5)\n\nThese stories' HTML snapshots changed. I've added screenshots + links to the changed stories below. Review them carefully then accept the changes to regenerate baselines and include them in this PR:\n\n#### [UI/InputGroup › Inline Addons](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/ui-inputgroup--inline-addons)\n\n\n\n#### [UI/InputGroup › Block Addons](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/ui-inputgroup--block-addons)\n\n\n\n#### [UI/Select › Provider](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/ui-select--provider)\n\n\n\n#### [Flows/Evolve › Playground](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/flows-evolve--playground)\n\n\n\n#### [Flows/Evolve › 1. Begin (idle)](https://c78c38dc.nixmac-storybook.pages.dev/?path=/story/flows-evolve--begin)\n\n\n\n---\n\n### Accept UI changes\n\n- [ ] Click here to accept these changes\n\nAlternatively, you can run `bun run test:update-snapshots` locally to re-generate the baselines and then push the changes to this PR.\n\n<details>\n<summary>What does this do?</summary>\n\nThe screenshots above show UI changes detected by the Storybook\nsnapshot tests run on this PR. Each image is the rendered output of\na Storybook story from the code in this PR branch; the snapshot\ntest compared it against the committed baseline in\n`__snapshots__/` and flagged the difference.\n\nChecking the box tells the `darkmatter[bot]` to regenerate the\nbaselines from this PR's current code and commit them directly to\nthis branch. The new baselines become the source of truth for\nfuture runs — only accept after confirming the visual changes are\nintentional.\n\nComparison baseline: the committed `__snapshots__/` files on this\nPR branch (carried forward from develop). Accept updates them in\nplace on this branch.\n\n</details>",
"author_association": "CONTRIBUTOR",
"reactions": {
"url": "https://api.github.com/repos/darkmatter/nixmac/issues/comments/5017330991/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": {
"id": 3663660,
"client_id": "Iv23lifA2SLzhklKJM5M",
"slug": "darkmatter",
"node_id": "A_kwHOARAg0c4AN-cs",
"owner": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"name": "darkmatter",
"description": "This is the darkmatter agent - mention the bot to have it review PR's, fix issues, and drive the agent.",
"external_url": "https://dm.sh",
"html_url": "https://github.com/apps/darkmatter",
"created_at": "2026-05-10T08:36:27Z",
"updated_at": "2026-07-01T11:26:40Z",
"permissions": {
"actions": "write",
"actions_variables": "read",
"agent_secrets": "read",
"agent_variables": "read",
"checks": "write",
"contents": "write",
"copilot_agent_settings": "write",
"custom_properties_for_organizations": "write",
"deployments": "write",
"discussions": "write",
"enterprise_organization_installations": "write",
"enterprise_organization_installation_repositories": "write",
"environments": "write",
"issues": "write",
"issue_fields": "read",
"issue_types": "read",
"members": "read",
"metadata": "read",
"organization_actions_variables": "write",
"organization_administration": "write",
"organization_agent_secrets": "read",
"organization_agent_variables": "read",
"organization_codespaces": "write",
"organization_codespaces_secrets": "write",
"organization_copilot_agent_settings": "read",
"organization_custom_properties": "write",
"organization_dependabot_dismissal_requests": "read",
"organization_dependabot_secrets": "read",
"organization_events": "read",
"organization_hooks": "write",
"organization_personal_access_tokens": "write",
"organization_personal_access_token_requests": "write",
"organization_private_registries": "write",
"organization_secrets": "write",
"organization_self_hosted_runners": "write",
"org_copilot_content_exclusion": "read",
"packages": "write",
"pages": "write",
"pull_requests": "write",
"repository_hooks": "write",
"secrets": "read",
"statuses": "write",
"user_events": "read",
"workflows": "write"
},
"events": [
"commit_comment",
"create",
"deployment",
"deployment_review",
"deployment_status",
"discussion",
"discussion_comment",
"issues",
"issue_comment",
"merge_queue_entry",
"pull_request",
"pull_request_review",
"pull_request_review_comment",
"pull_request_review_thread",
"release",
"status",
"sub_issues",
"workflow_dispatch",
"workflow_job",
"workflow_run"
]
},
"minimized": null
},
"repository": {
"id": 1209959628,
"node_id": "R_kgDOSB6EzA",
"name": "nixmac",
"full_name": "darkmatter/nixmac",
"private": false,
"owner": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac",
"description": "Home manager and nix-darwin that understands plain English",
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac/deployments",
"created_at": "2026-04-14T00:37:13Z",
"updated_at": "2026-07-20T17:31:39Z",
"pushed_at": "2026-07-20T17:30:26Z",
"git_url": "git://github.com/darkmatter/nixmac.git",
"ssh_url": "org-17834193@github.com:darkmatter/nixmac.git",
"clone_url": "https://github.com/darkmatter/nixmac.git",
"svn_url": "https://github.com/darkmatter/nixmac",
"homepage": "https://nixmac.com",
"size": 689249,
"stargazers_count": 21,
"watchers_count": 21,
"language": "Rust",
"has_issues": true,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": true,
"has_discussions": true,
"forks_count": 2,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 98,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [
"home-manager",
"nix",
"nix-darwin",
"nix-flake",
"opencode"
],
"visibility": "public",
"forks": 2,
"open_issues": 98,
"watchers": 21,
"default_branch": "main",
"custom_properties": {}
},
"organization": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"url": "https://api.github.com/orgs/darkmatter",
"repos_url": "https://api.github.com/orgs/darkmatter/repos",
"events_url": "https://api.github.com/orgs/darkmatter/events",
"hooks_url": "https://api.github.com/orgs/darkmatter/hooks",
"issues_url": "https://api.github.com/orgs/darkmatter/issues",
"members_url": "https://api.github.com/orgs/darkmatter/members{/member}",
"public_members_url": "https://api.github.com/orgs/darkmatter/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"description": ""
},
"enterprise": {
"id": 469843,
"slug": "darkmatter",
"name": "darkmatter",
"node_id": "E_kgDOAAcrUw",
"avatar_url": "https://avatars.githubusercontent.com/b/469843?v=4",
"description": "",
"website_url": "darkmatter.io",
"html_url": "https://github.com/enterprises/darkmatter",
"created_at": "2025-09-07T16:01:00Z",
"updated_at": "2026-07-07T15:59:26Z"
},
"sender": {
"login": "darkmatter[bot]",
"id": 283346107,
"node_id": "BOT_kgDOEOOEuw",
"avatar_url": "https://avatars.githubusercontent.com/in/3663660?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter%5Bbot%5D",
"html_url": "https://github.com/apps/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter%5Bbot%5D/followers",
"following_url": "https://api.github.com/users/darkmatter%5Bbot%5D/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter%5Bbot%5D/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter%5Bbot%5D/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter%5Bbot%5D/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter%5Bbot%5D/orgs",
"repos_url": "https://api.github.com/users/darkmatter%5Bbot%5D/repos",
"events_url": "https://api.github.com/users/darkmatter%5Bbot%5D/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter%5Bbot%5D/received_events",
"type": "Bot",
"user_view_type": "public",
"site_admin": false
},
"installation": {
"id": 131074261,
"node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTMxMDc0MjYx"
}
}