@takazudo/zudo-doc 5.28.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/catalog.js +1 -1
  43. package/dist/category-nav/index.d.ts +1 -2
  44. package/dist/category-nav/index.js +11 -5
  45. package/dist/category-tree-nav/index.d.ts +1 -2
  46. package/dist/category-tree-nav/index.js +3 -3
  47. package/dist/chrome/derive.d.ts +18 -27
  48. package/dist/chrome/derive.js +47 -29
  49. package/dist/chrome/index.d.ts +5 -5
  50. package/dist/chrome/index.js +1 -1
  51. package/dist/chrome/island-data.d.ts +4 -0
  52. package/dist/chrome/island-data.js +52 -0
  53. package/dist/chrome/primary-slots.d.ts +2 -3
  54. package/dist/chrome-bindings.d.ts +30 -22
  55. package/dist/code-group/index.d.ts +3 -4
  56. package/dist/code-group/index.js +3 -7
  57. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  58. package/dist/code-syntax/code-block-enhancer.js +2 -2
  59. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  60. package/dist/code-syntax/mermaid-init.js +5 -2
  61. package/dist/code-syntax/tabs-init-script.js +1 -1
  62. package/dist/code-syntax/tabs-init.d.ts +1 -2
  63. package/dist/code-syntax/tabs-init.js +2 -2
  64. package/dist/code-syntax/tabs.d.ts +6 -6
  65. package/dist/code-syntax/tabs.js +8 -8
  66. package/dist/compiled.css +2937 -2942
  67. package/dist/config/component-tokens.d.ts +1 -1
  68. package/dist/config/component-tokens.js +22 -0
  69. package/dist/config-assertions/index.d.ts +13 -0
  70. package/dist/config-assertions/index.js +14 -0
  71. package/dist/config.d.ts +36 -17
  72. package/dist/config.js +23 -95
  73. package/dist/content/content-blockquote.d.ts +2 -3
  74. package/dist/content/content-blockquote.js +3 -3
  75. package/dist/content/content-code.d.ts +3 -4
  76. package/dist/content/content-code.js +5 -5
  77. package/dist/content/content-link.d.ts +3 -4
  78. package/dist/content/content-link.js +10 -10
  79. package/dist/content/content-ol.d.ts +2 -3
  80. package/dist/content/content-ol.js +5 -4
  81. package/dist/content/content-paragraph.d.ts +2 -3
  82. package/dist/content/content-paragraph.js +1 -1
  83. package/dist/content/content-strong.d.ts +2 -3
  84. package/dist/content/content-strong.js +3 -3
  85. package/dist/content/content-table.d.ts +2 -3
  86. package/dist/content/content-table.js +4 -4
  87. package/dist/content/content-ul.d.ts +2 -3
  88. package/dist/content/content-ul.js +4 -4
  89. package/dist/content/heading-h2.d.ts +2 -3
  90. package/dist/content/heading-h2.js +4 -4
  91. package/dist/content/heading-h3.d.ts +2 -3
  92. package/dist/content/heading-h3.js +4 -4
  93. package/dist/content/heading-h4.d.ts +2 -3
  94. package/dist/content/heading-h4.js +4 -4
  95. package/dist/content-admonition/index.d.ts +3 -4
  96. package/dist/content-admonition/index.js +2 -2
  97. package/dist/content.css +35 -33
  98. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  99. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  100. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  101. package/dist/design-token-panel-bootstrap-island.js +19 -0
  102. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  103. package/dist/design-token-panel-bootstrap.js +3 -288
  104. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  105. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  106. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  107. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  108. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  109. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  110. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  111. package/dist/desktop-toc-toggle-island/index.js +2 -58
  112. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  113. package/dist/desktop-toc-toggle-island/island.js +43 -0
  114. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  115. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  116. package/dist/details/details.d.ts +3 -4
  117. package/dist/details/details.js +1 -1
  118. package/dist/doc-body-end/index.d.ts +1 -2
  119. package/dist/doc-body-end/index.js +1 -1
  120. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  121. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  122. package/dist/doc-body-end-islands/index.d.ts +4 -21
  123. package/dist/doc-body-end-islands/index.js +5 -3
  124. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  125. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  126. package/dist/doc-content-header/index.d.ts +1 -2
  127. package/dist/doc-content-header/index.js +1 -1
  128. package/dist/doc-history/index.d.ts +1 -1
  129. package/dist/doc-history/index.js +166 -141
  130. package/dist/doc-history-area/index.d.ts +6 -4
  131. package/dist/doc-history-area/index.js +17 -16
  132. package/dist/doc-metainfo-area/index.d.ts +2 -3
  133. package/dist/doc-metainfo-area/index.js +1 -1
  134. package/dist/doc-page-renderer/index.d.ts +13 -7
  135. package/dist/doc-page-renderer/index.js +10 -1
  136. package/dist/doc-page-shell/index.d.ts +20 -7
  137. package/dist/doc-page-shell/index.js +17 -6
  138. package/dist/doc-pager/index.d.ts +1 -2
  139. package/dist/doc-pager/index.js +3 -3
  140. package/dist/doc-tags-area/index.d.ts +2 -3
  141. package/dist/doc-tags-area/index.js +1 -1
  142. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  143. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  144. package/dist/doclayout/doc-layout.d.ts +26 -27
  145. package/dist/doclayout/doc-layout.js +23 -14
  146. package/dist/docs-schema/index.d.ts +4 -0
  147. package/dist/docs-schema/index.js +1 -0
  148. package/dist/extract-headings/index.js +43 -12
  149. package/dist/factory-context/index.d.ts +22 -19
  150. package/dist/features.css +75 -8
  151. package/dist/find-in-page/find-bar.d.ts +4 -2
  152. package/dist/find-in-page/find-bar.js +58 -69
  153. package/dist/find-in-page/index.d.ts +2 -8
  154. package/dist/find-in-page/index.js +33 -30
  155. package/dist/footer/footer.d.ts +3 -4
  156. package/dist/footer/footer.js +3 -3
  157. package/dist/footer-with-defaults/index.d.ts +2 -3
  158. package/dist/footer-with-defaults/index.js +1 -1
  159. package/dist/frontmatter-preview-defaults/index.js +1 -0
  160. package/dist/head/doc-head.d.ts +1 -1
  161. package/dist/head/doc-head.js +24 -32
  162. package/dist/head/og-tags.d.ts +1 -1
  163. package/dist/head/og-tags.js +8 -7
  164. package/dist/head/twitter-card.d.ts +1 -1
  165. package/dist/head/twitter-card.js +1 -1
  166. package/dist/head-with-defaults/index.d.ts +7 -2
  167. package/dist/head-with-defaults/index.js +46 -32
  168. package/dist/header/header.d.ts +8 -8
  169. package/dist/header/header.js +9 -11
  170. package/dist/header/types.d.ts +7 -7
  171. package/dist/header-with-defaults/index.d.ts +3 -4
  172. package/dist/header-with-defaults/index.js +27 -14
  173. package/dist/home-intro/index.d.ts +2 -5
  174. package/dist/home-intro/index.js +7 -5
  175. package/dist/home-intro/prepare.js +4 -3
  176. package/dist/home-page/index.d.ts +3 -3
  177. package/dist/home-page/index.js +19 -17
  178. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  179. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  180. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  181. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  182. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  183. package/dist/html-preview-wrapper/html-preview.js +13 -37
  184. package/dist/html-preview-wrapper/index.d.ts +2 -1
  185. package/dist/html-preview-wrapper/index.js +1 -1
  186. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  187. package/dist/html-preview-wrapper/preview-base.js +56 -59
  188. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  189. package/dist/html-preview-wrapper/wrapper.js +37 -0
  190. package/dist/hydration-pending.d.ts +3 -5
  191. package/dist/hydration-pending.js +7 -5
  192. package/dist/i18n-version/language-switcher.d.ts +5 -32
  193. package/dist/i18n-version/language-switcher.js +5 -106
  194. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  195. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  196. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  197. package/dist/i18n-version/switcher-url-state.js +103 -0
  198. package/dist/i18n-version/version-banner.d.ts +2 -3
  199. package/dist/i18n-version/version-banner.js +1 -1
  200. package/dist/i18n-version/version-switcher.d.ts +5 -50
  201. package/dist/i18n-version/version-switcher.js +5 -157
  202. package/dist/icons/index.d.ts +18 -19
  203. package/dist/icons/index.js +17 -33
  204. package/dist/image-enlarge/index.d.ts +1 -10
  205. package/dist/image-enlarge/index.js +80 -55
  206. package/dist/image-enlarge/public.d.ts +2 -0
  207. package/dist/image-enlarge/public.js +6 -0
  208. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  209. package/dist/image-enlarge/ssr-fallback.js +8 -0
  210. package/dist/index.d.ts +11 -4
  211. package/dist/inline-version-switcher/index.d.ts +1 -2
  212. package/dist/inline-version-switcher/index.js +1 -1
  213. package/dist/island-types/index.d.ts +2 -2
  214. package/dist/island-types/index.js +1 -5
  215. package/dist/math-block/index.d.ts +4 -7
  216. package/dist/math-block/index.js +5 -5
  217. package/dist/mcp/handler.d.ts +8 -0
  218. package/dist/mcp/handler.js +129 -0
  219. package/dist/mcp/index.d.ts +4 -0
  220. package/dist/mcp/index.js +7 -0
  221. package/dist/mcp/loader.d.ts +19 -0
  222. package/dist/mcp/loader.js +202 -0
  223. package/dist/mdx-components/index.js +40 -108
  224. package/dist/mermaid-enlarge/index.d.ts +1 -8
  225. package/dist/mermaid-enlarge/index.js +174 -158
  226. package/dist/mermaid-enlarge/public.d.ts +2 -0
  227. package/dist/mermaid-enlarge/public.js +6 -0
  228. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  229. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  230. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  231. package/dist/metainfo/doc-metainfo.js +1 -4
  232. package/dist/metainfo/doc-tags.d.ts +2 -3
  233. package/dist/metainfo/doc-tags.js +1 -1
  234. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  235. package/dist/metainfo/frontmatter-preview.js +1 -1
  236. package/dist/nav-data-prep/index.js +6 -4
  237. package/dist/nav-indexing/category-nav.d.ts +2 -3
  238. package/dist/nav-indexing/category-nav.js +1 -2
  239. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  240. package/dist/nav-indexing/category-tree-nav.js +1 -1
  241. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  242. package/dist/nav-indexing/doc-card-grid.js +1 -2
  243. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  244. package/dist/nav-indexing/docs-sitemap.js +2 -2
  245. package/dist/nav-indexing/index.d.ts +1 -1
  246. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  247. package/dist/nav-indexing/nav-card-grid.js +1 -2
  248. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  249. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  250. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  251. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  252. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  253. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  254. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  255. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  256. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  257. package/dist/nav-indexing/note-tray-index.js +1 -1
  258. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  259. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  260. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  261. package/dist/nav-indexing/tag-nav.js +1 -1
  262. package/dist/nav-indexing/types.d.ts +2 -2
  263. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  264. package/dist/nav-indexing/versions-page-content.js +8 -8
  265. package/dist/note-tray-index/index.d.ts +1 -2
  266. package/dist/note-tray-index/index.js +1 -1
  267. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  268. package/dist/page-loading/page-loading-overlay.js +3 -5
  269. package/dist/plugins/agent-export.d.ts +3 -0
  270. package/dist/plugins/agent-export.js +34 -0
  271. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  272. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  273. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  274. package/dist/plugins/internal/agent-export/index.js +123 -0
  275. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  276. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  277. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  278. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  279. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  280. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  281. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  282. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  283. package/dist/plugins/internal/llms-txt/load.js +20 -4
  284. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  285. package/dist/plugins/routes.js +4 -0
  286. package/dist/preset.d.ts +19 -9
  287. package/dist/preset.js +20 -1
  288. package/dist/route-context-payload/index.js +1 -1
  289. package/dist/routes/404.d.ts +2 -3
  290. package/dist/routes/404.js +1 -1
  291. package/dist/routes/_chrome.d.ts +5 -5
  292. package/dist/routes/_chrome.js +7 -2
  293. package/dist/routes/_context.d.ts +4 -4
  294. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  295. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  296. package/dist/routes/docs-slug.d.ts +2 -3
  297. package/dist/routes/docs-tags-index.d.ts +2 -3
  298. package/dist/routes/docs-tags-index.js +1 -1
  299. package/dist/routes/docs-tags-tag.d.ts +2 -3
  300. package/dist/routes/docs-tags-tag.js +1 -1
  301. package/dist/routes/docs-versions.d.ts +2 -3
  302. package/dist/routes/docs-versions.js +1 -1
  303. package/dist/routes/files-path.d.ts +2 -3
  304. package/dist/routes/files-path.js +1 -1
  305. package/dist/routes/index.d.ts +2 -3
  306. package/dist/routes/index.js +1 -1
  307. package/dist/routes/locale-docs-slug.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  309. package/dist/routes/locale-docs-tags-index.js +1 -1
  310. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  311. package/dist/routes/locale-docs-tags-tag.js +1 -1
  312. package/dist/routes/locale-docs-versions.d.ts +2 -3
  313. package/dist/routes/locale-docs-versions.js +1 -1
  314. package/dist/routes/locale-files-path.d.ts +2 -3
  315. package/dist/routes/locale-files-path.js +1 -1
  316. package/dist/routes/locale-index.d.ts +2 -3
  317. package/dist/routes/locale-index.js +1 -1
  318. package/dist/routes/mcp.d.ts +5 -0
  319. package/dist/routes/mcp.js +25 -0
  320. package/dist/routes/v-docs-slug.d.ts +2 -3
  321. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  322. package/dist/search-widget/index.d.ts +1 -2
  323. package/dist/search-widget/index.js +4 -7
  324. package/dist/search-widget-script/generated-script.js +12 -5
  325. package/dist/settings-defaults.d.ts +2 -0
  326. package/dist/settings-defaults.js +93 -0
  327. package/dist/settings.d.ts +8 -2
  328. package/dist/sidebar/client-data.d.ts +18 -0
  329. package/dist/sidebar/client-data.js +47 -0
  330. package/dist/sidebar/index.d.ts +3 -1
  331. package/dist/sidebar/index.js +3 -1
  332. package/dist/sidebar/sidebar.d.ts +12 -44
  333. package/dist/sidebar/sidebar.js +4 -3
  334. package/dist/sidebar/types.d.ts +14 -0
  335. package/dist/sidebar-prepaint/index.d.ts +1 -2
  336. package/dist/sidebar-prepaint/index.js +4 -6
  337. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  338. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  339. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  340. package/dist/sidebar-toggle-island/index.js +75 -62
  341. package/dist/sidebar-tree/build-tree.js +5 -6
  342. package/dist/sidebar-tree/types.d.ts +2 -0
  343. package/dist/sidebar-tree-island/index.d.ts +4 -19
  344. package/dist/sidebar-tree-island/index.js +782 -436
  345. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  346. package/dist/sidebar-tree-island/scope-state.js +151 -0
  347. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  348. package/dist/sidebar-utils/index.d.ts +17 -19
  349. package/dist/sidebar-utils/index.js +100 -3
  350. package/dist/sidebar-utils/scope.d.ts +11 -0
  351. package/dist/sidebar-utils/scope.js +67 -0
  352. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  353. package/dist/sidebar-with-defaults/index.js +19 -18
  354. package/dist/site-schema/nav-tree.js +15 -15
  355. package/dist/site-schema/types.d.ts +1 -0
  356. package/dist/site-tree-nav/index.d.ts +2 -3
  357. package/dist/site-tree-nav/index.js +11 -12
  358. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  359. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  360. package/dist/site-tree-nav-island/index.d.ts +3 -3
  361. package/dist/site-tree-nav-island/index.js +243 -144
  362. package/dist/smart-break/index.d.ts +3 -4
  363. package/dist/smart-break/index.js +1 -1
  364. package/dist/tab-item/tab-item.d.ts +3 -4
  365. package/dist/tab-item/tab-item.js +1 -1
  366. package/dist/tag-pages/index.d.ts +3 -3
  367. package/dist/tag-pages/index.js +10 -10
  368. package/dist/theme/color-scheme-provider.d.ts +3 -3
  369. package/dist/theme/color-scheme-provider.js +3 -3
  370. package/dist/theme/theme-pack-provider.d.ts +1 -1
  371. package/dist/theme/theme-pack-provider.js +3 -3
  372. package/dist/theme/theme-toggle.d.ts +2 -3
  373. package/dist/theme/theme-toggle.js +1 -1
  374. package/dist/theme-pack-dialog/index.d.ts +1 -1
  375. package/dist/theme-pack-dialog/index.js +69 -75
  376. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  377. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  378. package/dist/theme-pack-switcher/index.d.ts +4 -5
  379. package/dist/theme-pack-switcher/index.js +52 -49
  380. package/dist/theme-packs/academia/meta.json +1 -1
  381. package/dist/theme-packs/academia/pack.css +1 -1
  382. package/dist/theme-packs/bauhaus/meta.json +1 -1
  383. package/dist/theme-packs/bauhaus/pack.css +2 -2
  384. package/dist/theme-packs/blueprint/meta.json +1 -1
  385. package/dist/theme-packs/blueprint/pack.css +2 -2
  386. package/dist/theme-packs/botanica/meta.json +1 -1
  387. package/dist/theme-packs/botanica/pack.css +2 -2
  388. package/dist/theme-packs/broadsheet/meta.json +1 -1
  389. package/dist/theme-packs/broadsheet/pack.css +2 -2
  390. package/dist/theme-packs/brutalist/meta.json +1 -1
  391. package/dist/theme-packs/brutalist/pack.css +2 -2
  392. package/dist/theme-packs/eink/meta.json +1 -1
  393. package/dist/theme-packs/eink/pack.css +1 -1
  394. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  395. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  396. package/dist/theme-packs/hearth/meta.json +1 -1
  397. package/dist/theme-packs/hearth/pack.css +2 -2
  398. package/dist/theme-packs/ledger/meta.json +1 -1
  399. package/dist/theme-packs/ledger/pack.css +1 -1
  400. package/dist/theme-packs/manuscript/meta.json +1 -1
  401. package/dist/theme-packs/manuscript/pack.css +1 -1
  402. package/dist/theme-packs/matcha/meta.json +1 -1
  403. package/dist/theme-packs/matcha/pack.css +2 -2
  404. package/dist/theme-packs/nocturne/meta.json +1 -1
  405. package/dist/theme-packs/nocturne/pack.css +2 -2
  406. package/dist/theme-packs/observatory/meta.json +1 -1
  407. package/dist/theme-packs/observatory/pack.css +2 -2
  408. package/dist/theme-packs/onyx/meta.json +1 -1
  409. package/dist/theme-packs/onyx/pack.css +2 -2
  410. package/dist/theme-packs/phosphor/meta.json +1 -1
  411. package/dist/theme-packs/phosphor/pack.css +2 -2
  412. package/dist/theme-packs/riso/meta.json +1 -1
  413. package/dist/theme-packs/riso/pack.css +2 -2
  414. package/dist/theme-packs/sakura/meta.json +1 -1
  415. package/dist/theme-packs/sakura/pack.css +2 -2
  416. package/dist/theme-packs/scandi/meta.json +1 -1
  417. package/dist/theme-packs/scandi/pack.css +1 -1
  418. package/dist/theme-packs/solar/meta.json +1 -1
  419. package/dist/theme-packs/solar/pack.css +1 -1
  420. package/dist/theme-packs/sumi/meta.json +1 -1
  421. package/dist/theme-packs/sumi/pack.css +2 -2
  422. package/dist/theme-packs/swissgrid/meta.json +1 -1
  423. package/dist/theme-packs/swissgrid/pack.css +1 -1
  424. package/dist/theme-packs/timberline/meta.json +1 -1
  425. package/dist/theme-packs/timberline/pack.css +2 -2
  426. package/dist/theme-packs/washi/meta.json +1 -1
  427. package/dist/theme-packs/washi/pack.css +2 -2
  428. package/dist/theme-toggle/index.d.ts +1 -1
  429. package/dist/theme-toggle/index.js +154 -167
  430. package/dist/theme.css +47 -121
  431. package/dist/toc/mobile-toc.d.ts +3 -5
  432. package/dist/toc/mobile-toc.js +29 -27
  433. package/dist/toc/toc.d.ts +3 -4
  434. package/dist/toc/toc.js +18 -18
  435. package/dist/toc/use-active-heading.d.ts +5 -4
  436. package/dist/toc/use-active-heading.js +36 -30
  437. package/dist/toc-prepaint/index.d.ts +1 -2
  438. package/dist/toc-prepaint/index.js +4 -6
  439. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  440. package/dist/transitions/nested-island-props-refresh.js +133 -151
  441. package/dist/transitions/page-events.d.ts +8 -13
  442. package/dist/tree-nav-shared/index.d.ts +4 -5
  443. package/dist/tree-nav-shared/index.js +6 -7
  444. package/dist/use-modal-dialog/index.d.ts +9 -63
  445. package/dist/use-modal-dialog/index.js +41 -59
  446. package/dist/versions-page/index.d.ts +3 -3
  447. package/dist/versions-page/index.js +5 -5
  448. package/dist/wind/index.d.ts +5 -0
  449. package/dist/wind/index.js +169 -0
  450. package/dist/wind.json +498 -0
  451. package/dist/z-index-defaults/index.d.ts +4 -4
  452. package/dist/zdtp-loader.d.ts +7 -0
  453. package/dist/zdtp-loader.js +8 -0
  454. package/eject/asset-components/asset-card.tsx +14 -16
  455. package/eject/asset-components/asset-code.tsx +10 -12
  456. package/eject/asset-components/shared.tsx +5 -7
  457. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  458. package/eject/code-group/index.tsx +4 -10
  459. package/eject/content-admonition/index.tsx +5 -6
  460. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  461. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  462. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  463. package/eject/details/details.tsx +3 -5
  464. package/eject/doc-history/index.tsx +193 -179
  465. package/eject/doc-pager/index.tsx +3 -4
  466. package/eject/footer/footer.tsx +7 -9
  467. package/eject/header/header.tsx +42 -54
  468. package/eject/header/nav-overflow-script.ts +1 -1
  469. package/eject/header/types.ts +12 -13
  470. package/eject/image-enlarge/index.tsx +84 -69
  471. package/eject/image-enlarge/public.ts +2 -0
  472. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  473. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  474. package/eject/sidebar/client-data.ts +68 -0
  475. package/eject/sidebar/index.ts +3 -0
  476. package/eject/sidebar/sidebar.tsx +16 -97
  477. package/eject/sidebar/types.ts +15 -0
  478. package/eject/sidebar-toggle-island/index.tsx +103 -102
  479. package/eject/sidebar-tree-island/index.tsx +827 -615
  480. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  481. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  482. package/eject/site-tree-nav-island/index.tsx +349 -222
  483. package/eject/tab-item/tab-item.tsx +2 -4
  484. package/eject/theme-toggle/hydration-pending.ts +6 -10
  485. package/eject/theme-toggle/index.tsx +133 -173
  486. package/eject/toc/mobile-toc.tsx +27 -31
  487. package/eject/toc/toc.tsx +21 -24
  488. package/eject/toc/use-active-heading.ts +43 -38
  489. package/package.json +40 -22
  490. package/routes-src/404.tsx +2 -3
  491. package/routes-src/_chrome.tsx +7 -2
  492. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  493. package/routes-src/docs-slug.tsx +2 -3
  494. package/routes-src/docs-tags-index.tsx +2 -3
  495. package/routes-src/docs-tags-tag.tsx +2 -3
  496. package/routes-src/docs-versions.tsx +2 -3
  497. package/routes-src/files-path.tsx +2 -4
  498. package/routes-src/index.tsx +2 -3
  499. package/routes-src/locale-docs-slug.tsx +2 -3
  500. package/routes-src/locale-docs-tags-index.tsx +2 -3
  501. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  502. package/routes-src/locale-docs-versions.tsx +2 -3
  503. package/routes-src/locale-files-path.tsx +2 -4
  504. package/routes-src/locale-index.tsx +2 -3
  505. package/routes-src/mcp.tsx +25 -0
  506. package/routes-src/v-docs-slug.tsx +2 -3
  507. package/routes-src/v-locale-docs-slug.tsx +2 -3
  508. package/tsconfig.base.json +1 -1
  509. package/dist/safelist.css +0 -2
  510. package/dist/theme-no-reset.css +0 -379
  511. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -0,0 +1,123 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+ import { agentItemKey, agentPageKey } from "../../../agent-docs/identity.js";
