diff --git a/client/bin/client.js b/client/bin/client.js index d30cc70..7179e19 100755 --- a/client/bin/client.js +++ b/client/bin/client.js @@ -9,10 +9,34 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const distPath = join(__dirname, "../dist"); const server = http.createServer((request, response) => { - return handler(request, response, { + const handlerOptions = { public: distPath, rewrites: [{ source: "/**", destination: "/index.html" }], - }); + headers: [ + { + // Ensure index.html is never cached + source: "index.html", + headers: [ + { + key: "Cache-Control", + value: "no-cache, no-store, max-age=0", + }, + ], + }, + { + // Allow long-term caching for hashed assets + source: "assets/**", + headers: [ + { + key: "Cache-Control", + value: "public, max-age=31536000, immutable", + }, + ], + }, + ], + }; + + return handler(request, response, handlerOptions); }); const port = process.env.PORT || 6274; diff --git a/client/src/components/JsonView.tsx b/client/src/components/JsonView.tsx index bd7ef64..e9ef0d2 100644 --- a/client/src/components/JsonView.tsx +++ b/client/src/components/JsonView.tsx @@ -3,7 +3,7 @@ import type { JsonValue } from "@/utils/jsonUtils"; import clsx from "clsx"; import { Copy, CheckCheck } from "lucide-react"; import { Button } from "@/components/ui/button"; -import { useToast } from "@/hooks/use-toast"; +import { useToast } from "@/lib/hooks/useToast"; import { getDataType, tryParseJson } from "@/utils/jsonUtils"; interface JsonViewProps { diff --git a/client/src/components/OAuthCallback.tsx b/client/src/components/OAuthCallback.tsx index 6bfa8a3..ccfd6d9 100644 --- a/client/src/components/OAuthCallback.tsx +++ b/client/src/components/OAuthCallback.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef } from "react"; import { InspectorOAuthClientProvider } from "../lib/auth"; import { SESSION_KEYS } from "../lib/constants"; import { auth } from "@modelcontextprotocol/sdk/client/auth.js"; -import { useToast } from "@/hooks/use-toast.ts"; +import { useToast } from "@/lib/hooks/useToast"; import { generateOAuthErrorDescription, parseOAuthCallbackParams, diff --git a/client/src/components/SamplingRequest.tsx b/client/src/components/SamplingRequest.tsx index 2fc22d9..0e6f365 100644 --- a/client/src/components/SamplingRequest.tsx +++ b/client/src/components/SamplingRequest.tsx @@ -7,7 +7,7 @@ import { } from "@modelcontextprotocol/sdk/types.js"; import { PendingRequest } from "./SamplingTab"; import DynamicJsonForm from "./DynamicJsonForm"; -import { useToast } from "@/hooks/use-toast"; +import { useToast } from "@/lib/hooks/useToast"; import { JsonSchemaType, JsonValue } from "@/utils/jsonUtils"; export type SamplingRequestProps = { diff --git a/client/src/components/Sidebar.tsx b/client/src/components/Sidebar.tsx index bc6af52..6c95daa 100644 --- a/client/src/components/Sidebar.tsx +++ b/client/src/components/Sidebar.tsx @@ -29,7 +29,7 @@ import { } from "@modelcontextprotocol/sdk/types.js"; import { InspectorConfig } from "@/lib/configurationTypes"; import { ConnectionStatus } from "@/lib/constants"; -import useTheme from "../lib/useTheme"; +import useTheme from "../lib/hooks/useTheme"; import { version } from "../../../package.json"; import { Tooltip, diff --git a/client/src/components/__tests__/Sidebar.test.tsx b/client/src/components/__tests__/Sidebar.test.tsx index 980dc01..df4ed64 100644 --- a/client/src/components/__tests__/Sidebar.test.tsx +++ b/client/src/components/__tests__/Sidebar.test.tsx @@ -7,7 +7,7 @@ import { InspectorConfig } from "@/lib/configurationTypes"; import { TooltipProvider } from "@/components/ui/tooltip"; // Mock theme hook -jest.mock("../../lib/useTheme", () => ({ +jest.mock("../../lib/hooks/useTheme", () => ({ __esModule: true, default: () => ["light", jest.fn()], })); diff --git a/client/src/components/ui/toaster.tsx b/client/src/components/ui/toaster.tsx index 5887f08..1c1b267 100644 --- a/client/src/components/ui/toaster.tsx +++ b/client/src/components/ui/toaster.tsx @@ -1,4 +1,4 @@ -import { useToast } from "@/hooks/use-toast"; +import { useToast } from "@/lib/hooks/useToast"; import { Toast, ToastClose, diff --git a/client/src/lib/hooks/__tests__/useConnection.test.tsx b/client/src/lib/hooks/__tests__/useConnection.test.tsx index e191d6c..c6700dc 100644 --- a/client/src/lib/hooks/__tests__/useConnection.test.tsx +++ b/client/src/lib/hooks/__tests__/useConnection.test.tsx @@ -37,7 +37,7 @@ jest.mock("@modelcontextprotocol/sdk/client/auth.js", () => ({ })); // Mock the toast hook -jest.mock("@/hooks/use-toast", () => ({ +jest.mock("@/lib/hooks/useToast", () => ({ useToast: () => ({ toast: jest.fn(), }), diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index 27bc11a..57efc63 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -27,7 +27,7 @@ import { } from "@modelcontextprotocol/sdk/types.js"; import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js"; import { useState } from "react"; -import { useToast } from "@/hooks/use-toast"; +import { useToast } from "@/lib/hooks/useToast"; import { z } from "zod"; import { ConnectionStatus } from "../constants"; import { Notification, StdErrNotificationSchema } from "../notificationTypes"; diff --git a/client/src/lib/useTheme.ts b/client/src/lib/hooks/useTheme.ts similarity index 100% rename from client/src/lib/useTheme.ts rename to client/src/lib/hooks/useTheme.ts diff --git a/client/src/hooks/use-toast.ts b/client/src/lib/hooks/useToast.ts similarity index 100% rename from client/src/hooks/use-toast.ts rename to client/src/lib/hooks/useToast.ts