{"_id":"@ai37/copilotkit-md-renderer","_rev":"4-eea58db3c426da70b7b6c51b99a11349","name":"@ai37/copilotkit-md-renderer","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@ai37/copilotkit-md-renderer","version":"0.1.0","keywords":["copilotkit","streamdown","markdown","katex","react","ai37"],"license":"Apache-2.0","_id":"@ai37/copilotkit-md-renderer@0.1.0","maintainers":[{"name":"akjmto","email":"otmjka@gmail.com"},{"name":"cthtuf","email":"gdazeysinc@gmail.com"}],"homepage":"https://github.com/AI-37/copilotkit-md-renderer#readme","bugs":{"url":"https://github.com/AI-37/copilotkit-md-renderer/issues"},"dist":{"shasum":"4b594aabe2bc4282c96611aa6616d49a929595cc","tarball":"https://registry.npmjs.org/@ai37/copilotkit-md-renderer/-/copilotkit-md-renderer-0.1.0.tgz","fileCount":15,"integrity":"sha512-fqgVcX8rX+LUemzrLEcSbx4QRE9J5p1TV8ee/tq7J8gReE2zEvxtvwkXXY+klXu6/jk5o33H32duUPanbeggGw==","signatures":[{"sig":"MEQCHxnplLIQ3KgIwFh/Z/9Rg72IYFq1waG+eqmRz86e0EUCIQDB2K97Ww/cp62vpZKyI1vSfBbqW8tWfPUMxZCeB68U7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29823},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"akjmto","email":"otmjka@gmail.com"},"repository":{"url":"git+https://github.com/AI-37/copilotkit-md-renderer.git","type":"git","directory":"packages/copilotkit-md-renderer"},"_npmVersion":"11.3.0","description":"CopilotKit assistant markdown renderer with KaTeX formula support, built on Streamdown. KaTeX core + extension points.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"unified":"^11.0.5","streamdown":"^1.6.11","remark-math":"^6.0.0","rehype-katex":"^7.0.1","rehype-sanitize":"^6.0.0","hast-util-sanitize":"^5.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.0","typescript":"^5.9.0","@types/hast":"^3.0.4","@types/react":"^19.2.17"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/copilotkit-md-renderer_0.1.0_1782332529493_0.3427748982767138","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ai37/copilotkit-md-renderer","version":"0.1.1","keywords":["copilotkit","streamdown","markdown","katex","react","ai37"],"license":"Apache-2.0","_id":"@ai37/copilotkit-md-renderer@0.1.1","maintainers":[{"name":"akjmto","email":"otmjka@gmail.com"},{"name":"cthtuf","email":"gdazeysinc@gmail.com"}],"homepage":"https://github.com/AI-37/copilotkit-md-renderer#readme","bugs":{"url":"https://github.com/AI-37/copilotkit-md-renderer/issues"},"dist":{"shasum":"4fba02d99d417336d50e03381b5e00dd50dcb69e","tarball":"https://registry.npmjs.org/@ai37/copilotkit-md-renderer/-/copilotkit-md-renderer-0.1.1.tgz","fileCount":15,"integrity":"sha512-SN/ePfbpJR0KIsSFozV8hCWl76MQETTt6kJEtrOYKwFuttyjMcwebL+GO3w5AWwmc9CEhpvd56P1/hZlXtSvnQ==","signatures":[{"sig":"MEYCIQDn94LEQ535uneggevkNITII/1szgskBymkcFVwV0ntOQIhAKVlPVEU3kJ5F16uliF+2FxMcod1Xm3Q9KnfpPYJXcer","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30522},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"akjmto","email":"otmjka@gmail.com"},"repository":{"url":"git+https://github.com/AI-37/copilotkit-md-renderer.git","type":"git","directory":"packages/copilotkit-md-renderer"},"_npmVersion":"11.3.0","description":"CopilotKit assistant markdown renderer with KaTeX formula support, built on Streamdown. KaTeX core + extension points.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"unified":"^11.0.5","streamdown":"^1.6.11","remark-math":"^6.0.0","rehype-katex":"^7.0.1","rehype-sanitize":"^6.0.0","hast-util-sanitize":"^5.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.0","typescript":"^5.9.0","@types/hast":"^3.0.4","@types/react":"^19.2.17"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/copilotkit-md-renderer_0.1.1_1782333523742_0.6149922234596699","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ai37/copilotkit-md-renderer","version":"0.2.0","description":"CopilotKit assistant markdown renderer with KaTeX formula support, built on Streamdown. KaTeX core + extension points.","license":"Apache-2.0","type":"module","sideEffects":false,"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"keywords":["copilotkit","streamdown","markdown","katex","react","ai37"],"repository":{"type":"git","url":"git+https://github.com/AI-37/copilotkit-md-renderer.git","directory":"packages/copilotkit-md-renderer"},"homepage":"https://github.com/AI-37/copilotkit-md-renderer#readme","bugs":{"url":"https://github.com/AI-37/copilotkit-md-renderer/issues"},"engines":{"node":">=22.0.0"},"publishConfig":{"access":"public"},"dependencies":{"@types/hast":"^3.0.4","hast-util-sanitize":"^5.0.2","rehype-katex":"^7.0.1","rehype-sanitize":"^6.0.0","remark-math":"^6.0.0","streamdown":"^1.6.11","unified":"^11.0.5"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"devDependencies":{"@types/react":"^19.2.17","react":"^19.2.0","typescript":"^5.9.0"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_id":"@ai37/copilotkit-md-renderer@0.2.0","_integrity":"sha512-P+YjBM1rEUTjgkQO8RsJyVQfWZDgOO/Ubo+FC7YQTLl3xX/sztQ8RqGu01QzANmyv0mS1D9fYscMpg2yhC5BXg==","_resolved":"/private/var/folders/3c/kc47_fpj6sngrh4f4gz9g40c0000gn/T/3bfccb76ba54a5e1eb6c4147a758a398/ai37-copilotkit-md-renderer-0.2.0.tgz","_from":"file:ai37-copilotkit-md-renderer-0.2.0.tgz","_nodeVersion":"22.14.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-P+YjBM1rEUTjgkQO8RsJyVQfWZDgOO/Ubo+FC7YQTLl3xX/sztQ8RqGu01QzANmyv0mS1D9fYscMpg2yhC5BXg==","shasum":"ca7ed926a55665b7632e7a50dd87d8641a5c406e","tarball":"https://registry.npmjs.org/@ai37/copilotkit-md-renderer/-/copilotkit-md-renderer-0.2.0.tgz","fileCount":31,"unpackedSize":56794,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDikw15WuUXbMboOT8PP27cmpKU6BA6NAOKVvRWkipVBwIhANl5zmdwXrEiprilENsj6bkk74IB5X/pjPAT6AOgzbXe"}]},"_npmUser":{"name":"akjmto","email":"otmjka@gmail.com"},"directories":{},"maintainers":[{"name":"akjmto","email":"otmjka@gmail.com"},{"name":"shtep","email":"shtep@list.ru"},{"name":"cthtuf","email":"gdazeysinc@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/copilotkit-md-renderer_0.2.0_1786185298160_0.27139580114544004"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-24T20:22:09.265Z","modified":"2026-08-08T10:34:58.502Z","0.1.0":"2026-06-24T20:22:09.657Z","0.1.1":"2026-06-24T20:38:43.898Z","0.2.0":"2026-08-08T10:34:58.299Z"},"bugs":{"url":"https://github.com/AI-37/copilotkit-md-renderer/issues"},"license":"Apache-2.0","homepage":"https://github.com/AI-37/copilotkit-md-renderer#readme","keywords":["copilotkit","streamdown","markdown","katex","react","ai37"],"repository":{"type":"git","url":"git+https://github.com/AI-37/copilotkit-md-renderer.git","directory":"packages/copilotkit-md-renderer"},"description":"CopilotKit assistant markdown renderer with KaTeX formula support, built on Streamdown. KaTeX core + extension points.","maintainers":[{"name":"akjmto","email":"otmjka@gmail.com"},{"name":"shtep","email":"shtep@list.ru"},{"name":"cthtuf","email":"gdazeysinc@gmail.com"}],"readme":"# @ai37/copilotkit-md-renderer\n\nРендерер markdown ответов ассистента для **CopilotKit v2** с поддержкой\n**KaTeX**-формул (`$…$` / `$$…$$`) и безопасным sanitize. Обёртка над\n[`streamdown`](https://www.npmjs.com/package/streamdown).\n\nЯдро + точки расширения: компонент владеет порядком рехайп-пайплайна\n`[rehypeKatex, …extra, rehypeSanitize]`, а приложение добавляет свои плагины/схему\nснаружи, не форкая компонент.\n\n## Установка\n\n```bash\npnpm add @ai37/copilotkit-md-renderer\n# peer: react ^18 || ^19\n```\n\n**Важно:** пакет не несёт CSS KaTeX. Подключи стили один раз в корне приложения:\n\n```ts\nimport \"katex/dist/katex.min.css\"\n```\n\n## Использование\n\nСлот рендерера ассистента `<CopilotChat>`:\n\n```tsx\nimport { AssistantMarkdown } from \"@ai37/copilotkit-md-renderer\"\n\n<CopilotChat\n  chatView={{\n    messageView: {\n      assistantMessage: { markdownRenderer: AssistantMarkdown },\n    },\n  }}\n/>\n```\n\n## Точки расширения\n\n| Проп | Назначение |\n| --- | --- |\n| `content: string` | Markdown-источник. |\n| `extraRemarkPlugins?: PluggableList` | Доп. remark-плагины, ПОСЛЕ `remark-math`. |\n| `extraRehypePlugins?: PluggableList` | Доп. rehype-плагины, ПОСЛЕ `rehype-katex` и ПЕРЕД `rehype-sanitize`. |\n| `sanitizeSchema?: Schema` | Схема финального sanitize. По умолчанию `katexSchema`. |\n| `foldSections?: boolean \\| { shouldFold? }` | Фолдинг секций в `<details>` (см. ниже). По умолчанию выключен. |\n\n`remarkPlugins`/`rehypePlugins` намеренно **недоступны** — базовый KaTeX-пайплайн\nзаменить нельзя, только дополнить.\n\n### Пример: своя rehype-надстройка\n\nЕсли extra-плагин эмитит свою разметку, разреши её в `sanitizeSchema` (иначе\nsanitize её срежет):\n\n```tsx\nimport { AssistantMarkdown, katexSchema } from \"@ai37/copilotkit-md-renderer\"\nimport type { Schema } from \"hast-util-sanitize\"\nimport { myRehypePlugin } from \"./myRehypePlugin\"\n\nconst schema: Schema = {\n  ...katexSchema,\n  tagNames: [...(katexSchema.tagNames ?? []), \"section\"],\n  attributes: {\n    ...katexSchema.attributes,\n    \"*\": [...((katexSchema.attributes?.[\"*\"] as string[]) ?? []), \"data-foo\"],\n  },\n}\n\nfunction MyRenderer(props: { content: string }) {\n  return (\n    <AssistantMarkdown\n      {...props}\n      extraRehypePlugins={[myRehypePlugin]}\n      sanitizeSchema={schema}\n    />\n  )\n}\n```\n\n> Спредь `katexSchema.attributes` **целиком** — иначе потеряются per-tag\n> KaTeX-атрибуты и формулы сломаются.\n\n## Фолдинг секций (`foldSections`)\n\nСекция ответа агента «заголовок + контент до следующего заголовка любого\nуровня» сворачивается в нативный `<details><summary>…</summary>…</details>`.\nЗаголовок остаётся элементом hN внутри summary. Секция рождается свёрнутой уже\nпри стриминге; дальше состоянием владеет DOM.\n\n**Контракт маркера (дефолт):** сворачивается заголовок, чей текст начинается с\n`[>]` (пробел после маркера необязателен); маркер вычищается из вывода.\nМаркеры ставит шаблон/промпт агента:\n\n```md\n### [>] Ход расчёта\n…этот контент спрячется под details…\n```\n\n```tsx\n<AssistantMarkdown content={content} foldSections />\n```\n\nПроп сам собирает обязательную связку из трёх частей: rehype-плагин\n`rehypeFoldSections` (в конец extra-цепочки, до sanitize), схему\n`withFoldTags(sanitizeSchema)` и сплиттер `splitMarkdownAtHeadings` — Streamdown\nгоняет rehype-пайплайн по каждому блоку отдельно, и без нарезки «секция = один\nблок» плагин видел бы заголовок без контента. Свой\n`parseMarkdownIntoBlocksFn`, если передан, остаётся в приоритете.\n\n**Внешний вид** пакет не несёт (ни иконок, ни CSS) — стилизуй слотом\n`components.summary`:\n\n```tsx\n<AssistantMarkdown\n  content={content}\n  foldSections\n  components={{ summary: MySummary }}\n/>\n```\n\nБез слота — нативный браузерный маркер details.\n\n**Кастомный предикат** — например «сворачивать все h5» (тогда маркер не нужен\nи ничего не вычищается):\n\n```tsx\n<AssistantMarkdown\n  content={content}\n  foldSections={{\n    shouldFold: (heading) => heading.tagName === \"h5\",\n  }}\n/>\n```\n\nДля сборки руками (без пропа) экспортируются `rehypeFoldSections`,\n`splitMarkdownAtHeadings`, `withFoldTags`.\n\n## Экспорты\n\n- `AssistantMarkdown`, `AssistantMarkdownProps`\n- `katexSchema` — KaTeX-friendly схема sanitize (база для расширения)\n- `MATHML_TAGS` — список MathML-тегов, которые эмитит KaTeX\n- `rehypeFoldSections`, `RehypeFoldSectionsOptions` — rehype-плагин фолдинга\n- `splitMarkdownAtHeadings` — сплиттер блоков «секция = один блок»\n- `withFoldTags` — расширение sanitize-схемы на `details`/`summary`\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}