feat(FN-2901): merge fusion/fn-2901

- fix(FN-2901): reset source issue collapse state on task change
- fix(FN-2901): use issue number in collapsed source issue summary
- feat(FN-2901): complete Step 5 — finalize source issue toggle UX
- test(FN-2901): complete Step 4 — verify collapsible source issue behavior
- feat(FN-2901): complete Step 3 — style collapsible source issue header
- feat(FN-2901): complete Step 2 — add collapsible source issue section
- feat(FN-2901): complete Step 1 — update lucide imports
- feat(FN-2729): merge fusion/fn-2729
- fix(engine): prevent auto-merge cooldown loop on unresolvable conflicts
- feat(FN-2911): improve chat attachment compose and preview UX

Fusion-Task-Id: FN-2901
This commit is contained in:
Fusion
2026-04-28 23:31:23 -07:00
committed by gsxdsm
parent 3263babe1b
commit ebd3201153
4 changed files with 158 additions and 45 deletions

View File

@@ -438,7 +438,7 @@ describe("Settings view", () => {
await waitForFrameContains(lastFrame, "Remote");
expect(lastFrame() ?? "").toContain("cloudflare");
stdin.write("\t");
stdin.write("\u001B[C");
await new Promise((r) => setTimeout(r, 20));
stdin.write("C");
await new Promise((r) => setTimeout(r, 20));
@@ -470,9 +470,9 @@ describe("Settings view", () => {
const { lastFrame, stdin, unmount } = render(renderDashboardAppNode(controller));
await waitForFrameContains(lastFrame, "──── Remote ────");
stdin.write("\t");
await new Promise((r) => setTimeout(r, 20));
stdin.write("\u001B[C");
await new Promise((r) => setTimeout(r, 20));
stdin.write("L");
await waitForFrameContains(lastFrame, "TTL ms:");
stdin.write("\r");
@@ -508,9 +508,8 @@ describe("Settings view", () => {
controller.setInteractiveView("settings");
const { lastFrame, stdin, unmount } = render(renderDashboardAppNode(controller));
stdin.write("\t");
stdin.write("\u001B[C");
await new Promise((r) => setTimeout(r, 20));
stdin.write("P");
await waitForFrameContains(lastFrame, "Persistent token: tok_****");
expect(regeneratePersistentToken).toHaveBeenCalledTimes(1);
@@ -531,9 +530,9 @@ describe("Settings view", () => {
const { lastFrame, stdin, unmount } = render(renderDashboardAppNode(controller));
await waitForFrameContains(lastFrame, "──── Remote ────");
stdin.write("\t");
await new Promise((r) => setTimeout(r, 20));
stdin.write("\u001B[C");
await new Promise((r) => setTimeout(r, 20));
stdin.write("L");
await waitForFrameContains(lastFrame, "TTL ms:");
stdin.write("a");
@@ -559,7 +558,7 @@ describe("Settings view", () => {
controller.setInteractiveView("settings");
const { lastFrame, stdin, unmount } = render(renderDashboardAppNode(controller));
stdin.write("\t");
stdin.write("\u001B[C");
await new Promise((r) => setTimeout(r, 20));
stdin.write("K");
await waitForFrameContains(lastFrame, "QR SVG returned by server.");