apiRoutes: [
registerCopilotKit<RuntimeContext>({
path: "/copilotkit",
resourceId: "submissionAgent", // Agent name
setContext: (c, runtimeContext) => {
try {
const bearer = c.req.header("Authorization");
let userId = "anonymous";
if (bearer?.startsWith("Bearer ")) {
const token = bearer.slice(7);
try {
const payload = jwt.verify(token, process.env.AUTH_SECRET ?? "changeme") as jwt.JwtPayload;
if (typeof payload.sub === "string") userId = payload.sub;
} catch (err) {
console.warn("[Mastra] JWT verification failed:", err);
}
}
runtimeContext.set("user-id", userId);
// Extract submissionId from X-Submission-ID header for memory isolation
// This header is set by CopilotKit in the frontend
// The resourceId is used by Mastra's memory system to scope conversations
const submissionId = c.req.header("X-Submission-ID");
if (submissionId) {
// Use submissionId as resourceId for memory to isolate conversations per submission
runtimeContext.set("resource-id", `submission-${submissionId}`);
}
} catch (err) {
console.error("[Mastra] Error in setContext:", err);
throw err;
}
}
}),
// Minimal /api/health route for health check
{
path: "/api/health",
method: "GET",
handler: (c) => {
// Respond with 200 OK to indicate server is up
return c.json({ status: "ok" }, 200);
}
}
],
apiRoutes: [
registerCopilotKit<RuntimeContext>({
path: "/copilotkit",
resourceId: "submissionAgent", // Agent name
setContext: (c, runtimeContext) => {
try {
const bearer = c.req.header("Authorization");
let userId = "anonymous";
if (bearer?.startsWith("Bearer ")) {
const token = bearer.slice(7);
try {
const payload = jwt.verify(token, process.env.AUTH_SECRET ?? "changeme") as jwt.JwtPayload;
if (typeof payload.sub === "string") userId = payload.sub;
} catch (err) {
console.warn("[Mastra] JWT verification failed:", err);
}
}
runtimeContext.set("user-id", userId);
// Extract submissionId from X-Submission-ID header for memory isolation
// This header is set by CopilotKit in the frontend
// The resourceId is used by Mastra's memory system to scope conversations
const submissionId = c.req.header("X-Submission-ID");
if (submissionId) {
// Use submissionId as resourceId for memory to isolate conversations per submission
runtimeContext.set("resource-id", `submission-${submissionId}`);
}
} catch (err) {
console.error("[Mastra] Error in setContext:", err);
throw err;
}
}
}),
// Minimal /api/health route for health check
{
path: "/api/health",
method: "GET",
handler: (c) => {
// Respond with 200 OK to indicate server is up
return c.json({ status: "ok" }, 200);
}
}
],