mirror of
https://github.com/escalante29/WealthySmart.git
synced 2026-07-17 10:08:46 +02:00
Assistant: reliable "Nueva conversación" reset
Clearing in place (setMessages + remount) left the conversation rendered — CopilotKit keeps chat state beyond agent.messages — so the button now reloads the page after deleting the thread: a fresh boot hydrates from the empty store and shows the welcome screen with suggestions, which previously only appeared after a manual refresh. Supporting changes: - CopilotChat gets an explicit agentId="wealthysmart" (without it, it resolves DEFAULT_AGENT_ID and can bind a different client agent instance than useAgent's). - The BFF answers CopilotChat's POST …/connect with an immediately-completed stream: the runtime's in-memory runner replays this PROCESS's event history, which resurrects cleared conversations and double-feeds hydration. The empty-messages hydration run against the DB store is the single restore path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -384,12 +384,28 @@ app.use("*", async (c, next) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.all("/api/copilotkit/*", async (c) => {
|
app.all("/api/copilotkit/*", async (c) => {
|
||||||
|
// CopilotChat fires POST …/agent/<id>/connect for explicit threadIds and
|
||||||
|
// the runtime's in-memory runner replays THIS PROCESS's event history —
|
||||||
|
// stale relative to the DB store (it resurrects cleared conversations and
|
||||||
|
// double-feeds page-load hydration). The empty-messages hydration run
|
||||||
|
// against MAF is our single restore path, so connect gets an
|
||||||
|
// immediately-completed stream instead.
|
||||||
|
if (new URL(c.req.url).pathname.endsWith("/connect")) {
|
||||||
|
return new Response("", {
|
||||||
|
status: 200,
|
||||||
|
headers: { "Content-Type": "text/event-stream" },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const cookieHeader = c.req.header("cookie") ?? "";
|
const cookieHeader = c.req.header("cookie") ?? "";
|
||||||
const match = cookieHeader.match(/(?:^|;\s*)ws_token=([^;]+)/);
|
const match = cookieHeader.match(/(?:^|;\s*)ws_token=([^;]+)/);
|
||||||
const token = match?.[1];
|
const token = match?.[1];
|
||||||
const agentHeaders: Record<string, string> = token
|
const agentHeaders: Record<string, string> = token
|
||||||
? { Authorization: `Bearer ${token}` }
|
? { Authorization: `Bearer ${token}` }
|
||||||
: {};
|
: {};
|
||||||
|
// Note: the browser's X-Client-Timezone header (set in App.tsx) reaches
|
||||||
|
// the backend without help — CopilotKit's runtime forwards authorization
|
||||||
|
// and all x-* headers to the agent (extractForwardableHeaders).
|
||||||
|
|
||||||
const agent = new HttpAgent({ url: AGENT_URL, headers: agentHeaders });
|
const agent = new HttpAgent({ url: AGENT_URL, headers: agentHeaders });
|
||||||
// CK_MIDDLEWARES=off runs the stack bare — used to audit which of these
|
// CK_MIDDLEWARES=off runs the stack bare — used to audit which of these
|
||||||
|
|||||||
@@ -82,11 +82,13 @@ export default function Asistente() {
|
|||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
credentials: "include",
|
credentials: "include",
|
||||||
});
|
});
|
||||||
agent?.setMessages([]);
|
// Full reload is the reliable reset: CopilotKit keeps chat state in
|
||||||
setConfirmClear(false);
|
// more places than agent.messages (clearing it in place left the
|
||||||
|
// conversation rendered), while a fresh boot hydrates from the
|
||||||
|
// now-empty store and shows the welcome screen + suggestions.
|
||||||
|
window.location.reload();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("[asistente] clear thread failed:", err);
|
console.error("[asistente] clear thread failed:", err);
|
||||||
} finally {
|
|
||||||
setClearing(false);
|
setClearing(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -165,6 +167,11 @@ export default function Asistente() {
|
|||||||
<div className="flex-1 min-h-0 rounded-xl border border-border overflow-hidden bg-card">
|
<div className="flex-1 min-h-0 rounded-xl border border-border overflow-hidden bg-card">
|
||||||
<CopilotChat
|
<CopilotChat
|
||||||
className="h-full"
|
className="h-full"
|
||||||
|
// Without an explicit agentId, CopilotChat resolves DEFAULT_AGENT_ID
|
||||||
|
// ("default") — a DIFFERENT client agent instance than
|
||||||
|
// useAgent({agentId:"wealthysmart"}); clearing one leaves the other
|
||||||
|
// rendering its own copy of the conversation.
|
||||||
|
agentId="wealthysmart"
|
||||||
threadId={CHAT_THREAD_ID}
|
threadId={CHAT_THREAD_ID}
|
||||||
labels={{
|
labels={{
|
||||||
modalHeaderTitle: "WealthySmart",
|
modalHeaderTitle: "WealthySmart",
|
||||||
|
|||||||
Reference in New Issue
Block a user