# Architecture ## Overview `dsh-question-index` is a pure client-side UI surface plugin. Its node half (`lib/index.js`) has an empty `apply` — it exists so the plugin shows up in the host cordis.yml / Loader. All behavior lives in the browser half (`lib/client.js`), discovered through the `dsh.client` declaration in `package.json`. ## Wiring ``` shell.overlay (root scope, floating) └── question-index.panel (session scope) └── QuestionIndexPanel ← reads session chat snapshot, renders ordered list ``` The plugin registers: 1. **One `shell.overlay` entry** (`root` scope, floating surface) that declares the session-scoped child seat `question-index.panel`. 2. **One contribution into that seat** (`session` scope) — the ordered question list (`QuestionIndexPanel`), rendered by the overlay host (`QuestionIndexOverlay`). ## Data flow - The panel reads the current session's `chat` snapshot via `useSession`. - It walks nodes in `chat.order` order, filtering to `user` / `steering` question nodes. - For each question node it extracts text blocks from `content` (`{ type: 'text' }`) and builds an ordered list. - A click handler reads the node's `data-chat-anchor-key` and scrolls the matching row inside `[data-conversation-scroll]`. ## Module-table externals The client bundle is built with the DSH client bundle preset. Platform modules (`react`, `@deepseek-ai/cordis`, `@deepseek-ai/dsh-client-ui-primitives`, etc.) are left external and resolved through the loader's injected `require` at runtime — the plugin never bundles its own copy. ## Styling `QuestionIndex.module.css` is a CSS Module. It is compiled by `lightningcss` into a hashed class map during the build, and the css text auto-injects a `