@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.
- package/CHANGELOG.md +33 -0
- package/README.md +49 -16
- package/bin/gen-z-index.mjs +18 -18
- package/dist/agent-docs/identity.d.ts +4 -0
- package/dist/agent-docs/identity.js +24 -0
- package/dist/agent-docs/index.d.ts +5 -0
- package/dist/agent-docs/index.js +5 -0
- package/dist/agent-docs/limits.d.ts +11 -0
- package/dist/agent-docs/limits.js +24 -0
- package/dist/agent-docs/search.d.ts +14 -0
- package/dist/agent-docs/search.js +82 -0
- package/dist/agent-docs/tokenize.d.ts +2 -0
- package/dist/agent-docs/tokenize.js +22 -0
- package/dist/agent-docs/types.d.ts +68 -0
- package/dist/agent-docs/types.js +0 -0
- package/dist/ai-chat-modal/index.d.ts +1 -4
- package/dist/ai-chat-modal/index.js +183 -123
- package/dist/asset-components/asset-card.d.ts +1 -2
- package/dist/asset-components/asset-card.js +12 -12
- package/dist/asset-components/asset-code.d.ts +1 -2
- package/dist/asset-components/asset-code.js +10 -10
- package/dist/asset-components/shared.d.ts +3 -4
- package/dist/asset-components/shared.js +4 -4
- package/dist/asset-index-page/body.d.ts +5 -6
- package/dist/asset-index-page/body.js +6 -6
- package/dist/asset-index-page/index.d.ts +1 -2
- package/dist/asset-index-page/index.js +1 -1
- package/dist/asset-page/body.d.ts +5 -9
- package/dist/asset-page/body.js +3 -3
- package/dist/asset-page/components.d.ts +16 -17
- package/dist/asset-page/components.js +10 -9
- package/dist/asset-page/index.d.ts +1 -2
- package/dist/asset-page/index.js +1 -1
- package/dist/auto-logo/index.d.ts +1 -2
- package/dist/auto-logo/index.js +2 -2
- package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
- package/dist/body-foot-util/body-foot-util-area.js +1 -2
- package/dist/body-foot-util/edit-link.d.ts +2 -3
- package/dist/body-foot-util/edit-link.js +1 -2
- package/dist/breadcrumb/breadcrumb.d.ts +6 -6
- package/dist/breadcrumb/breadcrumb.js +3 -4
- package/dist/catalog.js +1 -1
- package/dist/category-nav/index.d.ts +1 -2
- package/dist/category-nav/index.js +11 -5
- package/dist/category-tree-nav/index.d.ts +1 -2
- package/dist/category-tree-nav/index.js +3 -3
- package/dist/chrome/derive.d.ts +18 -27
- package/dist/chrome/derive.js +47 -29
- package/dist/chrome/index.d.ts +5 -5
- package/dist/chrome/index.js +1 -1
- package/dist/chrome/island-data.d.ts +4 -0
- package/dist/chrome/island-data.js +52 -0
- package/dist/chrome/primary-slots.d.ts +2 -3
- package/dist/chrome-bindings.d.ts +30 -22
- package/dist/code-group/index.d.ts +3 -4
- package/dist/code-group/index.js +3 -7
- package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
- package/dist/code-syntax/code-block-enhancer.js +2 -2
- package/dist/code-syntax/mermaid-init.d.ts +1 -2
- package/dist/code-syntax/mermaid-init.js +5 -2
- package/dist/code-syntax/tabs-init-script.js +1 -1
- package/dist/code-syntax/tabs-init.d.ts +1 -2
- package/dist/code-syntax/tabs-init.js +2 -2
- package/dist/code-syntax/tabs.d.ts +6 -6
- package/dist/code-syntax/tabs.js +8 -8
- package/dist/compiled.css +2937 -2942
- package/dist/config/component-tokens.d.ts +1 -1
- package/dist/config/component-tokens.js +22 -0
- package/dist/config-assertions/index.d.ts +13 -0
- package/dist/config-assertions/index.js +14 -0
- package/dist/config.d.ts +36 -17
- package/dist/config.js +23 -95
- package/dist/content/content-blockquote.d.ts +2 -3
- package/dist/content/content-blockquote.js +3 -3
- package/dist/content/content-code.d.ts +3 -4
- package/dist/content/content-code.js +5 -5
- package/dist/content/content-link.d.ts +3 -4
- package/dist/content/content-link.js +10 -10
- package/dist/content/content-ol.d.ts +2 -3
- package/dist/content/content-ol.js +5 -4
- package/dist/content/content-paragraph.d.ts +2 -3
- package/dist/content/content-paragraph.js +1 -1
- package/dist/content/content-strong.d.ts +2 -3
- package/dist/content/content-strong.js +3 -3
- package/dist/content/content-table.d.ts +2 -3
- package/dist/content/content-table.js +4 -4
- package/dist/content/content-ul.d.ts +2 -3
- package/dist/content/content-ul.js +4 -4
- package/dist/content/heading-h2.d.ts +2 -3
- package/dist/content/heading-h2.js +4 -4
- package/dist/content/heading-h3.d.ts +2 -3
- package/dist/content/heading-h3.js +4 -4
- package/dist/content/heading-h4.d.ts +2 -3
- package/dist/content/heading-h4.js +4 -4
- package/dist/content-admonition/index.d.ts +3 -4
- package/dist/content-admonition/index.js +2 -2
- package/dist/content.css +35 -33
- package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
- package/dist/design-token-panel-bootstrap-controller.js +359 -0
- package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
- package/dist/design-token-panel-bootstrap-island.js +19 -0
- package/dist/design-token-panel-bootstrap.d.ts +5 -195
- package/dist/design-token-panel-bootstrap.js +3 -288
- package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
- package/dist/desktop-sidebar-toggle-island/index.js +2 -58
- package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
- package/dist/desktop-sidebar-toggle-island/island.js +43 -0
- package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
- package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
- package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
- package/dist/desktop-toc-toggle-island/index.js +2 -58
- package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
- package/dist/desktop-toc-toggle-island/island.js +43 -0
- package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
- package/dist/desktop-toc-toggle-island/storage.js +29 -0
- package/dist/details/details.d.ts +3 -4
- package/dist/details/details.js +1 -1
- package/dist/doc-body-end/index.d.ts +1 -2
- package/dist/doc-body-end/index.js +1 -1
- package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
- package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
- package/dist/doc-body-end-islands/index.d.ts +4 -21
- package/dist/doc-body-end-islands/index.js +5 -3
- package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
- package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
- package/dist/doc-content-header/index.d.ts +1 -2
- package/dist/doc-content-header/index.js +1 -1
- package/dist/doc-history/index.d.ts +1 -1
- package/dist/doc-history/index.js +166 -141
- package/dist/doc-history-area/index.d.ts +6 -4
- package/dist/doc-history-area/index.js +17 -16
- package/dist/doc-metainfo-area/index.d.ts +2 -3
- package/dist/doc-metainfo-area/index.js +1 -1
- package/dist/doc-page-renderer/index.d.ts +13 -7
- package/dist/doc-page-renderer/index.js +10 -1
- package/dist/doc-page-shell/index.d.ts +20 -7
- package/dist/doc-page-shell/index.js +17 -6
- package/dist/doc-pager/index.d.ts +1 -2
- package/dist/doc-pager/index.js +3 -3
- package/dist/doc-tags-area/index.d.ts +2 -3
- package/dist/doc-tags-area/index.js +1 -1
- package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
- package/dist/doclayout/doc-layout-with-defaults.js +5 -15
- package/dist/doclayout/doc-layout.d.ts +26 -27
- package/dist/doclayout/doc-layout.js +23 -14
- package/dist/docs-schema/index.d.ts +4 -0
- package/dist/docs-schema/index.js +1 -0
- package/dist/extract-headings/index.js +43 -12
- package/dist/factory-context/index.d.ts +22 -19
- package/dist/features.css +75 -8
- package/dist/find-in-page/find-bar.d.ts +4 -2
- package/dist/find-in-page/find-bar.js +58 -69
- package/dist/find-in-page/index.d.ts +2 -8
- package/dist/find-in-page/index.js +33 -30
- package/dist/footer/footer.d.ts +3 -4
- package/dist/footer/footer.js +3 -3
- package/dist/footer-with-defaults/index.d.ts +2 -3
- package/dist/footer-with-defaults/index.js +1 -1
- package/dist/frontmatter-preview-defaults/index.js +1 -0
- package/dist/head/doc-head.d.ts +1 -1
- package/dist/head/doc-head.js +24 -32
- package/dist/head/og-tags.d.ts +1 -1
- package/dist/head/og-tags.js +8 -7
- package/dist/head/twitter-card.d.ts +1 -1
- package/dist/head/twitter-card.js +1 -1
- package/dist/head-with-defaults/index.d.ts +7 -2
- package/dist/head-with-defaults/index.js +46 -32
- package/dist/header/header.d.ts +8 -8
- package/dist/header/header.js +9 -11
- package/dist/header/types.d.ts +7 -7
- package/dist/header-with-defaults/index.d.ts +3 -4
- package/dist/header-with-defaults/index.js +27 -14
- package/dist/home-intro/index.d.ts +2 -5
- package/dist/home-intro/index.js +7 -5
- package/dist/home-intro/prepare.js +4 -3
- package/dist/home-page/index.d.ts +3 -3
- package/dist/home-page/index.js +19 -17
- package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
- package/dist/html-preview-wrapper/highlighted-code.js +19 -17
- package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
- package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
- package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
- package/dist/html-preview-wrapper/html-preview.js +13 -37
- package/dist/html-preview-wrapper/index.d.ts +2 -1
- package/dist/html-preview-wrapper/index.js +1 -1
- package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
- package/dist/html-preview-wrapper/preview-base.js +56 -59
- package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
- package/dist/html-preview-wrapper/wrapper.js +37 -0
- package/dist/hydration-pending.d.ts +3 -5
- package/dist/hydration-pending.js +7 -5
- package/dist/i18n-version/language-switcher.d.ts +5 -32
- package/dist/i18n-version/language-switcher.js +5 -106
- package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
- package/dist/i18n-version/switcher-generated-scripts.js +107 -0
- package/dist/i18n-version/switcher-url-state.d.ts +76 -0
- package/dist/i18n-version/switcher-url-state.js +103 -0
- package/dist/i18n-version/version-banner.d.ts +2 -3
- package/dist/i18n-version/version-banner.js +1 -1
- package/dist/i18n-version/version-switcher.d.ts +5 -50
- package/dist/i18n-version/version-switcher.js +5 -157
- package/dist/icons/index.d.ts +18 -19
- package/dist/icons/index.js +17 -33
- package/dist/image-enlarge/index.d.ts +1 -10
- package/dist/image-enlarge/index.js +80 -55
- package/dist/image-enlarge/public.d.ts +2 -0
- package/dist/image-enlarge/public.js +6 -0
- package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
- package/dist/image-enlarge/ssr-fallback.js +8 -0
- package/dist/index.d.ts +11 -4
- package/dist/inline-version-switcher/index.d.ts +1 -2
- package/dist/inline-version-switcher/index.js +1 -1
- package/dist/island-types/index.d.ts +2 -2
- package/dist/island-types/index.js +1 -5
- package/dist/math-block/index.d.ts +4 -7
- package/dist/math-block/index.js +5 -5
- package/dist/mcp/handler.d.ts +8 -0
- package/dist/mcp/handler.js +129 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/loader.d.ts +19 -0
- package/dist/mcp/loader.js +202 -0
- package/dist/mdx-components/index.js +40 -108
- package/dist/mermaid-enlarge/index.d.ts +1 -8
- package/dist/mermaid-enlarge/index.js +174 -158
- package/dist/mermaid-enlarge/public.d.ts +2 -0
- package/dist/mermaid-enlarge/public.js +6 -0
- package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
- package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
- package/dist/metainfo/doc-metainfo.d.ts +2 -3
- package/dist/metainfo/doc-metainfo.js +1 -4
- package/dist/metainfo/doc-tags.d.ts +2 -3
- package/dist/metainfo/doc-tags.js +1 -1
- package/dist/metainfo/frontmatter-preview.d.ts +3 -4
- package/dist/metainfo/frontmatter-preview.js +1 -1
- package/dist/nav-data-prep/index.js +6 -4
- package/dist/nav-indexing/category-nav.d.ts +2 -3
- package/dist/nav-indexing/category-nav.js +1 -2
- package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
- package/dist/nav-indexing/category-tree-nav.js +1 -1
- package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
- package/dist/nav-indexing/doc-card-grid.js +1 -2
- package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
- package/dist/nav-indexing/docs-sitemap.js +2 -2
- package/dist/nav-indexing/index.d.ts +1 -1
- package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
- package/dist/nav-indexing/nav-card-grid.js +1 -2
- package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
- package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
- package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
- package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
- package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
- package/dist/nav-indexing/note-tray-index.d.ts +1 -2
- package/dist/nav-indexing/note-tray-index.js +1 -1
- package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
- package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
- package/dist/nav-indexing/tag-nav.d.ts +1 -2
- package/dist/nav-indexing/tag-nav.js +1 -1
- package/dist/nav-indexing/types.d.ts +2 -2
- package/dist/nav-indexing/versions-page-content.d.ts +2 -3
- package/dist/nav-indexing/versions-page-content.js +8 -8
- package/dist/note-tray-index/index.d.ts +1 -2
- package/dist/note-tray-index/index.js +1 -1
- package/dist/page-loading/page-loading-overlay.d.ts +1 -2
- package/dist/page-loading/page-loading-overlay.js +3 -5
- package/dist/plugins/agent-export.d.ts +3 -0
- package/dist/plugins/agent-export.js +34 -0
- package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
- package/dist/plugins/internal/agent-export/chunk.js +90 -0
- package/dist/plugins/internal/agent-export/index.d.ts +24 -0
- package/dist/plugins/internal/agent-export/index.js +123 -0
- package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
- package/dist/plugins/internal/agent-export/normalize.js +73 -0
- package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
- package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
- package/dist/plugins/internal/llms-txt/emit.js +23 -6
- package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
- package/dist/plugins/internal/llms-txt/generate.js +9 -2
- package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
- package/dist/plugins/internal/llms-txt/load.js +20 -4
- package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
- package/dist/plugins/routes.js +4 -0
- package/dist/preset.d.ts +19 -9
- package/dist/preset.js +20 -1
- package/dist/route-context-payload/index.js +1 -1
- package/dist/routes/404.d.ts +2 -3
- package/dist/routes/404.js +1 -1
- package/dist/routes/_chrome.d.ts +5 -5
- package/dist/routes/_chrome.js +7 -2
- package/dist/routes/_context.d.ts +4 -4
- package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
- package/dist/routes/_design-token-panel-bootstrap.js +9 -1
- package/dist/routes/docs-slug.d.ts +2 -3
- package/dist/routes/docs-tags-index.d.ts +2 -3
- package/dist/routes/docs-tags-index.js +1 -1
- package/dist/routes/docs-tags-tag.d.ts +2 -3
- package/dist/routes/docs-tags-tag.js +1 -1
- package/dist/routes/docs-versions.d.ts +2 -3
- package/dist/routes/docs-versions.js +1 -1
- package/dist/routes/files-path.d.ts +2 -3
- package/dist/routes/files-path.js +1 -1
- package/dist/routes/index.d.ts +2 -3
- package/dist/routes/index.js +1 -1
- package/dist/routes/locale-docs-slug.d.ts +2 -3
- package/dist/routes/locale-docs-tags-index.d.ts +2 -3
- package/dist/routes/locale-docs-tags-index.js +1 -1
- package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
- package/dist/routes/locale-docs-tags-tag.js +1 -1
- package/dist/routes/locale-docs-versions.d.ts +2 -3
- package/dist/routes/locale-docs-versions.js +1 -1
- package/dist/routes/locale-files-path.d.ts +2 -3
- package/dist/routes/locale-files-path.js +1 -1
- package/dist/routes/locale-index.d.ts +2 -3
- package/dist/routes/locale-index.js +1 -1
- package/dist/routes/mcp.d.ts +5 -0
- package/dist/routes/mcp.js +25 -0
- package/dist/routes/v-docs-slug.d.ts +2 -3
- package/dist/routes/v-locale-docs-slug.d.ts +2 -3
- package/dist/search-widget/index.d.ts +1 -2
- package/dist/search-widget/index.js +4 -7
- package/dist/search-widget-script/generated-script.js +12 -5
- package/dist/settings-defaults.d.ts +2 -0
- package/dist/settings-defaults.js +93 -0
- package/dist/settings.d.ts +8 -2
- package/dist/sidebar/client-data.d.ts +18 -0
- package/dist/sidebar/client-data.js +47 -0
- package/dist/sidebar/index.d.ts +3 -1
- package/dist/sidebar/index.js +3 -1
- package/dist/sidebar/sidebar.d.ts +12 -44
- package/dist/sidebar/sidebar.js +4 -3
- package/dist/sidebar/types.d.ts +14 -0
- package/dist/sidebar-prepaint/index.d.ts +1 -2
- package/dist/sidebar-prepaint/index.js +4 -6
- package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
- package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
- package/dist/sidebar-toggle-island/index.d.ts +8 -11
- package/dist/sidebar-toggle-island/index.js +75 -62
- package/dist/sidebar-tree/build-tree.js +5 -6
- package/dist/sidebar-tree/types.d.ts +2 -0
- package/dist/sidebar-tree-island/index.d.ts +4 -19
- package/dist/sidebar-tree-island/index.js +782 -436
- package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
- package/dist/sidebar-tree-island/scope-state.js +151 -0
- package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
- package/dist/sidebar-utils/index.d.ts +17 -19
- package/dist/sidebar-utils/index.js +100 -3
- package/dist/sidebar-utils/scope.d.ts +11 -0
- package/dist/sidebar-utils/scope.js +67 -0
- package/dist/sidebar-with-defaults/index.d.ts +1 -2
- package/dist/sidebar-with-defaults/index.js +19 -18
- package/dist/site-schema/nav-tree.js +15 -15
- package/dist/site-schema/types.d.ts +1 -0
- package/dist/site-tree-nav/index.d.ts +2 -3
- package/dist/site-tree-nav/index.js +11 -12
- package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
- package/dist/site-tree-nav/normalize-island-props.js +122 -0
- package/dist/site-tree-nav-island/index.d.ts +3 -3
- package/dist/site-tree-nav-island/index.js +243 -144
- package/dist/smart-break/index.d.ts +3 -4
- package/dist/smart-break/index.js +1 -1
- package/dist/tab-item/tab-item.d.ts +3 -4
- package/dist/tab-item/tab-item.js +1 -1
- package/dist/tag-pages/index.d.ts +3 -3
- package/dist/tag-pages/index.js +10 -10
- package/dist/theme/color-scheme-provider.d.ts +3 -3
- package/dist/theme/color-scheme-provider.js +3 -3
- package/dist/theme/theme-pack-provider.d.ts +1 -1
- package/dist/theme/theme-pack-provider.js +3 -3
- package/dist/theme/theme-toggle.d.ts +2 -3
- package/dist/theme/theme-toggle.js +1 -1
- package/dist/theme-pack-dialog/index.d.ts +1 -1
- package/dist/theme-pack-dialog/index.js +69 -75
- package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
- package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
- package/dist/theme-pack-switcher/index.d.ts +4 -5
- package/dist/theme-pack-switcher/index.js +52 -49
- package/dist/theme-packs/academia/meta.json +1 -1
- package/dist/theme-packs/academia/pack.css +1 -1
- package/dist/theme-packs/bauhaus/meta.json +1 -1
- package/dist/theme-packs/bauhaus/pack.css +2 -2
- package/dist/theme-packs/blueprint/meta.json +1 -1
- package/dist/theme-packs/blueprint/pack.css +2 -2
- package/dist/theme-packs/botanica/meta.json +1 -1
- package/dist/theme-packs/botanica/pack.css +2 -2
- package/dist/theme-packs/broadsheet/meta.json +1 -1
- package/dist/theme-packs/broadsheet/pack.css +2 -2
- package/dist/theme-packs/brutalist/meta.json +1 -1
- package/dist/theme-packs/brutalist/pack.css +2 -2
- package/dist/theme-packs/eink/meta.json +1 -1
- package/dist/theme-packs/eink/pack.css +1 -1
- package/dist/theme-packs/futura-editorial/meta.json +1 -1
- package/dist/theme-packs/futura-editorial/pack.css +2 -2
- package/dist/theme-packs/hearth/meta.json +1 -1
- package/dist/theme-packs/hearth/pack.css +2 -2
- package/dist/theme-packs/ledger/meta.json +1 -1
- package/dist/theme-packs/ledger/pack.css +1 -1
- package/dist/theme-packs/manuscript/meta.json +1 -1
- package/dist/theme-packs/manuscript/pack.css +1 -1
- package/dist/theme-packs/matcha/meta.json +1 -1
- package/dist/theme-packs/matcha/pack.css +2 -2
- package/dist/theme-packs/nocturne/meta.json +1 -1
- package/dist/theme-packs/nocturne/pack.css +2 -2
- package/dist/theme-packs/observatory/meta.json +1 -1
- package/dist/theme-packs/observatory/pack.css +2 -2
- package/dist/theme-packs/onyx/meta.json +1 -1
- package/dist/theme-packs/onyx/pack.css +2 -2
- package/dist/theme-packs/phosphor/meta.json +1 -1
- package/dist/theme-packs/phosphor/pack.css +2 -2
- package/dist/theme-packs/riso/meta.json +1 -1
- package/dist/theme-packs/riso/pack.css +2 -2
- package/dist/theme-packs/sakura/meta.json +1 -1
- package/dist/theme-packs/sakura/pack.css +2 -2
- package/dist/theme-packs/scandi/meta.json +1 -1
- package/dist/theme-packs/scandi/pack.css +1 -1
- package/dist/theme-packs/solar/meta.json +1 -1
- package/dist/theme-packs/solar/pack.css +1 -1
- package/dist/theme-packs/sumi/meta.json +1 -1
- package/dist/theme-packs/sumi/pack.css +2 -2
- package/dist/theme-packs/swissgrid/meta.json +1 -1
- package/dist/theme-packs/swissgrid/pack.css +1 -1
- package/dist/theme-packs/timberline/meta.json +1 -1
- package/dist/theme-packs/timberline/pack.css +2 -2
- package/dist/theme-packs/washi/meta.json +1 -1
- package/dist/theme-packs/washi/pack.css +2 -2
- package/dist/theme-toggle/index.d.ts +1 -1
- package/dist/theme-toggle/index.js +154 -167
- package/dist/theme.css +47 -121
- package/dist/toc/mobile-toc.d.ts +3 -5
- package/dist/toc/mobile-toc.js +29 -27
- package/dist/toc/toc.d.ts +3 -4
- package/dist/toc/toc.js +18 -18
- package/dist/toc/use-active-heading.d.ts +5 -4
- package/dist/toc/use-active-heading.js +36 -30
- package/dist/toc-prepaint/index.d.ts +1 -2
- package/dist/toc-prepaint/index.js +4 -6
- package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
- package/dist/transitions/nested-island-props-refresh.js +133 -151
- package/dist/transitions/page-events.d.ts +8 -13
- package/dist/tree-nav-shared/index.d.ts +4 -5
- package/dist/tree-nav-shared/index.js +6 -7
- package/dist/use-modal-dialog/index.d.ts +9 -63
- package/dist/use-modal-dialog/index.js +41 -59
- package/dist/versions-page/index.d.ts +3 -3
- package/dist/versions-page/index.js +5 -5
- package/dist/wind/index.d.ts +5 -0
- package/dist/wind/index.js +169 -0
- package/dist/wind.json +498 -0
- package/dist/z-index-defaults/index.d.ts +4 -4
- package/dist/zdtp-loader.d.ts +7 -0
- package/dist/zdtp-loader.js +8 -0
- package/eject/asset-components/asset-card.tsx +14 -16
- package/eject/asset-components/asset-code.tsx +10 -12
- package/eject/asset-components/shared.tsx +5 -7
- package/eject/breadcrumb/breadcrumb.tsx +15 -16
- package/eject/code-group/index.tsx +4 -10
- package/eject/content-admonition/index.tsx +5 -6
- package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
- package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
- package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
- package/eject/details/details.tsx +3 -5
- package/eject/doc-history/index.tsx +193 -179
- package/eject/doc-pager/index.tsx +3 -4
- package/eject/footer/footer.tsx +7 -9
- package/eject/header/header.tsx +42 -54
- package/eject/header/nav-overflow-script.ts +1 -1
- package/eject/header/types.ts +12 -13
- package/eject/image-enlarge/index.tsx +84 -69
- package/eject/image-enlarge/public.ts +2 -0
- package/eject/image-enlarge/ssr-fallback.tsx +7 -0
- package/eject/page-loading/page-loading-overlay.tsx +8 -15
- package/eject/sidebar/client-data.ts +68 -0
- package/eject/sidebar/index.ts +3 -0
- package/eject/sidebar/sidebar.tsx +16 -97
- package/eject/sidebar/types.ts +15 -0
- package/eject/sidebar-toggle-island/index.tsx +103 -102
- package/eject/sidebar-tree-island/index.tsx +827 -615
- package/eject/sidebar-tree-island/scope-state.ts +154 -0
- package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
- package/eject/site-tree-nav-island/index.tsx +349 -222
- package/eject/tab-item/tab-item.tsx +2 -4
- package/eject/theme-toggle/hydration-pending.ts +6 -10
- package/eject/theme-toggle/index.tsx +133 -173
- package/eject/toc/mobile-toc.tsx +27 -31
- package/eject/toc/toc.tsx +21 -24
- package/eject/toc/use-active-heading.ts +43 -38
- package/package.json +40 -22
- package/routes-src/404.tsx +2 -3
- package/routes-src/_chrome.tsx +7 -2
- package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
- package/routes-src/docs-slug.tsx +2 -3
- package/routes-src/docs-tags-index.tsx +2 -3
- package/routes-src/docs-tags-tag.tsx +2 -3
- package/routes-src/docs-versions.tsx +2 -3
- package/routes-src/files-path.tsx +2 -4
- package/routes-src/index.tsx +2 -3
- package/routes-src/locale-docs-slug.tsx +2 -3
- package/routes-src/locale-docs-tags-index.tsx +2 -3
- package/routes-src/locale-docs-tags-tag.tsx +2 -3
- package/routes-src/locale-docs-versions.tsx +2 -3
- package/routes-src/locale-files-path.tsx +2 -4
- package/routes-src/locale-index.tsx +2 -3
- package/routes-src/mcp.tsx +25 -0
- package/routes-src/v-docs-slug.tsx +2 -3
- package/routes-src/v-locale-docs-slug.tsx +2 -3
- package/tsconfig.base.json +1 -1
- package/dist/safelist.css +0 -2
- package/dist/theme-no-reset.css +0 -379
- package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { AGENT_MAX_POST_BYTES, AGENT_MAX_TOOL_RESPONSE_BYTES } from "../agent-docs/limits.js";
|
|
5
|
+
import { searchAgentIndex } from "../agent-docs/search.js";
|
|
6
|
+
import { AgentCorpusLoader, CorpusUnavailable } from "./loader.js";
|
|
7
|
+
const encoder = new TextEncoder();
|
|
8
|
+
const annotations = { readOnlyHint: true, idempotentHint: true, destructiveHint: false, openWorldHint: false };
|
|
9
|
+
function json(body, status) {
|
|
10
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json; charset=utf-8" } });
|
|
11
|
+
}
|
|
12
|
+
function absolute(url, origin) {
|
|
13
|
+
return new URL(url, origin).href;
|
|
14
|
+
}
|
|
15
|
+
function toolResult(value, error = false) {
|
|
16
|
+
return error ? { content: [{ type: "text", text: JSON.stringify(value) }], isError: true } : { structuredContent: value, content: [{ type: "text", text: JSON.stringify(value) }] };
|
|
17
|
+
}
|
|
18
|
+
async function cappedBody(request) {
|
|
19
|
+
if (!request.body) return new Uint8Array();
|
|
20
|
+
const reader = request.body.getReader();
|
|
21
|
+
const chunks = [];
|
|
22
|
+
let size = 0;
|
|
23
|
+
try {
|
|
24
|
+
for (; ; ) {
|
|
25
|
+
const { done, value } = await reader.read();
|
|
26
|
+
if (done) break;
|
|
27
|
+
size += value.length;
|
|
28
|
+
if (size > AGENT_MAX_POST_BYTES) {
|
|
29
|
+
await reader.cancel();
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
chunks.push(value);
|
|
33
|
+
}
|
|
34
|
+
} finally {
|
|
35
|
+
reader.releaseLock();
|
|
36
|
+
}
|
|
37
|
+
const bytes = new Uint8Array(size);
|
|
38
|
+
let offset = 0;
|
|
39
|
+
for (const chunk of chunks) {
|
|
40
|
+
bytes.set(chunk, offset);
|
|
41
|
+
offset += chunk.length;
|
|
42
|
+
}
|
|
43
|
+
return bytes;
|
|
44
|
+
}
|
|
45
|
+
function createMcpHandler(options) {
|
|
46
|
+
const loader = new AgentCorpusLoader(options.read, options.base);
|
|
47
|
+
return async (request) => {
|
|
48
|
+
const requestOrigin = new URL(request.url).origin;
|
|
49
|
+
const origin = request.headers.get("origin");
|
|
50
|
+
const allowed = /* @__PURE__ */ new Set([requestOrigin]);
|
|
51
|
+
if (options.siteUrl) {
|
|
52
|
+
try {
|
|
53
|
+
allowed.add(new URL(options.siteUrl).origin);
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const cors = origin && allowed.has(origin) ? origin : void 0;
|
|
58
|
+
const finish = (response) => {
|
|
59
|
+
const headers = new Headers(response.headers);
|
|
60
|
+
headers.set("cache-control", "no-store");
|
|
61
|
+
headers.set("vary", "Origin");
|
|
62
|
+
if (cors) headers.set("access-control-allow-origin", cors);
|
|
63
|
+
return new Response(response.body, { status: response.status, headers });
|
|
64
|
+
};
|
|
65
|
+
if (origin && !cors) return finish(json({ error: "Origin not allowed." }, 403));
|
|
66
|
+
if (request.method === "OPTIONS") return finish(new Response(null, { status: 204, headers: { allow: "POST, OPTIONS", "access-control-allow-methods": "POST, OPTIONS", "access-control-allow-headers": "content-type, accept, mcp-protocol-version" } }));
|
|
67
|
+
if (request.method !== "POST") {
|
|
68
|
+
const response = json({ error: "Method not allowed." }, 405);
|
|
69
|
+
response.headers.set("allow", "POST, OPTIONS");
|
|
70
|
+
return finish(response);
|
|
71
|
+
}
|
|
72
|
+
const mediaType = request.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase();
|
|
73
|
+
if (mediaType !== "application/json") return finish(json({ error: "Expected application/json." }, 415));
|
|
74
|
+
const bytes = await cappedBody(request);
|
|
75
|
+
if (!bytes) return finish(json({ error: "Request body exceeds 65536 bytes." }, 413));
|
|
76
|
+
try {
|
|
77
|
+
const corpus = await loader.corpus();
|
|
78
|
+
let envelope;
|
|
79
|
+
try {
|
|
80
|
+
envelope = JSON.parse(new TextDecoder().decode(bytes));
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
if (envelope && typeof envelope === "object" && !Array.isArray(envelope)) {
|
|
84
|
+
const call = envelope;
|
|
85
|
+
const id = call.params?.arguments?.id;
|
|
86
|
+
if (call.method === "tools/call" && call.params?.name === "fetch" && typeof id === "string" && corpus.manifest.items.some((item) => item.id === id)) {
|
|
87
|
+
await loader.item(id);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (error instanceof CorpusUnavailable) return finish(json({ error: error.message }, 503));
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
const server = new McpServer({ name: "zudo-doc", version: "1.0.0" });
|
|
95
|
+
const publicOrigin = options.siteUrl ? new URL(options.siteUrl).origin : requestOrigin;
|
|
96
|
+
server.registerTool("search", { description: "Search published documentation.", inputSchema: { query: z.string() }, outputSchema: { results: z.array(z.object({ id: z.string(), title: z.string(), url: z.string() })) }, annotations }, async ({ query }) => {
|
|
97
|
+
const corpus = await loader.corpus();
|
|
98
|
+
const outcome = searchAgentIndex(corpus.index, query);
|
|
99
|
+
if (!outcome.ok) return toolResult({ error: outcome.error }, true);
|
|
100
|
+
const currentIds = new Set(corpus.manifest.items.map((item) => item.id));
|
|
101
|
+
const results = outcome.results.filter((item) => currentIds.has(item.id)).map((item) => ({ ...item, url: absolute(item.url, publicOrigin) }));
|
|
102
|
+
while (encoder.encode(JSON.stringify(toolResult({ results }))).length * 2 > AGENT_MAX_TOOL_RESPONSE_BYTES && results.length) results.pop();
|
|
103
|
+
return toolResult({ results });
|
|
104
|
+
});
|
|
105
|
+
server.registerTool("fetch", { description: "Fetch a published documentation item by search result ID.", inputSchema: { id: z.string() }, outputSchema: { id: z.string(), title: z.string(), text: z.string(), url: z.string(), metadata: z.record(z.string(), z.unknown()) }, annotations }, async ({ id }) => {
|
|
106
|
+
const item = await loader.item(id);
|
|
107
|
+
if (!item) return toolResult({ error: `Documentation item not found: ${id}` }, true);
|
|
108
|
+
const result = { ...item, url: absolute(item.url, publicOrigin) };
|
|
109
|
+
return toolResult(result);
|
|
110
|
+
});
|
|
111
|
+
const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: void 0, enableJsonResponse: true });
|
|
112
|
+
try {
|
|
113
|
+
await server.connect(transport);
|
|
114
|
+
const sdkRequest = new Request(request.url, { method: "POST", headers: request.headers, body: new Uint8Array(bytes) });
|
|
115
|
+
const response = await transport.handleRequest(sdkRequest);
|
|
116
|
+
const body = await response.text();
|
|
117
|
+
if (encoder.encode(body).length > AGENT_MAX_TOOL_RESPONSE_BYTES) return finish(json({ error: "MCP response exceeds byte limit." }, 503));
|
|
118
|
+
return finish(new Response(body, { status: response.status, headers: response.headers }));
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (error instanceof CorpusUnavailable) return finish(json({ error: error.message }, 503));
|
|
121
|
+
throw error;
|
|
122
|
+
} finally {
|
|
123
|
+
await server.close();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
createMcpHandler
|
|
129
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type BuiltAgentSearchIndex } from "../agent-docs/search.js";
|
|
2
|
+
import type { AgentItem, AgentManifest } from "../agent-docs/types.js";
|
|
3
|
+
export type ReadAsset = (path: string) => Promise<Response>;
|
|
4
|
+
export declare class CorpusUnavailable extends Error {
|
|
5
|
+
}
|
|
6
|
+
export declare class AgentCorpusLoader {
|
|
7
|
+
private readonly read;
|
|
8
|
+
private readonly base;
|
|
9
|
+
private current?;
|
|
10
|
+
private loading?;
|
|
11
|
+
constructor(read: ReadAsset, base: string);
|
|
12
|
+
private load;
|
|
13
|
+
corpus(): Promise<{
|
|
14
|
+
fingerprint: string;
|
|
15
|
+
manifest: AgentManifest;
|
|
16
|
+
index: BuiltAgentSearchIndex;
|
|
17
|
+
}>;
|
|
18
|
+
item(id: string): Promise<AgentItem | undefined>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { AGENT_MAX_ITEMS, AGENT_MAX_MANIFEST_BYTES, AGENT_MAX_SEARCH_INDEX_BYTES } from "../agent-docs/limits.js";
|
|
2
|
+
import { buildAgentSearchIndex } from "../agent-docs/search.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const digest = z.string().regex(/^[a-f0-9]{64}$/);
|
|
5
|
+
const pageId = z.string().regex(/^p-[a-f0-9]{16}$/);
|
|
6
|
+
const itemId = z.string().regex(/^p-[a-f0-9]{16}-[0-9]{6}$/);
|
|
7
|
+
const part = z.number().int().positive();
|
|
8
|
+
const itemSchema = z.object({
|
|
9
|
+
id: itemId,
|
|
10
|
+
title: z.string(),
|
|
11
|
+
text: z.string(),
|
|
12
|
+
url: z.string(),
|
|
13
|
+
metadata: z.object({
|
|
14
|
+
locale: z.string(),
|
|
15
|
+
pageId,
|
|
16
|
+
fingerprint: digest,
|
|
17
|
+
part,
|
|
18
|
+
partCount: part,
|
|
19
|
+
description: z.string().optional(),
|
|
20
|
+
section: z.string().optional(),
|
|
21
|
+
unsupportedDynamicContent: z.boolean().optional()
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
const manifestSchema = z.object({
|
|
25
|
+
schemaVersion: z.literal(1),
|
|
26
|
+
fingerprint: digest,
|
|
27
|
+
site: z.object({ name: z.string(), url: z.string(), base: z.string() }),
|
|
28
|
+
defaultLocale: z.string(),
|
|
29
|
+
locales: z.array(z.string()),
|
|
30
|
+
searchIndex: z.object({ url: z.string(), sha256: digest }),
|
|
31
|
+
documents: z.array(z.object({
|
|
32
|
+
id: pageId,
|
|
33
|
+
key: pageId,
|
|
34
|
+
locale: z.string(),
|
|
35
|
+
title: z.string(),
|
|
36
|
+
url: z.string(),
|
|
37
|
+
markdownUrl: z.string(),
|
|
38
|
+
itemIds: z.array(itemId)
|
|
39
|
+
})),
|
|
40
|
+
items: z.array(z.object({
|
|
41
|
+
id: itemId,
|
|
42
|
+
key: itemId,
|
|
43
|
+
pageId,
|
|
44
|
+
url: z.string(),
|
|
45
|
+
artifactUrl: z.string(),
|
|
46
|
+
sha256: digest,
|
|
47
|
+
part,
|
|
48
|
+
partCount: part
|
|
49
|
+
})).max(AGENT_MAX_ITEMS)
|
|
50
|
+
});
|
|
51
|
+
const indexSchema = z.object({
|
|
52
|
+
schemaVersion: z.literal(1),
|
|
53
|
+
fingerprint: digest,
|
|
54
|
+
items: z.array(itemSchema).max(AGENT_MAX_ITEMS)
|
|
55
|
+
});
|
|
56
|
+
class CorpusUnavailable extends Error {
|
|
57
|
+
}
|
|
58
|
+
const encoder = new TextEncoder();
|
|
59
|
+
async function sha256(text) {
|
|
60
|
+
const bytes = await crypto.subtle.digest("SHA-256", encoder.encode(text));
|
|
61
|
+
return Array.from(new Uint8Array(bytes), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
62
|
+
}
|
|
63
|
+
function basePath(base) {
|
|
64
|
+
return `/${base.split("/").filter(Boolean).join("/")}/agent/v1/`.replace(/^\/\//, "/");
|
|
65
|
+
}
|
|
66
|
+
function safePath(url, root, siteUrl) {
|
|
67
|
+
let path = url;
|
|
68
|
+
if (/^https?:\/\//.test(url)) {
|
|
69
|
+
let parsed;
|
|
70
|
+
try {
|
|
71
|
+
parsed = new URL(url);
|
|
72
|
+
} catch {
|
|
73
|
+
throw new CorpusUnavailable("Invalid agent corpus artifact URL.");
|
|
74
|
+
}
|
|
75
|
+
if (!siteUrl || parsed.origin !== new URL(siteUrl).origin || parsed.search || parsed.hash) throw new CorpusUnavailable("Invalid agent corpus artifact origin.");
|
|
76
|
+
path = parsed.pathname;
|
|
77
|
+
}
|
|
78
|
+
if (!path.startsWith(root) || path.includes("?") || path.includes("#") || path.includes("..") || path.includes("%")) {
|
|
79
|
+
throw new CorpusUnavailable("Invalid agent corpus artifact path.");
|
|
80
|
+
}
|
|
81
|
+
return path;
|
|
82
|
+
}
|
|
83
|
+
async function readText(read, path, max) {
|
|
84
|
+
let response;
|
|
85
|
+
try {
|
|
86
|
+
response = await read(path);
|
|
87
|
+
} catch {
|
|
88
|
+
throw new CorpusUnavailable(`Cannot read agent corpus artifact: ${path}`);
|
|
89
|
+
}
|
|
90
|
+
if (!response.ok || !response.body) throw new CorpusUnavailable(`Missing agent corpus artifact: ${path}`);
|
|
91
|
+
const reader = response.body.getReader();
|
|
92
|
+
const chunks = [];
|
|
93
|
+
let size = 0;
|
|
94
|
+
try {
|
|
95
|
+
for (; ; ) {
|
|
96
|
+
const { done, value } = await reader.read();
|
|
97
|
+
if (done) break;
|
|
98
|
+
size += value.byteLength;
|
|
99
|
+
if (size > max) {
|
|
100
|
+
await reader.cancel();
|
|
101
|
+
throw new CorpusUnavailable(`Agent corpus artifact exceeds ${max} bytes.`);
|
|
102
|
+
}
|
|
103
|
+
chunks.push(value);
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (error instanceof CorpusUnavailable) throw error;
|
|
107
|
+
throw new CorpusUnavailable(`Cannot read agent corpus artifact: ${path}`);
|
|
108
|
+
} finally {
|
|
109
|
+
reader.releaseLock();
|
|
110
|
+
}
|
|
111
|
+
const bytes = new Uint8Array(size);
|
|
112
|
+
let offset = 0;
|
|
113
|
+
for (const chunk of chunks) {
|
|
114
|
+
bytes.set(chunk, offset);
|
|
115
|
+
offset += chunk.length;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
119
|
+
} catch {
|
|
120
|
+
throw new CorpusUnavailable(`Invalid UTF-8 in agent corpus artifact: ${path}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function parse(text, label, schema) {
|
|
124
|
+
let value;
|
|
125
|
+
try {
|
|
126
|
+
value = JSON.parse(text);
|
|
127
|
+
} catch {
|
|
128
|
+
throw new CorpusUnavailable(`Invalid agent ${label} JSON.`);
|
|
129
|
+
}
|
|
130
|
+
const result = schema.safeParse(value);
|
|
131
|
+
if (!result.success) throw new CorpusUnavailable(`Incompatible agent ${label}.`);
|
|
132
|
+
return result.data;
|
|
133
|
+
}
|
|
134
|
+
class AgentCorpusLoader {
|
|
135
|
+
constructor(read, base) {
|
|
136
|
+
this.read = read;
|
|
137
|
+
this.base = base;
|
|
138
|
+
}
|
|
139
|
+
read;
|
|
140
|
+
base;
|
|
141
|
+
current;
|
|
142
|
+
loading;
|
|
143
|
+
async load(manifest) {
|
|
144
|
+
const root = basePath(this.base);
|
|
145
|
+
const indexPath = safePath(manifest.searchIndex.url, root, manifest.site.url);
|
|
146
|
+
if (indexPath !== `${root}search-index.json`) throw new CorpusUnavailable("Invalid agent search index path.");
|
|
147
|
+
const raw = await readText(this.read, indexPath, AGENT_MAX_SEARCH_INDEX_BYTES);
|
|
148
|
+
if (await sha256(raw) !== manifest.searchIndex.sha256) throw new CorpusUnavailable("Agent search index digest mismatch.");
|
|
149
|
+
const data = parse(raw, "search index", indexSchema);
|
|
150
|
+
if (data.schemaVersion !== 1 || data.fingerprint !== manifest.fingerprint || !Array.isArray(data.items) || data.items.length > AGENT_MAX_ITEMS) {
|
|
151
|
+
throw new CorpusUnavailable("Incompatible agent search index.");
|
|
152
|
+
}
|
|
153
|
+
const byId = new Map(manifest.items.map((item) => [item.id, item]));
|
|
154
|
+
if (byId.size !== manifest.items.length || byId.size !== data.items.length || new Set(data.items.map((item) => item.id)).size !== data.items.length || data.items.some((item) => !byId.has(item.id) || item.metadata?.fingerprint !== manifest.fingerprint)) {
|
|
155
|
+
throw new CorpusUnavailable("Agent search index does not match manifest.");
|
|
156
|
+
}
|
|
157
|
+
const loaded = { fingerprint: manifest.fingerprint, manifest, index: buildAgentSearchIndex(data) };
|
|
158
|
+
this.current = loaded;
|
|
159
|
+
return loaded;
|
|
160
|
+
}
|
|
161
|
+
async corpus() {
|
|
162
|
+
const root = basePath(this.base);
|
|
163
|
+
const raw = await readText(this.read, `${root}manifest.json`, AGENT_MAX_MANIFEST_BYTES);
|
|
164
|
+
const manifest = parse(raw, "manifest", manifestSchema);
|
|
165
|
+
if (manifest.schemaVersion !== 1 || !/^[a-f0-9]{64}$/.test(manifest.fingerprint) || !Array.isArray(manifest.items) || manifest.items.length > AGENT_MAX_ITEMS || !manifest.searchIndex?.sha256) {
|
|
166
|
+
throw new CorpusUnavailable("Incompatible agent manifest.");
|
|
167
|
+
}
|
|
168
|
+
if (this.current?.fingerprint === manifest.fingerprint && this.current.manifest.searchIndex.sha256 === manifest.searchIndex.sha256) {
|
|
169
|
+
this.current = { ...this.current, manifest };
|
|
170
|
+
return this.current;
|
|
171
|
+
}
|
|
172
|
+
this.current = void 0;
|
|
173
|
+
if (this.loading) {
|
|
174
|
+
try {
|
|
175
|
+
const loaded = await this.loading;
|
|
176
|
+
if (loaded.fingerprint === manifest.fingerprint && loaded.manifest.searchIndex.sha256 === manifest.searchIndex.sha256) return { ...loaded, manifest };
|
|
177
|
+
} catch {
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.loading = this.load(manifest).finally(() => {
|
|
181
|
+
this.loading = void 0;
|
|
182
|
+
});
|
|
183
|
+
return this.loading;
|
|
184
|
+
}
|
|
185
|
+
async item(id) {
|
|
186
|
+
const { manifest } = await this.corpus();
|
|
187
|
+
const entry = manifest.items.find((item2) => item2.id === id);
|
|
188
|
+
if (!entry) return void 0;
|
|
189
|
+
const root = basePath(this.base);
|
|
190
|
+
const path = safePath(entry.artifactUrl, `${root}items/`, manifest.site.url);
|
|
191
|
+
if (path !== `${root}items/${entry.key}.json` || !/^p-[a-f0-9]{16}-[0-9]{6}$/.test(entry.key)) throw new CorpusUnavailable("Invalid agent item path.");
|
|
192
|
+
const raw = await readText(this.read, path, 256 * 1024);
|
|
193
|
+
if (await sha256(raw) !== entry.sha256) throw new CorpusUnavailable("Agent item digest mismatch.");
|
|
194
|
+
const item = parse(raw, "item", itemSchema);
|
|
195
|
+
if (item.id !== id || item.metadata?.fingerprint !== manifest.fingerprint || item.metadata.pageId !== entry.pageId) throw new CorpusUnavailable("Agent item does not match manifest.");
|
|
196
|
+
return item;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export {
|
|
200
|
+
AgentCorpusLoader,
|
|
201
|
+
CorpusUnavailable
|
|
202
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { h, flattenChildren } from "@takazudo/zfb/zudo-react";
|
|
2
2
|
import { defaultComponents } from "../content/index.js";
|
|
3
3
|
import { createContentLink } from "../content/content-link.js";
|
|
4
4
|
import { decodeAuthoredHref, assetViewerHref } from "../asset-path/index.js";
|
|
@@ -18,58 +18,25 @@ function makeContentImg(base) {
|
|
|
18
18
|
if (finalTitle !== void 0) {
|
|
19
19
|
mergedProps.title = finalTitle;
|
|
20
20
|
}
|
|
21
|
-
return
|
|
21
|
+
return h("img", mergedProps);
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
-
const ENLARGE_SVG =
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const ENLARGE_SVG = h(
|
|
25
|
+
"svg",
|
|
26
|
+
{
|
|
27
27
|
viewBox: "0 0 38.99 38.99",
|
|
28
28
|
fill: "currentColor",
|
|
29
|
-
|
|
30
|
-
"aria-hidden": "true",
|
|
31
|
-
children: [
|
|
32
|
-
{
|
|
33
|
-
type: "polygon",
|
|
34
|
-
props: {
|
|
35
|
-
points: "16.2 13.74 5.92 3.47 11.2 3.47 11.2 0 3.47 0 0 0 0 3.47 0 11.2 3.47 11.2 3.47 5.92 13.74 16.2 16.2 13.74"
|
|
36
|
-
},
|
|
37
|
-
key: null,
|
|
38
|
-
constructor: void 0
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
type: "polygon",
|
|
42
|
-
props: {
|
|
43
|
-
points: "25.24 16.2 35.52 5.92 35.52 11.2 38.99 11.2 38.99 3.47 38.99 0 35.52 0 27.79 0 27.79 3.47 33.07 3.47 22.79 13.74 25.24 16.2"
|
|
44
|
-
},
|
|
45
|
-
key: null,
|
|
46
|
-
constructor: void 0
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
type: "polygon",
|
|
50
|
-
props: {
|
|
51
|
-
points: "22.79 25.24 33.07 35.52 27.79 35.52 27.79 38.99 35.52 38.99 38.99 38.99 38.99 35.52 38.99 27.79 35.52 27.79 35.52 33.07 25.24 22.79 22.79 25.24"
|
|
52
|
-
},
|
|
53
|
-
key: null,
|
|
54
|
-
constructor: void 0
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
type: "polygon",
|
|
58
|
-
props: {
|
|
59
|
-
points: "13.74 22.79 3.47 33.07 3.47 27.79 0 27.79 0 35.52 0 38.99 3.47 38.99 11.2 38.99 11.2 35.52 5.92 35.52 16.2 25.24 13.74 22.79"
|
|
60
|
-
},
|
|
61
|
-
key: null,
|
|
62
|
-
constructor: void 0
|
|
63
|
-
}
|
|
64
|
-
]
|
|
29
|
+
"aria-hidden": "true"
|
|
65
30
|
},
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
31
|
+
h("polygon", { points: "16.2 13.74 5.92 3.47 11.2 3.47 11.2 0 3.47 0 0 0 0 3.47 0 11.2 3.47 11.2 3.47 5.92 13.74 16.2 16.2 13.74" }),
|
|
32
|
+
h("polygon", { points: "25.24 16.2 35.52 5.92 35.52 11.2 38.99 11.2 38.99 3.47 38.99 0 35.52 0 27.79 0 27.79 3.47 33.07 3.47 22.79 13.74 25.24 16.2" }),
|
|
33
|
+
h("polygon", { points: "22.79 25.24 33.07 35.52 27.79 35.52 27.79 38.99 35.52 38.99 38.99 38.99 38.99 35.52 38.99 27.79 35.52 27.79 35.52 33.07 25.24 22.79 22.79 25.24" }),
|
|
34
|
+
h("polygon", { points: "13.74 22.79 3.47 33.07 3.47 27.79 0 27.79 0 35.52 0 38.99 3.47 38.99 11.2 38.99 11.2 35.52 5.92 35.52 16.2 25.24 13.74 22.79" })
|
|
35
|
+
);
|
|
69
36
|
function makeEnlargeableParagraph(imageEnlarge, ContentImg, assetOptions) {
|
|
70
37
|
return function EnlargeableParagraph(props) {
|
|
71
38
|
const { children } = props;
|
|
72
|
-
const kids =
|
|
39
|
+
const kids = flattenChildren(children).filter((child) => {
|
|
73
40
|
if (typeof child === "string" || typeof child === "number") {
|
|
74
41
|
return String(child).trim() !== "";
|
|
75
42
|
}
|
|
@@ -90,71 +57,36 @@ function makeEnlargeableParagraph(imageEnlarge, ContentImg, assetOptions) {
|
|
|
90
57
|
) : void 0;
|
|
91
58
|
const canEnlarge = imageEnlarge && imgProps.title !== "no-enlarge";
|
|
92
59
|
if (canEnlarge || imageEntry) {
|
|
93
|
-
const enlargeBtn = {
|
|
60
|
+
const enlargeBtn = h("button", {
|
|
94
61
|
type: "button",
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"aria-label": "Enlarge image",
|
|
100
|
-
children: ENLARGE_SVG
|
|
101
|
-
},
|
|
102
|
-
key: null,
|
|
103
|
-
constructor: void 0
|
|
104
|
-
};
|
|
62
|
+
class: "zd-enlarge-btn",
|
|
63
|
+
hidden: true,
|
|
64
|
+
"aria-label": "Enlarge image"
|
|
65
|
+
}, ENLARGE_SVG);
|
|
105
66
|
const captionText = typeof imgProps.alt === "string" ? imgProps.alt.trim() : "";
|
|
106
67
|
const dimensions = imageEntry?.width !== void 0 && imageEntry.height !== void 0 ? ` \xB7 ${imageEntry.width} \xD7 ${imageEntry.height}` : "";
|
|
107
|
-
const figcaption = imageEntry ?
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class: "mt-vsp-2xs flex flex-wrap items-baseline justify-center gap-x-hsp-xs text-caption text-muted"
|
|
111
|
-
children: [
|
|
112
|
-
captionText ? {
|
|
113
|
-
type: "span",
|
|
114
|
-
props: { children: captionText },
|
|
115
|
-
key: null,
|
|
116
|
-
constructor: void 0
|
|
117
|
-
} : null,
|
|
118
|
-
captionText ? {
|
|
119
|
-
type: "span",
|
|
120
|
-
props: { "aria-hidden": "true", children: "|" },
|
|
121
|
-
key: null,
|
|
122
|
-
constructor: void 0
|
|
123
|
-
} : null,
|
|
124
|
-
{
|
|
125
|
-
type: "a",
|
|
126
|
-
props: {
|
|
127
|
-
class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
|
|
128
|
-
href: assetViewerHref({
|
|
129
|
-
base: assetOptions.base,
|
|
130
|
-
routePrefix: assetOptions.routePrefix,
|
|
131
|
-
path: imageEntry.path,
|
|
132
|
-
locale: assetOptions.isDefaultLocaleOnlyPath?.(
|
|
133
|
-
`/${assetOptions.routePrefix}/${imageEntry.path}`
|
|
134
|
-
) ? void 0 : assetOptions.locale
|
|
135
|
-
}),
|
|
136
|
-
children: `\u2922 Open asset page${dimensions}`
|
|
137
|
-
},
|
|
138
|
-
key: null,
|
|
139
|
-
constructor: void 0
|
|
140
|
-
}
|
|
141
|
-
]
|
|
142
|
-
},
|
|
143
|
-
key: null,
|
|
144
|
-
constructor: void 0
|
|
145
|
-
} : null;
|
|
146
|
-
return {
|
|
147
|
-
type: "figure",
|
|
148
|
-
props: {
|
|
149
|
-
class: [
|
|
150
|
-
canEnlarge ? "zd-enlargeable" : null,
|
|
151
|
-
imageEntry ? "p-hsp-lg" : null
|
|
152
|
-
].filter((className) => className !== null).join(" "),
|
|
153
|
-
children: [vnode, canEnlarge ? enlargeBtn : null, figcaption]
|
|
68
|
+
const figcaption = imageEntry ? h(
|
|
69
|
+
"figcaption",
|
|
70
|
+
{
|
|
71
|
+
class: "mt-vsp-2xs flex flex-wrap items-baseline justify-center gap-x-hsp-xs text-caption text-muted"
|
|
154
72
|
},
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
73
|
+
captionText ? h("span", null, captionText) : null,
|
|
74
|
+
captionText ? h("span", { "aria-hidden": "true" }, "|") : null,
|
|
75
|
+
h("a", {
|
|
76
|
+
class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
|
|
77
|
+
href: assetViewerHref({
|
|
78
|
+
base: assetOptions.base,
|
|
79
|
+
routePrefix: assetOptions.routePrefix,
|
|
80
|
+
path: imageEntry.path,
|
|
81
|
+
locale: assetOptions.isDefaultLocaleOnlyPath?.(
|
|
82
|
+
`/${assetOptions.routePrefix}/${imageEntry.path}`
|
|
83
|
+
) ? void 0 : assetOptions.locale
|
|
84
|
+
})
|
|
85
|
+
}, `\u2922 Open asset page${dimensions}`)
|
|
86
|
+
) : null;
|
|
87
|
+
return h("figure", {
|
|
88
|
+
class: [canEnlarge ? "zd-enlargeable" : null, imageEntry ? "p-hsp-lg" : null].filter((name) => name !== null).join(" ")
|
|
89
|
+
}, vnode, canEnlarge ? enlargeBtn : null, figcaption);
|
|
158
90
|
}
|
|
159
91
|
}
|
|
160
92
|
}
|
|
@@ -212,8 +144,8 @@ function createMdxComponents(options) {
|
|
|
212
144
|
// figures also receive the p-hsp-lg inset. Must come AFTER ...defaultComponents
|
|
213
145
|
// to override ContentParagraph.
|
|
214
146
|
p: EnlargeableParagraph,
|
|
215
|
-
// Admonitions —
|
|
216
|
-
//
|
|
147
|
+
// Admonitions — server-rendered components emitting the
|
|
148
|
+
// `data-admonition` / variant-class structure the design-system CSS
|
|
217
149
|
// targets. `:::note` directives emit <Note>; `<Note title="…">` JSX is
|
|
218
150
|
// also authored directly. github-alerts [!IMPORTANT]/[!CAUTION] map to
|
|
219
151
|
// Important/Caution — omitting those two 500s their SSR render.
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
export declare function MermaidEnlarge(): import("
|
|
1
|
+
export declare function MermaidEnlarge(): import("@takazudo/zfb").Description;
|
|
2
2
|
export declare namespace MermaidEnlarge {
|
|
3
3
|
var displayName: string;
|
|
4
4
|
}
|
|
5
|
-
/**
|
|
6
|
-
* Static SSR fallback for the {@link MermaidEnlarge} island.
|
|
7
|
-
*
|
|
8
|
-
* Renders an empty, closed `<dialog class="zd-mermaid-dialog ...">` so the
|
|
9
|
-
* dist HTML carries the dialog shell even before hydration.
|
|
10
|
-
*/
|
|
11
|
-
export declare function MermaidEnlargeSsrFallback(): import("preact").JSX.Element;
|