mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
pin brace-expansion to 5.0.8 update concurrently to 10.0.4 update electron-builder to 26.15.3 update eslint to 10.8.0 update eslint-plugin-perfectionist to 5.10.0 update @assistant-ui/react to 0.15.0 update @assistant-ui/react-streamdown to 0.3.8 update radix-ui to 1.6.7 update react-router-dom to react-router@8.3.0 - react-router-dom is no longer a standalone package, it just reexports react-router remove @radix-ui/react-slot: we import this from `radix-ui` remove eslint-plugin-react: we imported it, but never actually used it!
147 lines
4.8 KiB
TypeScript
147 lines
4.8 KiB
TypeScript
import { defineConfig, type Plugin } from "vite";
|
|
import react from "@vitejs/plugin-react";
|
|
import tailwindcss from "@tailwindcss/vite";
|
|
import path from "path";
|
|
|
|
const BACKEND = process.env.HERMES_DASHBOARD_URL ?? "http://127.0.0.1:9119";
|
|
|
|
/**
|
|
* In production the Python `hermes dashboard` server injects a one-shot
|
|
* session token into `index.html` (see `hermes_cli/web_server.py`). The
|
|
* Vite dev server serves its own `index.html`, so unless we forward that
|
|
* token, every protected `/api/*` call 401s.
|
|
*
|
|
* This plugin fetches the running dashboard's `index.html` on each dev page
|
|
* load, scrapes the `window.__HERMES_SESSION_TOKEN__` assignment, and
|
|
* re-injects it into the dev HTML. No-op in production builds.
|
|
*/
|
|
function hermesDevToken(): Plugin {
|
|
const TOKEN_RE = /window\.__HERMES_SESSION_TOKEN__\s*=\s*"([^"]+)"/;
|
|
const EMBEDDED_RE =
|
|
/window\.__HERMES_DASHBOARD_EMBEDDED_CHAT__\s*=\s*(true|false)/;
|
|
|
|
return {
|
|
name: "hermes:dev-session-token",
|
|
apply: "serve",
|
|
async transformIndexHtml() {
|
|
try {
|
|
const res = await fetch(BACKEND, { headers: { accept: "text/html" } });
|
|
const html = await res.text();
|
|
const match = html.match(TOKEN_RE);
|
|
if (!match) {
|
|
console.warn(
|
|
`[hermes] Could not find session token in ${BACKEND} — ` +
|
|
`is \`hermes dashboard\` running? /api calls will 401.`,
|
|
);
|
|
return;
|
|
}
|
|
const embeddedMatch = html.match(EMBEDDED_RE);
|
|
const embeddedJs = embeddedMatch ? embeddedMatch[1] : "true";
|
|
return [
|
|
{
|
|
tag: "script",
|
|
injectTo: "head",
|
|
children:
|
|
`window.__HERMES_SESSION_TOKEN__="${match[1]}";` +
|
|
`window.__HERMES_DASHBOARD_EMBEDDED_CHAT__=${embeddedJs};`,
|
|
},
|
|
];
|
|
} catch (err) {
|
|
console.warn(
|
|
`[hermes] Dashboard at ${BACKEND} unreachable — ` +
|
|
`start it with \`hermes dashboard\` or set HERMES_DASHBOARD_URL. ` +
|
|
`(${(err as Error).message})`,
|
|
);
|
|
}
|
|
},
|
|
};
|
|
}
|
|
|
|
export default defineConfig({
|
|
plugins: [react(), tailwindcss(), hermesDevToken()],
|
|
resolve: {
|
|
alias: {
|
|
"@": path.resolve(__dirname, "./src"),
|
|
"@hermes/shared": path.resolve(__dirname, "../apps/shared/src"),
|
|
},
|
|
// When @nous-research/ui is symlinked via `file:../../design-language`,
|
|
// Node's module resolution would pick up shared deps from
|
|
// design-language/node_modules/*, giving us two copies + breaking
|
|
// hooks (useRef-of-null), webgl contexts, etc. Force everything that
|
|
// exists in BOTH places to use the dashboard's copy.
|
|
//
|
|
// Don't list packages here that only exist in the DS (nanostores,
|
|
// @nanostores/react) — Vite dedupe errors out when it can't find
|
|
// them at the project root.
|
|
dedupe: [
|
|
"react",
|
|
"react-dom",
|
|
"@react-three/fiber",
|
|
"@observablehq/plot",
|
|
"three",
|
|
"leva",
|
|
"gsap",
|
|
],
|
|
},
|
|
build: {
|
|
outDir: "../hermes_cli/web_dist",
|
|
emptyOutDir: true,
|
|
// Shell stays a bit over Vite's 500 kB default after vendor splits;
|
|
// page/xterm chunks load on demand. Keep a modest ceiling so a true
|
|
// regression still warns.
|
|
chunkSizeWarningLimit: 600,
|
|
// Split heavy vendors so the first dashboard paint does not download
|
|
// xterm/three/plot/etc. until a route actually needs them. Lazy page
|
|
// imports in App.tsx create the route boundaries; these groups keep
|
|
// shared node_modules out of every page chunk.
|
|
rolldownOptions: {
|
|
output: {
|
|
codeSplitting: {
|
|
minSize: 20_000,
|
|
groups: [
|
|
{
|
|
name: "react-vendor",
|
|
test: /node_modules[\\/](react|react-dom|scheduler|react-router|react-router)([\\/]|$)/,
|
|
},
|
|
{
|
|
name: "xterm",
|
|
test: /node_modules[\\/]@xterm[\\/]/,
|
|
},
|
|
{
|
|
name: "three",
|
|
test: /node_modules[\\/](three|@react-three)([\\/]|$)/,
|
|
},
|
|
{
|
|
name: "plot",
|
|
test: /node_modules[\\/]@observablehq[\\/]plot([\\/]|$)/,
|
|
},
|
|
{
|
|
name: "motion",
|
|
test: /node_modules[\\/](motion|framer-motion)([\\/]|$)/,
|
|
},
|
|
{
|
|
name: "ui",
|
|
test: /node_modules[\\/]@nous-research[\\/]ui([\\/]|$)/,
|
|
},
|
|
{
|
|
name: "vendor",
|
|
test: /node_modules[\\/]/,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
server: {
|
|
proxy: {
|
|
"/api": {
|
|
target: BACKEND,
|
|
ws: true,
|
|
},
|
|
// Same host as `hermes dashboard` must serve these; Vite has no
|
|
// dashboard-plugins/* files, so without this, plugin scripts 404
|
|
// or receive index.html in dev.
|
|
"/dashboard-plugins": BACKEND,
|
|
},
|
|
},
|
|
});
|