MEGAINFRA-WEBAPP/package.json
DEls b69900fc1b feat(chat): render answers as dashboard-grade markdown
The models return GFM — tables of vehicles, bold figures, lists — and
the view rendered it as preformatted text, so users saw raw pipes and
asterisks.

Answers now render through react-markdown with every element mapped to
this app's own conventions: tables get the borders, muted header and
hover of components/ui/table.tsx, and numeric columns get tabular-nums
so rand figures line up as they do on the fuel and sites pages.

Alignment is computed per COLUMN, not per cell — the table inspects its
own rows, decides which columns are numeric, and publishes that through
context so a header never ranges left above a right-ranged figure.

Layout: questions are compact chips, answers are full-width documents
with a thin amber rule. Bubbles fight tables. Each answer carries a
provenance strip naming the tools it used — for a tool whose value is
that its numbers reconcile with the dashboard, the source is part of the
answer.

Motion is limited to a streaming caret and the running-tool pulse, both
disabled under motion-reduce.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 21:00:35 +02:00

62 lines
1.9 KiB
JSON

{
"name": "mega-infrastructure-dashboard",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev -H 0.0.0.0 -p 6004 --webpack",
"build": "npm run og-image && next build --webpack",
"og-image": "node scripts/build-og-image.mjs",
"start": "next start -H 0.0.0.0 -p 3000",
"lint": "next lint",
"typecheck": "tsc --noEmit",
"test": "vitest",
"test:run": "vitest run",
"mcp": "tsx --env-file=.env.local src/mcp/server.ts",
"postinstall": "node scripts/patch-next-dev-blocker.cjs"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.122.0",
"@ducanh2912/next-pwa": "^10.2.9",
"@modelcontextprotocol/sdk": "^1.30.0",
"@n8n/workflow-sdk": "^0.29.3",
"@radix-ui/react-dialog": "^1.1.4",
"@radix-ui/react-dropdown-menu": "^2.1.4",
"@radix-ui/react-label": "^2.1.1",
"@radix-ui/react-select": "^2.1.4",
"@radix-ui/react-slot": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-tooltip": "^1.1.6",
"@tanstack/react-table": "^8.20.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"lucide-react": "^0.469.0",
"next": "^16",
"openai": "^7.8.0",
"papaparse": "^5.4.1",
"pocketbase": "^0.27.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-markdown": "^10.1.0",
"recharts": "^2.15.0",
"remark-gfm": "^4.0.1",
"tailwind-merge": "^2.6.0",
"xlsx": "^0.18.5",
"zod": "^3.25.76",
"zod-to-json-schema": "^3.25.2"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.0.0",
"@types/node": "^22.10.5",
"@types/papaparse": "^5.3.15",
"@types/react": "^19.0.2",
"@types/react-dom": "^19.0.2",
"eslint": "^9.17.0",
"eslint-config-next": "^16",
"postcss": "^8.4.49",
"tailwindcss": "^4.0.0",
"tsx": "^4.23.12",
"typescript": "^5.7.2",
"vitest": "^2.1.9"
}
}