6
+ import { AGENT_MAX_ITEMS, AGENT_MAX_MANIFEST_BYTES, AGENT_MAX_SEARCH_INDEX_BYTES } from "../../../agent-docs/limits.js";
7
+ import { collectMdFiles, isExcluded, parseMarkdownFile, slugToUrl, stripMarkdown } from "../../../md-utils/index.js";
8
+ import { chunkAgentText } from "./chunk.js";
9
+ import { normalizeAgentMarkdown } from "./normalize.js";
10
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
11
+ const json = (value) => JSON.stringify(value);
12
+ const order = (a, b) => a < b ? -1 : a > b ? 1 : 0;
13
+ function canonical(value) {
14
+ if (Array.isArray(value)) return value.map(canonical);
15
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).sort(([a], [b]) => order(a, b)).map(([key, item]) => [key, canonical(item)]));
16
+ return value;
17
+ }
18
+ function prefix(base) {
19
+ return base === "/" ? "" : `/${base.replace(/^\/+|\/+$/g, "")}`;
20
+ }
21
+ function artifactUrl(options, path) {
22
+ const pathname = `${prefix(options.base)}/agent/v1/${path}`;
23
+ return options.siteUrl ? `${options.siteUrl.replace(/\/$/, "")}${pathname}` : pathname;
24
+ }
25
+ function projectAgentCorpus(options) {
26
+ const roots = [{ code: options.defaultLocale, dir: options.defaultLocaleDir, default: true }, ...(options.locales ?? []).map(({ code, dir }) => ({ code, dir, default: false }))];
27
+ const seen = /* @__PURE__ */ new Set();
28
+ const sources = roots.flatMap((root) => collectMdFiles(resolve(root.dir)).flatMap(({ filePath, slug: fileSlug }) => {
29
+ const parsed = parseMarkdownFile(filePath);
30
+ if (!parsed || isExcluded(parsed.data)) return [];
31
+ const slug = parsed.data.slug ?? fileSlug;
32
+ const url = slugToUrl(slug, root.default ? null : root.code, options.base, options.siteUrl);
33
+ return [{ root, filePath, parsed, slug, url }];
34
+ }));
35
+ const sourceUrls = new Map(sources.map((source) => [source.filePath, source.url]));
36
+ const documents = sources.map(({ root, filePath, parsed, slug, url }) => {
37
+ const id = agentPageKey(root.code, slug);
38
+ if (seen.has(id)) throw new Error(`Duplicate agent page ID: ${id}`);
39
+ seen.add(id);
40
+ const normalized = normalizeAgentMarkdown(parsed.content, url, (target) => {
41
+ try {
42
+ const source = new URL(target, pathToFileURL(filePath));
43
+ if (!/\.mdx?$/.test(source.pathname)) return void 0;
44
+ const page = sourceUrls.get(fileURLToPath(source));
45
+ return page === void 0 ? void 0 : page + source.search + source.hash;
46
+ } catch {
47
+ return void 0;
48
+ }
49
+ });
50
+ const title = parsed.data.title ?? slug;
51
+ const description = parsed.data.description ?? stripMarkdown(parsed.content).split("\n").find(Boolean) ?? "";
52
+ const metadata = {
53
+ locale: root.code,
54
+ pageId: id,
55
+ ...description ? { description } : {},
56
+ ...normalized.unsupportedDynamicContent ? { unsupportedDynamicContent: true } : {}
57
+ };
58
+ return {
59
+ id,
60
+ key: id,
61
+ locale: root.code,
62
+ slug,
63
+ title,
64
+ description,
65
+ url,
66
+ text: normalized.text,
67
+ unsupportedDynamicContent: normalized.unsupportedDynamicContent,
68
+ parts: chunkAgentText(normalized.text, title, url, metadata)
69
+ };
70
+ }).sort((a, b) => order(a.locale, b.locale) || order(a.slug, b.slug));
71
+ const site = { name: options.siteName, url: options.siteUrl ?? "", base: options.base };
72
+ const locales = roots.map(({ code }) => code);
73
+ const fingerprint = hash(json(canonical({ schemaVersion: 1, site, defaultLocale: options.defaultLocale, locales, documents })));
74
+ const pages = /* @__PURE__ */ new Map();
75
+ const items = /* @__PURE__ */ new Map();
76
+ const indexed = [];
77
+ const manifest = { schemaVersion: 1, fingerprint, site, defaultLocale: options.defaultLocale, locales, searchIndex: { url: artifactUrl(options, "search-index.json"), sha256: "" }, documents: [], items: [] };
78
+ for (const doc of documents) {
79
+ pages.set(doc.key, doc.text);
80
+ const itemIds = [];
81
+ doc.parts.forEach((text, index2) => {
82
+ const part = index2 + 1;
83
+ const id = agentItemKey(doc.id, part);
84
+ itemIds.push(id);
85
+ const item = { id, title: doc.parts.length === 1 ? doc.title : `${doc.title} (part ${part}/${doc.parts.length})`, text, url: doc.url, metadata: { locale: doc.locale, pageId: doc.id, fingerprint, part, partCount: doc.parts.length, ...doc.description ? { description: doc.description } : {}, ...doc.unsupportedDynamicContent ? { unsupportedDynamicContent: true } : {} } };
86
+ const bytes = json(item);
87
+ items.set(id, bytes);
88
+ indexed.push(item);
89
+ manifest.items.push({ id, key: id, pageId: doc.id, url: doc.url, artifactUrl: artifactUrl(options, `items/${id}.json`), sha256: hash(bytes), part, partCount: doc.parts.length });
90
+ });
91
+ manifest.documents.push({ id: doc.id, key: doc.key, locale: doc.locale, title: doc.title, url: doc.url, markdownUrl: artifactUrl(options, `pages/${doc.key}.md`), itemIds });
92
+ }
93
+ if (indexed.length > AGENT_MAX_ITEMS) throw new Error("Agent corpus exceeds the item limit.");
94
+ const index = { schemaVersion: 1, fingerprint, items: indexed };
95
+ const indexBytes = json(index);
96
+ if (Buffer.byteLength(indexBytes) > AGENT_MAX_SEARCH_INDEX_BYTES) throw new Error("Agent search index exceeds the byte limit.");
97
+ manifest.searchIndex.sha256 = hash(indexBytes);
98
+ if (Buffer.byteLength(json(manifest)) > AGENT_MAX_MANIFEST_BYTES) throw new Error("Agent manifest exceeds the byte limit.");
99
+ return { manifest, index, pages, items };
100
+ }
101
+ function emitAgentCorpus(options) {
102
+ const corpus = projectAgentCorpus(options);
103
+ const segment = options.copyPublicWithBase === false ? "" : prefix(options.base).slice(1);
104
+ const root = join(options.outDir, segment, "agent", "v1");
105
+ rmSync(root, { recursive: true, force: true });
106
+ mkdirSync(join(root, "items"), { recursive: true });
107
+ mkdirSync(join(root, "pages"), { recursive: true });
108
+ const written = [];
109
+ const write = (path, body) => {
110
+ const target = join(root, path);
111
+ writeFileSync(target, body);
112
+ written.push(target);
113
+ };
114
+ write("manifest.json", json(corpus.manifest));
115
+ write("search-index.json", json(corpus.index));
116
+ for (const [key, body] of corpus.items) write(`items/${key}.json`, body);
117
+ for (const [key, body] of corpus.pages) write(`pages/${key}.md`, body);
118
+ return written;
119
+ }
120
+ export {
121
+ emitAgentCorpus,
122
+ projectAgentCorpus
123
+ };
@@ -0,0 +1,5 @@
1
+ /** Normalize MDX for a published text corpus without evaluating its modules. */
2
+ export declare function normalizeAgentMarkdown(source: string, pageUrl: string, resolveSourceLink?: (target: string) => string | undefined): {
3
+ text: string;
4
+ unsupportedDynamicContent: boolean;
5
+ };
@@ -0,0 +1,73 @@
1
+ function normalizeAgentMarkdown(source, pageUrl, resolveSourceLink) {
2
+ let unsupportedDynamicContent = false;
3
+ const literals = [];
4
+ let marker = "\0agent-code:";
5
+ while (source.includes(marker)) marker += ":";
6
+ const shield = (value) => `${marker}${literals.push(value) - 1}\0`;
7
+ let fence;
8
+ const fenced = [];
9
+ const lines = source.replace(/\r\n?/g, "\n").split("\n");
10
+ const prose = [];
11
+ for (const line of lines) {
12
+ const match = line.match(/^ {0,3}(`{3,}|~{3,})(.*)$/);
13
+ if (fence) {
14
+ fenced.push(line);
15
+ if (match && match[1][0] === fence[0] && match[1].length >= fence.length && !match[2].trim()) {
16
+ prose.push(shield(fenced.join("\n")));
17
+ fenced.length = 0;
18
+ fence = void 0;
19
+ }
20
+ } else if (match) {
21
+ fence = match[1];
22
+ fenced.push(line);
23
+ } else prose.push(line);
24
+ }
25
+ if (fenced.length) prose.push(shield(fenced.join("\n")));
26
+ let text = prose.join("\n");
27
+ const runs = [...text.matchAll(/`+/g)];
28
+ let offset = 0;
29
+ let protectedText = "";
30
+ for (let i = 0; i < runs.length; i++) {
31
+ const opening = runs[i];
32
+ const closingIndex = runs.findIndex((run, j) => j > i && run[0].length === opening[0].length);
33
+ if (closingIndex < 0) continue;
34
+ const end = runs[closingIndex].index + opening[0].length;
35
+ protectedText += text.slice(offset, opening.index) + shield(text.slice(opening.index, end));
36
+ offset = end;
37
+ i = closingIndex;
38
+ }
39
+ text = protectedText + text.slice(offset);
40
+ text = text.replace(/\{\/\*[\s\S]*?\*\/\}/g, "");
41
+ text = text.replace(/^[ \t]*import[ \t]+(?:type[ \t]+)?(?:[\w$]+[ \t]*,[ \t]*)?\{[^}]*\}[ \t]*from[ \t]*["'][^"'\n]+["'][ \t]*;?[ \t]*$/gm, "");
42
+ text = text.replace(/^\s*(?:import|export)[^\S\n]+.*$/gm, "");
43
+ const resolveLink = (target) => {
44
+ if (/^(?:[a-z][a-z\d+.-]*:|\/|\{)/i.test(target)) return target;
45
+ const sourceUrl = resolveSourceLink?.(target);
46
+ if (sourceUrl !== void 0) return sourceUrl;
47
+ try {
48
+ const absolute = new URL(target, new URL(pageUrl, "https://agent.invalid"));
49
+ return absolute.origin === "https://agent.invalid" ? absolute.pathname + absolute.search + absolute.hash : absolute.toString();
50
+ } catch {
51
+ return target;
52
+ }
53
+ };
54
+ text = text.replace(
55
+ /(!?\[[^\]]*\]\()(?:<([^>]+)>|([^\s)]+))([^)]*\))/g,
56
+ (_all, before, angled, plain, after) => shield(before + (angled !== void 0 ? `<${resolveLink(angled)}>` : resolveLink(plain)) + after)
57
+ );
58
+ text = text.replace(
59
+ /^( {0,3}\[[^\]]+\]:[ \t]*)(?:<([^>]+)>|([^\s]+))/gm,
60
+ (_all, before, angled, plain) => shield(before + (angled !== void 0 ? `<${resolveLink(angled)}>` : resolveLink(plain)))
61
+ );
62
+ text = text.replace(/<([A-Z][\w.]*)\b[^>]*>/g, () => {
63
+ unsupportedDynamicContent = true;
64
+ return "[Dynamic content unavailable in text export]";
65
+ });
66
+ text = text.replace(/<\/([A-Z][\w.]*)\s*>/g, "");
67
+ text = text.replace(/<\/?[a-z][\w-]*(?=[\s/>])[^>]*>/g, "");
68
+ for (let i = literals.length - 1; i >= 0; i--) text = text.replaceAll(`${marker}${i}\0`, () => literals[i]);
69
+ return { text: text.trim(), unsupportedDynamicContent };
70
+ }
71
+ export {
72
+ normalizeAgentMarkdown
73
+ };
@@ -19,6 +19,12 @@ export interface LlmsTxtDevMiddlewareOptions extends LlmsTxtSiteMeta {
19
19
  base: string;
20
20
  /** Optional absolute site URL; see `LlmsTxtLoadOptions.siteUrl`. */
21
21
  siteUrl?: string;
22
+ /** Actual default locale code; needed to match agent-export page IDs. */
23
+ defaultLocale?: string;
24
+ /** Link slim-index docs to agent-export Markdown artifacts when enabled. */
25
+ agentExport?: boolean;
26
+ /** Include the stateless read-only endpoint in the slim index when enabled. */
27
+ mcp?: boolean;
22
28
  /** Default-locale content directory. */
23
29
  defaultLocaleDir: string;
24
30
  /** Additional locales (e.g. `[{ code: "ja", dir: "src/content/docs-ja" }]`). */
@@ -1,6 +1,6 @@
1
1
  import { loadLlmsAssetEntries } from "./assets.js";
2
2
  import { generateLlmsFullTxt, generateLlmsTxt } from "./generate.js";
3
- import { loadDocEntries } from "./load.js";
3
+ import { loadDocEntries, withLlmsBase } from "./load.js";
4
4
  const LLMS_KIND_PATTERN = /^(?:\/(.+?))?\/(llms|llms-full)\.txt$/;
5
5
  function createLlmsTxtDevMiddleware(options, logger) {
6
6
  const meta = {
@@ -13,6 +13,10 @@ function createLlmsTxtDevMiddleware(options, logger) {
13
13
  );
14
14
  const base = options.base ?? "";
15
15
  const siteUrl = options.siteUrl || void 0;
16
+ const generationOptions = {
17
+ agentExport: options.agentExport === true,
18
+ ...options.mcp === true ? { mcpEndpointUrl: withLlmsBase("/mcp", base, siteUrl) } : {}
19
+ };
16
20
  return (req, res, next) => {
17
21
  const url = req.url ?? "";
18
22
  const match = matchLlmsRoute(stripBase(url, base), localeCodes);
@@ -38,7 +42,8 @@ function createLlmsTxtDevMiddleware(options, logger) {
38
42
  contentDir,
39
43
  locale: match.locale,
40
44
  base,
41
- siteUrl
45
+ siteUrl,
46
+ ...options.agentExport === true ? { agentExportLocale: match.locale ?? options.defaultLocale ?? "en" } : {}
42
47
  });
43
48
  const assets = loadLlmsAssetEntries({
44
49
  projectRoot: options.projectRoot,
@@ -47,7 +52,7 @@ function createLlmsTxtDevMiddleware(options, logger) {
47
52
  }).filter(
48
53
  (asset) => match.locale === null ? asset.locale === void 0 : asset.locale === match.locale
49
54
  );
50
- const body = match.kind === "llms" ? generateLlmsTxt(entries, meta, assets) : generateLlmsFullTxt(entries, meta, assets);
55
+ const body = match.kind === "llms" ? generateLlmsTxt(entries, meta, assets, generationOptions) : generateLlmsFullTxt(entries, meta, assets);
51
56
  res.statusCode = 200;
52
57
  res.setHeader("Content-Type", "text/plain; charset=utf-8");
53
58
  res.end(body);
@@ -2,7 +2,7 @@ import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { generateLlmsFullTxt, generateLlmsTxt } from "./generate.js";
4
4
  import { loadLlmsAssetEntries } from "./assets.js";
5
- import { loadDocEntries } from "./load.js";
5
+ import { loadDocEntries, withLlmsBase } from "./load.js";
6
6
  function assetsForLocale(assets, locale) {
7
7
  return assets.filter(
8
8
  (asset) => locale === null ? asset.locale === void 0 : asset.locale === locale
@@ -19,23 +19,36 @@ function emitLlmsTxt(options) {
19
19
  locales = [],
20
20
  logger,
21
21
  projectRoot,
22
- assetScan
22
+ assetScan,
23
+ defaultLocale,
24
+ agentExport,
25
+ mcp
23
26
  } = options;
24
27
  const meta = { siteName, siteDescription };
25
28
  const written = [];
26
29
  const assetEntries = loadLlmsAssetEntries({ projectRoot, assetScan, siteUrl });
30
+ const generationOptions = {
31
+ agentExport: agentExport === true,
32
+ ...mcp === true ? { mcpEndpointUrl: withLlmsBase("/mcp", base, siteUrl) } : {}
33
+ };
27
34
  const defaultEntries = loadDocEntries({
28
35
  contentDir: defaultLocaleDir,
29
36
  locale: null,
30
37
  base,
31
- siteUrl
38
+ siteUrl,
39
+ ...agentExport === true ? { agentExportLocale: defaultLocale ?? "en" } : {}
32
40
  });
33
41
  mkdirSync(outDir, { recursive: true });
34
42
  const defaultIndexPath = join(outDir, "llms.txt");
35
43
  const defaultFullPath = join(outDir, "llms-full.txt");
36
44
  writeFileSync(
37
45
  defaultIndexPath,
38
- generateLlmsTxt(defaultEntries, meta, assetsForLocale(assetEntries, null))
46
+ generateLlmsTxt(
47
+ defaultEntries,
48
+ meta,
49
+ assetsForLocale(assetEntries, null),
50
+ generationOptions
51
+ )
39
52
  );
40
53
  writeFileSync(
41
54
  defaultFullPath,
@@ -50,14 +63,18 @@ function emitLlmsTxt(options) {
50
63
  contentDir: dir,
51
64
  locale: code,
52
65
  base,
53
- siteUrl
66
+ siteUrl,
67
+ ...agentExport === true ? { agentExportLocale: code } : {}
54
68
  });
55
69
  const localeDir = join(outDir, code);
56
70
  mkdirSync(localeDir, { recursive: true });
57
71
  const indexPath = join(localeDir, "llms.txt");
58
72
  const fullPath = join(localeDir, "llms-full.txt");
59
73
  const localeAssets = assetsForLocale(assetEntries, code);
60
- writeFileSync(indexPath, generateLlmsTxt(localeEntries, meta, localeAssets));
74
+ writeFileSync(
75
+ indexPath,
76
+ generateLlmsTxt(localeEntries, meta, localeAssets, generationOptions)
77
+ );
61
78
  writeFileSync(fullPath, generateLlmsFullTxt(localeEntries, meta, localeAssets));
62
79
  written.push(indexPath, fullPath);
63
80
  logger?.info(
@@ -10,11 +10,17 @@
10
10
  * — the file shape is part of the project's public surface.
11
11
  */
12
12
  import { type LlmsAssetEntry, type LlmsDocEntry, type LlmsTxtSiteMeta } from "./types.js";
13
+ export interface LlmsTxtGenerationOptions {
14
+ /** Replace eligible document links with their per-page Markdown artifacts. */
15
+ agentExport?: boolean;
16
+ /** Add an MCP discovery section with this base-aware endpoint URL. */
17
+ mcpEndpointUrl?: string;
18
+ }
13
19
  /**
14
20
  * Slim index — site header followed by a markdown bullet per page with
15
21
  * `[title](url): description`.
16
22
  */
17
- export declare function generateLlmsTxt(entries: readonly LlmsDocEntry[], meta: LlmsTxtSiteMeta, assets?: readonly LlmsAssetEntry[]): string;
23
+ export declare function generateLlmsTxt(entries: readonly LlmsDocEntry[], meta: LlmsTxtSiteMeta, assets?: readonly LlmsAssetEntry[], options?: LlmsTxtGenerationOptions): string;
18
24
  /**
19
25
  * Full content concatenation — site header followed by every page's
20
26
  * stripped body separated by `---` rules.
@@ -33,7 +33,7 @@ function renderAssetBody(entry) {
33
33
  return `${content}
34
34
  ${TRUNCATED_ASSET_MARKER}`;
35
35
  }
36
- function generateLlmsTxt(entries, meta, assets = []) {
36
+ function generateLlmsTxt(entries, meta, assets = [], options = {}) {
37
37
  const lines = [];
38
38
  lines.push(`# ${meta.siteName}`);
39
39
  lines.push("");
@@ -42,7 +42,8 @@ function generateLlmsTxt(entries, meta, assets = []) {
42
42
  lines.push("## Docs");
43
43
  lines.push("");
44
44
  for (const entry of entries) {
45
- lines.push(`- [${entry.title}](${entry.url}): ${entry.description}`);
45
+ const url = options.agentExport && entry.agentMarkdownUrl ? entry.agentMarkdownUrl : entry.url;
46
+ lines.push(`- [${entry.title}](${url}): ${entry.description}`);
46
47
  }
47
48
  lines.push("");
48
49
  if (assets.length > 0) {
@@ -53,6 +54,12 @@ function generateLlmsTxt(entries, meta, assets = []) {
53
54
  }
54
55
  lines.push("");
55
56
  }
57
+ if (options.mcpEndpointUrl !== void 0) {
58
+ lines.push("## MCP");
59
+ lines.push("");
60
+ lines.push(`- [Read-only MCP endpoint](${options.mcpEndpointUrl})`);
61
+ lines.push("");
62
+ }
56
63
  return lines.join("\n");
57
64
  }
58
65
  function generateLlmsFullTxt(entries, meta, assets = []) {
@@ -9,6 +9,8 @@
9
9
  * surface is unchanged.
10
10
  */
11
11
  import type { LlmsDocEntry, LlmsTxtLoadOptions } from "./types.js";
12
+ /** Resolve an artifact path with the same base/site URL rules as agent-export. */
13
+ export declare function withLlmsBase(path: string, base: string, siteUrl?: string): string;
12
14
  export { collectMdFiles, isExcluded, parseMarkdownFile, slugToUrl, } from "../../../md-utils/index.js";
13
15
  /**
14
16
  * Build the sorted {@link LlmsDocEntry} list for a single content root.
@@ -6,7 +6,13 @@ import {
6
6
  slugToUrl,
7
7
  stripMarkdown
8
8
  } from "../../../md-utils/index.js";
9
+ import { agentPageKey } from "../../../agent-docs/identity.js";
9
10
  import { stripImportsAndJsx } from "./strip.js";
11
+ function withLlmsBase(path, base, siteUrl) {
12
+ const basePrefix = base === "/" ? "" : `/${base.replace(/^\/+|\/+$/g, "")}`;
13
+ const pathname = `${basePrefix}/${path.replace(/^\/+/, "")}`;
14
+ return siteUrl ? `${siteUrl.replace(/\/$/, "")}${pathname}` : pathname;
15
+ }
10
16
  import {
11
17
  collectMdFiles as collectMdFiles2,
12
18
  isExcluded as isExcluded2,
@@ -14,7 +20,7 @@ import {
14
20
  slugToUrl as slugToUrl2
15
21
  } from "../../../md-utils/index.js";
16
22
  function loadDocEntries(options) {
17
- const { contentDir, locale, base, siteUrl } = options;
23
+ const { contentDir, locale, base, siteUrl, agentExportLocale } = options;
18
24
  const absDir = resolve(contentDir);
19
25
  const files = collectMdFiles(absDir);
20
26
  const entries = [];
@@ -29,13 +35,22 @@ function loadDocEntries(options) {
29
35
  const stripped = stripMarkdown(content);
30
36
  description = stripped.split("\n").find((l) => l.trim().length > 0) ?? "";
31
37
  }
32
- entries.push({
38
+ const entry = {
33
39
  title: data.title ?? slug,
34
40
  description,
35
41
  url: slugToUrl(slug, locale, base, siteUrl),
36
42
  content: stripImportsAndJsx(content),
37
43
  sidebarPosition: data.sidebar_position
38
- });
44
+ };
45
+ if (agentExportLocale !== void 0) {
46
+ const pageId = agentPageKey(agentExportLocale, slug);
47
+ entry.agentMarkdownUrl = withLlmsBase(
48
+ `/agent/v1/pages/${pageId}.md`,
49
+ base,
50
+ siteUrl
51
+ );
52
+ }
53
+ entries.push(entry);
39
54
  }
40
55
  entries.sort((a, b) => {
41
56
  const posA = a.sidebarPosition ?? Number.MAX_SAFE_INTEGER;
@@ -49,5 +64,6 @@ export {
49
64
  isExcluded2 as isExcluded,
50
65
  loadDocEntries,
51
66
  parseMarkdownFile2 as parseMarkdownFile,
52
- slugToUrl2 as slugToUrl
67
+ slugToUrl2 as slugToUrl,
68
+ withLlmsBase
53
69
  };
@@ -41,6 +41,8 @@ export interface LlmsDocEntry {
41
41
  content: string;
42
42
  /** `frontmatter.sidebar_position`, undefined when not declared. */
43
43
  sidebarPosition: number | undefined;
44
+ /** Base-aware Markdown artifact URL; present only when agent export is enabled. */
45
+ agentMarkdownUrl?: string;
44
46
  }
45
47
  /**
46
48
  * One generated asset-viewer page in the llms outputs.
@@ -101,6 +103,8 @@ export interface LlmsTxtLoadOptions {
101
103
  * empty, URLs are returned path-only for projects that omit `siteUrl`.
102
104
  */
103
105
  siteUrl?: string;
106
+ /** Actual locale code used by the agent export page identity, including for the default locale. */
107
+ agentExportLocale?: string;
104
108
  }
105
109
  /**
106
110
  * Top-level options for {@link emitLlmsTxt}. The current zfb plugin supplies
@@ -113,6 +117,12 @@ export interface LlmsTxtEmitOptions extends LlmsTxtSiteMeta {
113
117
  base: string;
114
118
  /** Optional absolute site URL; see {@link LlmsTxtLoadOptions}. */
115
119
  siteUrl?: string;
120
+ /** Actual default locale code; needed to match agent-export page IDs. */
121
+ defaultLocale?: string;
122
+ /** Link slim-index docs to agent-export Markdown artifacts when enabled. */
123
+ agentExport?: boolean;
124
+ /** Include the stateless read-only endpoint in the slim index when enabled. */
125
+ mcp?: boolean;
116
126
  /**
117
127
  * Default-locale content directory. Emitted at `outDir/llms.txt` and
118
128
  * `outDir/llms-full.txt`.
@@ -27,6 +27,10 @@ function deriveRoutes(settings, options) {
27
27
  const hasVersions = Array.isArray(settings.versions) && settings.versions.length > 0;
28
28
  const docTags = settings.docTags === true;
29
29
  const aiAssistant = settings.aiAssistant === true;
30
+ if (settings.mcp === true) {
31
+ const base = `/${String(settings.base ?? "").split("/").filter(Boolean).join("/")}`.replace(/\/$/, "");
32
+ routes.push({ pattern: `${base}/mcp`, entrypoint: "@takazudo/zudo-doc/routes/mcp", opts: { prerender: false }, includedInDtpShadowDiagnostic: false });
33
+ }
30
34
  if (options.packageOwnedRoutes === false) {
31
35
  if (options.assetViewer === true) {
32
36
  routes.push({
package/dist/preset.d.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  * `zudoDocPreset()` returns the zfb config fragment that every zudo-doc
5
5
  * project previously hand-wrote in its `zfb.config.ts` (collections loop,
6
6
  * markdown.features, class-mode codeHighlight, resolveMarkdownLinks,
7
- * stripMdExt, trailingSlash, minifyHtml, and the integration plugins array). The host
8
- * config spreads this fragment into `defineConfig` and supplies only the
9
- * project-specific shell fields it still owns (`framework`, `port`,
10
- * `tailwind`, `bundle`, `base`, `adapter`).
7
+ * stripMdExt, trailingSlash, minifyHtml, integration plugins, and the
8
+ * package-owned wind preset). The host config spreads this fragment into
9
+ * `defineConfig` and supplies project-specific shell fields (`port`, `bundle`,
10
+ * `base`, `adapter`, and an optional top-level `wind` override).
11
11
  *
12
12
  * ──────────────────────────────────────────────────────────────────────────
13
13
  * NODE-BUILTIN-FREE EVAL GRAPH (non-negotiable — guarded by a unit test)
@@ -29,13 +29,14 @@
29
29
  * specifier and dispatches lifecycle hooks against it; importing the
30
30
  * plugin modules here would pull their `node:fs` / `node:path` graph into
31
31
  * the config eval.
32
- * - The only runtime dependency is `zod` (for `z.toJSONSchema`), which
33
- * bundles cleanly under `--platform=neutral` (verified: zero `node:*`).
32
+ * - Runtime dependencies are `zod` (for `z.toJSONSchema`) and zfb's
33
+ * `definePreset` helper (for the package-owned wind fragment). Both bundle
34
+ * cleanly under `--platform=neutral` (verified: zero `node:*`).
34
35
  */
35
36
  import { z } from "zod";
37
+ import type { DirectiveSpec, ZfbConfig } from "@takazudo/zfb/config";
36
38
  import type { ColorScheme } from "./color-scheme-utils.js";
37
39
  import type { AssetViewerIndexingConfig, TagVocabularyEntry, FaviconConfig, HomeConfig } from "./settings.js";
38
- import type { DirectiveSpec } from "@takazudo/zfb/config";
39
40
  /** A single locale's content directory (`settings.locales[code]`). */
40
41
  export interface PresetLocaleConfig {
41
42
  dir: string;
@@ -118,6 +119,10 @@ export interface PresetSettings {
118
119
  transclude?: boolean;
119
120
  onBrokenMarkdownLinks: "warn" | "error" | "ignore";
120
121
  llmsTxt?: boolean;
122
+ /** Generate the package-owned static agent documentation feed. */
123
+ agentExport?: boolean;
124
+ /** Enable the stateless read-only MCP endpoint; requires `agentExport: true`. */
125
+ mcp?: boolean;
121
126
  changelogs?: PresetChangelogConfig[] | false;
122
127
  /** Metadata fields shown in the doc metadata area. */
123
128
  docMetainfoFields?: Array<"created" | "updated" | "author">;
@@ -305,14 +310,21 @@ export interface PresetMarkdown {
305
310
  footnoteDefinition: boolean;
306
311
  };
307
312
  }
313
+ /** MCP-only bundler options required for SDK CommonJS dependency resolution. */
314
+ export interface PresetBundle {
315
+ mainFields: string[];
316
+ }
308
317
  export interface PresetCodeHighlight {
309
318
  mode: "class";
310
319
  defaultStylesheet: true;
311
320
  }
312
321
  /** The config fragment returned by {@link zudoDocPreset}. */
313
322
  export interface ZudoDocPresetResult {
323
+ presets: Partial<ZfbConfig>[];
314
324
  collections: PresetCollection[];
315
325
  plugins: PresetPlugin[];
326
+ /** Present only when MCP is enabled. */
327
+ bundle?: PresetBundle;
316
328
  markdown: PresetMarkdown;
317
329
  codeHighlight: PresetCodeHighlight;
318
330
  resolveMarkdownLinks: PresetResolveMarkdownLinks;
@@ -327,9 +339,7 @@ export interface ZudoDocPresetResult {
327
339
  *
328
340
  * ```ts
329
341
  * export default defineConfig({
330
- * framework: "preact",
331
342
  * port: 4321,
332
- * tailwind: { enabled: true },
333
343
  * bundle: { exclude: [...] },
334
344
  * base: settings.base,
335
345
  * adapter: "@takazudo/zfb-adapter-cloudflare",
package/dist/preset.js CHANGED
@@ -4,9 +4,11 @@ import {
4
4
  assertNoEmptyStringFaviconOrLogo,
5
5
  assertZdtpBundlingConsistent,
6
6
  assertValidSearchMaxBodyLength,
7
+ assertAgentDocsConsistent,
7
8
  resolvesBundleZdtp,
8
9
  warnAmbiguousDropdownCategoryMatch
9
10
  } from "./config-assertions/index.js";
11
+ import { zudoDocWindPreset } from "./wind/index.js";
10
12
  function zudoDocPreset({
11
13
  settings,
12
14
  buildDocsSchema,
@@ -19,11 +21,14 @@ function zudoDocPreset({
19
21
  assertNoEmptyStringFaviconOrLogo(settings);
20
22
  assertZdtpBundlingConsistent(settings);
21
23
  assertValidSearchMaxBodyLength(settings.searchMaxBodyLength);
24
+ assertAgentDocsConsistent(settings);
22
25
  warnAmbiguousDropdownCategoryMatch(settings.headerNav);
23
26
  const docsSchemaJson = z.toJSONSchema(buildDocsSchema());
24
27
  return {
28
+ presets: [zudoDocWindPreset],
25
29
  collections: buildCollections(settings, docsSchemaJson),
26
30
  plugins: buildPlugins(settings, { translations, tagVocabulary, colorSchemes }),
31
+ ...settings.mcp === true ? { bundle: { mainFields: ["module", "main"] } } : {},
27
32
  markdown: {
28
33
  features: buildMarkdownFeatures(settings, directiveVocabulary),
29
34
  ...settings.cjkFriendly !== void 0 ? { cjkFriendly: settings.cjkFriendly } : {},
@@ -183,7 +188,7 @@ function buildPlugins(settings, routeContext) {
183
188
  // the route catalog from `settings.locales` / `settings.versions`. Listed
184
189
  // FIRST so an injected route is registered before the other plugins'
185
190
  // preBuild work runs (ordering is cosmetic — injection happens in `setup`).
186
- ...effectivePackageOwnedRoutes || assetViewer || homeIntro ? [
191
+ ...effectivePackageOwnedRoutes || assetViewer || homeIntro || settings.mcp === true ? [
187
192
  {
188
193
  name: "@takazudo/zudo-doc/plugins/routes",
189
194
  options: {
@@ -285,12 +290,26 @@ function buildPlugins(settings, routeContext) {
285
290
  siteDescription: settings.siteDescription,
286
291
  base: settings.base,
287
292
  siteUrl: settings.siteUrl,
293
+ defaultLocale: settings.defaultLocale ?? "en",
294
+ agentExport: settings.agentExport === true,
295
+ mcp: settings.mcp === true,
288
296
  defaultLocaleDir: settings.docsDir,
289
297
  locales: localeArray,
290
298
  assetScan
291
299
  }
292
300
  }
293
301
  ] : [],
302
+ ...settings.agentExport ? [{
303
+ name: "@takazudo/zudo-doc/plugins/agent-export",
304
+ options: {
305
+ siteName: settings.siteName,
306
+ siteUrl: settings.siteUrl,
307
+ base: settings.base,
308
+ defaultLocale: settings.defaultLocale ?? "en",
309
+ defaultLocaleDir: settings.docsDir,
310
+ locales: localeArray
311
+ }
312
+ }] : [],
294
313
  ...Array.isArray(settings.changelogs) && settings.changelogs.length > 0 ? [
295
314
  {
296
315
  name: "@takazudo/zudo-doc/plugins/changelog",
@@ -1,4 +1,4 @@
1
- import { DEFAULT_SETTINGS } from "../config.js";
1
+ import { DEFAULT_SETTINGS } from "../settings-defaults.js";
2
2
  import { defaultTranslations } from "../i18n-defaults/index.js";
3
3
  import { defaultColorSchemes } from "../color-schemes-defaults/index.js";
4
4
  import { buildThemePackRegistry } from "../theme-packs-registry/build-registry.js";
@@ -1,7 +1,6 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { JSX } from "preact";
2
+ import type { Child } from "@takazudo/zfb/zudo-react";
4
3
  export declare const frontmatter: {
5
4
  title: string;
6
5
  };
7
- export default function NotFoundPage(): JSX.Element;
6
+ export default function NotFoundPage(): Child;
@@ -1,4 +1,4 @@
1
- import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
1
+ import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { DocLayoutWithDefaults } from "../doclayout/index.js";
3
3
  import { resolveThemePackSsrSlug } from "../theme/theme-pack-provider.js";
4
4
  import { settings, defaultLocale, withBase, themePackRegistry } from "./_context.js";