@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.
Files changed (1011) hide show
  1. package/AUTHORING.md +269 -0
  2. package/CHANGELOG.md +82 -0
  3. package/LICENSE +202 -0
  4. package/README.md +189 -2
  5. package/agent-docs/.well-known/shoalrun/navigation/changelog-tab-50f26fe22670.txt +33 -0
  6. package/agent-docs/.well-known/shoalrun/navigation/docs-50f26fe22670.txt +24 -0
  7. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +9 -0
  8. package/agent-docs/SNAPSHOT.json +9 -0
  9. package/agent-docs/about.md +49 -0
  10. package/agent-docs/api-docs/focused-contracts.md +68 -0
  11. package/agent-docs/api-docs/generate.md +189 -0
  12. package/agent-docs/api-docs/generate.sections/add-useful-examples.md +47 -0
  13. package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +50 -0
  14. package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +52 -0
  15. package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +71 -0
  16. package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +48 -0
  17. package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +52 -0
  18. package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +60 -0
  19. package/agent-docs/api-docs/generate.sections/related-reading.md +38 -0
  20. package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +45 -0
  21. package/agent-docs/api-docs/support.md +97 -0
  22. package/agent-docs/author/add-page.md +124 -0
  23. package/agent-docs/author/agent-overview.md +59 -0
  24. package/agent-docs/author/agent-workflow.md +65 -0
  25. package/agent-docs/author/agents.md +53 -0
  26. package/agent-docs/author/analytics.md +286 -0
  27. package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +51 -0
  28. package/agent-docs/author/analytics.sections/built-in-events.md +52 -0
  29. package/agent-docs/author/analytics.sections/configure-an-adapter.md +51 -0
  30. package/agent-docs/author/analytics.sections/custom-interactions.md +57 -0
  31. package/agent-docs/author/analytics.sections/event-format.md +59 -0
  32. package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +42 -0
  33. package/agent-docs/author/analytics.sections/inspect-events-locally.md +36 -0
  34. package/agent-docs/author/analytics.sections/map-events-to-your-service.md +42 -0
  35. package/agent-docs/author/analytics.sections/posthog-example.md +126 -0
  36. package/agent-docs/author/analytics.sections/related-reading.md +42 -0
  37. package/agent-docs/author/authoring-agent.md +102 -0
  38. package/agent-docs/author/coding-agent.md +90 -0
  39. package/agent-docs/author/components/action-link.md +41 -0
  40. package/agent-docs/author/components/api-embeds.md +263 -0
  41. package/agent-docs/author/components/api-embeds.sections/apiexample.md +117 -0
  42. package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +37 -0
  43. package/agent-docs/author/components/api-embeds.sections/related-reading.md +37 -0
  44. package/agent-docs/author/components/badge.md +76 -0
  45. package/agent-docs/author/components/breadcrumbs.md +57 -0
  46. package/agent-docs/author/components/callout.md +131 -0
  47. package/agent-docs/author/components/cards.md +168 -0
  48. package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +50 -0
  49. package/agent-docs/author/components/cards.sections/build-a-collection.md +69 -0
  50. package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +66 -0
  51. package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +37 -0
  52. package/agent-docs/author/components/cards.sections/link-to-one-document.md +45 -0
  53. package/agent-docs/author/components/cards.sections/override-card-text.md +58 -0
  54. package/agent-docs/author/components/cards.sections/related-reading.md +43 -0
  55. package/agent-docs/author/components/code-blocks.md +117 -0
  56. package/agent-docs/author/components/collapsible.md +99 -0
  57. package/agent-docs/author/components/cookbook-chooser.md +86 -0
  58. package/agent-docs/author/components/custom/react.md +190 -0
  59. package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +36 -0
  60. package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +88 -0
  61. package/agent-docs/author/components/custom/react.sections/registration.md +41 -0
  62. package/agent-docs/author/components/custom/react.sections/related-reading.md +30 -0
  63. package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +47 -0
  64. package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +100 -0
  65. package/agent-docs/author/components/custom.md +183 -0
  66. package/agent-docs/author/components/definition-list.md +54 -0
  67. package/agent-docs/author/components/diagrams/d2-gallery.md +861 -0
  68. package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +163 -0
  69. package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +375 -0
  70. package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +33 -0
  71. package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +169 -0
  72. package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +37 -0
  73. package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +123 -0
  74. package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +125 -0
  75. package/agent-docs/author/components/diagrams/pele-gallery.md +1317 -0
  76. package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +341 -0
  77. package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +269 -0
  78. package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +273 -0
  79. package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +31 -0
  80. package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +35 -0
  81. package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +229 -0
  82. package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +291 -0
  83. package/agent-docs/author/components/diagrams.md +155 -0
  84. package/agent-docs/author/components/doc-link.md +58 -0
  85. package/agent-docs/author/components/fields.md +121 -0
  86. package/agent-docs/author/components/file-tree.md +84 -0
  87. package/agent-docs/author/components/images.md +103 -0
  88. package/agent-docs/author/components/info-hint.md +61 -0
  89. package/agent-docs/author/components/kbd.md +45 -0
  90. package/agent-docs/author/components/math.md +39 -0
  91. package/agent-docs/author/components/only.md +65 -0
  92. package/agent-docs/author/components/progress.md +53 -0
  93. package/agent-docs/author/components/related-reading.md +48 -0
  94. package/agent-docs/author/components/steps.md +121 -0
  95. package/agent-docs/author/components/tables.md +64 -0
  96. package/agent-docs/author/components/tabs.md +129 -0
  97. package/agent-docs/author/components/timeline.md +74 -0
  98. package/agent-docs/author/components/tooltips.md +58 -0
  99. package/agent-docs/author/components/walkthroughs.md +390 -0
  100. package/agent-docs/author/components/walkthroughs.sections/attributes.md +45 -0
  101. package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +133 -0
  102. package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +141 -0
  103. package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +126 -0
  104. package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +38 -0
  105. package/agent-docs/author/components/walkthroughs.sections/related-reading.md +36 -0
  106. package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +53 -0
  107. package/agent-docs/author/components.md +78 -0
  108. package/agent-docs/author/content.md +74 -0
  109. package/agent-docs/author/cookbooks.md +119 -0
  110. package/agent-docs/author/css.md +238 -0
  111. package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +70 -0
  112. package/agent-docs/author/css.sections/core-color-tokens.md +71 -0
  113. package/agent-docs/author/css.sections/page-attributes.md +69 -0
  114. package/agent-docs/author/css.sections/page-transitions.md +60 -0
  115. package/agent-docs/author/css.sections/responsive-behavior.md +58 -0
  116. package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +89 -0
  117. package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +71 -0
  118. package/agent-docs/author/custom-metadata.md +177 -0
  119. package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +68 -0
  120. package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +54 -0
  121. package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +33 -0
  122. package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +57 -0
  123. package/agent-docs/author/custom-metadata.sections/related-reading.md +29 -0
  124. package/agent-docs/author/design-templates.md +49 -0
  125. package/agent-docs/author/design-writing-guides.md +73 -0
  126. package/agent-docs/author/frontmatter-reference.md +146 -0
  127. package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +44 -0
  128. package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +41 -0
  129. package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +31 -0
  130. package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +40 -0
  131. package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +37 -0
  132. package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +41 -0
  133. package/agent-docs/author/frontmatter-reference.sections/related-reading.md +35 -0
  134. package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +33 -0
  135. package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +31 -0
  136. package/agent-docs/author/frontmatter.md +255 -0
  137. package/agent-docs/author/frontmatter.sections/audience-badges.md +66 -0
  138. package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +88 -0
  139. package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +75 -0
  140. package/agent-docs/author/frontmatter.sections/optional-native-fields.md +90 -0
  141. package/agent-docs/author/frontmatter.sections/publication-fields.md +85 -0
  142. package/agent-docs/author/frontmatter.sections/publishing-policy.md +71 -0
  143. package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +72 -0
  144. package/agent-docs/author/frontmatter.sections/related-reading.md +72 -0
  145. package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +84 -0
  146. package/agent-docs/author/frontmatter.sections/seo-fields.md +79 -0
  147. package/agent-docs/author/frontmatter.sections/validation-rules.md +75 -0
  148. package/agent-docs/author/markdown-metadata.md +207 -0
  149. package/agent-docs/author/navigation.md +269 -0
  150. package/agent-docs/author/navigation.sections/arrange-authored-pages.md +58 -0
  151. package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +48 -0
  152. package/agent-docs/author/navigation.sections/hide-group-page-counts.md +45 -0
  153. package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +40 -0
  154. package/agent-docs/author/navigation.sections/local-api-preview.md +47 -0
  155. package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +65 -0
  156. package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +97 -0
  157. package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +38 -0
  158. package/agent-docs/author/navigation.sections/related-reading.md +44 -0
  159. package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +67 -0
  160. package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +42 -0
  161. package/agent-docs/author/reader-views.md +200 -0
  162. package/agent-docs/author/reader-views.sections/configure-the-choices.md +65 -0
  163. package/agent-docs/author/reader-views.sections/connect-your-own-control.md +59 -0
  164. package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +41 -0
  165. package/agent-docs/author/reader-views.sections/mark-pages.md +49 -0
  166. package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +49 -0
  167. package/agent-docs/author/reader-views.sections/place-filter-controls.md +43 -0
  168. package/agent-docs/author/reader-views.sections/try-the-controls-here.md +64 -0
  169. package/agent-docs/author/recipe-drafts.md +181 -0
  170. package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +82 -0
  171. package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +60 -0
  172. package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +55 -0
  173. package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +66 -0
  174. package/agent-docs/author/recipe-drafts.sections/related-reading.md +45 -0
  175. package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +50 -0
  176. package/agent-docs/author/recipes.md +127 -0
  177. package/agent-docs/author/recipes.sections/how-agents-use-this.md +50 -0
  178. package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +64 -0
  179. package/agent-docs/author/recipes.sections/related-reading.md +36 -0
  180. package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +42 -0
  181. package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +52 -0
  182. package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +44 -0
  183. package/agent-docs/author/recipes.sections/what-each-file-does.md +48 -0
  184. package/agent-docs/author/recipes.sections/what-happens-and-when.md +45 -0
  185. package/agent-docs/author/related-reading.md +143 -0
  186. package/agent-docs/author/related-reading.sections/automatic-footers.md +35 -0
  187. package/agent-docs/author/related-reading.sections/declare-relationships.md +68 -0
  188. package/agent-docs/author/related-reading.sections/display-related-documents.md +54 -0
  189. package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +32 -0
  190. package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +32 -0
  191. package/agent-docs/author/related-reading.sections/related-reading.md +34 -0
  192. package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +34 -0
  193. package/agent-docs/author/release-notes.md +153 -0
  194. package/agent-docs/author/search.md +299 -0
  195. package/agent-docs/author/search.sections/choose-a-provider.md +52 -0
  196. package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +49 -0
  197. package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +55 -0
  198. package/agent-docs/author/search.sections/html-markdown-and-agents.md +37 -0
  199. package/agent-docs/author/search.sections/lexical-search.md +78 -0
  200. package/agent-docs/author/search.sections/local-semantic-preview.md +43 -0
  201. package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +41 -0
  202. package/agent-docs/author/search.sections/related-reading.md +45 -0
  203. package/agent-docs/author/search.sections/reuse-the-lexical-index.md +81 -0
  204. package/agent-docs/author/search.sections/turn-search-off.md +46 -0
  205. package/agent-docs/author/search.sections/use-the-search-box.md +39 -0
  206. package/agent-docs/author/search.sections/write-a-custom-provider.md +98 -0
  207. package/agent-docs/author/snippets.md +118 -0
  208. package/agent-docs/author/taxonomy.md +121 -0
  209. package/agent-docs/author/templates.md +231 -0
  210. package/agent-docs/author/templates.sections/built-in-feature-templates.md +52 -0
  211. package/agent-docs/author/templates.sections/built-in-templates.md +48 -0
  212. package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +69 -0
  213. package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +76 -0
  214. package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +46 -0
  215. package/agent-docs/author/templates.sections/project-added-templates.md +39 -0
  216. package/agent-docs/author/templates.sections/related-reading.md +47 -0
  217. package/agent-docs/author/templates.sections/scaffold-a-page.md +53 -0
  218. package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +56 -0
  219. package/agent-docs/author/templates.sections/what-every-template-gives-you.md +44 -0
  220. package/agent-docs/author/workspace/commands.md +92 -0
  221. package/agent-docs/author/workspace.md +104 -0
  222. package/agent-docs/author/writing-style.md +137 -0
  223. package/agent-docs/author/writing-style.sections/adapt-this-example.md +28 -0
  224. package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +42 -0
  225. package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +32 -0
  226. package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +28 -0
  227. package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +36 -0
  228. package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +41 -0
  229. package/agent-docs/author/writing-style.sections/procedures-and-examples.md +32 -0
  230. package/agent-docs/author/writing-style.sections/related-reading.md +32 -0
  231. package/agent-docs/author/writing-style.sections/review-a-draft.md +30 -0
  232. package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +39 -0
  233. package/agent-docs/author/writing-style.sections/voice-and-explanations.md +39 -0
  234. package/agent-docs/changelog/2026-10-14-agent-readiness.md +29 -0
  235. package/agent-docs/changelog/2026-10-15-evaluation-builds.md +84 -0
  236. package/agent-docs/changelog/2026-10-16-navigation-layouts.md +72 -0
  237. package/agent-docs/changelog/2026-10-17-mcp-hosting.md +60 -0
  238. package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +46 -0
  239. package/agent-docs/changelog/2026-10-19-visual-navigation.md +44 -0
  240. package/agent-docs/changelog/2026-10-25.md +45 -0
  241. package/agent-docs/changelog/2026-10-26.md +66 -0
  242. package/agent-docs/changelog/2026-10-27.md +85 -0
  243. package/agent-docs/changelog/authoring-preview.md +40 -0
  244. package/agent-docs/changelog/authoring-search.md +39 -0
  245. package/agent-docs/changelog/authoring-tools.md +34 -0
  246. package/agent-docs/changelog/working-tree-skill.md +38 -0
  247. package/agent-docs/changelog.md +115 -0
  248. package/agent-docs/chat/checks.md +175 -0
  249. package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +38 -0
  250. package/agent-docs/chat/checks.sections/answer-for-one-audience.md +66 -0
  251. package/agent-docs/chat/checks.sections/answer-without-a-model.md +54 -0
  252. package/agent-docs/chat/checks.sections/follow-up-questions.md +54 -0
  253. package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +67 -0
  254. package/agent-docs/chat/checks.sections/questions-with-several-parts.md +44 -0
  255. package/agent-docs/chat/checks.sections/related-reading.md +42 -0
  256. package/agent-docs/chat/checks.sections/reuse-answers.md +50 -0
  257. package/agent-docs/chat/host.md +222 -0
  258. package/agent-docs/chat/host.sections/cap-the-daily-spend.md +78 -0
  259. package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +64 -0
  260. package/agent-docs/chat/host.sections/related-reading.md +43 -0
  261. package/agent-docs/chat/passage-index.md +228 -0
  262. package/agent-docs/chat/passage-index.sections/build-the-index.md +72 -0
  263. package/agent-docs/chat/passage-index.sections/embed-passages.md +103 -0
  264. package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +53 -0
  265. package/agent-docs/chat/passage-index.sections/limits.md +45 -0
  266. package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +52 -0
  267. package/agent-docs/chat/passage-index.sections/related-reading.md +42 -0
  268. package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +91 -0
  269. package/agent-docs/chat/prepared-answers.md +116 -0
  270. package/agent-docs/chat/settings.md +213 -0
  271. package/agent-docs/chat/settings.sections/choose-the-scorer.md +63 -0
  272. package/agent-docs/chat/settings.sections/configure-chat.md +80 -0
  273. package/agent-docs/chat/settings.sections/configure-retrieval.md +62 -0
  274. package/agent-docs/chat/settings.sections/related-reading.md +32 -0
  275. package/agent-docs/chat/settings.sections/send-extra-request-fields.md +42 -0
  276. package/agent-docs/chat/settings.sections/use-more-than-one-model.md +62 -0
  277. package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +42 -0
  278. package/agent-docs/chat/setup.md +97 -0
  279. package/agent-docs/chat.md +102 -0
  280. package/agent-docs/cli.md +445 -0
  281. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +102 -0
  282. package/agent-docs/cli.sections/author-pages.md +94 -0
  283. package/agent-docs/cli.sections/build-and-serve.md +144 -0
  284. package/agent-docs/cli.sections/inspect-config-and-operations.md +41 -0
  285. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +45 -0
  286. package/agent-docs/cli.sections/related-reading.md +33 -0
  287. package/agent-docs/cli.sections/search-and-chat.md +132 -0
  288. package/agent-docs/cli.sections/start-a-project.md +37 -0
  289. package/agent-docs/cli.sections/working-tree-authoring-tools.md +35 -0
  290. package/agent-docs/concepts.md +133 -0
  291. package/agent-docs/config/apis.md +136 -0
  292. package/agent-docs/config/content.md +264 -0
  293. package/agent-docs/config/content.sections/authoring.md +58 -0
  294. package/agent-docs/config/content.sections/badges.md +34 -0
  295. package/agent-docs/config/content.sections/callouts.md +34 -0
  296. package/agent-docs/config/content.sections/cookbooks.md +38 -0
  297. package/agent-docs/config/content.sections/frontmatter.md +75 -0
  298. package/agent-docs/config/content.sections/readerfilters.md +44 -0
  299. package/agent-docs/config/content.sections/related-reading.md +34 -0
  300. package/agent-docs/config/content.sections/relationships.md +76 -0
  301. package/agent-docs/config/content.sections/snippets.md +61 -0
  302. package/agent-docs/config/content.sections/templates.md +57 -0
  303. package/agent-docs/config/content.sections/variables.md +55 -0
  304. package/agent-docs/config/examples.md +354 -0
  305. package/agent-docs/config/examples.sections/feature-showcase.md +55 -0
  306. package/agent-docs/config/examples.sections/minimal-site.md +80 -0
  307. package/agent-docs/config/examples.sections/multilingual-help-center.md +110 -0
  308. package/agent-docs/config/examples.sections/parcel-api-documentation.md +153 -0
  309. package/agent-docs/config/examples.sections/related-reading.md +50 -0
  310. package/agent-docs/config/examples.sections/shared-company-preset.md +118 -0
  311. package/agent-docs/config/integrations.md +76 -0
  312. package/agent-docs/config/outputs.md +160 -0
  313. package/agent-docs/config/outputs.sections/exports.md +57 -0
  314. package/agent-docs/config/outputs.sections/metadata.md +42 -0
  315. package/agent-docs/config/outputs.sections/related-reading.md +34 -0
  316. package/agent-docs/config/publishing.md +219 -0
  317. package/agent-docs/config/publishing.sections/navigation.md +92 -0
  318. package/agent-docs/config/publishing.sections/redirects.md +79 -0
  319. package/agent-docs/config/publishing.sections/related-reading.md +33 -0
  320. package/agent-docs/config/site.md +193 -0
  321. package/agent-docs/config/site.sections/related-reading.md +33 -0
  322. package/agent-docs/config/site.sections/theme.md +74 -0
  323. package/agent-docs/config.md +195 -0
  324. package/agent-docs/configuration.md +384 -0
  325. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +36 -0
  326. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +76 -0
  327. package/agent-docs/configuration.sections/extract-a-section-with-include.md +75 -0
  328. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +77 -0
  329. package/agent-docs/configuration.sections/related-reading.md +42 -0
  330. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +54 -0
  331. package/agent-docs/configuration.sections/share-defaults-through-extends.md +121 -0
  332. package/agent-docs/configuration.sections/start-with-one-working-file.md +81 -0
  333. package/agent-docs/configuration.sections/understand-the-three-stages.md +59 -0
  334. package/agent-docs/configuration.sections/understand-where-paths-point.md +53 -0
  335. package/agent-docs/connect/mcp.md +85 -0
  336. package/agent-docs/contribute/agent-skills.md +72 -0
  337. package/agent-docs/cookbooks/authoring.md +68 -0
  338. package/agent-docs/cookbooks/site-workflows.md +59 -0
  339. package/agent-docs/cookbooks/welcome-email.md +55 -0
  340. package/agent-docs/documents.json +20058 -0
  341. package/agent-docs/example-api/cedar/create-enrollment-7af3e5d2.md +594 -0
  342. package/agent-docs/example-api/cedar/get-legacy-parcel-6758d051.md +122 -0
  343. package/agent-docs/example-api/cedar/get-parcel-edee10e6.md +122 -0
  344. package/agent-docs/example-api/cedar/list-parcels-0345fb5f.md +271 -0
  345. package/agent-docs/example-api/cedar/parcel-delivered-7d1ba6db.md +122 -0
  346. package/agent-docs/example-api/cedar/upload-manifest-1af17891.md +101 -0
  347. package/agent-docs/example-api/cedar.md +39 -0
  348. package/agent-docs/example-api/create-note.md +344 -0
  349. package/agent-docs/example-api/generated/get-note-cbedb319.md +165 -0
  350. package/agent-docs/example-api/write-note.md +55 -0
  351. package/agent-docs/explore.md +54 -0
  352. package/agent-docs/glossary.md +827 -0
  353. package/agent-docs/index.md +249 -0
  354. package/agent-docs/ingredients/audit-site.md +27 -0
  355. package/agent-docs/ingredients/build-site.md +29 -0
  356. package/agent-docs/ingredients/compile-framework.md +28 -0
  357. package/agent-docs/ingredients/complete-page.md +30 -0
  358. package/agent-docs/ingredients/inspect-agent-bundle.md +28 -0
  359. package/agent-docs/ingredients/inspect-build.md +41 -0
  360. package/agent-docs/ingredients/preview-site.md +31 -0
  361. package/agent-docs/ingredients/refresh-agent-bundle.md +29 -0
  362. package/agent-docs/ingredients/scaffold-page.md +28 -0
  363. package/agent-docs/non-goals.md +58 -0
  364. package/agent-docs/provenance.json +10 -0
  365. package/agent-docs/publish/agent-discovery.md +79 -0
  366. package/agent-docs/publish/agent-friendliness.md +201 -0
  367. package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +61 -0
  368. package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +48 -0
  369. package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +46 -0
  370. package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +48 -0
  371. package/agent-docs/publish/agent-friendliness.sections/related-reading.md +52 -0
  372. package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +50 -0
  373. package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +62 -0
  374. package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +50 -0
  375. package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +58 -0
  376. package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +68 -0
  377. package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +60 -0
  378. package/agent-docs/publish/api-references.md +217 -0
  379. package/agent-docs/publish/api-references.sections/add-useful-examples.md +36 -0
  380. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +65 -0
  381. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +48 -0
  382. package/agent-docs/publish/api-references.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +36 -0
  383. package/agent-docs/publish/api-references.sections/generate-many-pages-selectively.md +36 -0
  384. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +36 -0
  385. package/agent-docs/publish/api-references.sections/link-guides-to-api-references.md +36 -0
  386. package/agent-docs/publish/api-references.sections/map-extension-values-to-shoalrun-status.md +36 -0
  387. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +38 -0
  388. package/agent-docs/publish/api-references.sections/publish-several-versions.md +36 -0
  389. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +62 -0
  390. package/agent-docs/publish/api-references.sections/register-the-operation.md +64 -0
  391. package/agent-docs/publish/api-references.sections/related-reading.md +42 -0
  392. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +54 -0
  393. package/agent-docs/publish/api-references.sections/use-a-template-for-editorial-context.md +36 -0
  394. package/agent-docs/publish/api-references.sections/what-readers-get.md +38 -0
  395. package/agent-docs/publish/audit.md +160 -0
  396. package/agent-docs/publish/audit.sections/add-project-tests.md +57 -0
  397. package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +52 -0
  398. package/agent-docs/publish/audit.sections/check-before-pushing.md +80 -0
  399. package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +54 -0
  400. package/agent-docs/publish/audit.sections/read-the-report.md +67 -0
  401. package/agent-docs/publish/audit.sections/related-reading.md +47 -0
  402. package/agent-docs/publish/content-export.md +208 -0
  403. package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +40 -0
  404. package/agent-docs/publish/content-export.sections/check-the-result.md +27 -0
  405. package/agent-docs/publish/content-export.sections/export-selected-pages.md +113 -0
  406. package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +29 -0
  407. package/agent-docs/publish/content-export.sections/prerequisites.md +29 -0
  408. package/agent-docs/publish/content-export.sections/related-reading.md +35 -0
  409. package/agent-docs/publish/content-export.sections/review-exported-api-material.md +44 -0
  410. package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +34 -0
  411. package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +43 -0
  412. package/agent-docs/publish/content-negotiation.md +121 -0
  413. package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +60 -0
  414. package/agent-docs/publish/content-negotiation.sections/missing-pages.md +51 -0
  415. package/agent-docs/publish/content-negotiation.sections/related-reading.md +45 -0
  416. package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +49 -0
  417. package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +62 -0
  418. package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +47 -0
  419. package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +49 -0
  420. package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +47 -0
  421. package/agent-docs/publish/deployment-check.md +72 -0
  422. package/agent-docs/publish/evals.md +175 -0
  423. package/agent-docs/publish/evals.sections/add-the-audit-hook.md +63 -0
  424. package/agent-docs/publish/evals.sections/check-the-report.md +36 -0
  425. package/agent-docs/publish/evals.sections/define-a-task-file.md +47 -0
  426. package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +42 -0
  427. package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +39 -0
  428. package/agent-docs/publish/evals.sections/related-reading.md +36 -0
  429. package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +54 -0
  430. package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +42 -0
  431. package/agent-docs/publish/host-adapters.md +60 -0
  432. package/agent-docs/publish/manni.md +227 -0
  433. package/agent-docs/publish/manni.sections/check-the-result.md +40 -0
  434. package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +83 -0
  435. package/agent-docs/publish/manni.sections/optional-custom-policies.md +42 -0
  436. package/agent-docs/publish/manni.sections/prerequisites.md +40 -0
  437. package/agent-docs/publish/mcp-analytics.md +356 -0
  438. package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +50 -0
  439. package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +45 -0
  440. package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +53 -0
  441. package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +62 -0
  442. package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +54 -0
  443. package/agent-docs/publish/mcp-analytics.sections/related-reading.md +36 -0
  444. package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +46 -0
  445. package/agent-docs/publish/mcp.md +190 -0
  446. package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +52 -0
  447. package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +51 -0
  448. package/agent-docs/publish/mcp.sections/configure-the-client.md +55 -0
  449. package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +50 -0
  450. package/agent-docs/publish/mcp.sections/related-reading.md +42 -0
  451. package/agent-docs/publish/mcp.sections/search-then-read.md +53 -0
  452. package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +79 -0
  453. package/agent-docs/publish/mcp.sections/verify-the-connection.md +40 -0
  454. package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +42 -0
  455. package/agent-docs/publish/openapi-extension-mappings.md +84 -0
  456. package/agent-docs/publish/output.md +220 -0
  457. package/agent-docs/publish/output.sections/api-contracts.md +48 -0
  458. package/agent-docs/publish/output.sections/code-highlighting.md +38 -0
  459. package/agent-docs/publish/output.sections/current-limits.md +40 -0
  460. package/agent-docs/publish/output.sections/incremental-sync.md +69 -0
  461. package/agent-docs/publish/output.sections/manifest-records-and-sections.md +46 -0
  462. package/agent-docs/publish/output.sections/navigation-section-indexes.md +42 -0
  463. package/agent-docs/publish/output.sections/page-formats.md +46 -0
  464. package/agent-docs/publish/output.sections/published-output-contract.md +58 -0
  465. package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +44 -0
  466. package/agent-docs/publish/output.sections/related-reading.md +34 -0
  467. package/agent-docs/publish/output.sections/response-identity.md +38 -0
  468. package/agent-docs/publish/output.sections/site-files.md +64 -0
  469. package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +48 -0
  470. package/agent-docs/publish/output.sections/where-files-go.md +49 -0
  471. package/agent-docs/publish/publications.md +153 -0
  472. package/agent-docs/publish/revisions.md +104 -0
  473. package/agent-docs/publish/seo.md +119 -0
  474. package/agent-docs/publish/single-source-sites.md +168 -0
  475. package/agent-docs/publish/troubleshooting.md +112 -0
  476. package/agent-docs/publish/vercel.md +130 -0
  477. package/agent-docs/publish/vercel.sections/check-the-deployment.md +54 -0
  478. package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +38 -0
  479. package/agent-docs/publish/vercel.sections/prepare-your-project.md +52 -0
  480. package/agent-docs/publish/vercel.sections/related-reading.md +38 -0
  481. package/agent-docs/publish.md +95 -0
  482. package/agent-docs/recipes/add-page.md +194 -0
  483. package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +40 -0
  484. package/agent-docs/recipes/add-page.sections/before-you-start.md +33 -0
  485. package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +42 -0
  486. package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +42 -0
  487. package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +54 -0
  488. package/agent-docs/recipes/add-page.sections/check-the-outcome.md +28 -0
  489. package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +42 -0
  490. package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +41 -0
  491. package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +42 -0
  492. package/agent-docs/recipes/add-page.sections/related-reading.md +30 -0
  493. package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +42 -0
  494. package/agent-docs/recipes/audit-docs.md +122 -0
  495. package/agent-docs/recipes/build-docs.md +105 -0
  496. package/agent-docs/recipes/preview-hybrid-search.md +84 -0
  497. package/agent-docs/recipes/preview-page.md +124 -0
  498. package/agent-docs/recipes/queue-email.md +49 -0
  499. package/agent-docs/recipes/refresh-agent-docs.md +109 -0
  500. package/agent-docs/recipes/send-welcome-email.md +92 -0
  501. package/agent-docs/reference/agent-skills.md +73 -0
  502. package/agent-docs/search-and-chat.md +87 -0
  503. package/agent-docs/search-index.json +1 -0
  504. package/agent-docs/start.md +197 -0
  505. package/agent-docs/start.sections/add-the-page-to-navigation.md +50 -0
  506. package/agent-docs/start.sections/build-and-check-both-outputs.md +50 -0
  507. package/agent-docs/start.sections/build-this-site.md +35 -0
  508. package/agent-docs/start.sections/check-writing-style.md +35 -0
  509. package/agent-docs/start.sections/create-a-page.md +105 -0
  510. package/agent-docs/start.sections/make-it-yours.md +37 -0
  511. package/agent-docs/start.sections/prerequisites.md +37 -0
  512. package/agent-docs/start.sections/related-reading.md +45 -0
  513. package/agent-docs/start.sections/start-your-own-project.md +53 -0
  514. package/agent-docs/status.md +75 -0
  515. package/agent-docs/styling/color-modes.md +85 -0
  516. package/agent-docs/styling/footer.md +67 -0
  517. package/agent-docs/styling/header.md +65 -0
  518. package/agent-docs/styling/layouts.md +193 -0
  519. package/agent-docs/styling/layouts.sections/build-a-landing-page.md +61 -0
  520. package/agent-docs/styling/layouts.sections/build-a-splash-page.md +88 -0
  521. package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +51 -0
  522. package/agent-docs/styling/layouts.sections/customize-the-hero.md +50 -0
  523. package/agent-docs/styling/layouts.sections/hero.md +83 -0
  524. package/agent-docs/styling/layouts.sections/related-reading.md +42 -0
  525. package/agent-docs/styling/palettes.md +140 -0
  526. package/agent-docs/styling/share-images.md +105 -0
  527. package/agent-docs/styling/themes.md +125 -0
  528. package/agent-docs/styling/try.md +106 -0
  529. package/agent-docs/what-is-shoalrun.md +56 -0
  530. package/assets/analytics.js +72 -0
  531. package/assets/ask-widget.js +320 -0
  532. package/assets/code-samples.js +28 -0
  533. package/assets/components.js +32 -0
  534. package/assets/cookbook-chooser.js +170 -0
  535. package/assets/copy-markdown.js +24 -0
  536. package/assets/example-panel.js +77 -0
  537. package/assets/file-tree.js +49 -0
  538. package/assets/image-viewer.js +41 -0
  539. package/assets/mode.js +26 -0
  540. package/assets/navigation.js +233 -0
  541. package/assets/reader-filters.js +305 -0
  542. package/assets/reader.js +111 -0
  543. package/assets/search-highlight.js +32 -0
  544. package/assets/search-lexical.js +66 -0
  545. package/assets/search.js +150 -0
  546. package/assets/table-filter.js +63 -0
  547. package/assets/tabs.js +80 -0
  548. package/assets/theme-preview.css +17 -0
  549. package/assets/theme-preview.js +135 -0
  550. package/assets/theme-switcher.js +113 -0
  551. package/assets/tooltips.js +81 -0
  552. package/assets/walkthrough.js +233 -0
  553. package/dist/agent-discovery.d.ts +11 -0
  554. package/dist/agent-discovery.js +37 -0
  555. package/dist/analytics.d.ts +2 -0
  556. package/dist/analytics.js +13 -0
  557. package/dist/answer-cache.d.ts +24 -0
  558. package/dist/answer-cache.js +55 -0
  559. package/dist/answer-cards.d.ts +71 -0
  560. package/dist/answer-cards.js +148 -0
  561. package/dist/api-embeds.d.ts +22 -0
  562. package/dist/api-embeds.js +84 -0
  563. package/dist/api-identity.d.ts +6 -0
  564. package/dist/api-identity.js +7 -0
  565. package/dist/api-materialize.d.ts +12 -0
  566. package/dist/api-materialize.js +120 -0
  567. package/dist/api-publication-plan.d.ts +86 -0
  568. package/dist/api-publication-plan.js +187 -0
  569. package/dist/api-publication-review.d.ts +23 -0
  570. package/dist/api-publication-review.js +58 -0
  571. package/dist/api-selection.d.ts +21 -0
  572. package/dist/api-selection.js +84 -0
  573. package/dist/api.d.ts +74 -0
  574. package/dist/api.js +782 -0
  575. package/dist/artifact-bundle.d.ts +96 -0
  576. package/dist/artifact-bundle.js +306 -0
  577. package/dist/ask-function.d.ts +19 -0
  578. package/dist/ask-function.js +139 -0
  579. package/dist/ask-handler.d.ts +38 -0
  580. package/dist/ask-handler.js +157 -0
  581. package/dist/ask-log-kv.d.ts +14 -0
  582. package/dist/ask-log-kv.js +69 -0
  583. package/dist/ask-log.d.ts +106 -0
  584. package/dist/ask-log.js +159 -0
  585. package/dist/ask-setup.d.ts +43 -0
  586. package/dist/ask-setup.js +99 -0
  587. package/dist/ask.d.ts +152 -0
  588. package/dist/ask.js +532 -0
  589. package/dist/audit.d.ts +29 -0
  590. package/dist/audit.js +171 -0
  591. package/dist/authored-change.d.ts +22 -0
  592. package/dist/authored-change.js +47 -0
  593. package/dist/authoring-api.d.ts +18 -0
  594. package/dist/authoring-api.js +15 -0
  595. package/dist/authoring-findings.d.ts +31 -0
  596. package/dist/authoring-findings.js +104 -0
  597. package/dist/authoring-guidance.d.ts +15 -0
  598. package/dist/authoring-guidance.js +57 -0
  599. package/dist/authoring-preview.d.ts +24 -0
  600. package/dist/authoring-preview.js +160 -0
  601. package/dist/authoring-project-command.d.ts +7 -0
  602. package/dist/authoring-project-command.js +52 -0
  603. package/dist/authoring-project.d.ts +104 -0
  604. package/dist/authoring-project.js +287 -0
  605. package/dist/authoring-review-command.d.ts +1 -0
  606. package/dist/authoring-review-command.js +68 -0
  607. package/dist/authoring-review.d.ts +72 -0
  608. package/dist/authoring-review.js +71 -0
  609. package/dist/authoring-snapshot.d.ts +66 -0
  610. package/dist/authoring-snapshot.js +293 -0
  611. package/dist/authoring-validation-command.d.ts +1 -0
  612. package/dist/authoring-validation-command.js +54 -0
  613. package/dist/authoring-validation.d.ts +101 -0
  614. package/dist/authoring-validation.js +348 -0
  615. package/dist/badges.d.ts +16 -0
  616. package/dist/badges.js +57 -0
  617. package/dist/budget-store.d.ts +21 -0
  618. package/dist/budget-store.js +90 -0
  619. package/dist/budget.d.ts +45 -0
  620. package/dist/budget.js +128 -0
  621. package/dist/build-info.d.ts +10 -0
  622. package/dist/build-info.js +15 -0
  623. package/dist/callouts.d.ts +18 -0
  624. package/dist/callouts.js +63 -0
  625. package/dist/cards.d.ts +35 -0
  626. package/dist/cards.js +237 -0
  627. package/dist/chat-config.d.ts +117 -0
  628. package/dist/chat-config.js +400 -0
  629. package/dist/chat-pause.d.ts +1 -0
  630. package/dist/chat-pause.js +3 -0
  631. package/dist/chat.d.ts +46 -0
  632. package/dist/chat.js +78 -0
  633. package/dist/cli-discovery.d.ts +4 -0
  634. package/dist/cli-discovery.js +86 -0
  635. package/dist/cli.d.ts +2 -0
  636. package/dist/cli.js +750 -0
  637. package/dist/code-samples.d.ts +50 -0
  638. package/dist/code-samples.js +181 -0
  639. package/dist/compact-discovery.d.ts +15 -0
  640. package/dist/compact-discovery.js +78 -0
  641. package/dist/compiler-config.d.ts +67 -0
  642. package/dist/compiler-config.js +66 -0
  643. package/dist/compiler.d.ts +208 -0
  644. package/dist/compiler.js +524 -0
  645. package/dist/component-bundle.d.ts +4 -0
  646. package/dist/component-bundle.js +32 -0
  647. package/dist/component-content.d.ts +78 -0
  648. package/dist/component-content.js +47 -0
  649. package/dist/component-manifest.d.ts +15 -0
  650. package/dist/component-manifest.js +84 -0
  651. package/dist/component-names.d.ts +1 -0
  652. package/dist/component-names.js +1 -0
  653. package/dist/component-plugins.d.ts +28 -0
  654. package/dist/component-plugins.js +141 -0
  655. package/dist/component-transform.d.ts +10 -0
  656. package/dist/component-transform.js +697 -0
  657. package/dist/components.d.ts +2 -0
  658. package/dist/components.js +1 -0
  659. package/dist/config.d.ts +29 -0
  660. package/dist/config.js +149 -0
  661. package/dist/content-export-assets.d.ts +23 -0
  662. package/dist/content-export-assets.js +103 -0
  663. package/dist/content-export-command.d.ts +20 -0
  664. package/dist/content-export-command.js +57 -0
  665. package/dist/content-export-config.d.ts +16 -0
  666. package/dist/content-export-config.js +50 -0
  667. package/dist/content-export-render.d.ts +12 -0
  668. package/dist/content-export-render.js +132 -0
  669. package/dist/content-export.d.ts +30 -0
  670. package/dist/content-export.js +307 -0
  671. package/dist/content-filter.d.ts +4 -0
  672. package/dist/content-filter.js +16 -0
  673. package/dist/content-source.d.ts +100 -0
  674. package/dist/content-source.js +42 -0
  675. package/dist/content-workspace.d.ts +293 -0
  676. package/dist/content-workspace.js +69 -0
  677. package/dist/content.d.ts +41 -0
  678. package/dist/content.js +176 -0
  679. package/dist/cookbook-chooser.d.ts +19 -0
  680. package/dist/cookbook-chooser.js +56 -0
  681. package/dist/dev.d.ts +2 -0
  682. package/dist/dev.js +113 -0
  683. package/dist/diagram-svg.d.ts +1 -0
  684. package/dist/diagram-svg.js +44 -0
  685. package/dist/diagrams.d.ts +7 -0
  686. package/dist/diagrams.js +102 -0
  687. package/dist/docs-author.d.ts +86 -0
  688. package/dist/docs-author.js +380 -0
  689. package/dist/docs-command.d.ts +8 -0
  690. package/dist/docs-command.js +62 -0
  691. package/dist/docs-eval.d.ts +146 -0
  692. package/dist/docs-eval.js +231 -0
  693. package/dist/docs-mcp.d.ts +12 -0
  694. package/dist/docs-mcp.js +82 -0
  695. package/dist/docs-tool.d.ts +81 -0
  696. package/dist/docs-tool.js +7 -0
  697. package/dist/document-sync.d.ts +36 -0
  698. package/dist/document-sync.js +58 -0
  699. package/dist/documentation-core.d.ts +148 -0
  700. package/dist/documentation-core.js +160 -0
  701. package/dist/embeddings.d.ts +68 -0
  702. package/dist/embeddings.js +198 -0
  703. package/dist/focused-audit.d.ts +10 -0
  704. package/dist/focused-audit.js +69 -0
  705. package/dist/focused-openapi.d.ts +2 -0
  706. package/dist/focused-openapi.js +140 -0
  707. package/dist/fonts.d.ts +54 -0
  708. package/dist/fonts.js +92 -0
  709. package/dist/freshness.d.ts +7 -0
  710. package/dist/freshness.js +58 -0
  711. package/dist/frontmatter.d.ts +24 -0
  712. package/dist/frontmatter.js +342 -0
  713. package/dist/function-package.d.ts +1 -0
  714. package/dist/function-package.js +58 -0
  715. package/dist/highlight.d.ts +14 -0
  716. package/dist/highlight.js +114 -0
  717. package/dist/html-renderer.d.ts +10 -0
  718. package/dist/html-renderer.js +63 -0
  719. package/dist/icons.d.ts +8 -0
  720. package/dist/icons.js +40 -0
  721. package/dist/index-build.d.ts +55 -0
  722. package/dist/index-build.js +227 -0
  723. package/dist/ingredient-draft.d.ts +17 -0
  724. package/dist/ingredient-draft.js +94 -0
  725. package/dist/ingredient-workflow.d.ts +8 -0
  726. package/dist/ingredient-workflow.js +25 -0
  727. package/dist/init.d.ts +8 -0
  728. package/dist/init.js +66 -0
  729. package/dist/jev.d.ts +62 -0
  730. package/dist/jev.js +190 -0
  731. package/dist/link-audit.d.ts +12 -0
  732. package/dist/link-audit.js +146 -0
  733. package/dist/llms-discovery.d.ts +11 -0
  734. package/dist/llms-discovery.js +23 -0
  735. package/dist/markdown-sections.d.ts +15 -0
  736. package/dist/markdown-sections.js +60 -0
  737. package/dist/markdown-size.d.ts +7 -0
  738. package/dist/markdown-size.js +6 -0
  739. package/dist/mcp-analytics.d.ts +38 -0
  740. package/dist/mcp-analytics.js +35 -0
  741. package/dist/mcp-artifacts.d.ts +2 -0
  742. package/dist/mcp-artifacts.js +78 -0
  743. package/dist/mcp-client-metadata.d.ts +18 -0
  744. package/dist/mcp-client-metadata.js +69 -0
  745. package/dist/mcp-config.d.ts +23 -0
  746. package/dist/mcp-config.js +56 -0
  747. package/dist/mcp-http.d.ts +19 -0
  748. package/dist/mcp-http.js +157 -0
  749. package/dist/mcp-integrity.d.ts +3 -0
  750. package/dist/mcp-integrity.js +4 -0
  751. package/dist/mcp-node.d.ts +4 -0
  752. package/dist/mcp-node.js +68 -0
  753. package/dist/mcp-vercel-runtime.d.ts +3 -0
  754. package/dist/mcp-vercel-runtime.js +36 -0
  755. package/dist/mcp-vercel.d.ts +15 -0
  756. package/dist/mcp-vercel.js +65 -0
  757. package/dist/metadata-provider.d.ts +19 -0
  758. package/dist/metadata-provider.js +38 -0
  759. package/dist/negotiation.d.ts +10 -0
  760. package/dist/negotiation.js +35 -0
  761. package/dist/not-found.d.ts +16 -0
  762. package/dist/not-found.js +25 -0
  763. package/dist/output-commit.d.ts +1 -0
  764. package/dist/output-commit.js +133 -0
  765. package/dist/output-location.d.ts +3 -0
  766. package/dist/output-location.js +30 -0
  767. package/dist/page-materialization.d.ts +78 -0
  768. package/dist/page-materialization.js +132 -0
  769. package/dist/page-renderer.d.ts +71 -0
  770. package/dist/page-renderer.js +177 -0
  771. package/dist/palettes.d.ts +41 -0
  772. package/dist/palettes.js +160 -0
  773. package/dist/procedure-components.d.ts +2 -0
  774. package/dist/procedure-components.js +94 -0
  775. package/dist/project-navigation.d.ts +41 -0
  776. package/dist/project-navigation.js +190 -0
  777. package/dist/provider-http.d.ts +10 -0
  778. package/dist/provider-http.js +60 -0
  779. package/dist/publication-manifest.d.ts +229 -0
  780. package/dist/publication-manifest.js +53 -0
  781. package/dist/publication-plan.d.ts +34 -0
  782. package/dist/publication-plan.js +85 -0
  783. package/dist/publication-render.d.ts +71 -0
  784. package/dist/publication-render.js +92 -0
  785. package/dist/reader-filters.d.ts +30 -0
  786. package/dist/reader-filters.js +105 -0
  787. package/dist/recipe-draft.d.ts +17 -0
  788. package/dist/recipe-draft.js +147 -0
  789. package/dist/reference-audit.d.ts +18 -0
  790. package/dist/reference-audit.js +169 -0
  791. package/dist/remote-import.d.ts +62 -0
  792. package/dist/remote-import.js +292 -0
  793. package/dist/representation-tree.d.ts +3 -0
  794. package/dist/representation-tree.js +320 -0
  795. package/dist/retrieval-config.d.ts +30 -0
  796. package/dist/retrieval-config.js +83 -0
  797. package/dist/retrieval.d.ts +60 -0
  798. package/dist/retrieval.js +228 -0
  799. package/dist/scaffold.d.ts +39 -0
  800. package/dist/scaffold.js +167 -0
  801. package/dist/search-config.d.ts +8 -0
  802. package/dist/search-config.js +26 -0
  803. package/dist/search-handler.d.ts +16 -0
  804. package/dist/search-handler.js +111 -0
  805. package/dist/search-identifier.d.ts +3 -0
  806. package/dist/search-identifier.js +25 -0
  807. package/dist/search-literal.d.ts +1 -0
  808. package/dist/search-literal.js +28 -0
  809. package/dist/search-query.d.ts +54 -0
  810. package/dist/search-query.js +120 -0
  811. package/dist/search-results.d.ts +6 -0
  812. package/dist/search-results.js +45 -0
  813. package/dist/search-snippet.d.ts +11 -0
  814. package/dist/search-snippet.js +93 -0
  815. package/dist/search-synonyms.d.ts +8 -0
  816. package/dist/search-synonyms.js +46 -0
  817. package/dist/semantic-markdown.d.ts +10 -0
  818. package/dist/semantic-markdown.js +39 -0
  819. package/dist/server.d.ts +10 -0
  820. package/dist/server.js +223 -0
  821. package/dist/share-images.d.ts +24 -0
  822. package/dist/share-images.js +187 -0
  823. package/dist/site-path.d.ts +2 -0
  824. package/dist/site-path.js +15 -0
  825. package/dist/sitemap.d.ts +8 -0
  826. package/dist/sitemap.js +58 -0
  827. package/dist/snippets.d.ts +19 -0
  828. package/dist/snippets.js +84 -0
  829. package/dist/structured-model-output.d.ts +6 -0
  830. package/dist/structured-model-output.js +21 -0
  831. package/dist/subject-deprecation.d.ts +21 -0
  832. package/dist/subject-deprecation.js +57 -0
  833. package/dist/surface-text.d.ts +4 -0
  834. package/dist/surface-text.js +42 -0
  835. package/dist/taxonomy.d.ts +14 -0
  836. package/dist/taxonomy.js +88 -0
  837. package/dist/turnstile.d.ts +21 -0
  838. package/dist/turnstile.js +52 -0
  839. package/dist/vale.d.ts +28 -0
  840. package/dist/vale.js +103 -0
  841. package/dist/vercel-function.d.ts +21 -0
  842. package/dist/vercel-function.js +108 -0
  843. package/dist/vercel.d.ts +11 -0
  844. package/dist/vercel.js +103 -0
  845. package/dist/walkthrough.d.ts +25 -0
  846. package/dist/walkthrough.js +336 -0
  847. package/dist/yaml-value.d.ts +2 -0
  848. package/dist/yaml-value.js +36 -0
  849. package/example-configs/api-docs/README.md +59 -0
  850. package/example-configs/api-docs/apis/cedar-parcel.yaml +413 -0
  851. package/example-configs/api-docs/content/create-enrollment.mdx +11 -0
  852. package/example-configs/api-docs/content/overview.mdx +36 -0
  853. package/example-configs/api-docs/content/quickstart.mdx +52 -0
  854. package/example-configs/api-docs/docs.config.yaml +104 -0
  855. package/example-configs/faceted-sites/README.md +31 -0
  856. package/example-configs/faceted-sites/base.yaml +30 -0
  857. package/example-configs/faceted-sites/content/api.md +12 -0
  858. package/example-configs/faceted-sites/content/home.md +10 -0
  859. package/example-configs/faceted-sites/content/operations.md +12 -0
  860. package/example-configs/faceted-sites/developers.config.yaml +8 -0
  861. package/example-configs/faceted-sites/docs.config.yaml +7 -0
  862. package/example-configs/faceted-sites/europe.config.yaml +9 -0
  863. package/example-configs/minimal/content/install.mdx +12 -0
  864. package/example-configs/minimal/content/welcome.mdx +8 -0
  865. package/example-configs/minimal/docs.config.yaml +31 -0
  866. package/example-configs/multilingual/content/de/home.mdx +9 -0
  867. package/example-configs/multilingual/content/de/reset-password.mdx +9 -0
  868. package/example-configs/multilingual/content/home.mdx +10 -0
  869. package/example-configs/multilingual/content/reset-password.mdx +12 -0
  870. package/example-configs/multilingual/docs.config.yaml +61 -0
  871. package/example-configs/multilingual/snippets/contact.mdx +1 -0
  872. package/example-configs/notifications/apis/notifications.yaml +132 -0
  873. package/example-configs/notifications/content/cookbook.mdx +17 -0
  874. package/example-configs/notifications/content/get-message.mdx +14 -0
  875. package/example-configs/notifications/content/queue-email.mdx +42 -0
  876. package/example-configs/notifications/content/queue-push.mdx +33 -0
  877. package/example-configs/notifications/content/queue-sms.mdx +33 -0
  878. package/example-configs/notifications/content/send-email.mdx +14 -0
  879. package/example-configs/notifications/content/send-push.mdx +14 -0
  880. package/example-configs/notifications/content/send-sms.mdx +14 -0
  881. package/example-configs/notifications/content/start.mdx +13 -0
  882. package/example-configs/notifications/content/welcome-cookbook.mdx +21 -0
  883. package/example-configs/notifications/content/welcome-email.mdx +82 -0
  884. package/example-configs/notifications/demo.mjs +43 -0
  885. package/example-configs/notifications/docs.config.yaml +88 -0
  886. package/example-configs/notifications/ingredient-drafts/README.md +41 -0
  887. package/example-configs/notifications/ingredient-drafts/check-delivery.mdx +13 -0
  888. package/example-configs/notifications/ingredient-drafts/queue-welcome-email.mdx +48 -0
  889. package/example-configs/notifications/ingredient-specs/queue-welcome-email.yaml +7 -0
  890. package/example-configs/notifications/ingredients/check-delivery.mdx +42 -0
  891. package/example-configs/notifications/ingredients/queue-welcome-email.mdx +37 -0
  892. package/example-configs/notifications/recipe-drafts/send-welcome-email.mdx +91 -0
  893. package/example-configs/notifications/recipe-specs/send-welcome-email.yaml +11 -0
  894. package/example-configs/reference-stress/README.md +32 -0
  895. package/example-configs/reference-stress/apis/cedar-parcel.yaml +413 -0
  896. package/example-configs/reference-stress/content/enrollment-shapes.mdx +16 -0
  897. package/example-configs/reference-stress/content/overview.mdx +14 -0
  898. package/example-configs/reference-stress/docs.config.yaml +55 -0
  899. package/example-configs/shared-preset/shared/company-docs.yaml +46 -0
  900. package/example-configs/shared-preset/shared/runbook.mdx +7 -0
  901. package/example-configs/shared-preset/site/content/failed-invoices.mdx +15 -0
  902. package/example-configs/shared-preset/site/content/start.mdx +9 -0
  903. package/example-configs/shared-preset/site/docs.config.yaml +18 -0
  904. package/example-configs/showcase/README.md +20 -0
  905. package/example-configs/showcase/apis/cedar-parcel.yaml +413 -0
  906. package/example-configs/showcase/content/assets/collection.svg +1 -0
  907. package/example-configs/showcase/content/code.mdx +100 -0
  908. package/example-configs/showcase/content/create-enrollment.mdx +11 -0
  909. package/example-configs/showcase/content/features.mdx +39 -0
  910. package/example-configs/showcase/content/landing.mdx +36 -0
  911. package/example-configs/showcase/content/overview.mdx +42 -0
  912. package/example-configs/showcase/content/personalization.mdx +38 -0
  913. package/example-configs/showcase/content/preview.mdx +35 -0
  914. package/example-configs/showcase/content/procedures.mdx +88 -0
  915. package/example-configs/showcase/content/quickstart.mdx +64 -0
  916. package/example-configs/showcase/content/reading.mdx +99 -0
  917. package/example-configs/showcase/content/verify.mdx +27 -0
  918. package/example-configs/showcase/content/visuals.mdx +47 -0
  919. package/example-configs/showcase/content/workflows.mdx +12 -0
  920. package/example-configs/showcase/docs.config.yaml +149 -0
  921. package/example-configs/showcase/snippets/sandbox.mdx +1 -0
  922. package/examples/analytics/README.md +56 -0
  923. package/examples/analytics/inspector.js +25 -0
  924. package/examples/analytics/posthog.js +36 -0
  925. package/examples/components/comparison.mjs +8 -0
  926. package/examples/components/components.json +6 -0
  927. package/examples/components/copy-text/LICENSE.react-dom.txt +21 -0
  928. package/examples/components/copy-text/LICENSE.react.txt +21 -0
  929. package/examples/components/copy-text/LICENSE.scheduler.txt +21 -0
  930. package/examples/components/copy-text/browser.jsx +21 -0
  931. package/examples/components/copy-text/components.json +6 -0
  932. package/examples/components/copy-text/package-lock.json +41 -0
  933. package/examples/components/copy-text/package.json +9 -0
  934. package/examples/components/copy-text/plugin.mjs +5 -0
  935. package/examples/components/retry-budget/LICENSE.react-dom.txt +21 -0
  936. package/examples/components/retry-budget/LICENSE.react.txt +21 -0
  937. package/examples/components/retry-budget/LICENSE.scheduler.txt +21 -0
  938. package/examples/components/retry-budget/browser.jsx +50 -0
  939. package/examples/components/retry-budget/components.json +6 -0
  940. package/examples/components/retry-budget/model.js +22 -0
  941. package/examples/components/retry-budget/package-lock.json +41 -0
  942. package/examples/components/retry-budget/package.json +9 -0
  943. package/examples/components/retry-budget/plugin.mjs +31 -0
  944. package/examples/components/retry-budget/policy.json +9 -0
  945. package/examples/components/retry-budget/style.css +25 -0
  946. package/examples/diagrams/d2-gallery.json +138 -0
  947. package/examples/diagrams/gallery.json +236 -0
  948. package/examples/help-drawer/README.md +44 -0
  949. package/examples/help-drawer/app.js +53 -0
  950. package/examples/help-drawer/components/components.json +1 -0
  951. package/examples/help-drawer/components/support.mjs +10 -0
  952. package/examples/help-drawer/content/account.md +8 -0
  953. package/examples/help-drawer/content/billing.mdx +29 -0
  954. package/examples/help-drawer/content/keys.mdx +46 -0
  955. package/examples/help-drawer/content/settings.svg +1 -0
  956. package/examples/help-drawer/docs.config.yaml +30 -0
  957. package/examples/help-drawer/index.html +26 -0
  958. package/examples/help-drawer/preview.mjs +33 -0
  959. package/examples/mcp-analytics/README.md +59 -0
  960. package/examples/mcp-analytics/posthog.mjs +159 -0
  961. package/package.json +100 -4
  962. package/schemas/content-export.schema.json +55 -0
  963. package/skills/shoalrun-author/SKILL.md +52 -0
  964. package/skills/shoalrun-component-author/SKILL.md +24 -0
  965. package/skills/shoalrun-recipes/SKILL.md +25 -0
  966. package/skills/shoalrun-setup/SKILL.md +34 -0
  967. package/skills/shoalrun-walkthrough/SKILL.md +18 -0
  968. package/styles/fonts/figtree-LICENSE.txt +93 -0
  969. package/styles/fonts/figtree-italic.woff2 +0 -0
  970. package/styles/fonts/figtree.woff2 +0 -0
  971. package/styles/fonts/inter-LICENSE.txt +93 -0
  972. package/styles/fonts/inter-italic.woff2 +0 -0
  973. package/styles/fonts/inter.woff2 +0 -0
  974. package/styles/fonts/jetbrains-mono-LICENSE.txt +93 -0
  975. package/styles/fonts/jetbrains-mono.woff2 +0 -0
  976. package/styles/fonts/jost-LICENSE.txt +93 -0
  977. package/styles/fonts/jost-italic.woff2 +0 -0
  978. package/styles/fonts/jost.woff2 +0 -0
  979. package/styles/fonts/share/figtree-400.ttf +0 -0
  980. package/styles/fonts/share/figtree-700.ttf +0 -0
  981. package/styles/fonts/share/inter-400.ttf +0 -0
  982. package/styles/fonts/share/inter-700.ttf +0 -0
  983. package/styles/fonts/share/jetbrains-mono-700.ttf +0 -0
  984. package/styles/fonts/share/jost-italic-800.ttf +0 -0
  985. package/styles/fonts/share/metrics.json +1 -0
  986. package/styles/fonts/share/source-serif-4-400.ttf +0 -0
  987. package/styles/fonts/source-serif-4-LICENSE.txt +93 -0
  988. package/styles/fonts/source-serif-4-italic.woff2 +0 -0
  989. package/styles/fonts/source-serif-4.woff2 +0 -0
  990. package/styles/header.css +56 -0
  991. package/styles/site.css +825 -0
  992. package/styles/themes/ledger.css +93 -0
  993. package/styles/themes/palettes/amethyst.yaml +127 -0
  994. package/styles/themes/palettes/coral.yaml +127 -0
  995. package/styles/themes/palettes/harbor.yaml +127 -0
  996. package/styles/themes/palettes/ink.yaml +127 -0
  997. package/styles/themes/palettes/kelp.yaml +127 -0
  998. package/styles/themes/palettes/vice.yaml +127 -0
  999. package/styles/themes/reef.css +68 -0
  1000. package/styles/themes/vice.css +56 -0
  1001. package/styles/tokens.css +91 -0
  1002. package/templates/api-reference.mdx +133 -0
  1003. package/templates/cookbook.mdx +38 -0
  1004. package/templates/explanation.mdx +76 -0
  1005. package/templates/guide.mdx +175 -0
  1006. package/templates/how-to.mdx +171 -0
  1007. package/templates/ingredient.mdx +53 -0
  1008. package/templates/recipe.mdx +76 -0
  1009. package/templates/reference.mdx +171 -0
  1010. package/templates/troubleshooting.mdx +159 -0
  1011. package/templates/tutorial.mdx +165 -0
