5f5f8d5b62
`hermes update` was pruning root-level Node dependencies (agent-browser) because npm ci always wipes and reifies node_modules according to its active filter -- no root-first/workspace-first ordering or flag combination (--workspaces=false, --include-workspace-root, etc.) can reliably keep a root-only package.json dependency from being pruned by a subsequent workspace-scoped npm ci. Confirmed empirically and via npm/cli source (isArboristCmd hardcodes includeWorkspaceRoot=false for ci/install), so no amount of install-order juggling fixes this for good. Instead of chasing install order, remove the root-only dependencies that made the npm step fragile in the first place: - agent-browser is no longer a root package.json dependency. It resolves lazily via `npx agent-browser` (tools/browser_tool.py already had this as a fallback; it's now the primary path). warm_agent_browser_npx_cache() is called fire-and-forget from both `hermes update` and `hermes doctor --fix` to keep npx's cache warm, preserving the "available before any session starts" property agent-browser had as an eager dependency without re-entangling it with the npm workspace graph. - @streamdown/math moves to apps/desktop/package.json, where it's actually imported (markdown-text.tsx, katex-memo.ts) -- it was never used anywhere else and was subject to the same pruning risk. - _update_node_dependencies() collapses to a single `npm ci --workspace ui-tui --workspace web` call now that root has no dependencies of its own to protect, and keeps its original spot ahead of `_build_web_ui()` at both call sites in update_cmd.py -- with no root-only dependencies left to protect, there's no reason for the Node refresh and the web build to run in any particular order relative to each other. - hermes_cli/tools_config.py's post-setup Chromium-install path and hermes_cli/doctor.py's agent-browser check both now resolve through the same PATH -> Homebrew/Hermes-managed-node -> npx cascade (_find_agent_browser / _resolve_npx_bin) instead of hand-rolling their own node_modules/.bin lookups, so they can't diverge from what browser tools actually invoke at runtime. - tests-js/package-json-lazy-deps.test.ts gets a lockfile-level check mirroring the existing camofox one, so a future regression that reintroduces agent-browser into package-lock.json fails this test directly instead of relying on manual review to catch it. Fixes #43564.