Files
oh-my-pi/packages/natives
roboomp fc4fb70232 fix(natives): restore macos coreaudio capture bindings
The 17.1.6 Bazel migration dropped maudio's generate-bindings feature, so
the darwin addon shipped maudio-sys's Linux-shaped pregenerated miniaudio
bindings. Those bindings omit the MA_SUPPORT_COREAUDIO backend-state union
members that the macOS build of miniaudio.c actually contains, producing a
Rust/C ABI mismatch: capture callbacks saw zero channels and yielded no PCM.

Re-enable generate-bindings for apple targets only. Patch maudio-sys's build
script to branch on Cargo's TARGET rather than the build-script host, so a
macOS-hosted Linux/Windows cross-build keeps target-family pregenerated
bindings instead of incorrectly running Darwin bindgen. Repin the Bazel graph
to apply the patch and gate bindgen behind the apple target selects.

Fixes #6846
2026-07-28 04:40:17 +00:00
..
2026-07-28 00:30:15 +02:00
2026-07-28 00:30:15 +02:00

@oh-my-pi/pi-natives

Native Rust functionality via N-API.

What's Inside

  • Grep: Regex-based search powered by ripgrep's engine with native file walking and matching
  • Find: Glob-based file/directory discovery with gitignore support (pure TypeScript via globPaths)
  • SIXEL: Terminal image encoding for SIXEL-capable terminals (decode, resize, encode in one pass)
  • Audio: Cross-platform low-latency microphone capture and gapless speaker playback
  • WebRTC: Native Opus media, SDP offer/answer negotiation, and data-channel events for live sessions

General-purpose image processing (decode/resize/encode for files and buffers) lives in Bun.Image on the JS side; this crate only ships the SIXEL encoder because no built-in equivalent exists for that terminal protocol.

Usage

import { grep, find, encodeSixel } from "@oh-my-pi/pi-natives";

// Grep for a pattern
const results = await grep({
	pattern: "TODO",
	path: "/path/to/project",
	glob: "*.ts",
	context: 2,
});

// Find files
const files = await find({
	pattern: "*.rs",
	path: "/path/to/project",
	fileType: "file",
});

// SIXEL encode for a terminal cell box (px)
const sequence = encodeSixel(pngBytes, widthPx, heightPx);

Building

# Build native addon from workspace root (requires Rust)
bun run build

# Type check
bun run check

Architecture

@oh-my-pi/pi-natives publishes a small core package plus generated platform-specific optional dependency packages:

crates/pi-natives/       # Rust source (workspace member)
  src/lib.rs             # N-API exports
  src/sixel.rs           # SIXEL terminal-image encoding
  Cargo.toml             # Rust dependencies
native/                  # Core loader files and local/CI native build outputs
  index.js               # Public native export surface
  loader-state.js        # Platform, ISA variant, and addon resolution
  embedded-addon.js      # Standalone binary embed stub/generated metadata
  pi_natives.<platform>-<arch>-modern.node   # x64 modern ISA (local/CI artifact)
  pi_natives.<platform>-<arch>-baseline.node # x64 baseline ISA (local/CI artifact)
  pi_natives.<platform>-<arch>.node          # non-x64 build artifact
npm/<platform>-<arch>/   # Generated at publish time, not committed
  package.json           # @oh-my-pi/pi-natives-<platform>-<arch>
  *.node                 # Only that platform's addon binary or x64 ISA variants

The published core package contains only the JS loader, declarations, README, and package.json. Release publishing generates one leaf package per supported os/cpu pair and injects those leaves into the core manifest as pinned optionalDependencies, so package managers install only the host platform's native addon. x64 leaves include every built ISA variant, and the loader keeps choosing between baseline and modern at runtime.