import test from "node:test"; import assert from "node:assert/strict"; import os from "node:os"; import path from "node:path"; import { mkdtemp, rm } from "node:fs/promises"; import { NextRequest } from "next/server"; let runtimeRoot = ""; let createAuthSession: (typeof import("../src/lib/boss-data"))["createAuthSession"]; let AUTH_SESSION_COOKIE = ""; let getConversationHomeRoute: (typeof import("../src/app/api/v1/conversations/home/route"))["GET"]; let getConversationsRoute: (typeof import("../src/app/api/v1/conversations/route"))["GET"]; let getFolderRoute: (typeof import("../src/app/api/v1/conversation-folders/[folderKey]/route"))["GET"]; let getProjectDetailRoute: (typeof import("../src/app/api/v1/projects/[projectId]/route"))["GET"]; let getDevicesRoute: (typeof import("../src/app/api/v1/devices/route"))["GET"]; let getSettingsRoute: (typeof import("../src/app/api/v1/settings/route"))["GET"]; let getThreadStatusRoute: (typeof import("../src/app/api/v1/projects/[projectId]/thread-status/route"))["GET"]; let getOpsSummaryRoute: (typeof import("../src/app/api/v1/ops/summary/route"))["GET"]; let getAuditSummaryRoute: (typeof import("../src/app/api/v1/audits/summary/route"))["GET"]; let getAppLogsRoute: (typeof import("../src/app/api/v1/app-logs/route"))["GET"]; let getParticipantsRoute: (typeof import("../src/app/api/v1/projects/[projectId]/participants/route"))["GET"]; let getDispatchPlansRoute: (typeof import("../src/app/api/v1/projects/[projectId]/dispatch-plans/route"))["GET"]; let getAgentControlsRoute: (typeof import("../src/app/api/v1/projects/[projectId]/agent-controls/route"))["GET"]; let getOrchestrationBackendRoute: (typeof import("../src/app/api/v1/projects/[projectId]/orchestration-backend/route"))["GET"]; let getThreadContextBudgetRoute: (typeof import("../src/app/api/v1/threads/[threadId]/context-budget/route"))["GET"]; let getAccountsRoute: (typeof import("../src/app/api/v1/accounts/route"))["GET"]; let getOtaRoute: (typeof import("../src/app/api/v1/user/ota/route"))["GET"]; let getDeviceSkillsRoute: (typeof import("../src/app/api/v1/devices/[deviceId]/skills/route"))["GET"]; let getDeviceEnrollmentsRoute: (typeof import("../src/app/api/v1/devices/enrollments/route"))["GET"]; let getDeviceImportDraftRoute: (typeof import("../src/app/api/v1/devices/[deviceId]/import-draft/route"))["GET"]; let getPromptProfileRoute: (typeof import("../src/app/api/v1/projects/[projectId]/prompt-profile/route"))["GET"]; let getProjectMemoriesRoute: (typeof import("../src/app/api/v1/projects/[projectId]/memories/route"))["GET"]; let getMasterAgentPromptPolicyRoute: (typeof import("../src/app/api/v1/master-agent/prompt-policy/route"))["GET"]; let getMasterAgentPromptRoute: (typeof import("../src/app/api/v1/master-agent/prompt/route"))["GET"]; let getMasterAgentMemoriesRoute: (typeof import("../src/app/api/v1/master-agent/memories/route"))["GET"]; let getStorageConfigRoute: (typeof import("../src/app/api/v1/storage/config/route"))["GET"]; let getAccountDetailRoute: (typeof import("../src/app/api/v1/accounts/[accountId]/route"))["GET"]; async function setup() { if (runtimeRoot) return; runtimeRoot = await mkdtemp(path.join(os.tmpdir(), "boss-live-data-cache-headers-")); process.env.BOSS_RUNTIME_ROOT = runtimeRoot; process.env.BOSS_STATE_FILE = path.join(runtimeRoot, "boss-state.json"); const [ homeRoute, conversationsRoute, folderRoute, projectRoute, devicesRoute, settingsRoute, threadStatusRoute, opsSummaryRoute, auditSummaryRoute, appLogsRoute, participantsRoute, dispatchPlansRoute, agentControlsRoute, orchestrationBackendRoute, threadContextBudgetRoute, accountsRoute, otaRoute, deviceSkillsRoute, deviceEnrollmentsRoute, deviceImportDraftRoute, promptProfileRoute, projectMemoriesRoute, masterAgentPromptPolicyRoute, masterAgentPromptRoute, masterAgentMemoriesRoute, storageConfigRoute, accountDetailRoute, dataModule, authModule, ] = await Promise.all([ import("../src/app/api/v1/conversations/home/route.ts"), import("../src/app/api/v1/conversations/route.ts"), import("../src/app/api/v1/conversation-folders/[folderKey]/route.ts"), import("../src/app/api/v1/projects/[projectId]/route.ts"), import("../src/app/api/v1/devices/route.ts"), import("../src/app/api/v1/settings/route.ts"), import("../src/app/api/v1/projects/[projectId]/thread-status/route.ts"), import("../src/app/api/v1/ops/summary/route.ts"), import("../src/app/api/v1/audits/summary/route.ts"), import("../src/app/api/v1/app-logs/route.ts"), import("../src/app/api/v1/projects/[projectId]/participants/route.ts"), import("../src/app/api/v1/projects/[projectId]/dispatch-plans/route.ts"), import("../src/app/api/v1/projects/[projectId]/agent-controls/route.ts"), import("../src/app/api/v1/projects/[projectId]/orchestration-backend/route.ts"), import("../src/app/api/v1/threads/[threadId]/context-budget/route.ts"), import("../src/app/api/v1/accounts/route.ts"), import("../src/app/api/v1/user/ota/route.ts"), import("../src/app/api/v1/devices/[deviceId]/skills/route.ts"), import("../src/app/api/v1/devices/enrollments/route.ts"), import("../src/app/api/v1/devices/[deviceId]/import-draft/route.ts"), import("../src/app/api/v1/projects/[projectId]/prompt-profile/route.ts"), import("../src/app/api/v1/projects/[projectId]/memories/route.ts"), import("../src/app/api/v1/master-agent/prompt-policy/route.ts"), import("../src/app/api/v1/master-agent/prompt/route.ts"), import("../src/app/api/v1/master-agent/memories/route.ts"), import("../src/app/api/v1/storage/config/route.ts"), import("../src/app/api/v1/accounts/[accountId]/route.ts"), import("../src/lib/boss-data.ts"), import("../src/lib/boss-auth.ts"), ]); getConversationHomeRoute = homeRoute.GET; getConversationsRoute = conversationsRoute.GET; getFolderRoute = folderRoute.GET; getProjectDetailRoute = projectRoute.GET; getDevicesRoute = devicesRoute.GET; getSettingsRoute = settingsRoute.GET; getThreadStatusRoute = threadStatusRoute.GET; getOpsSummaryRoute = opsSummaryRoute.GET; getAuditSummaryRoute = auditSummaryRoute.GET; getAppLogsRoute = appLogsRoute.GET; getParticipantsRoute = participantsRoute.GET; getDispatchPlansRoute = dispatchPlansRoute.GET; getAgentControlsRoute = agentControlsRoute.GET; getOrchestrationBackendRoute = orchestrationBackendRoute.GET; getThreadContextBudgetRoute = threadContextBudgetRoute.GET; getAccountsRoute = accountsRoute.GET; getOtaRoute = otaRoute.GET; getDeviceSkillsRoute = deviceSkillsRoute.GET; getDeviceEnrollmentsRoute = deviceEnrollmentsRoute.GET; getDeviceImportDraftRoute = deviceImportDraftRoute.GET; getPromptProfileRoute = promptProfileRoute.GET; getProjectMemoriesRoute = projectMemoriesRoute.GET; getMasterAgentPromptPolicyRoute = masterAgentPromptPolicyRoute.GET; getMasterAgentPromptRoute = masterAgentPromptRoute.GET; getMasterAgentMemoriesRoute = masterAgentMemoriesRoute.GET; getStorageConfigRoute = storageConfigRoute.GET; getAccountDetailRoute = accountDetailRoute.GET; createAuthSession = dataModule.createAuthSession; AUTH_SESSION_COOKIE = authModule.AUTH_SESSION_COOKIE; } test.after(async () => { if (runtimeRoot) { await rm(runtimeRoot, { recursive: true, force: true }); } }); async function createAuthedRequest(url: string) { const session = await createAuthSession({ account: "17600003315", role: "highest_admin", displayName: "Boss 超级管理员", loginMethod: "password", }); return new NextRequest(url, { method: "GET", headers: { cookie: `${AUTH_SESSION_COOKIE}=${session.sessionToken}`, }, }); } function assertNoStoreHeader(response: Response) { assert.equal(response.headers.get("Cache-Control"), "private, no-store, max-age=0"); } test("live conversation and device routes disable cache storage", async () => { await setup(); const homeResponse = await getConversationHomeRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/conversations/home"), ); assertNoStoreHeader(homeResponse); const conversationsResponse = await getConversationsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/conversations"), ); assertNoStoreHeader(conversationsResponse); const folderResponse = await getFolderRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/conversation-folders/mac-studio%3Aboss"), { params: Promise.resolve({ folderKey: "mac-studio%3Aboss" }) }, ); assertNoStoreHeader(folderResponse); const projectResponse = await getProjectDetailRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/master-agent"), { params: Promise.resolve({ projectId: "master-agent" }) }, ); assertNoStoreHeader(projectResponse); const devicesResponse = await getDevicesRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/devices"), ); assertNoStoreHeader(devicesResponse); const settingsResponse = await getSettingsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/settings"), ); assertNoStoreHeader(settingsResponse); }); test("live detail and summary routes disable cache storage", async () => { await setup(); const threadStatusResponse = await getThreadStatusRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/master-agent/thread-status"), { params: Promise.resolve({ projectId: "master-agent" }) }, ); assertNoStoreHeader(threadStatusResponse); const opsSummaryResponse = await getOpsSummaryRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/ops/summary"), ); assertNoStoreHeader(opsSummaryResponse); const auditSummaryResponse = await getAuditSummaryRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/audits/summary"), ); assertNoStoreHeader(auditSummaryResponse); const appLogsResponse = await getAppLogsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/app-logs?limit=10"), ); assertNoStoreHeader(appLogsResponse); const participantsResponse = await getParticipantsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/audit-collab/participants"), { params: Promise.resolve({ projectId: "audit-collab" }) }, ); assertNoStoreHeader(participantsResponse); const dispatchPlansResponse = await getDispatchPlansRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/audit-collab/dispatch-plans"), { params: Promise.resolve({ projectId: "audit-collab" }) }, ); assertNoStoreHeader(dispatchPlansResponse); const agentControlsResponse = await getAgentControlsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/master-agent/agent-controls"), { params: Promise.resolve({ projectId: "master-agent" }) }, ); assertNoStoreHeader(agentControlsResponse); const orchestrationBackendResponse = await getOrchestrationBackendRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/audit-collab/orchestration-backend"), { params: Promise.resolve({ projectId: "audit-collab" }) }, ); assertNoStoreHeader(orchestrationBackendResponse); const threadContextBudgetResponse = await getThreadContextBudgetRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/threads/thread-audit-chief/context-budget"), { params: Promise.resolve({ threadId: "thread-audit-chief" }) }, ); assertNoStoreHeader(threadContextBudgetResponse); const accountsResponse = await getAccountsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/accounts"), ); assertNoStoreHeader(accountsResponse); const otaResponse = await getOtaRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/user/ota"), ); assertNoStoreHeader(otaResponse); const deviceSkillsResponse = await getDeviceSkillsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/devices/mac-studio/skills"), { params: Promise.resolve({ deviceId: "mac-studio" }) }, ); assertNoStoreHeader(deviceSkillsResponse); const deviceEnrollmentsResponse = await getDeviceEnrollmentsRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/devices/enrollments"), ); assertNoStoreHeader(deviceEnrollmentsResponse); const deviceImportDraftResponse = await getDeviceImportDraftRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/devices/mac-studio/import-draft"), { params: Promise.resolve({ deviceId: "mac-studio" }) }, ); assertNoStoreHeader(deviceImportDraftResponse); const promptProfileResponse = await getPromptProfileRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/master-agent/prompt-profile"), { params: Promise.resolve({ projectId: "master-agent" }) }, ); assertNoStoreHeader(promptProfileResponse); const projectMemoriesResponse = await getProjectMemoriesRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/projects/master-agent/memories"), { params: Promise.resolve({ projectId: "master-agent" }) }, ); assertNoStoreHeader(projectMemoriesResponse); const masterAgentPromptPolicyResponse = await getMasterAgentPromptPolicyRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/master-agent/prompt-policy"), ); assertNoStoreHeader(masterAgentPromptPolicyResponse); const masterAgentPromptResponse = await getMasterAgentPromptRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/master-agent/prompt"), ); assertNoStoreHeader(masterAgentPromptResponse); const masterAgentMemoriesResponse = await getMasterAgentMemoriesRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/master-agent/memories?scope=global"), ); assertNoStoreHeader(masterAgentMemoriesResponse); const storageConfigResponse = await getStorageConfigRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/storage/config"), ); assertNoStoreHeader(storageConfigResponse); const accountDetailResponse = await getAccountDetailRoute( await createAuthedRequest("http://127.0.0.1:3000/api/v1/accounts/main"), { params: Promise.resolve({ accountId: "main" }) }, ); assertNoStoreHeader(accountDetailResponse); });