34e746e: A link the agent surfaces and the assistant rewrite to a route with a space, a parenthesis, or a quote in it (my page.md publishes at /my page) now has those characters percent-encoded, so it’s still a link, also inside a component’s quoted href. Before, [Mine](./my%20page.md) became [Mine](/my page), which shows as text. The page links in llms.txt, the site’s agent skill, the changelog list, and an API reference operation list now encode a parenthesis or a quote the same way, so one in a route can’t end the link early.
34e746e: In a .md page, a link or image inside an indented code block is now left as written on the agent surfaces (the .md mirrors, llms-full.txt, MCP get_page, and the assistant’s excerpts), and blume validate no longer checks it, as with one in a fenced block. A link or image in a comment is left as written on the agent surfaces too, and a page from a content source now renders an image or file link in its indented code as written, as does any page for one in an included partial’s indented code or comments. Before, they were rewritten to routes or served file URLs, and blume validate reported a link in indented code as broken when it didn’t resolve.
34e746e: On a translated page, a relative link to a page that isn’t translated yet now points at the locale’s copy of that page in the .md mirrors, llms-full.txt, and MCP get_page, as it does on the rendered page. Before, it pointed at the default locale’s page. On a site with both versions and locales, such a link now also lands on the page in the reader’s own docs version on those surfaces and in blume validate, where it could point at an archived version’s copy instead of the current one, and blume validate reads one that climbs into another version’s or locale’s folder as the rendered page does, instead of reporting it as broken. On an archived version’s translated page, the rendered link to such a page now follows that page’s slug too, as on the current version’s.
9d21673: Fix the Algolia search sync hanging the build when the configured index doesn’t exist. replaceAllObjects starts by copying the index’s settings into a temporary one, and a copy from a missing index never publishes, so the sync polled it for about an hour with no error until the CI platform killed the build. A missing index is now created by uploading the records straight into it, and every Algolia task the sync waits on is polled for about seven minutes at most, so a stuck one fails the build with BLUME_SEARCH_SYNC_FAILED instead of hanging it. Separately, an index whose settings were never set answers null for them, which crashed the sync after uploading the records with Cannot read properties of null (reading 'map'); unset settings now read as empty, and a never-set attributeForDistinct counts as unset.
34e746e: The assistant now finds the page the reader is on when its route has letters beyond ASCII or a space in it (/sv/översikt), so it grounds its answer in that page first and keeps to its docs version. Before, it looked the page up by the percent-encoded path the browser sends, found nothing, and answered as if the reader were on no page.
34e746e: The assistant’s root page links ([Setup](/guides/setup)) now get the basePath and the page’s locale prefix, as the rendered page gives them, so a link the assistant cites lands on the page on a site with a basePath, and on the reader’s translation when there is one. A link that already carries the deployment.base is read as including it, and one to a locale’s copy of a page that isn’t translated yet, with a trailing slash or without, names the page the assistant reads in its place. A root image that carries the deployment.base loses it there too, since the chat panel adds it. Before, the assistant read root page links as written, and under a basePath the links it cited led to a 404.
34e746e: In the assistant’s excerpts, an API reference operation list (<ApiTagOperations>) and a page’s <Changelog /> release list now link pages by route, as the rest of the excerpts do, without the deployment.base or the site’s URL. Before, under a deployment.base, those links carried the base, and the chat panel added it again, so a link the assistant cited from them led to a 404.
34e746e: A page title with a line break in it, as a folded YAML title: > ends with or a literal title: | holds, is now read as one line, so it no longer breaks a link built from it: the assistant’s citation heading, the llms.txt and agent skill page lists, and the changelog release list. Before, the line break split the link across two lines, so it showed as text. In llms-full.txt, such a title also split its page’s section heading, and a page that opened with the same heading showed it twice.
34e746e: A relative link that would resolve to a path a browser reads as another site’s (/\host or //host, once it drops the tabs and line breaks a URL may hold) is now left as written, on the rendered page and the agent surfaces alike: \host/x on the home page, say, or ../\host/x. The link as written stays on your site.
c1d56f9: WebMCP now registers two more in-page tools: read_skill, which lists the site’s published agent skills or returns one’s SKILL.md, and navigate_page, which opens a page of the site in the reader’s tab through the client router. The WebMCP get_page tool no longer fetches another site’s Markdown when handed a route a browser resolves to another origin, like //host or /\host.