Added
- Complete Bloomberg entitlement-ID routes across bindings: Python and
@xbbg/corenow request EIDs for intraday bars and ticks as well as BDP/BDS/BDH; LangGraph exposesreturnEidson BDP/BDS/BDH/BDIB/BDTICK plusxbbg_check_entitlements, and MCP exposesreturn_eidson its dedicated BDP/BDS/BDH/BDIB tools and generic IntradayTick route pluscheck_entitlements, with bounded results preserving entitlement metadata. - Official MCP Registry publish workflow: Added a manual GitHub Actions workflow that publishes release
server.jsonmetadata throughmcp-publisherwith GitHub Actions OIDC, so the xbbg-org namespace can publish without relying on a maintainer's local public organization membership. - Batched subscription delivery in
@xbbg/core: one native crossing now drains many ticks (nextUpdates) and Arrow subscriptions return multi-row zero-copy batches (nextArrowBatch); tick field layouts cross the boundary once per layout version andTickcaches decodedBigInt/Datevalues. SubscriptionArrowBatcherin the Rust engine: cached schema + reusable Arrow builders convert streaming updates into multi-row RecordBatches instead of one-row batches per tick.- Offline benchmark coverage: registered the previously orphaned Arrow/subscription bench targets, added a
serde_jsonvssimd-jsonBQL parser bench, and added offline Rust→Python / Rust→JS binding-handoff benches that run without a Bloomberg connection. - Host-tuned build modes:
pixi run build-nativeandnpm run build:native:hostproducetarget-cpu=nativeartifacts for internal deployments; published artifacts stay portable.
Changed
- Subscription sessions moved to Bloomberg SDK asynchronous callback mode: the 1 ms
nextEventbusy-poll loop, its command channel, and per-loop topic-status scans are gone; events are dispatched by SDK callbacks and deactivation warnings run on a 1 s timer. Idle subscription workers no longer consume CPU. - Faster response decoding: typed long-format reference/historical output uses fixed-schema builders (no per-cell string-keyed map lookups), BDS bulk decoding walks each row once via interned name keys instead of O(rows × subfields) lookups, intraday bars use fixed builders, streaming chunks pre-reserve capacity, and BQL infers column types in a single pass.
- Cheaper ticks: DATALOSS detection is folded into the normal extraction pass, message types are read via borrowed strings instead of refcounted
Nameduplicates, small updates avoid heap allocation (SmallVec), and repeated string values (exchange/condition codes) are interned per field. - Python pandas conversion is Arrow-native:
backend='pandas'now converts through the Arrow C stream (pyarrow.table(...).to_pandas()) instead of materializing every cell as a Python object; the row-based path remains only as a documented no-pyarrow fallback. Python subscriptions withbackend=Nonenow yield native Arrow wrappers and resolve their converter once at construction. @xbbg/corerequest responses are zero-copy: reference/historical/recipe results cross N-API as Arrow buffer descriptors instead of Arrow IPC bytes that were immediately reparsed; schema APIs cache their JSON payloads.- Request workers decode responses outside the shared slot table lock, so large partial responses no longer block unrelated in-flight requests on the same worker.
OverflowPolicy::Blockis now bounded on the SDK callback thread: instead of parking Bloomberg's dispatcher indefinitely when a consumer stalls, the producer retries briefly, then records a slow-consumer event and drops the update.npm run build:nativebuilds release by default (usebuild:native:debugfor local iteration), and packaging refuses to stage a native addon whose build profile isn'trelease.blpapi-syscaches generated bindings next to the vendored SDK keyed by target and build-script hash, and tracks headers/env precisely, removing bindgen from warm clean builds and spuriousCONDA_PREFIXrebuilds on non-Windows hosts.- Metadata caches (exchange info, field types) publish snapshots per batch with bounded capacity instead of cloning the whole map per inserted key.
Fixed
- Marimo notebook compatibility: Synchronous one-shot Python APIs such as
blp.bdp()now use the notebook bridge inside marimo's async execution context instead of raising the generic async-context error.
Full Changelog: v1.4.3...v1.4.4