Fix UI stop button delay by using Next.js after() for background chat summaries
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
* data: {"type":"done"}
|
* data: {"type":"done"}
|
||||||
* data: {"type":"error","error":"..."}
|
* data: {"type":"error","error":"..."}
|
||||||
*/
|
*/
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse, after } from "next/server";
|
||||||
import { requireWorkspacePrincipal } from "@/lib/auth/workspace-auth";
|
import { requireWorkspacePrincipal } from "@/lib/auth/workspace-auth";
|
||||||
import { query, queryOne } from "@/lib/db-postgres";
|
import { query, queryOne } from "@/lib/db-postgres";
|
||||||
import { callVibnChat, streamVibnChat } from "@/lib/ai/vibn-chat-model";
|
import { callVibnChat, streamVibnChat } from "@/lib/ai/vibn-chat-model";
|
||||||
@@ -628,22 +628,21 @@ function extractPreviewUrl(messages: ChatMessage[]): string | undefined {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function summarizeForUI(raw: string): string {
|
function summarizeForUI(raw: string): string {
|
||||||
try {
|
try {
|
||||||
const p = JSON.parse(raw);
|
const p = JSON.parse(raw);
|
||||||
if (p && typeof p === "object") {
|
if (p && typeof p === "object") {
|
||||||
const clone = { ...p };
|
const clone = { ...p };
|
||||||
// Strip massive payload fields so the UI gets intact JSON
|
// Strip massive payload fields so the UI gets intact JSON
|
||||||
if (clone.result && typeof clone.result === 'object') {
|
if (clone.result && typeof clone.result === "object") {
|
||||||
if (clone.result.log) clone.result.log = "...";
|
if (clone.result.log) clone.result.log = "...";
|
||||||
if (clone.result.content) clone.result.content = "...";
|
if (clone.result.content) clone.result.content = "...";
|
||||||
if (clone.result.listing) clone.result.listing = "...";
|
if (clone.result.listing) clone.result.listing = "...";
|
||||||
}
|
}
|
||||||
if (typeof clone.stdout === 'string' && clone.stdout.length > 200) {
|
if (typeof clone.stdout === "string" && clone.stdout.length > 200) {
|
||||||
clone.stdout = clone.stdout.slice(0, 200) + "...";
|
clone.stdout = clone.stdout.slice(0, 200) + "...";
|
||||||
}
|
}
|
||||||
if (typeof clone.stderr === 'string' && clone.stderr.length > 200) {
|
if (typeof clone.stderr === "string" && clone.stderr.length > 200) {
|
||||||
clone.stderr = clone.stderr.slice(0, 200) + "...";
|
clone.stderr = clone.stderr.slice(0, 200) + "...";
|
||||||
}
|
}
|
||||||
return JSON.stringify(clone);
|
return JSON.stringify(clone);
|
||||||
@@ -1898,7 +1897,7 @@ export async function POST(request: Request) {
|
|||||||
// Wrapped in try/catch + .catch — the response stream is already
|
// Wrapped in try/catch + .catch — the response stream is already
|
||||||
// closed and we don't want a summary failure to surface as an
|
// closed and we don't want a summary failure to surface as an
|
||||||
// error to the user.
|
// error to the user.
|
||||||
(async () => {
|
after(async () => {
|
||||||
try {
|
try {
|
||||||
const allMessages = [...history, finalMsg];
|
const allMessages = [...history, finalMsg];
|
||||||
// Only summarize if there's something worth summarizing.
|
// Only summarize if there's something worth summarizing.
|
||||||
@@ -1951,7 +1950,7 @@ export async function POST(request: Request) {
|
|||||||
} catch {
|
} catch {
|
||||||
// best-effort; silent failure
|
// best-effort; silent failure
|
||||||
}
|
}
|
||||||
})().catch(() => {});
|
});
|
||||||
|
|
||||||
// Plan extraction is handled inline during tool calls or proactively.
|
// Plan extraction is handled inline during tool calls or proactively.
|
||||||
emit({ type: "done" });
|
emit({ type: "done" });
|
||||||
|
|||||||
Reference in New Issue
Block a user