सामग्री पर जाएँ
Blume is now publicly available.
Blume
हिन्दी
Esc
नेविगेटखोलें⌘Jप्रीव्यू
इस पेज पर

blume@1.4.3

Patch Changes

  • c19bfeb: Render Ask AI answers through a dedicated Marked instance instead of mutating the shared marked singleton, so other components importing marked no longer inherit the panel’s breaks option and citation link rewriting.
  • d16f0a5: Keep keyboard focus inside the Ask AI panel while it is a small-screen overlay: everything behind it turns inert until it closes, so Tab no longer escapes into the covered page. The desktop docked panel stays non-modal and the page remains interactive.
  • e59cbd2: Add ai.ask.instructions for custom system-prompt text (identity, language, tone). It is appended to the built-in instructions on every backend, so the grounding and citation contract stays intact.
  • 421fa82: Locate Ask AI grounding excerpts for queries in languages written without word spaces. Query terms are now segmented with Intl.Segmenter (with a Unicode-aware regex fallback) instead of a Latin-only pattern, so Japanese, Chinese, Korean, and Thai questions center the injected excerpt on the matching section instead of always sending the head of the page. Content and query are NFC-normalized so decomposed text still matches.
  • e59cbd2: Warn at build time, naming the exact package to install, when the configured Ask AI backend’s provider SDK isn’t installed — instead of failing with an opaque unresolved-import error.
  • 9a1b71c: Bound concurrent file reads during audit crawling, example/island discovery, and math detection with p-map. These previously fanned out one unbounded fs call per discovered file, which on large sites risked EMFILE and held every page’s HTML in memory at once.
  • 9156701: Keep punctuation out of the index terms the segmenting search tokenizer produces. Intl.Segmenter follows UAX #29, which holds connector punctuation, combining marks, format characters and mid-number punctuation inside a word, so スネーク_ケース and robots.txt each arrived as a single word-like segment and were indexed as they stood — reachable only by retyping the punctuation, and unreachable from ケース or txt. Word-like segments made of nothing but a symbol became index terms of their own. Segments are now split into runs of letters, combining marks and digits — marks are spelling, so Thai vowel and tone signs and the voicing in decomposed kana survive, as do a word-internal apostrophe (don't) and punctuation flanked by digits (1.0.3, 1,000) — and each boundary ends a bigram run the same way a space or an interpunct does, so no window spans it. Text is also NFC-normalized before segmenting, so decomposed input indexes the same terms as a composed query.
  • 051bceb: Count audit prose words with Intl.Segmenter seeded by the page’s lang. The whitespace split it replaces counted a fully written Japanese or Chinese page as a handful of “words”, tripping BLUME_AUDIT_LOW_WORD_COUNT on every page of a CJK site.
  • 156d5ff: Preserve the request query string when the Cloudflare wrapper Worker answers a configured redirect. The baked-in redirect table now matches the static layer’s _redirects semantics: the incoming query string is forwarded to the destination unless the destination specifies its own, so inbound links carrying UTM or ref parameters keep them across a retired URL.
  • 2cb73cc: Slug Accordion, Tab, and Update ids through github-slugger via one shared helper instead of three identical per-component copies. Component ids now slug exactly like heading anchors: unicode letters are kept (Españolespañol instead of espaol) and underscores survive. Titles that relied on the old ASCII-only stripping get new ids, so hash deep-links to such components change once.
  • c37b42a: Consolidate four divergent route normalizers (OpenAPI references, Ask AI retrieval, the MCP server, and the Scalar page generator) onto one shared normalizeRoute in core, and retire the last quadratic edge-trimming regexes in favor of the linear trim helpers.
  • 92e1d2e: Spawn agent CLIs (claude/codex handoffs, eval and translate runners) through cross-spawn instead of shell: true on Windows. cmd.exe no longer parses the argument list — codex’s -c flags carry JSON that shell quoting could mangle, and the interactive handoff no longer hand-builds a quoted command line — and a missing executable now rejects with ENOENT on every platform instead of surfacing as cmd.exe’s exit code 9009.
  • d56e235: Declare p-retry and nanotar as dependencies. Both were imported by openapi/parse.ts and ai/tar.ts but only declared in the monorepo root, so installs of the published package could fail to resolve them.
  • be0d582: Deduplicate the escapeRawHtml/unwrapParagraph helpers that were copied verbatim into <Prompt>, <Frame>, and <Tooltip> into one shared module. No behavior change.
  • e5a374a: Hand the CLI’s .env/.env.local cascade to dotenv.config({ path }) instead of a hand-rolled apply loop. The walk up to the repo root stays; the first-wins ordering, never-clobber-process.env semantics, and best-effort file handling now come from dotenv itself.
  • d67135f: Cut GitHub Releases meta descriptions on grapheme boundaries. The UTF-16 slice could split a surrogate pair at the 160-character cap, emitting invalid Unicode (a lone surrogate) into seo.description.
  • 5056321: Harden the search excerpt sanitizer: any < that does not begin a bare <mark> tag is now entity-escaped instead of passed through. A remote excerpt containing <!-- could previously open an HTML comment inside the results list and swallow the rest of the excerpt, highlights included. Rendering of legitimate text is unchanged.
  • 7c37792: Keep the Ask AI overlay’s inert sweep current while it is open. The sweep snapshotted <body>’s children at open time, so anything portaled in afterwards (an image-zoom backdrop, a mermaid render, another island) stayed tabbable behind the overlay; a MutationObserver now folds late arrivals into the sweep.
  • 614ecb2: Measure header logo SVG dimensions with image-size instead of a hand-rolled attribute regex. This is the same parser the OG card already uses for the brand mark, so the two can no longer disagree about one logo, and spellings the regex missed (unquoted attributes, em/pt lengths, a > inside another attribute value) now measure correctly.
  • 0db1528: Define each MCP tool’s input once in zod and derive both the runtime argument parsing and the JSON Schema advertised by tools/list from that single definition, so the two can no longer drift. The lenient agent-friendly coercions are preserved: a bare string is accepted for an array field, []/{} mean “no filter”, and out-of-range limits clamp instead of rejecting.
  • 9229cf2: Extract search-index plain text by parsing Markdown (GFM included) and walking the tree instead of regex-stripping the source. Reference-style links, autolinks, setext headings, and table cells now index their text; literal */~/> in prose are no longer blanked; and the inner prose of block-level JSX components stays indexed. Applies to the client index and every hosted-provider sync, so rankings may shift slightly on re-index.
  • fec3400: Build agent-skill .tar.gz archives with nanotar instead of a hand-rolled ustar writer, keeping the path validation, deterministic attributes, and sync gzip layer. The header byte layout changes once with this release, so each published skill’s archive digest changes on the next build; digests remain stable from then on and are now pinned by a golden test.
  • b6fe173: Pace Notion source API requests through a bounded request pool (default 3 concurrent, configurable via concurrency) and jitter the 429 backoff, so large databases import within Notion’s rate limits instead of failing the build with BLUME_SOURCE_FETCH_FAILED.
  • 9560ed2: Measure the OG-card brand mark’s aspect ratio with image-size (already a dependency) instead of a viewBox regex. Legitimate SVG spellings the regex missed — viewBox = "…" with spaces, newline-separated values, explicit width/height attributes without a viewBox — no longer silently render a squashed square mark.
  • fc92c24: Flatten OpenAPI descriptions into meta descriptions with a real markdown parse (mdast-util-to-string) instead of regex stripping. Literal punctuation in spec prose survives — snake_case no longer becomes snakecase, C# no longer becomes C — in the seo.description tags of generated reference pages.
  • 7f1b355: Leave tilde-fenced code blocks in OpenAPI spec descriptions verbatim when escaping MDX-special characters, matching how backtick fences are already handled. Braces inside a ~~~ fence no longer ship as literal &#123; entities on rendered reference pages.
  • ea04c90: Replace three hand-rolled concurrency pools with p-limit/p-map: the Notion source’s request semaphore, the link-audit probe pool, and the translate runner’s worker lanes and ledger-flush mutex. Behavior is unchanged — bounds, FIFO ordering, and the flush-before-next-item guarantee all carry over — with ~100 fewer lines to maintain.
  • 40cb5d1: Drive remote OpenAPI spec fetch retries through p-retry instead of a hand-rolled loop. The behavior is unchanged — three attempts, exponential backoff capped at 10s, non-retryable statuses abort immediately, and a sane Retry-After replaces the backoff rather than stacking on it (now covered by a test).
  • b15a87a: Render package-install command tabs through package-manager-detector (the engine behind ni), with the yarn tab pinned to Berry. Previously the yarn tab mixed Berry-only commands (yarn dlx, --immutable) with Classic-only ones (yarn global add), so no single yarn version could run every rendered command; global installs on the yarn tab now render npm’s form, since Berry removed yarn global. blume eject also detects the project’s package manager from its lockfile instead of only the invoking user agent, which was absent (silently defaulting to npm) whenever the CLI was run directly.
  • 39367e2: Strip all markup except bare <mark> highlights from Pagefind excerpts before rendering them in the search dialog and preview pane, so a compromised or tampered search index can’t inject HTML into reader pages. The other providers already escape their excerpts.
  • 0900dc7: Parse llms.txt link targets with a real Markdown parse instead of a ](url) regex in the audit crawler. Reference-style links and angle-bracket destinations now resolve, link titles no longer leak into URLs, and link-shaped strings inside fenced code blocks are no longer probed as claims.
  • 4b04a52: Locate code regions in OpenAPI descriptions with a CommonMark parse instead of fence-emulating regexes when escaping MDX-special characters. The parser is the authority on backtick pairing, tilde closers, unclosed fences, and fences nested in blockquotes (which the regexes mis-handled by escaping entities into the quoted code). Indented blocks keep escaping as prose — MDX has no indented code form.
  • abd6be5: Collapse the dev server’s regeneration debounce and single-flight coalescer into perfect-debounce, whose contract covers both: watch bursts debounce at 80ms and a trigger during a running scan marks exactly one trailing rerun instead of starting an overlapping scan. The heap-exhaustion guarantee the old coalescer carried is pinned by a dedicated test against the library.
  • f2ca3f6: Escape Markdown syntax in Portable Text prose spans. Span text is plain text by the Portable Text contract, but a literal *, _, [, backtick, ~, or < typed in Sanity was interpreted as Markdown or raw HTML in the rendered page; those characters now render as themselves. Code-marked spans stay verbatim.
  • 61a1146: Coalesce the page-actions menu and <Component> preview-pane resize handlers to one layout pass per animation frame. Both previously re-read layout on every resize event, causing needless main-thread churn during a live resize drag.
  • 2094270: Honor the HTTP-date form of Retry-After (RFC 9110’s Wed, 21 Oct 2015 07:28:00 GMT spelling) when retrying remote OpenAPI spec fetches. Previously only delta-seconds were parsed and date values were silently ignored.
  • 3d6789b: Strip : and control characters from filename-derived route segments, so files like Guide: Architecture.md build instead of crashing route generation with “The URL must be of scheme file”.
  • a7ad63a: Give the search dialog proper combobox semantics: the input announces as role="combobox" with aria-expanded/aria-controls/aria-autocomplete, results render in a labeled role="listbox" with grouped role="option" rows, and the highlighted result is surfaced through aria-activedescendant and aria-selected. Screen readers previously heard nothing while arrowing through results.
  • 1a83df2: Guard the search dialog’s localStorage reads and writes so blocked storage (Safari “Block All Cookies”, sandboxed webviews) degrades to session-default preferences instead of throwing during setup and leaving search unable to open.
  • 3b59b8f: Hash staged source content and asset filenames with SHA-256 (64-bit prefix) instead of a 31-bit DJB2 hash. The old hash named downloaded CMS assets, where a collision — plausible from ~46k items — silently served the wrong file. The first build after upgrading re-downloads remote source assets once under the new names.
  • f14ac3f: Consolidate the six hand-rolled clipboard + “Copied” flashes (code blocks, page actions, color swatches, prompts, API panels, Ask AI) into one shared helper. Every copy affordance now announces success to a screen-reader live region (previously only code blocks did), never confirms a failed write, and holds its confirmation through rapid repeat clicks instead of reverting early.
  • e511d02: Join deployment.site with emitted paths through one shared helper built on ufo’s joinURL. Eight emitters (sitemap, RSS, robots, llms.txt, the MCP server and discovery documents, the API catalog, agent-readability) had drifted across three different trailing-slash treatments; they now agree, and a site configured with extra trailing slashes can no longer produce double-slash URLs.
  • 19f1f7d: Split the sitemap into a sitemap index over numbered sitemap-N.xml chunks when a site exceeds 50,000 URLs, the per-file cap search engines enforce. Smaller sites keep the single classic sitemap.xml.
  • c3f058d: Keep Unicode letters in OpenAPI tag slugs, and label tag sidebar groups with the spec’s own tag names. Slugs derived from OpenAPI tag names and reference-source labels now keep Unicode letters and numbers (with NFC normalization) instead of stripping them to hyphens, and tag sidebar groups take their label directly from the spec’s tags[].name (overridable with a meta.ts title), so authored casing like OAuth2 or Größe renders verbatim. Note that operation-page URLs change for specs whose tag names, operation ids, or source labels contain non-ASCII characters — if such URLs are already deployed, add entries under redirects in blume.config to forward the old routes.
  • e81ab33: Harden the search excerpt sanitizer against tag splicing: every < is now consumed by a single scan, so dropping a disallowed tag can no longer join the text around it into a fresh one.
  • 6c747bc: Treat a document-leading --- followed by a blank line, or one with no closing fence, as a thematic break instead of front matter, so bodies that open with a divider (e.g. a Notion page whose first block is one) build instead of crashing with a YAML parse error.
  • 032df5f: Keep Unicode letters in CMS/frontmatter slugs. The slugifier’s ASCII-only keep-class deleted every non-ASCII character, so a Japanese/Chinese/Cyrillic slug collapsed to empty (forcing Sanity/Notion routes onto opaque document-id fallbacks) and accented slugs were mangled (cafécaf). ASCII slugs are byte-identical; sites with non-ASCII CMS slugs get readable routes where the id fallback previously applied — set up redirects if those fallback URLs were shared.
  • 0ade7e6: Resolve OG card accent presets from the theme’s own OKLCH palette instead of a separate hand-synced hex table. The card’s “blue” was Tailwind’s blue, not the site’s — social cards now render exactly the accent the site shows. Custom (non-preset) accents are unaffected.
  • edf5b78: Fix the /blume-assets endpoint’s traversal guard on Windows: it compared a forward-slash directory against path.resolve output (backslashes there), which 404’d every staged remote-source asset. The guard now uses path.relative, which also closes the sibling-directory-name edge a bare prefix test admits.

अंतिम अपडेट 11 अगस्त 2026

क्या यह पेज सहायक था?