Vite 8 switches the bundler to Rolldown, which no longer accepts the
object form of rollupOptions.output.manualChunks — it must be a function.
Convert it (same ndk/vendor split intent) and give tsconfig.node.json a
modern target/lib so vite.config.ts type-checks against String.includes.