@shoalrun/cli 0.0.0-stage → 0.1.0-alpha.11
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/AUTHORING.md +269 -0
- package/CHANGELOG.md +82 -0
- package/LICENSE +202 -0
- package/README.md +189 -2
- package/agent-docs/.well-known/shoalrun/navigation/changelog-tab-50f26fe22670.txt +33 -0
- package/agent-docs/.well-known/shoalrun/navigation/docs-50f26fe22670.txt +24 -0
- package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +9 -0
- package/agent-docs/SNAPSHOT.json +9 -0
- package/agent-docs/about.md +49 -0
- package/agent-docs/api-docs/focused-contracts.md +68 -0
- package/agent-docs/api-docs/generate.md +189 -0
- package/agent-docs/api-docs/generate.sections/add-useful-examples.md +47 -0
- package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +50 -0
- package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +52 -0
- package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +71 -0
- package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +48 -0
- package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +52 -0
- package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +60 -0
- package/agent-docs/api-docs/generate.sections/related-reading.md +38 -0
- package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +45 -0
- package/agent-docs/api-docs/support.md +97 -0
- package/agent-docs/author/add-page.md +124 -0
- package/agent-docs/author/agent-overview.md +59 -0
- package/agent-docs/author/agent-workflow.md +65 -0
- package/agent-docs/author/agents.md +53 -0
- package/agent-docs/author/analytics.md +286 -0
- package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +51 -0
- package/agent-docs/author/analytics.sections/built-in-events.md +52 -0
- package/agent-docs/author/analytics.sections/configure-an-adapter.md +51 -0
- package/agent-docs/author/analytics.sections/custom-interactions.md +57 -0
- package/agent-docs/author/analytics.sections/event-format.md +59 -0
- package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +42 -0
- package/agent-docs/author/analytics.sections/inspect-events-locally.md +36 -0
- package/agent-docs/author/analytics.sections/map-events-to-your-service.md +42 -0
- package/agent-docs/author/analytics.sections/posthog-example.md +126 -0
- package/agent-docs/author/analytics.sections/related-reading.md +42 -0
- package/agent-docs/author/authoring-agent.md +102 -0
- package/agent-docs/author/coding-agent.md +90 -0
- package/agent-docs/author/components/action-link.md +41 -0
- package/agent-docs/author/components/api-embeds.md +263 -0
- package/agent-docs/author/components/api-embeds.sections/apiexample.md +117 -0
- package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +37 -0
- package/agent-docs/author/components/api-embeds.sections/related-reading.md +37 -0
- package/agent-docs/author/components/badge.md +76 -0
- package/agent-docs/author/components/breadcrumbs.md +57 -0
- package/agent-docs/author/components/callout.md +131 -0
- package/agent-docs/author/components/cards.md +168 -0
- package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +50 -0
- package/agent-docs/author/components/cards.sections/build-a-collection.md +69 -0
- package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +66 -0
- package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +37 -0
- package/agent-docs/author/components/cards.sections/link-to-one-document.md +45 -0
- package/agent-docs/author/components/cards.sections/override-card-text.md +58 -0
- package/agent-docs/author/components/cards.sections/related-reading.md +43 -0
- package/agent-docs/author/components/code-blocks.md +117 -0
- package/agent-docs/author/components/collapsible.md +99 -0
- package/agent-docs/author/components/cookbook-chooser.md +86 -0
- package/agent-docs/author/components/custom/react.md +190 -0
- package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +36 -0
- package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +88 -0
- package/agent-docs/author/components/custom/react.sections/registration.md +41 -0
- package/agent-docs/author/components/custom/react.sections/related-reading.md +30 -0
- package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +47 -0
- package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +100 -0
- package/agent-docs/author/components/custom.md +183 -0
- package/agent-docs/author/components/definition-list.md +54 -0
- package/agent-docs/author/components/diagrams/d2-gallery.md +861 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +163 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +375 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +33 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +169 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +37 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +123 -0
- package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +125 -0
- package/agent-docs/author/components/diagrams/pele-gallery.md +1317 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +341 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +269 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +273 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +31 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +35 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +229 -0
- package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +291 -0
- package/agent-docs/author/components/diagrams.md +155 -0
- package/agent-docs/author/components/doc-link.md +58 -0
- package/agent-docs/author/components/fields.md +121 -0
- package/agent-docs/author/components/file-tree.md +84 -0
- package/agent-docs/author/components/images.md +103 -0
- package/agent-docs/author/components/info-hint.md +61 -0
- package/agent-docs/author/components/kbd.md +45 -0
- package/agent-docs/author/components/math.md +39 -0
- package/agent-docs/author/components/only.md +65 -0
- package/agent-docs/author/components/progress.md +53 -0
- package/agent-docs/author/components/related-reading.md +48 -0
- package/agent-docs/author/components/steps.md +121 -0
- package/agent-docs/author/components/tables.md +64 -0
- package/agent-docs/author/components/tabs.md +129 -0
- package/agent-docs/author/components/timeline.md +74 -0
- package/agent-docs/author/components/tooltips.md +58 -0
- package/agent-docs/author/components/walkthroughs.md +390 -0
- package/agent-docs/author/components/walkthroughs.sections/attributes.md +45 -0
- package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +133 -0
- package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +141 -0
- package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +126 -0
- package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +38 -0
- package/agent-docs/author/components/walkthroughs.sections/related-reading.md +36 -0
- package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +53 -0
- package/agent-docs/author/components.md +78 -0
- package/agent-docs/author/content.md +74 -0
- package/agent-docs/author/cookbooks.md +119 -0
- package/agent-docs/author/css.md +238 -0
- package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +70 -0
- package/agent-docs/author/css.sections/core-color-tokens.md +71 -0
- package/agent-docs/author/css.sections/page-attributes.md +69 -0
- package/agent-docs/author/css.sections/page-transitions.md +60 -0
- package/agent-docs/author/css.sections/responsive-behavior.md +58 -0
- package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +89 -0
- package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +71 -0
- package/agent-docs/author/custom-metadata.md +177 -0
- package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +68 -0
- package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +54 -0
- package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +33 -0
- package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +57 -0
- package/agent-docs/author/custom-metadata.sections/related-reading.md +29 -0
- package/agent-docs/author/design-templates.md +49 -0
- package/agent-docs/author/design-writing-guides.md +73 -0
- package/agent-docs/author/frontmatter-reference.md +146 -0
- package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +44 -0
- package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +41 -0
- package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +31 -0
- package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +40 -0
- package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +37 -0
- package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +41 -0
- package/agent-docs/author/frontmatter-reference.sections/related-reading.md +35 -0
- package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +33 -0
- package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +31 -0
- package/agent-docs/author/frontmatter.md +255 -0
- package/agent-docs/author/frontmatter.sections/audience-badges.md +66 -0
- package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +88 -0
- package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +75 -0
- package/agent-docs/author/frontmatter.sections/optional-native-fields.md +90 -0
- package/agent-docs/author/frontmatter.sections/publication-fields.md +85 -0
- package/agent-docs/author/frontmatter.sections/publishing-policy.md +71 -0
- package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +72 -0
- package/agent-docs/author/frontmatter.sections/related-reading.md +72 -0
- package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +84 -0
- package/agent-docs/author/frontmatter.sections/seo-fields.md +79 -0
- package/agent-docs/author/frontmatter.sections/validation-rules.md +75 -0
- package/agent-docs/author/markdown-metadata.md +207 -0
- package/agent-docs/author/navigation.md +269 -0
- package/agent-docs/author/navigation.sections/arrange-authored-pages.md +58 -0
- package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +48 -0
- package/agent-docs/author/navigation.sections/hide-group-page-counts.md +45 -0
- package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +40 -0
- package/agent-docs/author/navigation.sections/local-api-preview.md +47 -0
- package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +65 -0
- package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +97 -0
- package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +38 -0
- package/agent-docs/author/navigation.sections/related-reading.md +44 -0
- package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +67 -0
- package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +42 -0
- package/agent-docs/author/reader-views.md +200 -0
- package/agent-docs/author/reader-views.sections/configure-the-choices.md +65 -0
- package/agent-docs/author/reader-views.sections/connect-your-own-control.md +59 -0
- package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +41 -0
- package/agent-docs/author/reader-views.sections/mark-pages.md +49 -0
- package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +49 -0
- package/agent-docs/author/reader-views.sections/place-filter-controls.md +43 -0
- package/agent-docs/author/reader-views.sections/try-the-controls-here.md +64 -0
- package/agent-docs/author/recipe-drafts.md +181 -0
- package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +82 -0
- package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +60 -0
- package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +55 -0
- package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +66 -0
- package/agent-docs/author/recipe-drafts.sections/related-reading.md +45 -0
- package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +50 -0
- package/agent-docs/author/recipes.md +127 -0
- package/agent-docs/author/recipes.sections/how-agents-use-this.md +50 -0
- package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +64 -0
- package/agent-docs/author/recipes.sections/related-reading.md +36 -0
- package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +42 -0
- package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +52 -0
- package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +44 -0
- package/agent-docs/author/recipes.sections/what-each-file-does.md +48 -0
- package/agent-docs/author/recipes.sections/what-happens-and-when.md +45 -0
- package/agent-docs/author/related-reading.md +143 -0
- package/agent-docs/author/related-reading.sections/automatic-footers.md +35 -0
- package/agent-docs/author/related-reading.sections/declare-relationships.md +68 -0
- package/agent-docs/author/related-reading.sections/display-related-documents.md +54 -0
- package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +32 -0
- package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +32 -0
- package/agent-docs/author/related-reading.sections/related-reading.md +34 -0
- package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +34 -0
- package/agent-docs/author/release-notes.md +153 -0
- package/agent-docs/author/search.md +299 -0
- package/agent-docs/author/search.sections/choose-a-provider.md +52 -0
- package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +49 -0
- package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +55 -0
- package/agent-docs/author/search.sections/html-markdown-and-agents.md +37 -0
- package/agent-docs/author/search.sections/lexical-search.md +78 -0
- package/agent-docs/author/search.sections/local-semantic-preview.md +43 -0
- package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +41 -0
- package/agent-docs/author/search.sections/related-reading.md +45 -0
- package/agent-docs/author/search.sections/reuse-the-lexical-index.md +81 -0
- package/agent-docs/author/search.sections/turn-search-off.md +46 -0
- package/agent-docs/author/search.sections/use-the-search-box.md +39 -0
- package/agent-docs/author/search.sections/write-a-custom-provider.md +98 -0
- package/agent-docs/author/snippets.md +118 -0
- package/agent-docs/author/taxonomy.md +121 -0
- package/agent-docs/author/templates.md +231 -0
- package/agent-docs/author/templates.sections/built-in-feature-templates.md +52 -0
- package/agent-docs/author/templates.sections/built-in-templates.md +48 -0
- package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +69 -0
- package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +76 -0
- package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +46 -0
- package/agent-docs/author/templates.sections/project-added-templates.md +39 -0
- package/agent-docs/author/templates.sections/related-reading.md +47 -0
- package/agent-docs/author/templates.sections/scaffold-a-page.md +53 -0
- package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +56 -0
- package/agent-docs/author/templates.sections/what-every-template-gives-you.md +44 -0
- package/agent-docs/author/workspace/commands.md +92 -0
- package/agent-docs/author/workspace.md +104 -0
- package/agent-docs/author/writing-style.md +137 -0
- package/agent-docs/author/writing-style.sections/adapt-this-example.md +28 -0
- package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +42 -0
- package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +32 -0
- package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +28 -0
- package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +36 -0
- package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +41 -0
- package/agent-docs/author/writing-style.sections/procedures-and-examples.md +32 -0
- package/agent-docs/author/writing-style.sections/related-reading.md +32 -0
- package/agent-docs/author/writing-style.sections/review-a-draft.md +30 -0
- package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +39 -0
- package/agent-docs/author/writing-style.sections/voice-and-explanations.md +39 -0
- package/agent-docs/changelog/2026-10-14-agent-readiness.md +29 -0
- package/agent-docs/changelog/2026-10-15-evaluation-builds.md +84 -0
- package/agent-docs/changelog/2026-10-16-navigation-layouts.md +72 -0
- package/agent-docs/changelog/2026-10-17-mcp-hosting.md +60 -0
- package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +46 -0
- package/agent-docs/changelog/2026-10-19-visual-navigation.md +44 -0
- package/agent-docs/changelog/2026-10-25.md +45 -0
- package/agent-docs/changelog/2026-10-26.md +66 -0
- package/agent-docs/changelog/2026-10-27.md +85 -0
- package/agent-docs/changelog/authoring-preview.md +40 -0
- package/agent-docs/changelog/authoring-search.md +39 -0
- package/agent-docs/changelog/authoring-tools.md +34 -0
- package/agent-docs/changelog/working-tree-skill.md +38 -0
- package/agent-docs/changelog.md +115 -0
- package/agent-docs/chat/checks.md +175 -0
- package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +38 -0
- package/agent-docs/chat/checks.sections/answer-for-one-audience.md +66 -0
- package/agent-docs/chat/checks.sections/answer-without-a-model.md +54 -0
- package/agent-docs/chat/checks.sections/follow-up-questions.md +54 -0
- package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +67 -0
- package/agent-docs/chat/checks.sections/questions-with-several-parts.md +44 -0
- package/agent-docs/chat/checks.sections/related-reading.md +42 -0
- package/agent-docs/chat/checks.sections/reuse-answers.md +50 -0
- package/agent-docs/chat/host.md +222 -0
- package/agent-docs/chat/host.sections/cap-the-daily-spend.md +78 -0
- package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +64 -0
- package/agent-docs/chat/host.sections/related-reading.md +43 -0
- package/agent-docs/chat/passage-index.md +228 -0
- package/agent-docs/chat/passage-index.sections/build-the-index.md +72 -0
- package/agent-docs/chat/passage-index.sections/embed-passages.md +103 -0
- package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +53 -0
- package/agent-docs/chat/passage-index.sections/limits.md +45 -0
- package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +52 -0
- package/agent-docs/chat/passage-index.sections/related-reading.md +42 -0
- package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +91 -0
- package/agent-docs/chat/prepared-answers.md +116 -0
- package/agent-docs/chat/settings.md +213 -0
- package/agent-docs/chat/settings.sections/choose-the-scorer.md +63 -0
- package/agent-docs/chat/settings.sections/configure-chat.md +80 -0
- package/agent-docs/chat/settings.sections/configure-retrieval.md +62 -0
- package/agent-docs/chat/settings.sections/related-reading.md +32 -0
- package/agent-docs/chat/settings.sections/send-extra-request-fields.md +42 -0
- package/agent-docs/chat/settings.sections/use-more-than-one-model.md +62 -0
- package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +42 -0
- package/agent-docs/chat/setup.md +97 -0
- package/agent-docs/chat.md +102 -0
- package/agent-docs/cli.md +445 -0
- package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +102 -0
- package/agent-docs/cli.sections/author-pages.md +94 -0
- package/agent-docs/cli.sections/build-and-serve.md +144 -0
- package/agent-docs/cli.sections/inspect-config-and-operations.md +41 -0
- package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +45 -0
- package/agent-docs/cli.sections/related-reading.md +33 -0
- package/agent-docs/cli.sections/search-and-chat.md +132 -0
- package/agent-docs/cli.sections/start-a-project.md +37 -0
- package/agent-docs/cli.sections/working-tree-authoring-tools.md +35 -0
- package/agent-docs/concepts.md +133 -0
- package/agent-docs/config/apis.md +136 -0
- package/agent-docs/config/content.md +264 -0
- package/agent-docs/config/content.sections/authoring.md +58 -0
- package/agent-docs/config/content.sections/badges.md +34 -0
- package/agent-docs/config/content.sections/callouts.md +34 -0
- package/agent-docs/config/content.sections/cookbooks.md +38 -0
- package/agent-docs/config/content.sections/frontmatter.md +75 -0
- package/agent-docs/config/content.sections/readerfilters.md +44 -0
- package/agent-docs/config/content.sections/related-reading.md +34 -0
- package/agent-docs/config/content.sections/relationships.md +76 -0
- package/agent-docs/config/content.sections/snippets.md +61 -0
- package/agent-docs/config/content.sections/templates.md +57 -0
- package/agent-docs/config/content.sections/variables.md +55 -0
- package/agent-docs/config/examples.md +354 -0
- package/agent-docs/config/examples.sections/feature-showcase.md +55 -0
- package/agent-docs/config/examples.sections/minimal-site.md +80 -0
- package/agent-docs/config/examples.sections/multilingual-help-center.md +110 -0
- package/agent-docs/config/examples.sections/parcel-api-documentation.md +153 -0
- package/agent-docs/config/examples.sections/related-reading.md +50 -0
- package/agent-docs/config/examples.sections/shared-company-preset.md +118 -0
- package/agent-docs/config/integrations.md +76 -0
- package/agent-docs/config/outputs.md +160 -0
- package/agent-docs/config/outputs.sections/exports.md +57 -0
- package/agent-docs/config/outputs.sections/metadata.md +42 -0
- package/agent-docs/config/outputs.sections/related-reading.md +34 -0
- package/agent-docs/config/publishing.md +219 -0
- package/agent-docs/config/publishing.sections/navigation.md +92 -0
- package/agent-docs/config/publishing.sections/redirects.md +79 -0
- package/agent-docs/config/publishing.sections/related-reading.md +33 -0
- package/agent-docs/config/site.md +193 -0
- package/agent-docs/config/site.sections/related-reading.md +33 -0
- package/agent-docs/config/site.sections/theme.md +74 -0
- package/agent-docs/config.md +195 -0
- package/agent-docs/configuration.md +384 -0
- package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +36 -0
- package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +76 -0
- package/agent-docs/configuration.sections/extract-a-section-with-include.md +75 -0
- package/agent-docs/configuration.sections/inspect-and-validate-changes.md +77 -0
- package/agent-docs/configuration.sections/related-reading.md +42 -0
- package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +54 -0
- package/agent-docs/configuration.sections/share-defaults-through-extends.md +121 -0
- package/agent-docs/configuration.sections/start-with-one-working-file.md +81 -0
- package/agent-docs/configuration.sections/understand-the-three-stages.md +59 -0
- package/agent-docs/configuration.sections/understand-where-paths-point.md +53 -0
- package/agent-docs/connect/mcp.md +85 -0
- package/agent-docs/contribute/agent-skills.md +72 -0
- package/agent-docs/cookbooks/authoring.md +68 -0
- package/agent-docs/cookbooks/site-workflows.md +59 -0
- package/agent-docs/cookbooks/welcome-email.md +55 -0
- package/agent-docs/documents.json +20058 -0
- package/agent-docs/example-api/cedar/create-enrollment-7af3e5d2.md +594 -0
- package/agent-docs/example-api/cedar/get-legacy-parcel-6758d051.md +122 -0
- package/agent-docs/example-api/cedar/get-parcel-edee10e6.md +122 -0
- package/agent-docs/example-api/cedar/list-parcels-0345fb5f.md +271 -0
- package/agent-docs/example-api/cedar/parcel-delivered-7d1ba6db.md +122 -0
- package/agent-docs/example-api/cedar/upload-manifest-1af17891.md +101 -0
- package/agent-docs/example-api/cedar.md +39 -0
- package/agent-docs/example-api/create-note.md +344 -0
- package/agent-docs/example-api/generated/get-note-cbedb319.md +165 -0
- package/agent-docs/example-api/write-note.md +55 -0
- package/agent-docs/explore.md +54 -0
- package/agent-docs/glossary.md +827 -0
- package/agent-docs/index.md +249 -0
- package/agent-docs/ingredients/audit-site.md +27 -0
- package/agent-docs/ingredients/build-site.md +29 -0
- package/agent-docs/ingredients/compile-framework.md +28 -0
- package/agent-docs/ingredients/complete-page.md +30 -0
- package/agent-docs/ingredients/inspect-agent-bundle.md +28 -0
- package/agent-docs/ingredients/inspect-build.md +41 -0
- package/agent-docs/ingredients/preview-site.md +31 -0
- package/agent-docs/ingredients/refresh-agent-bundle.md +29 -0
- package/agent-docs/ingredients/scaffold-page.md +28 -0
- package/agent-docs/non-goals.md +58 -0
- package/agent-docs/provenance.json +10 -0
- package/agent-docs/publish/agent-discovery.md +79 -0
- package/agent-docs/publish/agent-friendliness.md +201 -0
- package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +61 -0
- package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +48 -0
- package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +46 -0
- package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +48 -0
- package/agent-docs/publish/agent-friendliness.sections/related-reading.md +52 -0
- package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +50 -0
- package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +62 -0
- package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +50 -0
- package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +58 -0
- package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +68 -0
- package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +60 -0
- package/agent-docs/publish/api-references.md +217 -0
- package/agent-docs/publish/api-references.sections/add-useful-examples.md +36 -0
- package/agent-docs/publish/api-references.sections/author-the-reference-page.md +65 -0
- package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +48 -0
- package/agent-docs/publish/api-references.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +36 -0
- package/agent-docs/publish/api-references.sections/generate-many-pages-selectively.md +36 -0
- package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +36 -0
- package/agent-docs/publish/api-references.sections/link-guides-to-api-references.md +36 -0
- package/agent-docs/publish/api-references.sections/map-extension-values-to-shoalrun-status.md +36 -0
- package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +38 -0
- package/agent-docs/publish/api-references.sections/publish-several-versions.md +36 -0
- package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +62 -0
- package/agent-docs/publish/api-references.sections/register-the-operation.md +64 -0
- package/agent-docs/publish/api-references.sections/related-reading.md +42 -0
- package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +54 -0
- package/agent-docs/publish/api-references.sections/use-a-template-for-editorial-context.md +36 -0
- package/agent-docs/publish/api-references.sections/what-readers-get.md +38 -0
- package/agent-docs/publish/audit.md +160 -0
- package/agent-docs/publish/audit.sections/add-project-tests.md +57 -0
- package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +52 -0
- package/agent-docs/publish/audit.sections/check-before-pushing.md +80 -0
- package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +54 -0
- package/agent-docs/publish/audit.sections/read-the-report.md +67 -0
- package/agent-docs/publish/audit.sections/related-reading.md +47 -0
- package/agent-docs/publish/content-export.md +208 -0
- package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +40 -0
- package/agent-docs/publish/content-export.sections/check-the-result.md +27 -0
- package/agent-docs/publish/content-export.sections/export-selected-pages.md +113 -0
- package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +29 -0
- package/agent-docs/publish/content-export.sections/prerequisites.md +29 -0
- package/agent-docs/publish/content-export.sections/related-reading.md +35 -0
- package/agent-docs/publish/content-export.sections/review-exported-api-material.md +44 -0
- package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +34 -0
- package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +43 -0
- package/agent-docs/publish/content-negotiation.md +121 -0
- package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +60 -0
- package/agent-docs/publish/content-negotiation.sections/missing-pages.md +51 -0
- package/agent-docs/publish/content-negotiation.sections/related-reading.md +45 -0
- package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +49 -0
- package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +62 -0
- package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +47 -0
- package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +49 -0
- package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +47 -0
- package/agent-docs/publish/deployment-check.md +72 -0
- package/agent-docs/publish/evals.md +175 -0
- package/agent-docs/publish/evals.sections/add-the-audit-hook.md +63 -0
- package/agent-docs/publish/evals.sections/check-the-report.md +36 -0
- package/agent-docs/publish/evals.sections/define-a-task-file.md +47 -0
- package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +42 -0
- package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +39 -0
- package/agent-docs/publish/evals.sections/related-reading.md +36 -0
- package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +54 -0
- package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +42 -0
- package/agent-docs/publish/host-adapters.md +60 -0
- package/agent-docs/publish/manni.md +227 -0
- package/agent-docs/publish/manni.sections/check-the-result.md +40 -0
- package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +83 -0
- package/agent-docs/publish/manni.sections/optional-custom-policies.md +42 -0
- package/agent-docs/publish/manni.sections/prerequisites.md +40 -0
- package/agent-docs/publish/mcp-analytics.md +356 -0
- package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +50 -0
- package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +45 -0
- package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +53 -0
- package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +62 -0
- package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +54 -0
- package/agent-docs/publish/mcp-analytics.sections/related-reading.md +36 -0
- package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +46 -0
- package/agent-docs/publish/mcp.md +190 -0
- package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +52 -0
- package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +51 -0
- package/agent-docs/publish/mcp.sections/configure-the-client.md +55 -0
- package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +50 -0
- package/agent-docs/publish/mcp.sections/related-reading.md +42 -0
- package/agent-docs/publish/mcp.sections/search-then-read.md +53 -0
- package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +79 -0
- package/agent-docs/publish/mcp.sections/verify-the-connection.md +40 -0
- package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +42 -0
- package/agent-docs/publish/openapi-extension-mappings.md +84 -0
- package/agent-docs/publish/output.md +220 -0
- package/agent-docs/publish/output.sections/api-contracts.md +48 -0
- package/agent-docs/publish/output.sections/code-highlighting.md +38 -0
- package/agent-docs/publish/output.sections/current-limits.md +40 -0
- package/agent-docs/publish/output.sections/incremental-sync.md +69 -0
- package/agent-docs/publish/output.sections/manifest-records-and-sections.md +46 -0
- package/agent-docs/publish/output.sections/navigation-section-indexes.md +42 -0
- package/agent-docs/publish/output.sections/page-formats.md +46 -0
- package/agent-docs/publish/output.sections/published-output-contract.md +58 -0
- package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +44 -0
- package/agent-docs/publish/output.sections/related-reading.md +34 -0
- package/agent-docs/publish/output.sections/response-identity.md +38 -0
- package/agent-docs/publish/output.sections/site-files.md +64 -0
- package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +48 -0
- package/agent-docs/publish/output.sections/where-files-go.md +49 -0
- package/agent-docs/publish/publications.md +153 -0
- package/agent-docs/publish/revisions.md +104 -0
- package/agent-docs/publish/seo.md +119 -0
- package/agent-docs/publish/single-source-sites.md +168 -0
- package/agent-docs/publish/troubleshooting.md +112 -0
- package/agent-docs/publish/vercel.md +130 -0
- package/agent-docs/publish/vercel.sections/check-the-deployment.md +54 -0
- package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +38 -0
- package/agent-docs/publish/vercel.sections/prepare-your-project.md +52 -0
- package/agent-docs/publish/vercel.sections/related-reading.md +38 -0
- package/agent-docs/publish.md +95 -0
- package/agent-docs/recipes/add-page.md +194 -0
- package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +40 -0
- package/agent-docs/recipes/add-page.sections/before-you-start.md +33 -0
- package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +42 -0
- package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +42 -0
- package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +54 -0
- package/agent-docs/recipes/add-page.sections/check-the-outcome.md +28 -0
- package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +42 -0
- package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +41 -0
- package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +42 -0
- package/agent-docs/recipes/add-page.sections/related-reading.md +30 -0
- package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +42 -0
- package/agent-docs/recipes/audit-docs.md +122 -0
- package/agent-docs/recipes/build-docs.md +105 -0
- package/agent-docs/recipes/preview-hybrid-search.md +84 -0
- package/agent-docs/recipes/preview-page.md +124 -0
- package/agent-docs/recipes/queue-email.md +49 -0
- package/agent-docs/recipes/refresh-agent-docs.md +109 -0
- package/agent-docs/recipes/send-welcome-email.md +92 -0
- package/agent-docs/reference/agent-skills.md +73 -0
- package/agent-docs/search-and-chat.md +87 -0
- package/agent-docs/search-index.json +1 -0
- package/agent-docs/start.md +197 -0
- package/agent-docs/start.sections/add-the-page-to-navigation.md +50 -0
- package/agent-docs/start.sections/build-and-check-both-outputs.md +50 -0
- package/agent-docs/start.sections/build-this-site.md +35 -0
- package/agent-docs/start.sections/check-writing-style.md +35 -0
- package/agent-docs/start.sections/create-a-page.md +105 -0
- package/agent-docs/start.sections/make-it-yours.md +37 -0
- package/agent-docs/start.sections/prerequisites.md +37 -0
- package/agent-docs/start.sections/related-reading.md +45 -0
- package/agent-docs/start.sections/start-your-own-project.md +53 -0
- package/agent-docs/status.md +75 -0
- package/agent-docs/styling/color-modes.md +85 -0
- package/agent-docs/styling/footer.md +67 -0
- package/agent-docs/styling/header.md +65 -0
- package/agent-docs/styling/layouts.md +193 -0
- package/agent-docs/styling/layouts.sections/build-a-landing-page.md +61 -0
- package/agent-docs/styling/layouts.sections/build-a-splash-page.md +88 -0
- package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +51 -0
- package/agent-docs/styling/layouts.sections/customize-the-hero.md +50 -0
- package/agent-docs/styling/layouts.sections/hero.md +83 -0
- package/agent-docs/styling/layouts.sections/related-reading.md +42 -0
- package/agent-docs/styling/palettes.md +140 -0
- package/agent-docs/styling/share-images.md +105 -0
- package/agent-docs/styling/themes.md +125 -0
- package/agent-docs/styling/try.md +106 -0
- package/agent-docs/what-is-shoalrun.md +56 -0
- package/assets/analytics.js +72 -0
- package/assets/ask-widget.js +320 -0
- package/assets/code-samples.js +28 -0
- package/assets/components.js +32 -0
- package/assets/cookbook-chooser.js +170 -0
- package/assets/copy-markdown.js +24 -0
- package/assets/example-panel.js +77 -0
- package/assets/file-tree.js +49 -0
- package/assets/image-viewer.js +41 -0
- package/assets/mode.js +26 -0
- package/assets/navigation.js +233 -0
- package/assets/reader-filters.js +305 -0
- package/assets/reader.js +111 -0
- package/assets/search-highlight.js +32 -0
- package/assets/search-lexical.js +66 -0
- package/assets/search.js +150 -0
- package/assets/table-filter.js +63 -0
- package/assets/tabs.js +80 -0
- package/assets/theme-preview.css +17 -0
- package/assets/theme-preview.js +135 -0
- package/assets/theme-switcher.js +113 -0
- package/assets/tooltips.js +81 -0
- package/assets/walkthrough.js +233 -0
- package/dist/agent-discovery.d.ts +11 -0
- package/dist/agent-discovery.js +37 -0
- package/dist/analytics.d.ts +2 -0
- package/dist/analytics.js +13 -0
- package/dist/answer-cache.d.ts +24 -0
- package/dist/answer-cache.js +55 -0
- package/dist/answer-cards.d.ts +71 -0
- package/dist/answer-cards.js +148 -0
- package/dist/api-embeds.d.ts +22 -0
- package/dist/api-embeds.js +84 -0
- package/dist/api-identity.d.ts +6 -0
- package/dist/api-identity.js +7 -0
- package/dist/api-materialize.d.ts +12 -0
- package/dist/api-materialize.js +120 -0
- package/dist/api-publication-plan.d.ts +86 -0
- package/dist/api-publication-plan.js +187 -0
- package/dist/api-publication-review.d.ts +23 -0
- package/dist/api-publication-review.js +58 -0
- package/dist/api-selection.d.ts +21 -0
- package/dist/api-selection.js +84 -0
- package/dist/api.d.ts +74 -0
- package/dist/api.js +782 -0
- package/dist/artifact-bundle.d.ts +96 -0
- package/dist/artifact-bundle.js +306 -0
- package/dist/ask-function.d.ts +19 -0
- package/dist/ask-function.js +139 -0
- package/dist/ask-handler.d.ts +38 -0
- package/dist/ask-handler.js +157 -0
- package/dist/ask-log-kv.d.ts +14 -0
- package/dist/ask-log-kv.js +69 -0
- package/dist/ask-log.d.ts +106 -0
- package/dist/ask-log.js +159 -0
- package/dist/ask-setup.d.ts +43 -0
- package/dist/ask-setup.js +99 -0
- package/dist/ask.d.ts +152 -0
- package/dist/ask.js +532 -0
- package/dist/audit.d.ts +29 -0
- package/dist/audit.js +171 -0
- package/dist/authored-change.d.ts +22 -0
- package/dist/authored-change.js +47 -0
- package/dist/authoring-api.d.ts +18 -0
- package/dist/authoring-api.js +15 -0
- package/dist/authoring-findings.d.ts +31 -0
- package/dist/authoring-findings.js +104 -0
- package/dist/authoring-guidance.d.ts +15 -0
- package/dist/authoring-guidance.js +57 -0
- package/dist/authoring-preview.d.ts +24 -0
- package/dist/authoring-preview.js +160 -0
- package/dist/authoring-project-command.d.ts +7 -0
- package/dist/authoring-project-command.js +52 -0
- package/dist/authoring-project.d.ts +104 -0
- package/dist/authoring-project.js +287 -0
- package/dist/authoring-review-command.d.ts +1 -0
- package/dist/authoring-review-command.js +68 -0
- package/dist/authoring-review.d.ts +72 -0
- package/dist/authoring-review.js +71 -0
- package/dist/authoring-snapshot.d.ts +66 -0
- package/dist/authoring-snapshot.js +293 -0
- package/dist/authoring-validation-command.d.ts +1 -0
- package/dist/authoring-validation-command.js +54 -0
- package/dist/authoring-validation.d.ts +101 -0
- package/dist/authoring-validation.js +348 -0
- package/dist/badges.d.ts +16 -0
- package/dist/badges.js +57 -0
- package/dist/budget-store.d.ts +21 -0
- package/dist/budget-store.js +90 -0
- package/dist/budget.d.ts +45 -0
- package/dist/budget.js +128 -0
- package/dist/build-info.d.ts +10 -0
- package/dist/build-info.js +15 -0
- package/dist/callouts.d.ts +18 -0
- package/dist/callouts.js +63 -0
- package/dist/cards.d.ts +35 -0
- package/dist/cards.js +237 -0
- package/dist/chat-config.d.ts +117 -0
- package/dist/chat-config.js +400 -0
- package/dist/chat-pause.d.ts +1 -0
- package/dist/chat-pause.js +3 -0
- package/dist/chat.d.ts +46 -0
- package/dist/chat.js +78 -0
- package/dist/cli-discovery.d.ts +4 -0
- package/dist/cli-discovery.js +86 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +750 -0
- package/dist/code-samples.d.ts +50 -0
- package/dist/code-samples.js +181 -0
- package/dist/compact-discovery.d.ts +15 -0
- package/dist/compact-discovery.js +78 -0
- package/dist/compiler-config.d.ts +67 -0
- package/dist/compiler-config.js +66 -0
- package/dist/compiler.d.ts +208 -0
- package/dist/compiler.js +524 -0
- package/dist/component-bundle.d.ts +4 -0
- package/dist/component-bundle.js +32 -0
- package/dist/component-content.d.ts +78 -0
- package/dist/component-content.js +47 -0
- package/dist/component-manifest.d.ts +15 -0
- package/dist/component-manifest.js +84 -0
- package/dist/component-names.d.ts +1 -0
- package/dist/component-names.js +1 -0
- package/dist/component-plugins.d.ts +28 -0
- package/dist/component-plugins.js +141 -0
- package/dist/component-transform.d.ts +10 -0
- package/dist/component-transform.js +697 -0
- package/dist/components.d.ts +2 -0
- package/dist/components.js +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.js +149 -0
- package/dist/content-export-assets.d.ts +23 -0
- package/dist/content-export-assets.js +103 -0
- package/dist/content-export-command.d.ts +20 -0
- package/dist/content-export-command.js +57 -0
- package/dist/content-export-config.d.ts +16 -0
- package/dist/content-export-config.js +50 -0
- package/dist/content-export-render.d.ts +12 -0
- package/dist/content-export-render.js +132 -0
- package/dist/content-export.d.ts +30 -0
- package/dist/content-export.js +307 -0
- package/dist/content-filter.d.ts +4 -0
- package/dist/content-filter.js +16 -0
- package/dist/content-source.d.ts +100 -0
- package/dist/content-source.js +42 -0
- package/dist/content-workspace.d.ts +293 -0
- package/dist/content-workspace.js +69 -0
- package/dist/content.d.ts +41 -0
- package/dist/content.js +176 -0
- package/dist/cookbook-chooser.d.ts +19 -0
- package/dist/cookbook-chooser.js +56 -0
- package/dist/dev.d.ts +2 -0
- package/dist/dev.js +113 -0
- package/dist/diagram-svg.d.ts +1 -0
- package/dist/diagram-svg.js +44 -0
- package/dist/diagrams.d.ts +7 -0
- package/dist/diagrams.js +102 -0
- package/dist/docs-author.d.ts +86 -0
- package/dist/docs-author.js +380 -0
- package/dist/docs-command.d.ts +8 -0
- package/dist/docs-command.js +62 -0
- package/dist/docs-eval.d.ts +146 -0
- package/dist/docs-eval.js +231 -0
- package/dist/docs-mcp.d.ts +12 -0
- package/dist/docs-mcp.js +82 -0
- package/dist/docs-tool.d.ts +81 -0
- package/dist/docs-tool.js +7 -0
- package/dist/document-sync.d.ts +36 -0
- package/dist/document-sync.js +58 -0
- package/dist/documentation-core.d.ts +148 -0
- package/dist/documentation-core.js +160 -0
- package/dist/embeddings.d.ts +68 -0
- package/dist/embeddings.js +198 -0
- package/dist/focused-audit.d.ts +10 -0
- package/dist/focused-audit.js +69 -0
- package/dist/focused-openapi.d.ts +2 -0
- package/dist/focused-openapi.js +140 -0
- package/dist/fonts.d.ts +54 -0
- package/dist/fonts.js +92 -0
- package/dist/freshness.d.ts +7 -0
- package/dist/freshness.js +58 -0
- package/dist/frontmatter.d.ts +24 -0
- package/dist/frontmatter.js +342 -0
- package/dist/function-package.d.ts +1 -0
- package/dist/function-package.js +58 -0
- package/dist/highlight.d.ts +14 -0
- package/dist/highlight.js +114 -0
- package/dist/html-renderer.d.ts +10 -0
- package/dist/html-renderer.js +63 -0
- package/dist/icons.d.ts +8 -0
- package/dist/icons.js +40 -0
- package/dist/index-build.d.ts +55 -0
- package/dist/index-build.js +227 -0
- package/dist/ingredient-draft.d.ts +17 -0
- package/dist/ingredient-draft.js +94 -0
- package/dist/ingredient-workflow.d.ts +8 -0
- package/dist/ingredient-workflow.js +25 -0
- package/dist/init.d.ts +8 -0
- package/dist/init.js +66 -0
- package/dist/jev.d.ts +62 -0
- package/dist/jev.js +190 -0
- package/dist/link-audit.d.ts +12 -0
- package/dist/link-audit.js +146 -0
- package/dist/llms-discovery.d.ts +11 -0
- package/dist/llms-discovery.js +23 -0
- package/dist/markdown-sections.d.ts +15 -0
- package/dist/markdown-sections.js +60 -0
- package/dist/markdown-size.d.ts +7 -0
- package/dist/markdown-size.js +6 -0
- package/dist/mcp-analytics.d.ts +38 -0
- package/dist/mcp-analytics.js +35 -0
- package/dist/mcp-artifacts.d.ts +2 -0
- package/dist/mcp-artifacts.js +78 -0
- package/dist/mcp-client-metadata.d.ts +18 -0
- package/dist/mcp-client-metadata.js +69 -0
- package/dist/mcp-config.d.ts +23 -0
- package/dist/mcp-config.js +56 -0
- package/dist/mcp-http.d.ts +19 -0
- package/dist/mcp-http.js +157 -0
- package/dist/mcp-integrity.d.ts +3 -0
- package/dist/mcp-integrity.js +4 -0
- package/dist/mcp-node.d.ts +4 -0
- package/dist/mcp-node.js +68 -0
- package/dist/mcp-vercel-runtime.d.ts +3 -0
- package/dist/mcp-vercel-runtime.js +36 -0
- package/dist/mcp-vercel.d.ts +15 -0
- package/dist/mcp-vercel.js +65 -0
- package/dist/metadata-provider.d.ts +19 -0
- package/dist/metadata-provider.js +38 -0
- package/dist/negotiation.d.ts +10 -0
- package/dist/negotiation.js +35 -0
- package/dist/not-found.d.ts +16 -0
- package/dist/not-found.js +25 -0
- package/dist/output-commit.d.ts +1 -0
- package/dist/output-commit.js +133 -0
- package/dist/output-location.d.ts +3 -0
- package/dist/output-location.js +30 -0
- package/dist/page-materialization.d.ts +78 -0
- package/dist/page-materialization.js +132 -0
- package/dist/page-renderer.d.ts +71 -0
- package/dist/page-renderer.js +177 -0
- package/dist/palettes.d.ts +41 -0
- package/dist/palettes.js +160 -0
- package/dist/procedure-components.d.ts +2 -0
- package/dist/procedure-components.js +94 -0
- package/dist/project-navigation.d.ts +41 -0
- package/dist/project-navigation.js +190 -0
- package/dist/provider-http.d.ts +10 -0
- package/dist/provider-http.js +60 -0
- package/dist/publication-manifest.d.ts +229 -0
- package/dist/publication-manifest.js +53 -0
- package/dist/publication-plan.d.ts +34 -0
- package/dist/publication-plan.js +85 -0
- package/dist/publication-render.d.ts +71 -0
- package/dist/publication-render.js +92 -0
- package/dist/reader-filters.d.ts +30 -0
- package/dist/reader-filters.js +105 -0
- package/dist/recipe-draft.d.ts +17 -0
- package/dist/recipe-draft.js +147 -0
- package/dist/reference-audit.d.ts +18 -0
- package/dist/reference-audit.js +169 -0
- package/dist/remote-import.d.ts +62 -0
- package/dist/remote-import.js +292 -0
- package/dist/representation-tree.d.ts +3 -0
- package/dist/representation-tree.js +320 -0
- package/dist/retrieval-config.d.ts +30 -0
- package/dist/retrieval-config.js +83 -0
- package/dist/retrieval.d.ts +60 -0
- package/dist/retrieval.js +228 -0
- package/dist/scaffold.d.ts +39 -0
- package/dist/scaffold.js +167 -0
- package/dist/search-config.d.ts +8 -0
- package/dist/search-config.js +26 -0
- package/dist/search-handler.d.ts +16 -0
- package/dist/search-handler.js +111 -0
- package/dist/search-identifier.d.ts +3 -0
- package/dist/search-identifier.js +25 -0
- package/dist/search-literal.d.ts +1 -0
- package/dist/search-literal.js +28 -0
- package/dist/search-query.d.ts +54 -0
- package/dist/search-query.js +120 -0
- package/dist/search-results.d.ts +6 -0
- package/dist/search-results.js +45 -0
- package/dist/search-snippet.d.ts +11 -0
- package/dist/search-snippet.js +93 -0
- package/dist/search-synonyms.d.ts +8 -0
- package/dist/search-synonyms.js +46 -0
- package/dist/semantic-markdown.d.ts +10 -0
- package/dist/semantic-markdown.js +39 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +223 -0
- package/dist/share-images.d.ts +24 -0
- package/dist/share-images.js +187 -0
- package/dist/site-path.d.ts +2 -0
- package/dist/site-path.js +15 -0
- package/dist/sitemap.d.ts +8 -0
- package/dist/sitemap.js +58 -0
- package/dist/snippets.d.ts +19 -0
- package/dist/snippets.js +84 -0
- package/dist/structured-model-output.d.ts +6 -0
- package/dist/structured-model-output.js +21 -0
- package/dist/subject-deprecation.d.ts +21 -0
- package/dist/subject-deprecation.js +57 -0
- package/dist/surface-text.d.ts +4 -0
- package/dist/surface-text.js +42 -0
- package/dist/taxonomy.d.ts +14 -0
- package/dist/taxonomy.js +88 -0
- package/dist/turnstile.d.ts +21 -0
- package/dist/turnstile.js +52 -0
- package/dist/vale.d.ts +28 -0
- package/dist/vale.js +103 -0
- package/dist/vercel-function.d.ts +21 -0
- package/dist/vercel-function.js +108 -0
- package/dist/vercel.d.ts +11 -0
- package/dist/vercel.js +103 -0
- package/dist/walkthrough.d.ts +25 -0
- package/dist/walkthrough.js +336 -0
- package/dist/yaml-value.d.ts +2 -0
- package/dist/yaml-value.js +36 -0
- package/example-configs/api-docs/README.md +59 -0
- package/example-configs/api-docs/apis/cedar-parcel.yaml +413 -0
- package/example-configs/api-docs/content/create-enrollment.mdx +11 -0
- package/example-configs/api-docs/content/overview.mdx +36 -0
- package/example-configs/api-docs/content/quickstart.mdx +52 -0
- package/example-configs/api-docs/docs.config.yaml +104 -0
- package/example-configs/faceted-sites/README.md +31 -0
- package/example-configs/faceted-sites/base.yaml +30 -0
- package/example-configs/faceted-sites/content/api.md +12 -0
- package/example-configs/faceted-sites/content/home.md +10 -0
- package/example-configs/faceted-sites/content/operations.md +12 -0
- package/example-configs/faceted-sites/developers.config.yaml +8 -0
- package/example-configs/faceted-sites/docs.config.yaml +7 -0
- package/example-configs/faceted-sites/europe.config.yaml +9 -0
- package/example-configs/minimal/content/install.mdx +12 -0
- package/example-configs/minimal/content/welcome.mdx +8 -0
- package/example-configs/minimal/docs.config.yaml +31 -0
- package/example-configs/multilingual/content/de/home.mdx +9 -0
- package/example-configs/multilingual/content/de/reset-password.mdx +9 -0
- package/example-configs/multilingual/content/home.mdx +10 -0
- package/example-configs/multilingual/content/reset-password.mdx +12 -0
- package/example-configs/multilingual/docs.config.yaml +61 -0
- package/example-configs/multilingual/snippets/contact.mdx +1 -0
- package/example-configs/notifications/apis/notifications.yaml +132 -0
- package/example-configs/notifications/content/cookbook.mdx +17 -0
- package/example-configs/notifications/content/get-message.mdx +14 -0
- package/example-configs/notifications/content/queue-email.mdx +42 -0
- package/example-configs/notifications/content/queue-push.mdx +33 -0
- package/example-configs/notifications/content/queue-sms.mdx +33 -0
- package/example-configs/notifications/content/send-email.mdx +14 -0
- package/example-configs/notifications/content/send-push.mdx +14 -0
- package/example-configs/notifications/content/send-sms.mdx +14 -0
- package/example-configs/notifications/content/start.mdx +13 -0
- package/example-configs/notifications/content/welcome-cookbook.mdx +21 -0
- package/example-configs/notifications/content/welcome-email.mdx +82 -0
- package/example-configs/notifications/demo.mjs +43 -0
- package/example-configs/notifications/docs.config.yaml +88 -0
- package/example-configs/notifications/ingredient-drafts/README.md +41 -0
- package/example-configs/notifications/ingredient-drafts/check-delivery.mdx +13 -0
- package/example-configs/notifications/ingredient-drafts/queue-welcome-email.mdx +48 -0
- package/example-configs/notifications/ingredient-specs/queue-welcome-email.yaml +7 -0
- package/example-configs/notifications/ingredients/check-delivery.mdx +42 -0
- package/example-configs/notifications/ingredients/queue-welcome-email.mdx +37 -0
- package/example-configs/notifications/recipe-drafts/send-welcome-email.mdx +91 -0
- package/example-configs/notifications/recipe-specs/send-welcome-email.yaml +11 -0
- package/example-configs/reference-stress/README.md +32 -0
- package/example-configs/reference-stress/apis/cedar-parcel.yaml +413 -0
- package/example-configs/reference-stress/content/enrollment-shapes.mdx +16 -0
- package/example-configs/reference-stress/content/overview.mdx +14 -0
- package/example-configs/reference-stress/docs.config.yaml +55 -0
- package/example-configs/shared-preset/shared/company-docs.yaml +46 -0
- package/example-configs/shared-preset/shared/runbook.mdx +7 -0
- package/example-configs/shared-preset/site/content/failed-invoices.mdx +15 -0
- package/example-configs/shared-preset/site/content/start.mdx +9 -0
- package/example-configs/shared-preset/site/docs.config.yaml +18 -0
- package/example-configs/showcase/README.md +20 -0
- package/example-configs/showcase/apis/cedar-parcel.yaml +413 -0
- package/example-configs/showcase/content/assets/collection.svg +1 -0
- package/example-configs/showcase/content/code.mdx +100 -0
- package/example-configs/showcase/content/create-enrollment.mdx +11 -0
- package/example-configs/showcase/content/features.mdx +39 -0
- package/example-configs/showcase/content/landing.mdx +36 -0
- package/example-configs/showcase/content/overview.mdx +42 -0
- package/example-configs/showcase/content/personalization.mdx +38 -0
- package/example-configs/showcase/content/preview.mdx +35 -0
- package/example-configs/showcase/content/procedures.mdx +88 -0
- package/example-configs/showcase/content/quickstart.mdx +64 -0
- package/example-configs/showcase/content/reading.mdx +99 -0
- package/example-configs/showcase/content/verify.mdx +27 -0
- package/example-configs/showcase/content/visuals.mdx +47 -0
- package/example-configs/showcase/content/workflows.mdx +12 -0
- package/example-configs/showcase/docs.config.yaml +149 -0
- package/example-configs/showcase/snippets/sandbox.mdx +1 -0
- package/examples/analytics/README.md +56 -0
- package/examples/analytics/inspector.js +25 -0
- package/examples/analytics/posthog.js +36 -0
- package/examples/components/comparison.mjs +8 -0
- package/examples/components/components.json +6 -0
- package/examples/components/copy-text/LICENSE.react-dom.txt +21 -0
- package/examples/components/copy-text/LICENSE.react.txt +21 -0
- package/examples/components/copy-text/LICENSE.scheduler.txt +21 -0
- package/examples/components/copy-text/browser.jsx +21 -0
- package/examples/components/copy-text/components.json +6 -0
- package/examples/components/copy-text/package-lock.json +41 -0
- package/examples/components/copy-text/package.json +9 -0
- package/examples/components/copy-text/plugin.mjs +5 -0
- package/examples/components/retry-budget/LICENSE.react-dom.txt +21 -0
- package/examples/components/retry-budget/LICENSE.react.txt +21 -0
- package/examples/components/retry-budget/LICENSE.scheduler.txt +21 -0
- package/examples/components/retry-budget/browser.jsx +50 -0
- package/examples/components/retry-budget/components.json +6 -0
- package/examples/components/retry-budget/model.js +22 -0
- package/examples/components/retry-budget/package-lock.json +41 -0
- package/examples/components/retry-budget/package.json +9 -0
- package/examples/components/retry-budget/plugin.mjs +31 -0
- package/examples/components/retry-budget/policy.json +9 -0
- package/examples/components/retry-budget/style.css +25 -0
- package/examples/diagrams/d2-gallery.json +138 -0
- package/examples/diagrams/gallery.json +236 -0
- package/examples/help-drawer/README.md +44 -0
- package/examples/help-drawer/app.js +53 -0
- package/examples/help-drawer/components/components.json +1 -0
- package/examples/help-drawer/components/support.mjs +10 -0
- package/examples/help-drawer/content/account.md +8 -0
- package/examples/help-drawer/content/billing.mdx +29 -0
- package/examples/help-drawer/content/keys.mdx +46 -0
- package/examples/help-drawer/content/settings.svg +1 -0
- package/examples/help-drawer/docs.config.yaml +30 -0
- package/examples/help-drawer/index.html +26 -0
- package/examples/help-drawer/preview.mjs +33 -0
- package/examples/mcp-analytics/README.md +59 -0
- package/examples/mcp-analytics/posthog.mjs +159 -0
- package/package.json +100 -4
- package/schemas/content-export.schema.json +55 -0
- package/skills/shoalrun-author/SKILL.md +52 -0
- package/skills/shoalrun-component-author/SKILL.md +24 -0
- package/skills/shoalrun-recipes/SKILL.md +25 -0
- package/skills/shoalrun-setup/SKILL.md +34 -0
- package/skills/shoalrun-walkthrough/SKILL.md +18 -0
- package/styles/fonts/figtree-LICENSE.txt +93 -0
- package/styles/fonts/figtree-italic.woff2 +0 -0
- package/styles/fonts/figtree.woff2 +0 -0
- package/styles/fonts/inter-LICENSE.txt +93 -0
- package/styles/fonts/inter-italic.woff2 +0 -0
- package/styles/fonts/inter.woff2 +0 -0
- package/styles/fonts/jetbrains-mono-LICENSE.txt +93 -0
- package/styles/fonts/jetbrains-mono.woff2 +0 -0
- package/styles/fonts/jost-LICENSE.txt +93 -0
- package/styles/fonts/jost-italic.woff2 +0 -0
- package/styles/fonts/jost.woff2 +0 -0
- package/styles/fonts/share/figtree-400.ttf +0 -0
- package/styles/fonts/share/figtree-700.ttf +0 -0
- package/styles/fonts/share/inter-400.ttf +0 -0
- package/styles/fonts/share/inter-700.ttf +0 -0
- package/styles/fonts/share/jetbrains-mono-700.ttf +0 -0
- package/styles/fonts/share/jost-italic-800.ttf +0 -0
- package/styles/fonts/share/metrics.json +1 -0
- package/styles/fonts/share/source-serif-4-400.ttf +0 -0
- package/styles/fonts/source-serif-4-LICENSE.txt +93 -0
- package/styles/fonts/source-serif-4-italic.woff2 +0 -0
- package/styles/fonts/source-serif-4.woff2 +0 -0
- package/styles/header.css +56 -0
- package/styles/site.css +825 -0
- package/styles/themes/ledger.css +93 -0
- package/styles/themes/palettes/amethyst.yaml +127 -0
- package/styles/themes/palettes/coral.yaml +127 -0
- package/styles/themes/palettes/harbor.yaml +127 -0
- package/styles/themes/palettes/ink.yaml +127 -0
- package/styles/themes/palettes/kelp.yaml +127 -0
- package/styles/themes/palettes/vice.yaml +127 -0
- package/styles/themes/reef.css +68 -0
- package/styles/themes/vice.css +56 -0
- package/styles/tokens.css +91 -0
- package/templates/api-reference.mdx +133 -0
- package/templates/cookbook.mdx +38 -0
- package/templates/explanation.mdx +76 -0
- package/templates/guide.mdx +175 -0
- package/templates/how-to.mdx +171 -0
- package/templates/ingredient.mdx +53 -0
- package/templates/recipe.mdx +76 -0
- package/templates/reference.mdx +171 -0
- package/templates/troubleshooting.mdx +159 -0
- package/templates/tutorial.mdx +165 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: guide.theme-preview
|
|
3
|
+
title: Try a theme
|
|
4
|
+
summary: Preview every preset, palette, and color mode on this page, then copy
|
|
5
|
+
the config.
|
|
6
|
+
type: how-to
|
|
7
|
+
area: appearance
|
|
8
|
+
subarea: appearance-themes
|
|
9
|
+
canonical: /styling/try
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Try a theme
|
|
13
|
+
|
|
14
|
+
> Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
|
|
15
|
+
|
|
16
|
+
Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigation/docs-50f26fe22670.txt) (ID: docs). [All sections and pages](https://www.shoalrun.com/llms.min.txt)
|
|
17
|
+
|
|
18
|
+
Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Customize > Try a theme
|
|
19
|
+
|
|
20
|
+
**Updated: 2026-10-26.**
|
|
21
|
+
|
|
22
|
+
Pick a shape, a palette, and a mode. This page restyles itself as you choose. Scroll down to see how each option styles the sample content, then copy the config into `docs.config.yaml`.
|
|
23
|
+
|
|
24
|
+
Every preset works with every palette, in light or dark mode.
|
|
25
|
+
|
|
26
|
+
| Preset | Shape | Default palette |
|
|
27
|
+
| -------- | ----------------------------------------------------------------------------------- | --------------- |
|
|
28
|
+
| `shoal` | Flat page with a ruled sidebar and square-cornered controls. | `kelp` |
|
|
29
|
+
| `reef` | Rounded panels on a tinted page, with pill navigation and controls. | `coral` |
|
|
30
|
+
| `ledger` | Technical manual with an inked masthead, monospace headings, and numbered sections. | `ink` |
|
|
31
|
+
| `vice` | Night masthead with a sunset stripe, bold italic type, and neon rules. | `vice` |
|
|
32
|
+
|
|
33
|
+
| Palette | Colors |
|
|
34
|
+
| ---------- | --------------------------------------------------------------- |
|
|
35
|
+
| `kelp` | Sea green on white. |
|
|
36
|
+
| `coral` | Coral accent over cool blue-gray neutrals. |
|
|
37
|
+
| `ink` | Black ink on warm paper with a vermilion accent. |
|
|
38
|
+
| `harbor` | Navy ink, blue links, and a yellow callout rule. |
|
|
39
|
+
| `amethyst` | Violet accents over lavender neutrals. |
|
|
40
|
+
| `vice` | Flamingo pink and aqua by day, neon on night purple after dark. |
|
|
41
|
+
|
|
42
|
+
```yaml title="docs.config.yaml"
|
|
43
|
+
theme:
|
|
44
|
+
preset: vice
|
|
45
|
+
palette: harbor
|
|
46
|
+
mode: system
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The preview lasts until you leave the page or press **Reset**. It does not change the site for other readers. Your site's [project CSS](https://www.shoalrun.com/author/css.md) still applies on top of the preview.
|
|
50
|
+
|
|
51
|
+
## Sample content
|
|
52
|
+
|
|
53
|
+
A guide page mixes prose, [links](https://www.shoalrun.com/styling/themes.md), `inline code`, and components. Each preset styles them in its own way.
|
|
54
|
+
|
|
55
|
+
> **Tip:** Try the `vice` shape in dark mode.
|
|
56
|
+
|
|
57
|
+
### A table
|
|
58
|
+
|
|
59
|
+
Use this sample to inspect table headers, cell spacing, and inline values in the selected theme.
|
|
60
|
+
|
|
61
|
+
| Setting | Default | Values |
|
|
62
|
+
| --------- | -------------- | -------------------------------------- |
|
|
63
|
+
| `preset` | `shoal` | `shoal`, `reef`, `ledger`, `vice` |
|
|
64
|
+
| `palette` | Preset default | Any built-in name, or a custom palette |
|
|
65
|
+
| `mode` | `light` | `light`, `dark`, `system` |
|
|
66
|
+
|
|
67
|
+
### A code block
|
|
68
|
+
|
|
69
|
+
```yaml title="docs.config.yaml"
|
|
70
|
+
theme:
|
|
71
|
+
preset: reef
|
|
72
|
+
palette: amethyst
|
|
73
|
+
mode: system
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Tabs
|
|
77
|
+
|
|
78
|
+
### Light
|
|
79
|
+
|
|
80
|
+
Readers always see the light set.
|
|
81
|
+
|
|
82
|
+
### Dark
|
|
83
|
+
|
|
84
|
+
Readers always see the dark set.
|
|
85
|
+
|
|
86
|
+
### System
|
|
87
|
+
|
|
88
|
+
The site follows each reader's system setting, with an optional toggle.
|
|
89
|
+
|
|
90
|
+
## Add the previewer to a page
|
|
91
|
+
|
|
92
|
+
Place the component on its own line in any MDX page:
|
|
93
|
+
|
|
94
|
+
```mdx
|
|
95
|
+
<ThemePreview />
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The component takes no attributes. The build then publishes every preset and palette under `/assets/themes/`, so the previewer works on a static host. Sites that don't use the component don't publish those files.
|
|
99
|
+
|
|
100
|
+
Without JavaScript, and in the Markdown twin, the component shows the preset and palette tables and an example config.
|
|
101
|
+
|
|
102
|
+
## Related reading
|
|
103
|
+
|
|
104
|
+
### Related topics
|
|
105
|
+
|
|
106
|
+
- [Themes](https://www.shoalrun.com/styling/themes.md) — Preview every preset, palette, and color mode on a live page.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: guide.what-is-shoalrun
|
|
3
|
+
title: What is Shoalrun?
|
|
4
|
+
summary: A one-page introduction to Shoalrun's document-first approach, its
|
|
5
|
+
outputs, and the current prototype.
|
|
6
|
+
type: overview
|
|
7
|
+
area: project
|
|
8
|
+
subarea: project-overview
|
|
9
|
+
canonical: /what-is-shoalrun
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# What is Shoalrun?
|
|
13
|
+
|
|
14
|
+
> Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
|
|
15
|
+
|
|
16
|
+
Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigation/docs-50f26fe22670.txt) (ID: docs). [All sections and pages](https://www.shoalrun.com/llms.min.txt)
|
|
17
|
+
|
|
18
|
+
Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > What is Shoalrun?
|
|
19
|
+
|
|
20
|
+
**Updated: 2026-10-27.**
|
|
21
|
+
|
|
22
|
+
Shoalrun is a documentation compiler for product and API docs. It reads project configuration, Markdown and supported MDX pages, and optional local OpenAPI files. From those sources, it builds a site for people and readable Markdown pages for agents. The normal build is deterministic: it makes no model calls or network requests.
|
|
23
|
+
|
|
24
|
+
## Documents have an identity
|
|
25
|
+
|
|
26
|
+
In Shoalrun, a document is more than a file at a path. It has a stable ID, metadata, and relationships to other documents. Navigation, page cards, and links can refer to that ID. You can move a source file without reconnecting those parts of the site. The published URL is a separate choice: changing a page's slug changes its URL and may need a redirect.
|
|
27
|
+
|
|
28
|
+
That identity lets information connect across the site. A guide can link to an exact API operation, a related page, or a complete workflow without relying on where its source file lives.
|
|
29
|
+
|
|
30
|
+
## One source serves different readers
|
|
31
|
+
|
|
32
|
+
Shoalrun builds HTML and a Markdown twin from the same accepted content. Browser components can give people tabs, diagrams, and other ways to explore an idea; their Markdown form keeps the useful content readable without browser scripts. Authors can also write a section for just one output when people and agents need different explanations. The build publishes a document manifest and discovery files so software can find the pages and their relationships.
|
|
33
|
+
|
|
34
|
+
## Authors control the connections
|
|
35
|
+
|
|
36
|
+
Shoalrun also supports AI-assisted writing with human review. Use your existing coding agent with project guidance and checked edit tools. [Authoring tools](https://www.shoalrun.com/author/agent-overview.md) provide project-wide discovery and isolated snapshot validation for ordinary working-tree edits. You accept the content, inspect its HTML and Markdown, and decide when to publish. The normal compiler build remains independent of the models.
|
|
37
|
+
|
|
38
|
+
Project-owned YAML can define navigation, relationships, templates, and API sources in separate files. Shoalrun combines the files and can trace where a setting came from. Public builds check links and publication variants, and changes to imported OpenAPI content require a renewed review digest.
|
|
39
|
+
|
|
40
|
+
Optional ingredients, recipes, and cookbooks extend the same idea to tasks. An ingredient is a reusable action; a reviewed recipe completes one goal. A cookbook helps readers choose the complete recipes they need.
|
|
41
|
+
|
|
42
|
+
## Where it stands
|
|
43
|
+
|
|
44
|
+
The public documentation site shows output built by Shoalrun. Install the alpha CLI from npm using [Getting started](https://www.shoalrun.com/start.md). The [project status](https://www.shoalrun.com/status.md) lists implemented capabilities and current limits.
|
|
45
|
+
|
|
46
|
+
## Related reading
|
|
47
|
+
|
|
48
|
+
### Next steps
|
|
49
|
+
|
|
50
|
+
- [How Shoalrun works](https://www.shoalrun.com/concepts.md) — Follow a document through the compiler and see how IDs and routes work.
|
|
51
|
+
|
|
52
|
+
- [Getting started](https://www.shoalrun.com/start.md) — Follow the getting-started workflow if you have access to the prototype.
|
|
53
|
+
|
|
54
|
+
### Related topics
|
|
55
|
+
|
|
56
|
+
- [About Shoalrun](https://www.shoalrun.com/about.md) — Read the author's motivation and design philosophy.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// No service SDK, endpoint, storage, or transport belongs to this module.
|
|
2
|
+
// The project adapter owns initialization, consent, and delivery.
|
|
3
|
+
const source = document.querySelector('#analytics-config');
|
|
4
|
+
if (source) {
|
|
5
|
+
const page = Object.freeze(JSON.parse(source.textContent));
|
|
6
|
+
let adapter;
|
|
7
|
+
let ready = false;
|
|
8
|
+
let enabled = true;
|
|
9
|
+
const setEnabled = value => { if (typeof value === 'boolean') enabled = value; };
|
|
10
|
+
const scalar = value => typeof value === 'string' ? value.slice(0, 256)
|
|
11
|
+
: typeof value === 'boolean' || typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
12
|
+
const propertiesOf = properties => Object.fromEntries(Object.entries(properties ?? {}).slice(0, 32).flatMap(([key, value]) => {
|
|
13
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]{0,63}$/.test(key) || ['constructor', 'prototype'].includes(key)) return [];
|
|
14
|
+
const safe = Array.isArray(value) ? value.slice(0, 32).map(scalar).filter(value => value !== undefined) : scalar(value);
|
|
15
|
+
return safe === undefined ? [] : [[key, safe]];
|
|
16
|
+
}));
|
|
17
|
+
const component = element => {
|
|
18
|
+
if (!(element instanceof Element)) return {};
|
|
19
|
+
const scope = element.closest('article, .examples, .side, .page-toc, .mast') ?? document.body;
|
|
20
|
+
const heading = element.closest('article') ? [...document.querySelectorAll('article :is(h2,h3,h4)[id]')].filter(h => h.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING).at(-1) : undefined;
|
|
21
|
+
const kind = element.matches('.walkthrough') ? 'walkthrough' : element.matches('.doc-tabs') ? 'tabs' : element.matches('details') ? 'disclosure' : element.matches('.code-block') ? 'code' : 'control';
|
|
22
|
+
const selector = kind === 'walkthrough' ? '.walkthrough' : kind === 'tabs' ? '.doc-tabs' : kind === 'disclosure' ? 'details' : kind === 'code' ? '.code-block' : 'a,button,select';
|
|
23
|
+
const ordinal = [...scope.querySelectorAll(selector)].indexOf(element) + 1;
|
|
24
|
+
return { componentId: element.dataset.analyticsId || element.id || `${heading?.id ?? 'page'}:${kind}:${ordinal}`, componentType: kind, ...(heading ? { headingId: heading.id } : {}) };
|
|
25
|
+
};
|
|
26
|
+
const track = (name, properties = {}, element) => {
|
|
27
|
+
if (!ready || !enabled || typeof name !== 'string' || !/^[a-z][a-z0-9_]{0,63}$/.test(name)) return false;
|
|
28
|
+
try {
|
|
29
|
+
const event = { schemaVersion: 1, name, properties: { ...propertiesOf(properties), ...component(element), ...page } };
|
|
30
|
+
Promise.resolve(adapter.track(event)).catch(() => {});
|
|
31
|
+
return true;
|
|
32
|
+
} catch { return false; }
|
|
33
|
+
};
|
|
34
|
+
globalThis.shoalrunAnalytics = Object.freeze({ track, setEnabled, get enabled() { return ready && enabled; } });
|
|
35
|
+
|
|
36
|
+
// Links retain normal browser behavior, including keyboard and modified clicks.
|
|
37
|
+
document.addEventListener('click', event => {
|
|
38
|
+
const target = event.target instanceof Element ? event.target : null;
|
|
39
|
+
const summary = target?.closest('summary');
|
|
40
|
+
if (summary?.parentElement.matches('details.doc-collapsible, article details.doc-info-hint')) intendedDisclosures.add(summary.parentElement);
|
|
41
|
+
const anchor = target?.closest('a[href]');
|
|
42
|
+
if (!anchor || anchor.closest('.doc-tablist, .site-search-results') || anchor.matches('.heading-anchor')) return;
|
|
43
|
+
const region = anchor.closest('.section-nav, .side, .page-toc, .doc-breadcrumbs, .related-reading, .doc-card, .hero-actions, .site-footer, .mast, article, .page-formats');
|
|
44
|
+
if (!region) return;
|
|
45
|
+
let url;
|
|
46
|
+
try { url = new URL(anchor.href); } catch { return; }
|
|
47
|
+
if (!['http:', 'https:'].includes(url.protocol)) return;
|
|
48
|
+
const names = { 'section-nav': 'sections', side: 'sidebar', 'page-toc': 'toc', 'doc-breadcrumbs': 'breadcrumbs', 'related-reading': 'related', 'doc-card': 'card', 'hero-actions': 'hero', 'site-footer': 'footer', mast: 'header', 'page-formats': 'formats' };
|
|
49
|
+
const regionName = Object.entries(names).find(([className]) => region.classList.contains(className))?.[1] ?? 'content';
|
|
50
|
+
track('navigation_click', { region: regionName, targetPath: url.pathname, external: url.origin !== location.origin }, anchor);
|
|
51
|
+
});
|
|
52
|
+
const intendedDisclosures = new WeakSet();
|
|
53
|
+
document.addEventListener('toggle', event => {
|
|
54
|
+
const details = event.target;
|
|
55
|
+
if (!intendedDisclosures.has(details)) return;
|
|
56
|
+
intendedDisclosures.delete(details);
|
|
57
|
+
track('disclosure_toggle', { open: details.open }, details);
|
|
58
|
+
}, true);
|
|
59
|
+
|
|
60
|
+
// Import and init never block component scripts or normal navigation. Events
|
|
61
|
+
// before readiness or while disabled are discarded rather than queued.
|
|
62
|
+
import('./analytics-adapter.js').then(async module => {
|
|
63
|
+
if (typeof module.track !== 'function') throw new Error('Missing track export');
|
|
64
|
+
adapter = module;
|
|
65
|
+
if (module.init !== undefined) {
|
|
66
|
+
if (typeof module.init !== 'function') throw new Error('Invalid init export');
|
|
67
|
+
await module.init(Object.freeze({ page, setEnabled, track }));
|
|
68
|
+
}
|
|
69
|
+
ready = true;
|
|
70
|
+
track('page_view');
|
|
71
|
+
}).catch(() => { enabled = false; });
|
|
72
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// The chat panel: a floating "Ask" button and a dialog. `shoalrun serve --ask` injects it as a local preview that shows how each answer was
|
|
2
|
+
// made. A hosted site (`shoalrun vercel build --chat`) injects it too and publishes `/__shoalrun/chat.json`. When that file exists the panel runs
|
|
3
|
+
// as the public chat: it checks the visitor with Turnstile, shows the recording notice and any wording the site set, and shows only the answer, its sources, and
|
|
4
|
+
// warnings. It builds every node with createElement and textContent, and never assigns markup, so text from a model cannot inject HTML.
|
|
5
|
+
(async () => {
|
|
6
|
+
if (window.__shoalrunAsk) return;
|
|
7
|
+
window.__shoalrunAsk = true;
|
|
8
|
+
const scriptUrl = document.currentScript.src;
|
|
9
|
+
const endpoint = new URL('ask', scriptUrl).pathname;
|
|
10
|
+
// Public settings for a hosted chat: the Turnstile site key and the notice. A local preview has none.
|
|
11
|
+
const hosted = await fetch(new URL('chat.json', scriptUrl).pathname, { headers: { Accept: 'application/json' } }).then(response => response.ok ? response.json() : undefined).catch(() => undefined);
|
|
12
|
+
// The wording a site may change (chat.panel). A hosted chat gets it in chat.json and a local preview in window.__shoalrunPanel. Any it leaves out keeps the text below.
|
|
13
|
+
const words = { title: 'Ask the docs', placeholder: 'Ask about these docs', intro: 'Ask a question about these docs.', ...(hosted ? hosted.panel : window.__shoalrunPanel) };
|
|
14
|
+
const maxHistory = 6;
|
|
15
|
+
// Only the start of a long answer goes back as context, which keeps a follow-up request small.
|
|
16
|
+
const clip = text => text.length > 1500 ? `${text.slice(0, 1500)}…` : text;
|
|
17
|
+
|
|
18
|
+
const css = `
|
|
19
|
+
.sr-ask-button{position:fixed;right:16px;bottom:16px;z-index:2147483000;padding:10px 16px;border:1px solid var(--color-accent,#2563eb);border-radius:999px;background:var(--color-accent,#2563eb);color:var(--color-accent-contrast,#fff);font:600 14px/1 system-ui,sans-serif;cursor:pointer;box-shadow:0 2px 10px rgba(0,0,0,.25)}
|
|
20
|
+
.sr-ask-button:focus-visible,.sr-ask-panel button:focus-visible,.sr-ask-panel input:focus-visible,.sr-ask-panel a:focus-visible{outline:3px solid var(--color-accent,#2563eb);outline-offset:2px}
|
|
21
|
+
.sr-ask-panel{position:fixed;right:16px;bottom:64px;z-index:2147483000;display:flex;flex-direction:column;width:min(440px,calc(100vw - 32px));max-height:min(640px,calc(100vh - 96px));border:1px solid var(--color-border,#cbd5e1);border-radius:var(--radius-panel,12px);background:var(--color-surface,#fff);color:var(--color-ink,#0f172a);font:14px/1.5 system-ui,sans-serif;box-shadow:0 12px 40px rgba(0,0,0,.28)}
|
|
22
|
+
.sr-ask-panel[hidden]{display:none}
|
|
23
|
+
.sr-ask-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--color-border,#cbd5e1)}
|
|
24
|
+
.sr-ask-head strong{flex:1}
|
|
25
|
+
.sr-ask-tag{padding:1px 6px;border:1px solid var(--color-border,#cbd5e1);border-radius:4px;color:var(--color-muted,#475569);font-size:11px}
|
|
26
|
+
.sr-ask-panel button.sr-ask-plain{padding:4px 8px;border:1px solid var(--color-border,#cbd5e1);border-radius:6px;background:transparent;color:inherit;font:inherit;cursor:pointer}
|
|
27
|
+
.sr-ask-log{flex:1;overflow:auto;padding:12px}
|
|
28
|
+
.sr-ask-empty{color:var(--color-muted,#475569)}
|
|
29
|
+
.sr-ask-msg{margin:0 0 14px}
|
|
30
|
+
.sr-ask-you{padding:8px 10px;border-radius:8px;background:var(--color-field-surface,#f1f5f9);font-weight:600}
|
|
31
|
+
.sr-ask-msg p,.sr-ask-msg ul,.sr-ask-msg ol,.sr-ask-msg blockquote{margin:8px 0}
|
|
32
|
+
.sr-ask-msg ol{padding-left:1.6em;list-style-type:decimal}
|
|
33
|
+
.sr-ask-msg h2,.sr-ask-msg h3,.sr-ask-msg h4{margin:12px 0 4px;font-size:1.05em}
|
|
34
|
+
.sr-ask-msg blockquote{padding-left:10px;border-left:3px solid var(--color-border,#cbd5e1)}
|
|
35
|
+
.sr-ask-msg table{display:block;max-width:100%;overflow:auto;border-collapse:collapse;margin:8px 0}
|
|
36
|
+
.sr-ask-msg th,.sr-ask-msg td{padding:4px 6px;border:1px solid var(--color-border,#cbd5e1);text-align:left}
|
|
37
|
+
.sr-ask-msg pre{margin:8px 0;padding:8px 10px;overflow:auto;border-radius:6px;background:var(--color-field-surface,#f1f5f9);font:12px/1.5 var(--font-code,ui-monospace,monospace);white-space:pre}
|
|
38
|
+
.sr-ask-msg code{font-family:var(--font-code,ui-monospace,monospace);font-size:.92em}
|
|
39
|
+
.sr-ask-msg a{color:var(--color-accent,#2563eb)}
|
|
40
|
+
.sr-ask-msg .sr-cite{margin:0 1px;font-size:.8em;vertical-align:super;text-decoration:none}
|
|
41
|
+
.sr-ask-sources{margin:8px 0 0;padding:0;list-style:none;font-size:13px}
|
|
42
|
+
.sr-ask-sources li{margin:2px 0}
|
|
43
|
+
.sr-ask-meta{margin-top:8px;color:var(--color-muted,#475569);font-size:12px}
|
|
44
|
+
.sr-ask-meta summary{cursor:pointer}
|
|
45
|
+
.sr-ask-warn{margin-top:6px;padding:6px 8px;border-left:3px solid #b45309;background:var(--color-field-surface,#f1f5f9);font-size:12px}
|
|
46
|
+
.sr-ask-error{color:#b91c1c}
|
|
47
|
+
.sr-ask-form{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--color-border,#cbd5e1)}
|
|
48
|
+
.sr-ask-form input{flex:1;min-width:0;padding:8px 10px;border:1px solid var(--color-field-border,#94a3b8);border-radius:6px;background:var(--color-field-surface,#fff);color:inherit;font:inherit}
|
|
49
|
+
.sr-ask-form button{padding:8px 14px;border:1px solid var(--color-accent,#2563eb);border-radius:6px;background:var(--color-accent,#2563eb);color:var(--color-accent-contrast,#fff);font:600 14px/1 system-ui,sans-serif;cursor:pointer}
|
|
50
|
+
.sr-ask-form button:disabled{opacity:.6;cursor:progress}
|
|
51
|
+
.sr-ask-notice{margin:0;padding:8px 12px 10px;border-top:1px solid var(--color-border,#cbd5e1);color:var(--color-muted,#475569);font-size:12px;line-height:1.45}
|
|
52
|
+
.sr-ask-notice p{margin:0 0 4px}
|
|
53
|
+
.sr-ask-challenge:empty{display:none}
|
|
54
|
+
.sr-ask-challenge{padding:0 12px 8px}
|
|
55
|
+
.sr-ask-wait{display:flex;align-items:center;gap:10px;margin:0 0 14px;color:var(--color-muted,#475569)}
|
|
56
|
+
.sr-ask-dots{display:inline-flex;gap:4px;flex:none}
|
|
57
|
+
.sr-ask-dots i{display:block;width:7px;height:7px;border-radius:50%;background:var(--color-accent,#2563eb);opacity:.55}
|
|
58
|
+
@media (prefers-reduced-motion:no-preference){.sr-ask-dots i{animation:sr-ask-dot 1.2s ease-in-out infinite}.sr-ask-dots i:nth-child(2){animation-delay:.15s}.sr-ask-dots i:nth-child(3){animation-delay:.3s}}
|
|
59
|
+
@keyframes sr-ask-dot{0%,80%,100%{opacity:.25;transform:scale(.8)}40%{opacity:1;transform:scale(1.15)}}
|
|
60
|
+
@media (prefers-reduced-motion:no-preference){.sr-ask-panel{animation:sr-ask-in .12s ease-out}}
|
|
61
|
+
@keyframes sr-ask-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
const el = (tag, attributes = {}, ...children) => {
|
|
65
|
+
const node = document.createElement(tag);
|
|
66
|
+
for (const [name, value] of Object.entries(attributes)) {
|
|
67
|
+
if (value === undefined || value === false) continue;
|
|
68
|
+
if (name === 'text') node.textContent = value;
|
|
69
|
+
else node.setAttribute(name, value === true ? '' : value);
|
|
70
|
+
}
|
|
71
|
+
for (const child of children) node.append(child);
|
|
72
|
+
return node;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Only same-site paths become links. A source URL that is anything else is shown as plain text.
|
|
76
|
+
const safeHref = url => typeof url === 'string' && url.startsWith('/') && !url.startsWith('//') ? url : undefined;
|
|
77
|
+
|
|
78
|
+
const inline = (parent, text, sources) => {
|
|
79
|
+
for (const piece of text.split(/(`[^`\n]+`|\*\*[^*\n]+\*\*|\*[^*\n]+\*|\[[^\]\n]+\]\([^\s)]+\)|(?:\[\d+\])+)/)) {
|
|
80
|
+
if (!piece) continue;
|
|
81
|
+
if (piece.startsWith('`') && piece.endsWith('`') && piece.length > 2) parent.append(el('code', { text: piece.slice(1, -1) }));
|
|
82
|
+
else if (piece.startsWith('**') && piece.endsWith('**') && piece.length > 4) parent.append(el('strong', { text: piece.slice(2, -2) }));
|
|
83
|
+
else if (piece.startsWith('*') && piece.endsWith('*') && piece.length > 2) parent.append(el('em', { text: piece.slice(1, -1) }));
|
|
84
|
+
else if (/^\[[^\]\n]+\]\([^\s)]+\)$/.test(piece)) {
|
|
85
|
+
const match = /^\[([^\]]+)\]\(([^)]+)\)$/.exec(piece);
|
|
86
|
+
const href = safeHref(match[2]);
|
|
87
|
+
parent.append(href ? el('a', { href, text: match[1] }) : document.createTextNode(match[1]));
|
|
88
|
+
}
|
|
89
|
+
else if (/^(?:\[\d+\])+$/.test(piece)) {
|
|
90
|
+
for (const match of piece.matchAll(/\[(\d+)\]/g)) {
|
|
91
|
+
const source = sources.find(item => item.number === Number(match[1]));
|
|
92
|
+
const href = source && safeHref(source.url);
|
|
93
|
+
parent.append(href ? el('a', { class: 'sr-cite', href, title: source.title, text: `[${match[1]}]` }) : document.createTextNode(`[${match[1]}]`));
|
|
94
|
+
}
|
|
95
|
+
} else parent.append(document.createTextNode(piece));
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// A refusal lists the closest pages as "- Title: /path". With `pages` set, a same-site path in such a line becomes a link.
|
|
100
|
+
const listItem = (line, sources, pages) => {
|
|
101
|
+
const item = el('li');
|
|
102
|
+
const text = line.replace(/^\s*(\d+[.)]|[-*])\s+/, '');
|
|
103
|
+
const page = pages && text.match(/^(.+?): (\/\S*)$/);
|
|
104
|
+
if (page && safeHref(page[2])) item.append(el('a', { href: page[2], text: page[1] }));
|
|
105
|
+
else inline(item, text, sources);
|
|
106
|
+
return item;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const render = (parent, text, sources, pages) => {
|
|
110
|
+
const lists = [];
|
|
111
|
+
const indentOf = line => (line.match(/^[ \t]*/)?.[0] ?? '').replace(/\t/g, ' ').length;
|
|
112
|
+
const appendBlock = (node, indent, code = false) => {
|
|
113
|
+
const current = lists.at(-1);
|
|
114
|
+
if (current?.item && (indent > current.indent || code && current.item.textContent.replace(/\[\d+\]/g, '').trim().endsWith(':'))) current.item.append(node);
|
|
115
|
+
else { lists.length = 0; parent.append(node); }
|
|
116
|
+
};
|
|
117
|
+
for (const part of text.split(/((?:^[ \t]*)?```[\s\S]*?```)/m)) {
|
|
118
|
+
if (!part.trim()) continue;
|
|
119
|
+
if (part.trimStart().startsWith('```')) {
|
|
120
|
+
const indent = indentOf(part);
|
|
121
|
+
let code = part.replace(/^[ \t]*```[^\n]*\n?/, '').replace(/\n?[ \t]*```$/, '');
|
|
122
|
+
if (indent) code = code.replace(new RegExp('^ {0,' + indent + '}', 'gm'), '');
|
|
123
|
+
appendBlock(el('pre', {}, el('code', { text: code })), indent, true); continue;
|
|
124
|
+
}
|
|
125
|
+
for (const block of part.split(/\n{2,}/)) {
|
|
126
|
+
const heading = /^(#{1,6})\s+(.+)$/.exec(block.trim());
|
|
127
|
+
if (heading && !block.trim().includes('\n')) { const node = el(`h${Math.max(2, heading[1].length)}`); inline(node, heading[2], sources); appendBlock(node, indentOf(block)); continue; }
|
|
128
|
+
if (/^>\s?/.test(block.trim())) { const quote = el('blockquote'); render(quote, block.replace(/^>\s?/gm, ''), sources, pages); appendBlock(quote, indentOf(block)); continue; }
|
|
129
|
+
if (/^\|.+\|\s*\n\|?\s*:?-{3,}/.test(block.trim())) {
|
|
130
|
+
const rows = block.trim().split('\n').map(line => line.replace(/^\||\|$/g, '').split('|').map(cell => cell.trim()));
|
|
131
|
+
const table = el('table');
|
|
132
|
+
for (const [index, cells] of rows.entries()) { if (index === 1) continue; const row = el('tr'); for (const cell of cells) { const node = el(index === 0 ? 'th' : 'td'); inline(node, cell, sources); row.append(node); } table.append(row); }
|
|
133
|
+
appendBlock(table, indentOf(block)); continue;
|
|
134
|
+
}
|
|
135
|
+
// A block can mix kinds, such as a sentence that introduces a list, so it is cut into runs of one kind each.
|
|
136
|
+
const kind = line => /^\s*#{1,6}\s+/.test(line) ? 'heading' : /^\s*\d+[.)]\s+/.test(line) ? 'ol' : /^\s*[-*]\s+/.test(line) ? 'ul' : 'p';
|
|
137
|
+
const runs = [];
|
|
138
|
+
for (const line of block.split('\n').filter(line => line.trim())) {
|
|
139
|
+
const type = kind(line);
|
|
140
|
+
if (runs.length && runs.at(-1).type === type) runs.at(-1).lines.push(line);
|
|
141
|
+
else runs.push({ type, lines: [line] });
|
|
142
|
+
}
|
|
143
|
+
for (const { type, lines } of runs) {
|
|
144
|
+
if (type === 'heading') { for (const line of lines) { const match = /^\s*(#{1,6})\s+(.+)$/.exec(line); const heading = el(`h${Math.max(2, match[1].length)}`); inline(heading, match[2], sources); appendBlock(heading, indentOf(line)); } continue; }
|
|
145
|
+
if (type === 'p') { const paragraph = el('p'); inline(paragraph, lines.join(' '), sources); appendBlock(paragraph, indentOf(lines[0])); continue; }
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
const indent = indentOf(line);
|
|
148
|
+
while (lists.length && (lists.at(-1).indent > indent || lists.at(-1).indent === indent && lists.at(-1).type !== type)) lists.pop();
|
|
149
|
+
let current = lists.at(-1);
|
|
150
|
+
if (!current || current.indent < indent) {
|
|
151
|
+
const start = type === 'ol' ? Number(line.match(/^\s*(\d+)[.)]/)[1]) : undefined;
|
|
152
|
+
const list = el(type, start === undefined ? {} : { start: String(start) });
|
|
153
|
+
(current?.item ?? parent).append(list);
|
|
154
|
+
current = { type, indent, list, item: null }; lists.push(current);
|
|
155
|
+
}
|
|
156
|
+
current.item = listItem(line, sources, pages); current.list.append(current.item);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const style = el('style', { text: css });
|
|
164
|
+
const button = el('button', { class: 'sr-ask-button', type: 'button', 'aria-expanded': 'false', 'aria-controls': 'sr-ask-panel', text: 'Ask' });
|
|
165
|
+
const log = el('div', { class: 'sr-ask-log', role: 'log', 'aria-live': 'polite', 'aria-label': 'Conversation' });
|
|
166
|
+
const input = el('input', { type: 'text', id: 'sr-ask-input', autocomplete: 'off', maxlength: '500', placeholder: words.placeholder, 'aria-label': 'Your question' });
|
|
167
|
+
const send = el('button', { type: 'submit', text: 'Send' });
|
|
168
|
+
const reset = el('button', { class: 'sr-ask-plain', type: 'button', text: 'New chat' });
|
|
169
|
+
const close = el('button', { class: 'sr-ask-plain', type: 'button', 'aria-label': 'Close', text: 'Close' });
|
|
170
|
+
const form = el('form', { class: 'sr-ask-form' }, input, send);
|
|
171
|
+
// Turnstile draws here only when a visitor has to do something. Otherwise the box stays empty and hidden.
|
|
172
|
+
const challengeBox = el('div', { class: 'sr-ask-challenge' });
|
|
173
|
+
const notice = el('div', { class: 'sr-ask-notice' }, ...(hosted?.notice ? [el('p', { text: hosted.notice })] : []), el('p', { text: 'Answers are written by an AI from these docs and can be wrong. Check the pages they cite.' }));
|
|
174
|
+
const panel = el('section', { class: 'sr-ask-panel', id: 'sr-ask-panel', role: 'dialog', 'aria-label': words.title, hidden: true }, el('div', { class: 'sr-ask-head' }, el('strong', { text: words.title }), el('span', { class: 'sr-ask-tag', text: hosted ? 'beta' : 'local preview' }), reset, close), log, ...(hosted ? [challengeBox] : []), form, ...(hosted ? [notice] : []));
|
|
175
|
+
let history = [];
|
|
176
|
+
let busy = false;
|
|
177
|
+
|
|
178
|
+
const intro = () => { log.replaceChildren(el('p', { class: 'sr-ask-empty', text: words.intro })); };
|
|
179
|
+
const open = value => {
|
|
180
|
+
panel.hidden = !value;
|
|
181
|
+
button.setAttribute('aria-expanded', String(value));
|
|
182
|
+
// In adaptive mode nobody is checked until the server asks. Only `always` mode checks ahead of the first question.
|
|
183
|
+
if (value) { input.focus(); if (hosted?.prewarm) warm(); } else button.focus();
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const show = (question, data, failure) => {
|
|
187
|
+
const message = el('div', { class: 'sr-ask-msg' });
|
|
188
|
+
if (failure) message.append(el('p', { class: 'sr-ask-error', role: 'alert', text: failure }));
|
|
189
|
+
else {
|
|
190
|
+
render(message, data.answer, data.sources ?? [], data.decision === 'declined' || data.decision === 'search');
|
|
191
|
+
// A search-only answer already lists its pages as links in the text, so a second list of them would repeat it.
|
|
192
|
+
if (data.sources?.length && data.decision !== 'search') {
|
|
193
|
+
const list = el('ul', { class: 'sr-ask-sources', 'aria-label': 'Sources' });
|
|
194
|
+
for (const source of data.sources) {
|
|
195
|
+
const href = safeHref(source.url);
|
|
196
|
+
const label = `[${source.number}] ${source.title}${source.heading ? ` > ${source.heading}` : ''}`;
|
|
197
|
+
list.append(el('li', {}, href ? el('a', { href, text: label }) : document.createTextNode(label)));
|
|
198
|
+
}
|
|
199
|
+
message.append(list);
|
|
200
|
+
}
|
|
201
|
+
for (const warning of [...(data.uncited ? ['This answer cites no source. Check it against the docs.'] : []), ...(data.unsupportedCode?.length ? [`Code that is not in the docs: ${data.unsupportedCode.join(' | ')}`] : []), ...((data.unsupportedClaims ?? []).map(claim => `Not supported by the docs it cites: ${claim.text}`))]) message.append(el('div', { class: 'sr-ask-warn', role: 'note', text: warning }));
|
|
202
|
+
if (hosted && data.deletionReceipt) {
|
|
203
|
+
const remove = el('button', { class: 'sr-ask-plain', type: 'button', text: 'Delete logged question' });
|
|
204
|
+
const state = el('span', { role: 'status' });
|
|
205
|
+
remove.addEventListener('click', async () => {
|
|
206
|
+
remove.disabled = true;
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetch(endpoint, { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ receipt: data.deletionReceipt }) });
|
|
209
|
+
const reply = await response.json();
|
|
210
|
+
state.textContent = response.ok ? (reply.deleted ? 'Logged question deleted.' : 'This logged question is no longer stored.') : 'Could not delete it. Try again.';
|
|
211
|
+
if (!response.ok) remove.disabled = false;
|
|
212
|
+
} catch { state.textContent = 'Could not delete it. Try again.'; remove.disabled = false; }
|
|
213
|
+
});
|
|
214
|
+
message.append(el('div', { class: 'sr-ask-meta' }, remove, state, el('details', {}, el('summary', { text: 'Deletion code for a later request' }), el('code', { text: data.deletionReceipt }))));
|
|
215
|
+
}
|
|
216
|
+
if (!hosted) {
|
|
217
|
+
const facts = [data.mode, data.cached ? 'from the answer cache' : undefined, data.decision === 'excerpt' ? 'excerpt, no model used' : data.decision === 'search' ? 'search only, no model used' : data.decision, data.jevBest !== undefined ? `Jev ${data.jevBest.toFixed(2)}` : undefined, `${data.usage?.chatCalls ?? 0} model call${data.usage?.chatCalls === 1 ? '' : 's'}`, data.usage ? `${data.usage.promptTokens} in / ${data.usage.completionTokens} out tokens` : undefined, data.verified ? 'claims checked' : undefined, data.routing?.escalated ? `escalated to ${data.routing.escalated.to}` : data.routing?.failed?.length ? `answered by ${data.routing.answeredBy} after ${data.routing.failed.length} failed` : undefined, data.timings ? `${((data.timings.rewriteMs + data.timings.retrieveMs + data.timings.rerankMs + data.timings.answerMs + (data.timings.verifyMs ?? 0)) / 1000).toFixed(1)}s` : undefined].filter(Boolean).join(' · ');
|
|
218
|
+
const details = el('details', { class: 'sr-ask-meta' }, el('summary', { text: 'How this answer was made' }), el('div', { text: facts }));
|
|
219
|
+
if (data.standalone) details.append(el('div', { text: `Searched for: ${data.standalone}` }));
|
|
220
|
+
for (const note of data.notes ?? []) details.append(el('div', { text: `Note: ${note}` }));
|
|
221
|
+
message.append(details);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
log.append(message);
|
|
225
|
+
log.scrollTop = log.scrollHeight;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// Turnstile. A token works once, so each question gets its own: the widget is reset and run again before every send.
|
|
229
|
+
let loading;
|
|
230
|
+
let widget;
|
|
231
|
+
let waiter;
|
|
232
|
+
const loadTurnstile = () => loading ??= new Promise((resolve, reject) => {
|
|
233
|
+
if (window.turnstile) { resolve(window.turnstile); return; }
|
|
234
|
+
const script = el('script', { src: 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit', async: true, defer: true });
|
|
235
|
+
script.addEventListener('load', () => resolve(window.turnstile));
|
|
236
|
+
script.addEventListener('error', () => { loading = undefined; reject(new Error('The check could not load.')); });
|
|
237
|
+
document.head.append(script);
|
|
238
|
+
});
|
|
239
|
+
const checkVisitor = async () => {
|
|
240
|
+
const turnstile = await loadTurnstile();
|
|
241
|
+
if (widget === undefined) widget = turnstile.render(challengeBox, { sitekey: hosted.siteKey, appearance: 'interaction-only', execution: 'execute', callback: token => waiter?.resolve(token), 'error-callback': () => waiter?.reject(new Error('The check did not pass.')) });
|
|
242
|
+
else turnstile.reset(widget);
|
|
243
|
+
return new Promise((resolve, reject) => {
|
|
244
|
+
const timer = setTimeout(() => reject(new Error('The check timed out.')), 30000);
|
|
245
|
+
waiter = { resolve: token => { clearTimeout(timer); resolve(token); }, reject: error => { clearTimeout(timer); reject(error); } };
|
|
246
|
+
turnstile.execute(widget);
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// By default nobody is checked until the server asks. Then one check runs and the same question is sent again, and the server gives the browser a
|
|
251
|
+
// short-lived pass, so follow-ups need no token. With `prewarm` set, the check runs in the background when the panel opens instead.
|
|
252
|
+
let verified = false;
|
|
253
|
+
let warmed;
|
|
254
|
+
const warm = () => { if (hosted?.siteKey && !verified && !warmed) warmed = checkVisitor().then(token => ({ token, at: Date.now() }), () => undefined); };
|
|
255
|
+
const takeToken = async () => {
|
|
256
|
+
const ready = warmed && await warmed;
|
|
257
|
+
warmed = undefined;
|
|
258
|
+
// A token is good for a few minutes. An old one is not worth sending.
|
|
259
|
+
return ready && Date.now() - ready.at < 240000 ? ready.token : checkVisitor();
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const ask = async question => {
|
|
263
|
+
busy = true; send.disabled = true; log.setAttribute('aria-busy', 'true');
|
|
264
|
+
if (log.querySelector('.sr-ask-empty')) log.replaceChildren();
|
|
265
|
+
log.append(el('div', { class: 'sr-ask-msg sr-ask-you', text: question }));
|
|
266
|
+
// Shown while the server works. The dots are decoration and are hidden from screen readers, which hear the words instead. The words
|
|
267
|
+
// change at most a few times, so a screen reader is not read a running commentary.
|
|
268
|
+
const status = el('span', { text: hosted?.siteKey && hosted.prewarm ? 'Checking that you are a person…' : 'Looking through the docs…' });
|
|
269
|
+
const waiting = el('div', { class: 'sr-ask-wait', role: 'status' }, el('span', { class: 'sr-ask-dots', 'aria-hidden': 'true' }, el('i'), el('i'), el('i')), status);
|
|
270
|
+
let later = [];
|
|
271
|
+
log.append(waiting);
|
|
272
|
+
log.scrollTop = log.scrollHeight;
|
|
273
|
+
try {
|
|
274
|
+
const post = token => fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ question, history, ...(token ? { turnstileToken: token } : {}) }) });
|
|
275
|
+
let token;
|
|
276
|
+
if (hosted?.siteKey && hosted.prewarm && !verified) {
|
|
277
|
+
try { token = await takeToken(); }
|
|
278
|
+
catch { waiting.remove(); show(question, undefined, 'The check did not pass. Reload the page and try again.'); return; }
|
|
279
|
+
status.textContent = 'Looking through the docs…';
|
|
280
|
+
}
|
|
281
|
+
const statusDelays = window.__shoalrunAskStatusDelays ?? [3000, 10000, 25000];
|
|
282
|
+
later = [setTimeout(() => { status.textContent = 'Writing an answer…'; }, statusDelays[0]), setTimeout(() => { status.textContent = 'Still working. Longer answers can take a few seconds.'; }, statusDelays[1]), setTimeout(() => { status.textContent = 'Taking longer than usual. A second check may be running.'; }, statusDelays[2])];
|
|
283
|
+
let response = await post(token);
|
|
284
|
+
let data = await response.json().catch(() => ({}));
|
|
285
|
+
if (response.status === 403 && data.challenge && hosted?.siteKey && !token) {
|
|
286
|
+
// The pass expired or was refused. Check again and send the same question once more.
|
|
287
|
+
verified = false;
|
|
288
|
+
status.textContent = 'Checking that you are a person…';
|
|
289
|
+
try { token = await checkVisitor(); }
|
|
290
|
+
catch { waiting.remove(); show(question, undefined, 'The check did not pass. Reload the page and try again.'); return; }
|
|
291
|
+
status.textContent = 'Looking through the docs…';
|
|
292
|
+
response = await post(token);
|
|
293
|
+
data = await response.json().catch(() => ({}));
|
|
294
|
+
}
|
|
295
|
+
if (response.ok && hosted?.siteKey) verified = true;
|
|
296
|
+
waiting.remove();
|
|
297
|
+
if (!response.ok) show(question, undefined, data.error ?? `The request failed (${response.status}).`);
|
|
298
|
+
else { show(question, data); history = [...history, { role: 'user', content: question }, { role: 'assistant', content: clip(data.answer) }].slice(-maxHistory); }
|
|
299
|
+
} catch {
|
|
300
|
+
waiting.remove();
|
|
301
|
+
show(question, undefined, hosted ? 'Could not reach the chat. Check your connection and try again.' : 'Could not reach the local server.');
|
|
302
|
+
} finally { later.forEach(clearTimeout); busy = false; send.disabled = false; log.removeAttribute('aria-busy'); input.focus(); }
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
form.addEventListener('submit', event => {
|
|
306
|
+
event.preventDefault();
|
|
307
|
+
const question = input.value.trim();
|
|
308
|
+
if (!question || busy) return;
|
|
309
|
+
input.value = '';
|
|
310
|
+
ask(question);
|
|
311
|
+
});
|
|
312
|
+
reset.addEventListener('click', () => { history = []; intro(); input.focus(); });
|
|
313
|
+
close.addEventListener('click', () => open(false));
|
|
314
|
+
button.addEventListener('click', () => open(panel.hidden));
|
|
315
|
+
panel.addEventListener('keydown', event => { if (event.key === 'Escape') { event.stopPropagation(); open(false); } });
|
|
316
|
+
|
|
317
|
+
intro();
|
|
318
|
+
document.head.append(style);
|
|
319
|
+
document.body.append(button, panel);
|
|
320
|
+
})();
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Language switcher for API request samples. The build renders every language and
|
|
2
|
+
// leaves only the first (cURL) visible; this reveals the selector, switches the
|
|
3
|
+
// visible sample, and remembers the reader's choice across pages. Without
|
|
4
|
+
// JavaScript the cURL sample stays visible, matching the Markdown twin.
|
|
5
|
+
const key = 'shoalrun-code-language';
|
|
6
|
+
const read = () => { try { return localStorage.getItem(key); } catch { return null; } };
|
|
7
|
+
const write = value => { try { localStorage.setItem(key, value); } catch { /* storage may be blocked */ } };
|
|
8
|
+
const widgets = [...document.querySelectorAll('[data-code-samples]')];
|
|
9
|
+
|
|
10
|
+
if (widgets.length) {
|
|
11
|
+
const apply = value => {
|
|
12
|
+
if (!value) return;
|
|
13
|
+
for (const widget of widgets) {
|
|
14
|
+
const panes = [...widget.querySelectorAll('[data-code-language]')];
|
|
15
|
+
const chosen = panes.some(pane => pane.dataset.codeLanguage === value) ? value : panes[0]?.dataset.codeLanguage;
|
|
16
|
+
for (const pane of panes) pane.hidden = pane.dataset.codeLanguage !== chosen;
|
|
17
|
+
const select = widget.querySelector('select');
|
|
18
|
+
if (select) select.value = chosen;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
apply(read());
|
|
22
|
+
for (const widget of widgets) {
|
|
23
|
+
const select = widget.querySelector('select');
|
|
24
|
+
if (!select || widget.querySelectorAll('[data-code-language]').length < 2) continue;
|
|
25
|
+
select.hidden = false;
|
|
26
|
+
select.addEventListener('change', () => { apply(select.value); write(select.value); });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Progressive enhancement: the complete shared content remains independent of
|
|
2
|
+
// the browser module. Each root gets its own controls slot and failure boundary.
|
|
3
|
+
const styles = new Map();
|
|
4
|
+
function stylesheet(url) {
|
|
5
|
+
if (!styles.has(url)) styles.set(url, new Promise((resolve, reject) => {
|
|
6
|
+
const link = document.createElement('link');
|
|
7
|
+
link.rel = 'stylesheet'; link.href = url;
|
|
8
|
+
link.onload = resolve; link.onerror = () => reject(new Error(`Cannot load component stylesheet: ${url}`));
|
|
9
|
+
document.head.append(link);
|
|
10
|
+
}));
|
|
11
|
+
return styles.get(url);
|
|
12
|
+
}
|
|
13
|
+
for (const root of document.querySelectorAll('[data-component-module]')) {
|
|
14
|
+
const controls = root.querySelector(':scope > [data-component-controls]');
|
|
15
|
+
const content = root.querySelector(':scope > [data-component-content]');
|
|
16
|
+
void (async () => {
|
|
17
|
+
try {
|
|
18
|
+
const [module] = await Promise.all([
|
|
19
|
+
import(root.dataset.componentModule),
|
|
20
|
+
...JSON.parse(root.dataset.componentStyles || '[]').map(stylesheet)
|
|
21
|
+
]);
|
|
22
|
+
if (typeof module.enhance !== 'function') throw new Error('Browser component module must export enhance');
|
|
23
|
+
await module.enhance({ root, controls, content, data: JSON.parse(root.dataset.componentData) });
|
|
24
|
+
root.dataset.componentReady = 'true';
|
|
25
|
+
} catch (error) {
|
|
26
|
+
controls.hidden = true;
|
|
27
|
+
content.hidden = false;
|
|
28
|
+
root.dataset.componentReady = 'failed';
|
|
29
|
+
console.error(`Cannot enhance ${root.dataset.shoalrunComponent}:`, error);
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
}
|