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

This merge lands four features: a `/clear` command for Chat and Quick Chat with session banner fixes (FN-3062), a todo view redesign with restructured rows and improved styling (FN-3063), deterministic peer exchange shutdown with dashboard improvements (FN-3040), and a summary Q&A disclosure feature

Fusion-Task-Id: FN-3078
This commit is contained in:
Fusion
2026-05-01 13:37:03 -07:00
committed by gsxdsm
parent 8b7f20f207
commit 0188da703b
9 changed files with 156 additions and 14 deletions

View File

@@ -311,12 +311,12 @@ describe("planning module", () => {
it("enforces rate limiting", async () => {
const mockIp = getUniqueIp();
// Create max sessions (5 per hour)
for (let i = 0; i < 5; i++) {
// Create max sessions (1000 per hour)
for (let i = 0; i < 1000; i++) {
await createSession(mockIp, `${initialPlan} ${i}`, undefined, TEST_ROOT_DIR);
}
// 6th session should fail
// 1001st session should fail
await expect(createSession(mockIp, initialPlan, undefined, TEST_ROOT_DIR)).rejects.toThrow(RateLimitError);
});
@@ -325,7 +325,7 @@ describe("planning module", () => {
try {
const mockIp = getUniqueIp();
// Create max sessions
for (let i = 0; i < 5; i++) {
for (let i = 0; i < 1000; i++) {
await createSession(mockIp, `${initialPlan} ${i}`, undefined, TEST_ROOT_DIR);
}

View File

@@ -9987,9 +9987,9 @@ describe("Planning Mode Routes", () => {
expect(res.body.sessionId).toBeDefined();
});
it("enforces rate limiting (5 sessions per hour per IP)", async () => {
// Create 5 sessions (should succeed)
for (let i = 0; i < 5; i++) {
it("enforces rate limiting (1000 sessions per hour per IP)", async () => {
// Create 1000 sessions (should succeed)
for (let i = 0; i < 1000; i++) {
const res = await REQUEST(
buildApp(),
"POST",
@@ -10000,12 +10000,12 @@ describe("Planning Mode Routes", () => {
expect(res.status).toBe(201);
}
// 6th session should be rate limited
// 1001st session should be rate limited
const res = await REQUEST(
buildApp(),
"POST",
"/api/planning/start",
JSON.stringify({ initialPlan: "Plan 6" }),
JSON.stringify({ initialPlan: "Plan 1001" }),
{ "Content-Type": "application/json" }
);