@@ -0,0 +1,117 @@
1
+ import { type ChatProviderConfig } from './chat.js';
2
+ import { type ReaderFiltersConfig, type ReaderSelection } from './reader-filters.js';
3
+ export type ChatGate = {
4
+ decline: number;
5
+ hedge: number;
6
+ };
7
+ export type ChatVerify = {
8
+ threshold: number;
9
+ onUnsupported: 'flag' | 'remove';
10
+ };
11
+ export declare const escalateReasons: readonly ["unsupported-claim", "unsupported-code", "uncited"];
12
+ export type EscalateReason = typeof escalateReasons[number];
13
+ export type ChatRerank = {
14
+ provider: 'jev';
15
+ endpoint?: string;
16
+ model?: string;
17
+ keyEnv?: string;
18
+ stateFormat?: 'object' | 'string';
19
+ onError?: 'search' | 'answer';
20
+ };
21
+ export type ChatCards = {
22
+ threshold: number;
23
+ confirm: number;
24
+ };
25
+ export type ChatBudgetStore = {
26
+ provider: 'upstash';
27
+ urlEnv: string;
28
+ tokenEnv: string;
29
+ };
30
+ export type ChatChallenge = {
31
+ provider: 'turnstile';
32
+ siteKey: string;
33
+ secretEnv: string;
34
+ when: 'adaptive' | 'always';
35
+ freeQuestions: number;
36
+ busyShare: number;
37
+ };
38
+ export type ChatLog = {
39
+ retentionDays: number;
40
+ maxPerDay: number;
41
+ answers: boolean;
42
+ notice: string;
43
+ };
44
+ export type ChatPanel = {
45
+ title?: string;
46
+ placeholder?: string;
47
+ intro?: string;
48
+ };
49
+ export declare const defaultLogNotice = "Questions are recorded, with personal details removed, to improve these docs.";
50
+ export type ChatBudget = {
51
+ perCaller: number;
52
+ perDay: number;
53
+ store?: ChatBudgetStore;
54
+ };
55
+ export type ChatCache = {
56
+ maxEntries: number;
57
+ ttlMinutes: number;
58
+ };
59
+ export type ChatRoute = {
60
+ body?: Record<string, unknown>;
61
+ model: string;
62
+ provider?: 'openai';
63
+ baseUrl?: string;
64
+ keyEnv?: string;
65
+ maxTokens?: number;
66
+ temperature?: number;
67
+ };
68
+ export type ChatEscalate = ChatRoute & {
69
+ when: EscalateReason[];
70
+ };
71
+ export type ChatDirect = {
72
+ threshold: number;
73
+ maxChars: number;
74
+ margin: number;
75
+ others: number;
76
+ };
77
+ export type ChatConfig = {
78
+ body?: Record<string, unknown>;
79
+ provider: 'openai';
80
+ model: string;
81
+ baseUrl?: string;
82
+ keyEnv?: string;
83
+ maxTokens?: number;
84
+ temperature?: number;
85
+ passages?: number;
86
+ readerView?: ReaderSelection;
87
+ rerank?: ChatRerank;
88
+ gate?: ChatGate;
89
+ verify?: ChatVerify;
90
+ direct?: ChatDirect;
91
+ fallback?: ChatRoute[];
92
+ escalate?: ChatEscalate;
93
+ cache?: ChatCache;
94
+ cards?: ChatCards;
95
+ budget?: ChatBudget;
96
+ challenge?: ChatChallenge;
97
+ log?: ChatLog;
98
+ panel?: ChatPanel;
99
+ };
100
+ export declare function text(value: unknown, setting: string): string;
101
+ export declare function integer(value: unknown, setting: string, min: number, max: number): number;
102
+ export declare function bodyFields(value: unknown, where: string): Record<string, unknown>;
103
+ export declare function validateChat(value: unknown, readerFilters?: ReaderFiltersConfig): ChatConfig | undefined;
104
+ export type ChatFlags = {
105
+ model?: string;
106
+ baseUrl?: string;
107
+ keyEnv?: string;
108
+ passages?: number;
109
+ };
110
+ export declare function chatProviderConfig(config: ChatConfig | undefined, flags?: ChatFlags): ChatProviderConfig;
111
+ export declare function chatRoutes(config: ChatConfig | undefined, main: ChatProviderConfig): {
112
+ fallbacks: ChatProviderConfig[];
113
+ escalate?: {
114
+ config: ChatProviderConfig;
115
+ when: EscalateReason[];
116
+ };
117
+ };
@@ -0,0 +1,400 @@
1
+ import { reservedBodyFields } from './chat.js';
2
+ import { validateReaderSelection } from './reader-filters.js';
3
+ export const escalateReasons = ['unsupported-claim', 'unsupported-code', 'uncited'];
4
+ export const defaultLogNotice = 'Questions are recorded, with personal details removed, to improve these docs.';
5
+ const mapping = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
6
+ const keys = ['provider', 'model', 'baseUrl', 'keyEnv', 'maxTokens', 'temperature', 'passages', 'readerView', 'rerank', 'gate', 'verify', 'direct', 'fallback', 'escalate', 'cache', 'cards', 'body', 'budget', 'challenge', 'log', 'panel'];
7
+ export function text(value, setting) {
8
+ if (typeof value !== 'string' || !value.trim())
9
+ throw new Error(`${setting} must be a nonempty string`);
10
+ return value.trim();
11
+ }
12
+ export function integer(value, setting, min, max) {
13
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < min || value > max)
14
+ throw new Error(`${setting} must be an integer from ${min} to ${max}`);
15
+ return value;
16
+ }
17
+ const routeKeys = ['model', 'provider', 'baseUrl', 'keyEnv', 'maxTokens', 'temperature', 'body'];
18
+ // Extra fields to send with every request, such as OpenRouter's `reasoning`. They can add to a request but cannot replace what the tool owns,
19
+ // and they can never carry a key, because the config never holds one.
20
+ export function bodyFields(value, where) {
21
+ if (!mapping(value))
22
+ throw new Error(`${where} must be a mapping of request fields`);
23
+ const secretLike = /key|secret|token|password|authorization|credential/i;
24
+ const scan = (item, path, depth) => {
25
+ if (depth > 4)
26
+ throw new Error(`${where} nests too deeply at ${path}`);
27
+ if (item === null || ['string', 'number', 'boolean'].includes(typeof item))
28
+ return;
29
+ if (Array.isArray(item)) {
30
+ item.forEach((entry, at) => scan(entry, `${path}[${at}]`, depth + 1));
31
+ return;
32
+ }
33
+ if (mapping(item)) {
34
+ for (const [name, entry] of Object.entries(item)) {
35
+ if (secretLike.test(name))
36
+ throw new Error(`${where}.${path ? `${path}.` : ''}${name} looks like a secret. The config never holds a key; name the environment variable that does with keyEnv`);
37
+ scan(entry, path ? `${path}.${name}` : name, depth + 1);
38
+ }
39
+ return;
40
+ }
41
+ throw new Error(`${where}.${path} must be text, a number, true or false, a list, or a mapping`);
42
+ };
43
+ for (const name of Object.keys(value))
44
+ if (reservedBodyFields.includes(name))
45
+ throw new Error(`${where}.${name} is set by Shoalrun and can't be replaced${name === 'model' ? '; use chat.model' : name === 'max_tokens' ? '; use chat.maxTokens' : name === 'temperature' ? '; use chat.temperature' : ''}`);
46
+ scan(value, '', 0);
47
+ if (JSON.stringify(value).length > 2000)
48
+ throw new Error(`${where} is too large; keep it under 2,000 characters`);
49
+ return value;
50
+ }
51
+ // `rerank: jev`, or a mapping that names the service. The endpoint may carry no credentials and no query, and the key comes from the
52
+ // environment variable named by keyEnv.
53
+ function rerankConfig(value) {
54
+ if (value === 'jev')
55
+ return { provider: 'jev' };
56
+ if (!mapping(value))
57
+ throw new Error('chat.rerank must be jev, or a mapping with provider: jev and optionally endpoint, model, keyEnv, stateFormat, and onError');
58
+ for (const key of Object.keys(value)) {
59
+ if (['provider', 'endpoint', 'model', 'keyEnv', 'stateFormat', 'onError'].includes(key))
60
+ continue;
61
+ throw new Error(/key|secret|token|password/i.test(key) ? `chat.rerank.${key} is not a setting. The config never holds a key; name the environment variable that does with keyEnv` : `chat.rerank has an unknown setting ${key}; it accepts provider, endpoint, model, keyEnv, stateFormat, and onError`);
62
+ }
63
+ if (value.provider !== 'jev')
64
+ throw new Error('chat.rerank.provider must be jev, the yes/no scoring protocol that Jev and compatible services speak');
65
+ const result = { provider: 'jev' };
66
+ if (value.endpoint !== undefined) {
67
+ const endpoint = text(value.endpoint, 'chat.rerank.endpoint');
68
+ let url;
69
+ try {
70
+ url = new URL(endpoint);
71
+ }
72
+ catch {
73
+ throw new Error('chat.rerank.endpoint must be a full URL such as https://api.example.com');
74
+ }
75
+ const local = /^(localhost|127\.0\.0\.1|\[::1\])$/.test(url.hostname);
76
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && local))
77
+ throw new Error('chat.rerank.endpoint must use https, except for localhost');
78
+ if (url.username || url.password || url.search || url.hash)
79
+ throw new Error('chat.rerank.endpoint must not contain credentials, a query, or a fragment. The config never holds a key; name the environment variable that does with keyEnv');
80
+ result.endpoint = endpoint;
81
+ }
82
+ if (value.model !== undefined)
83
+ result.model = text(value.model, 'chat.rerank.model');
84
+ if (value.stateFormat !== undefined) {
85
+ if (value.stateFormat !== 'object' && value.stateFormat !== 'string')
86
+ throw new Error('chat.rerank.stateFormat must be object or string');
87
+ result.stateFormat = value.stateFormat;
88
+ }
89
+ if (value.onError !== undefined) {
90
+ if (value.onError !== 'search' && value.onError !== 'answer')
91
+ throw new Error('chat.rerank.onError must be search or answer');
92
+ result.onError = value.onError;
93
+ }
94
+ if (value.keyEnv !== undefined) {
95
+ const name = text(value.keyEnv, 'chat.rerank.keyEnv');
96
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
97
+ throw new Error('chat.rerank.keyEnv names an environment variable, such as LAYA_API_KEY, not the key itself');
98
+ result.keyEnv = name;
99
+ }
100
+ return result;
101
+ }
102
+ function route(value, where, extra = []) {
103
+ if (!mapping(value))
104
+ throw new Error(`${where} must be a mapping with at least a model`);
105
+ for (const key of Object.keys(value)) {
106
+ if (routeKeys.includes(key) || extra.includes(key))
107
+ continue;
108
+ throw new Error(/key|secret|token|password/i.test(key) && key !== 'maxTokens' ? `${where}.${key} is not a setting. The config never holds a key; name the environment variable that does with keyEnv` : `${where} has an unknown setting ${key}; it accepts ${[...routeKeys, ...extra].join(', ')}`);
109
+ }
110
+ const result = { model: text(value.model, `${where}.model`) };
111
+ if (value.provider !== undefined) {
112
+ if (value.provider !== 'openai')
113
+ throw new Error(`${where}.provider must be openai`);
114
+ result.provider = 'openai';
115
+ }
116
+ if (value.keyEnv !== undefined) {
117
+ const name = text(value.keyEnv, `${where}.keyEnv`);
118
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
119
+ throw new Error(`${where}.keyEnv names an environment variable, such as OPENROUTER_API_KEY, not the key itself`);
120
+ result.keyEnv = name;
121
+ }
122
+ if (value.baseUrl !== undefined) {
123
+ const url = text(value.baseUrl, `${where}.baseUrl`);
124
+ let parsed;
125
+ try {
126
+ parsed = new URL(url);
127
+ }
128
+ catch {
129
+ throw new Error(`${where}.baseUrl must be an http or https URL`);
130
+ }
131
+ if (!['http:', 'https:'].includes(parsed.protocol))
132
+ throw new Error(`${where}.baseUrl must be an http or https URL`);
133
+ if (parsed.username || parsed.password)
134
+ throw new Error(`${where}.baseUrl must not contain credentials; name the key variable with keyEnv`);
135
+ result.baseUrl = url;
136
+ }
137
+ if (value.maxTokens !== undefined)
138
+ result.maxTokens = integer(value.maxTokens, `${where}.maxTokens`, 1, 100000);
139
+ if (value.temperature !== undefined) {
140
+ if (typeof value.temperature !== 'number' || !(value.temperature >= 0 && value.temperature <= 2))
141
+ throw new Error(`${where}.temperature must be a number from 0 to 2`);
142
+ result.temperature = value.temperature;
143
+ }
144
+ if (value.body !== undefined)
145
+ result.body = bodyFields(value.body, `${where}.body`);
146
+ return result;
147
+ }
148
+ export function validateChat(value, readerFilters) {
149
+ if (value === undefined)
150
+ return undefined;
151
+ if (!mapping(value))
152
+ throw new Error('chat must be a mapping');
153
+ for (const key of Object.keys(value)) {
154
+ if (keys.includes(key))
155
+ continue;
156
+ throw new Error(/key|secret|token|password/i.test(key)
157
+ ? `chat.${key} is not a setting. The config never holds a key; name the environment variable that does with keyEnv`
158
+ : `chat has an unknown setting ${key}; it accepts ${keys.join(', ')}`);
159
+ }
160
+ const provider = text(value.provider, 'chat.provider');
161
+ if (provider !== 'openai')
162
+ throw new Error('chat.provider must be openai, which covers any OpenAI-style service, including OpenRouter');
163
+ const result = { provider, model: text(value.model, 'chat.model') };
164
+ if (value.keyEnv !== undefined) {
165
+ const name = text(value.keyEnv, 'chat.keyEnv');
166
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
167
+ throw new Error('chat.keyEnv names an environment variable, such as OPENROUTER_API_KEY, not the key itself');
168
+ result.keyEnv = name;
169
+ }
170
+ if (value.baseUrl !== undefined) {
171
+ const url = text(value.baseUrl, 'chat.baseUrl');
172
+ let parsed;
173
+ try {
174
+ parsed = new URL(url);
175
+ }
176
+ catch {
177
+ throw new Error('chat.baseUrl must be an http or https URL');
178
+ }
179
+ if (!['http:', 'https:'].includes(parsed.protocol))
180
+ throw new Error('chat.baseUrl must be an http or https URL');
181
+ if (parsed.username || parsed.password)
182
+ throw new Error('chat.baseUrl must not contain credentials; name the key variable with keyEnv');
183
+ result.baseUrl = url;
184
+ }
185
+ if (value.maxTokens !== undefined)
186
+ result.maxTokens = integer(value.maxTokens, 'chat.maxTokens', 1, 100000);
187
+ if (value.passages !== undefined)
188
+ result.passages = integer(value.passages, 'chat.passages', 1, 20);
189
+ if (value.temperature !== undefined) {
190
+ if (typeof value.temperature !== 'number' || !(value.temperature >= 0 && value.temperature <= 2))
191
+ throw new Error('chat.temperature must be a number from 0 to 2');
192
+ result.temperature = value.temperature;
193
+ }
194
+ if (value.readerView !== undefined) {
195
+ // Who the chat answers for. It uses the site's reader filters, so audience means the same thing in search and in chat.
196
+ if (!readerFilters)
197
+ throw new Error('chat.readerView needs readerFilters.facets in the site config');
198
+ const selection = validateReaderSelection(value.readerView, readerFilters, 'chat.readerView');
199
+ if (Object.values(selection).some(choices => !choices.length))
200
+ throw new Error('chat.readerView lists at least one choice for each filter');
201
+ result.readerView = selection;
202
+ }
203
+ if (value.rerank !== undefined) {
204
+ result.rerank = rerankConfig(value.rerank);
205
+ }
206
+ if (value.gate !== undefined) {
207
+ if (!mapping(value.gate))
208
+ throw new Error('chat.gate must be a mapping with decline and hedge');
209
+ for (const key of Object.keys(value.gate))
210
+ if (!['decline', 'hedge'].includes(key))
211
+ throw new Error(`chat.gate has an unknown setting ${key}; it accepts decline and hedge`);
212
+ const { decline, hedge } = value.gate;
213
+ if (typeof decline !== 'number' || typeof hedge !== 'number' || !(decline >= 0 && hedge <= 1 && decline < hedge))
214
+ throw new Error('chat.gate.decline and chat.gate.hedge must be numbers with 0 <= decline < hedge <= 1');
215
+ if (!result.rerank)
216
+ throw new Error('chat.gate needs chat.rerank: jev, because the gate reads Jev scores');
217
+ result.gate = { decline, hedge };
218
+ }
219
+ if (value.verify !== undefined) {
220
+ if (!mapping(value.verify))
221
+ throw new Error('chat.verify must be a mapping with threshold and onUnsupported');
222
+ for (const key of Object.keys(value.verify))
223
+ if (!['threshold', 'onUnsupported'].includes(key))
224
+ throw new Error(`chat.verify has an unknown setting ${key}; it accepts threshold and onUnsupported`);
225
+ const { threshold, onUnsupported = 'flag' } = value.verify;
226
+ if (typeof threshold !== 'number' || !(threshold > 0 && threshold < 1))
227
+ throw new Error('chat.verify.threshold must be a number above 0 and below 1');
228
+ if (onUnsupported !== 'flag' && onUnsupported !== 'remove')
229
+ throw new Error('chat.verify.onUnsupported must be flag or remove');
230
+ if (!result.rerank)
231
+ throw new Error('chat.verify needs chat.rerank: jev, because Jev checks each sentence against the passage it cites');
232
+ result.verify = { threshold, onUnsupported };
233
+ }
234
+ if (value.direct !== undefined) {
235
+ if (!mapping(value.direct))
236
+ throw new Error('chat.direct must be a mapping with threshold and maxChars');
237
+ for (const key of Object.keys(value.direct))
238
+ if (!['threshold', 'maxChars', 'margin', 'others'].includes(key))
239
+ throw new Error(`chat.direct has an unknown setting ${key}; it accepts threshold, maxChars, margin, and others`);
240
+ const { threshold, maxChars = 1200, margin = 0.1, others = 1 } = value.direct;
241
+ if (typeof margin !== 'number' || !(margin >= 0 && margin <= 1))
242
+ throw new Error('chat.direct.margin must be a number from 0 to 1');
243
+ if (typeof others !== 'number' || !Number.isSafeInteger(others) || others < 0 || others > 20)
244
+ throw new Error('chat.direct.others must be an integer from 0 to 20');
245
+ if (typeof threshold !== 'number' || !(threshold > 0 && threshold <= 1))
246
+ throw new Error('chat.direct.threshold must be a number above 0 and at most 1');
247
+ if (typeof maxChars !== 'number' || !Number.isSafeInteger(maxChars) || maxChars < 200 || maxChars > 6000)
248
+ throw new Error('chat.direct.maxChars must be an integer from 200 to 6000');
249
+ if (!result.rerank)
250
+ throw new Error('chat.direct needs chat.rerank: jev, because it reads Jev scores');
251
+ if (result.gate && threshold < result.gate.hedge)
252
+ throw new Error('chat.direct.threshold must be at least chat.gate.hedge, so a passage shown word for word is never one the gate would hedge on');
253
+ result.direct = { threshold, maxChars, margin, others };
254
+ }
255
+ if (value.body !== undefined)
256
+ result.body = bodyFields(value.body, 'chat.body');
257
+ if (value.cards !== undefined) {
258
+ if (!mapping(value.cards))
259
+ throw new Error('chat.cards must be a mapping with threshold and confirm');
260
+ for (const key of Object.keys(value.cards))
261
+ if (!['threshold', 'confirm'].includes(key))
262
+ throw new Error(`chat.cards has an unknown setting ${key}; it accepts threshold and confirm`);
263
+ // Similarity only shortlists a card. Jev's confirmation is the safety, so the shortlist can be loose.
264
+ const { threshold = 0.75, confirm = 0.9 } = value.cards;
265
+ if (typeof threshold !== 'number' || !(threshold > 0 && threshold <= 1))
266
+ throw new Error('chat.cards.threshold must be a number above 0 and at most 1');
267
+ if (typeof confirm !== 'number' || !(confirm > 0 && confirm <= 1))
268
+ throw new Error('chat.cards.confirm must be a number above 0 and at most 1');
269
+ if (!result.rerank)
270
+ throw new Error('chat.cards needs chat.rerank: jev, because Jev confirms that a card answers the question');
271
+ result.cards = { threshold, confirm };
272
+ }
273
+ if (value.log !== undefined) {
274
+ if (!mapping(value.log))
275
+ throw new Error('chat.log must be a mapping');
276
+ for (const key of Object.keys(value.log))
277
+ if (!['retentionDays', 'maxPerDay', 'answers', 'notice'].includes(key))
278
+ throw new Error(`chat.log has an unknown setting ${key}; it accepts retentionDays, maxPerDay, answers, and notice`);
279
+ if (!value.budget || !mapping(value.budget) || !value.budget.store)
280
+ throw new Error('chat.log needs chat.budget.store, because questions are recorded in the same store as the daily counters');
281
+ const notice = value.log.notice === undefined ? defaultLogNotice : typeof value.log.notice === 'string' ? value.log.notice.trim() : '';
282
+ if (!notice || notice.length > 300)
283
+ throw new Error('chat.log.notice must be text of 300 characters or fewer, shown to readers');
284
+ if (value.log.answers !== undefined && typeof value.log.answers !== 'boolean')
285
+ throw new Error('chat.log.answers must be true or false');
286
+ result.log = { retentionDays: value.log.retentionDays === undefined ? 30 : integer(value.log.retentionDays, 'chat.log.retentionDays', 1, 365), maxPerDay: value.log.maxPerDay === undefined ? 2000 : integer(value.log.maxPerDay, 'chat.log.maxPerDay', 1, 100000), answers: value.log.answers ?? true, notice };
287
+ }
288
+ if (value.panel !== undefined) {
289
+ if (!mapping(value.panel))
290
+ throw new Error('chat.panel must be a mapping with title, placeholder, or intro');
291
+ const panel = {};
292
+ for (const [key, entry] of Object.entries(value.panel)) {
293
+ if (key !== 'title' && key !== 'placeholder' && key !== 'intro')
294
+ throw new Error(`chat.panel has an unknown setting ${key}; it accepts title, placeholder, and intro`);
295
+ const words = typeof entry === 'string' ? entry.trim() : '';
296
+ if (!words || words.length > 150)
297
+ throw new Error(`chat.panel.${key} must be text of 150 characters or fewer`);
298
+ panel[key] = words;
299
+ }
300
+ if (Object.keys(panel).length)
301
+ result.panel = panel;
302
+ }
303
+ if (value.challenge !== undefined) {
304
+ const challenge = value.challenge;
305
+ if (!mapping(challenge))
306
+ throw new Error('chat.challenge must be a mapping with provider, siteKey, and secretEnv');
307
+ for (const key of Object.keys(challenge)) {
308
+ if (['provider', 'siteKey', 'secretEnv', 'when', 'freeQuestions', 'busyShare'].includes(key))
309
+ continue;
310
+ throw new Error(/key|secret|token|password/i.test(key) ? `chat.challenge.${key} is not a setting. The config never holds a secret; name the environment variable that does with secretEnv` : `chat.challenge has an unknown setting ${key}; it accepts provider, siteKey, secretEnv, when, freeQuestions, and busyShare`);
311
+ }
312
+ if (challenge.provider !== 'turnstile')
313
+ throw new Error('chat.challenge.provider must be turnstile');
314
+ const siteKey = typeof challenge.siteKey === 'string' ? challenge.siteKey.trim() : '';
315
+ if (!/^[0-9A-Za-z_-]{8,64}$/.test(siteKey))
316
+ throw new Error('chat.challenge.siteKey must be the public site key from the Turnstile dashboard');
317
+ const secretEnv = typeof challenge.secretEnv === 'string' ? challenge.secretEnv.trim() : '';
318
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(secretEnv))
319
+ throw new Error('chat.challenge.secretEnv names an environment variable, such as TURNSTILE_SECRET_KEY, not the secret itself');
320
+ if (challenge.when !== undefined && challenge.when !== 'adaptive' && challenge.when !== 'always')
321
+ throw new Error('chat.challenge.when must be adaptive or always');
322
+ if (challenge.busyShare !== undefined && (typeof challenge.busyShare !== 'number' || !(challenge.busyShare > 0 && challenge.busyShare <= 1)))
323
+ throw new Error('chat.challenge.busyShare must be a number above 0 and at most 1');
324
+ result.challenge = { provider: 'turnstile', siteKey, secretEnv, when: challenge.when ?? 'adaptive', freeQuestions: challenge.freeQuestions === undefined ? 3 : integer(challenge.freeQuestions, 'chat.challenge.freeQuestions', 0, 1000), busyShare: challenge.busyShare ?? 0.5 };
325
+ }
326
+ if (value.budget !== undefined) {
327
+ if (!mapping(value.budget))
328
+ throw new Error('chat.budget must be a mapping with perCaller and perDay');
329
+ for (const key of Object.keys(value.budget))
330
+ if (!['perCaller', 'perDay', 'store'].includes(key))
331
+ throw new Error(`chat.budget has an unknown setting ${key}; it accepts perCaller, perDay, and store`);
332
+ const perCaller = integer(value.budget.perCaller, 'chat.budget.perCaller', 1, 100000);
333
+ const perDay = integer(value.budget.perDay, 'chat.budget.perDay', 1, 10000000);
334
+ if (perCaller > perDay)
335
+ throw new Error('chat.budget.perCaller can not be more than chat.budget.perDay');
336
+ result.budget = { perCaller, perDay };
337
+ if (value.budget.store !== undefined) {
338
+ const store = value.budget.store;
339
+ if (!mapping(store))
340
+ throw new Error('chat.budget.store must be a mapping with provider, urlEnv, and tokenEnv');
341
+ for (const key of Object.keys(store)) {
342
+ if (['provider', 'urlEnv', 'tokenEnv'].includes(key))
343
+ continue;
344
+ throw new Error(/key|secret|token|password|url/i.test(key) && !['urlEnv', 'tokenEnv'].includes(key) ? `chat.budget.store.${key} is not a setting. The config never holds an address or token; name the environment variables that do with urlEnv and tokenEnv` : `chat.budget.store has an unknown setting ${key}; it accepts provider, urlEnv, and tokenEnv`);
345
+ }
346
+ if (store.provider !== 'upstash')
347
+ throw new Error('chat.budget.store.provider must be upstash, the REST API that Upstash Redis and Vercel KV provide');
348
+ const name = (setting, where) => {
349
+ const text = typeof setting === 'string' ? setting.trim() : '';
350
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(text))
351
+ throw new Error(`${where} names an environment variable, such as KV_REST_API_URL, not the value itself`);
352
+ return text;
353
+ };
354
+ result.budget.store = { provider: 'upstash', urlEnv: name(store.urlEnv, 'chat.budget.store.urlEnv'), tokenEnv: name(store.tokenEnv, 'chat.budget.store.tokenEnv') };
355
+ }
356
+ }
357
+ if (value.cache !== undefined) {
358
+ if (!mapping(value.cache))
359
+ throw new Error('chat.cache must be a mapping with maxEntries and ttlMinutes');
360
+ for (const key of Object.keys(value.cache))
361
+ if (!['maxEntries', 'ttlMinutes'].includes(key))
362
+ throw new Error(`chat.cache has an unknown setting ${key}; it accepts maxEntries and ttlMinutes`);
363
+ result.cache = { maxEntries: value.cache.maxEntries === undefined ? 500 : integer(value.cache.maxEntries, 'chat.cache.maxEntries', 1, 100000), ttlMinutes: value.cache.ttlMinutes === undefined ? 1440 : integer(value.cache.ttlMinutes, 'chat.cache.ttlMinutes', 1, 525600) };
364
+ }
365
+ if (value.fallback !== undefined) {
366
+ if (!Array.isArray(value.fallback) || value.fallback.length < 1 || value.fallback.length > 5)
367
+ throw new Error('chat.fallback must be a list of one to five models');
368
+ result.fallback = value.fallback.map((entry, at) => route(entry, `chat.fallback[${at}]`));
369
+ }
370
+ if (value.escalate !== undefined) {
371
+ const second = route(value.escalate, 'chat.escalate', ['when']);
372
+ let when;
373
+ if (value.escalate.when === undefined)
374
+ when = ['unsupported-code', 'uncited', ...(result.verify ? ['unsupported-claim'] : [])];
375
+ else {
376
+ const listed = value.escalate.when;
377
+ if (!Array.isArray(listed) || !listed.length || new Set(listed).size !== listed.length || listed.some(reason => !escalateReasons.includes(reason)))
378
+ throw new Error(`chat.escalate.when must be a unique list of ${escalateReasons.join(', ')}`);
379
+ when = listed;
380
+ }
381
+ if (when.includes('unsupported-claim') && !result.verify)
382
+ throw new Error('chat.escalate.when lists unsupported-claim, which needs chat.verify');
383
+ result.escalate = { ...second, when };
384
+ }
385
+ return result;
386
+ }
387
+ // Flags override the config, so a model can be tried without editing it. A missing chat section is an error, because nothing
388
+ // here supplies a default service.
389
+ export function chatProviderConfig(config, flags = {}) {
390
+ const provider = config?.provider;
391
+ const model = flags.model ?? config?.model;
392
+ if (!provider || !model)
393
+ throw new Error('Choose a chat provider and model: set chat in docs.config.yaml, or add chat.provider and chat.model');
394
+ return { provider, model, baseUrl: flags.baseUrl ?? config?.baseUrl, keyEnv: flags.keyEnv ?? config?.keyEnv, maxTokens: config?.maxTokens, temperature: config?.temperature, ...(config?.body ? { body: config.body } : {}) };
395
+ }
396
+ const merged = (main, entry) => ({ ...main, ...Object.fromEntries(Object.entries(entry).filter(([key, value]) => value !== undefined && key !== 'when')) });
397
+ // The provider settings for each extra model. Each inherits the main model's settings and overrides only what it names.
398
+ export function chatRoutes(config, main) {
399
+ return { fallbacks: (config?.fallback ?? []).map(entry => merged(main, entry)), ...(config?.escalate ? { escalate: { config: merged(main, config.escalate), when: config.escalate.when } } : {}) };
400
+ }
@@ -0,0 +1 @@
1
+ export declare const pausedKey = "shoalrun:chat:paused";
@@ -0,0 +1,3 @@
1
+ // The chat's instant off switch, kept in the same store as the daily counters so it takes effect within seconds and needs no redeploy.
2
+ // A running function checks the flag at most every five seconds. `shoalrun chat pause` sets it and `shoalrun chat resume` clears it.
3
+ export const pausedKey = 'shoalrun:chat:paused';
package/dist/chat.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ import { type Transport } from './provider-http.js';
2
+ export type ChatMessage = {
3
+ role: 'system' | 'user' | 'assistant';
4
+ content: string;
5
+ };
6
+ export type ChatCallOptions = {
7
+ maxTokens?: number;
8
+ temperature?: number;
9
+ signal?: AbortSignal;
10
+ };
11
+ export type ChatRoute = {
12
+ model: string;
13
+ failed: Array<{
14
+ model: string;
15
+ error: string;
16
+ }>;
17
+ };
18
+ export type ChatResult = {
19
+ text: string;
20
+ finishReason?: string;
21
+ model?: string;
22
+ promptTokens?: number;
23
+ completionTokens?: number;
24
+ route?: ChatRoute;
25
+ };
26
+ export type ChatProvider = {
27
+ name: string;
28
+ model: string;
29
+ complete(messages: ChatMessage[], options?: ChatCallOptions): Promise<ChatResult>;
30
+ };
31
+ export declare const reservedBodyFields: string[];
32
+ export type OpenAIChatOptions = Transport & {
33
+ body?: Record<string, unknown>;
34
+ model: string;
35
+ apiKey?: string;
36
+ keyEnv?: string;
37
+ baseUrl?: string;
38
+ maxTokens?: number;
39
+ temperature?: number;
40
+ };
41
+ export declare function openAIChatProvider(options: OpenAIChatOptions): ChatProvider;
42
+ export type ChatProviderConfig = Partial<OpenAIChatOptions> & {
43
+ provider?: string;
44
+ };
45
+ export declare function createChatProvider(config?: ChatProviderConfig): ChatProvider;
46
+ export declare function fallbackChat(providers: ChatProvider[]): ChatProvider;
package/dist/chat.js ADDED
@@ -0,0 +1,78 @@
1
+ import { postJson, providerError, throwIfCancelled } from './provider-http.js';
2
+ // Fields the tool owns. Extra body fields can add to a request but never replace these.
3
+ export const reservedBodyFields = ['model', 'messages', 'max_tokens', 'temperature', 'stream'];
4
+ // The OpenAI chat completions API, and the many services that copy it: OpenRouter, OpenAI, Ollama, vLLM, a LiteLLM proxy. Shoalrun has
5
+ // no default model or service. Whoever runs it chooses both, and the choice lives in config. The key comes from the environment
6
+ // variable named by `keyEnv` (OPENAI_API_KEY by default) and never appears in an error.
7
+ export function openAIChatProvider(options) {
8
+ const model = options.model;
9
+ if (!model)
10
+ throw new Error('Choose a chat model');
11
+ const baseUrl = (options.baseUrl ?? 'https://api.openai.com/v1').replace(/\/+$/, '');
12
+ const local = /^https?:\/\/(localhost|127\.0\.0\.1|\[::1\])(:|\/|$)/.test(baseUrl);
13
+ const keyEnv = options.keyEnv ?? 'OPENAI_API_KEY';
14
+ return {
15
+ name: 'openai', model,
16
+ async complete(messages, call = {}) {
17
+ const apiKey = options.apiKey ?? process.env[keyEnv];
18
+ if (!apiKey && !local)
19
+ throw new Error(`Set ${keyEnv} to generate answers`);
20
+ const maxTokens = call.maxTokens ?? options.maxTokens;
21
+ const temperature = call.temperature ?? options.temperature;
22
+ // Some models occasionally return an empty reply with a normal stop. That is worth one more try. An empty reply that stopped at the
23
+ // token limit is not: asking again would use the same limit.
24
+ for (let attempt = 0;; attempt++) {
25
+ throwIfCancelled(call.signal);
26
+ const body = await postJson('Chat API', `${baseUrl}/chat/completions`, apiKey ? { authorization: `Bearer ${apiKey}` } : {}, { ...options.body, model, messages, ...(maxTokens ? { max_tokens: maxTokens } : {}), ...(temperature !== undefined ? { temperature } : {}) }, { ...options, signal: call.signal });
27
+ // Some services report an upstream failure with HTTP 200 and an error object.
28
+ if (body?.error)
29
+ throw new Error(`Chat API returned an error: ${providerError(typeof body.error === 'string' ? body.error : body.error.message ?? 'unknown', [apiKey])}`);
30
+ const choice = body?.choices?.[0];
31
+ const content = choice?.message?.content;
32
+ const text = typeof content === 'string' ? content : Array.isArray(content) ? content.map(part => typeof part === 'string' ? part : String(part?.text ?? '')).join('') : '';
33
+ if (text.trim())
34
+ return { text: text.trim(), finishReason: choice?.finish_reason, model: body.model, promptTokens: body.usage?.prompt_tokens, completionTokens: body.usage?.completion_tokens };
35
+ if (attempt === 0 && choice?.finish_reason !== 'length')
36
+ continue;
37
+ throw new Error(`Chat API returned no answer text${choice?.finish_reason ? ` (finish reason: ${choice.finish_reason})` : ''}${choice?.finish_reason === 'length' ? '; a reasoning model may need a larger chat.maxTokens' : ''}`);
38
+ }
39
+ }
40
+ };
41
+ }
42
+ // Shoalrun has no default chat provider or model, exactly as with embeddings.
43
+ export function createChatProvider(config = {}) {
44
+ const { provider, model } = config;
45
+ if (!provider)
46
+ throw new Error('Choose a chat provider: openai (any OpenAI-style service, including OpenRouter)');
47
+ if (!model)
48
+ throw new Error(`Choose a chat model for ${provider}`);
49
+ if (provider === 'openai')
50
+ return openAIChatProvider({ ...config, model });
51
+ throw new Error(`Unknown chat provider ${provider}; use openai`);
52
+ }
53
+ // Try each model in turn and use the first that answers. The result says which one did and which ones failed, and why. If none answers,
54
+ // the error lists every failure.
55
+ export function fallbackChat(providers) {
56
+ if (!providers.length)
57
+ throw new Error('fallbackChat needs at least one provider');
58
+ if (providers.length === 1)
59
+ return providers[0];
60
+ return {
61
+ name: providers[0].name,
62
+ model: providers[0].model,
63
+ async complete(messages, call) {
64
+ const failed = [];
65
+ for (const provider of providers) {
66
+ throwIfCancelled(call?.signal);
67
+ try {
68
+ return { ...await provider.complete(messages, call), route: { model: provider.model, failed } };
69
+ }
70
+ catch (error) {
71
+ throwIfCancelled(call?.signal);
72
+ failed.push({ model: provider.model, error: error.message });
73
+ }
74
+ }
75
+ throw new Error(`Every model failed: ${failed.map(item => `${item.model}: ${item.error}`).join('; ')}`);
76
+ }
77
+ };
78
+ }
@@ -0,0 +1,4 @@
1
+ export declare const docsHelp = "Usage: shoalrun docs <command>\n\nRead bundled references (no project or provider key required):\n search <query> [--json]\n read <document-id> [--json]\n\nInspect a project:\n project [--config FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings]\n source FILE [--config FILE]\n context <document-id> [--config FILE]\n\nValidate and preview edits:\n baseline --out FILE [--config FILE]\n validate (--baseline FILE | --file FILE | --id ID) [--config FILE]\n validation-status REPORT\n review REPORT [--format json|markdown]\n preview REPORT [--port PORT]\n\nOther authoring tools: changes, plan, apply, mcp.\nDiscover packaged agent guidance with shoalrun skills list.\n";
2
+ export declare const skillsHelp = "Usage: shoalrun skills list [--json]\n shoalrun skills read <name> [--json]\n\nList the names, descriptions and local paths of packaged skills, or read a skill.\nThese commands do not install skills or require a project or provider key.\n";
3
+ export declare const cliHelp = "Usage: shoalrun <command>\n\nStart and build:\n init [directory] [--starter minimal|api-docs|showcase]\n build [config] [output]\n export [config] --out DIRECTORY [--target NAME]\n dev [config] [output] [--port PORT]\n serve <site-directory> [--host HOST] [--port PORT]\n check [config] [--json]\n audit [config]\n scaffold <template> -n <target> [--config FILE]\n\nAgent guidance and offline documentation:\n skills list [--json]\n skills read <name> [--json]\n docs search <query> [--json]\n docs read <document-id> [--json]\n docs project [--config FILE]\n docs baseline --out FILE [--config FILE]\n docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE]\n docs review REPORT [--format json|markdown]\n docs preview REPORT [--port PORT]\n\nOther commands: config, api, operation, ingredient, recipe, search, index,\nask, answers, ask-log, chat, eval, vercel.\nRun shoalrun docs --help or shoalrun skills --help for discovery commands.\n";
4
+ export declare function runSkillsCommand(args: string[]): Promise<string>;