Skip to main content

Crate grain_pi_compat

Crate grain_pi_compat 

Source
Expand description

grain-pi-compat — run pi-style extensions on the grain runtime.

pi extensions are TypeScript / JavaScript files exporting a factory:

// <workspace>/.pi/extensions/my-tool.js
export default (pi) => {
  pi.registerTool({
    name: "shout",
    description: "Uppercases text",
    parameters: { type: "object", properties: { text: { type: "string" }}},
    execute: (args) => args.text.toUpperCase(),
  });
};

This crate adapts that shape to our grain_script_boa::BoaExtension by source-transforming each file: prepending a small shim that aliases pi’s camelCase API onto grain’s snake_case API, then — when an export default factory entry is present — wrapping the call to feed it the pi object. The transformed file is written to a temp dir, then BoaExtension::from_scripts_dir loads it.

§What works in Phase 1

  • pi.registerTool({ name, description, parameters, execute })
  • export default (pi) => {...} factory entry
  • Top-level pi.registerTool(...) (no factory) — also fine
  • Discovery: <workspace>/.pi/extensions/*.js + ~/.pi/agent/extensions/*.js

§Not yet (Phase 2+)

  • pi.on(event, handler) event subscriptions
  • pi.registerCommand / pi.registerShortcut
  • ctx.ui.* interactive prompts
  • TypeScript source via swc
  • npm package extensions

Re-exports§

pub use extension::PiCommand;
pub use extension::PiCompatError;
pub use extension::PiExtension;
pub use extension::PiNotification;
pub use extension::PiShortcut;
pub use transform::transform_pi_source;

Modules§

extension
Public surface: discover pi extension files, transform each, load the transformed bundle through grain_script_boa::BoaExtension.
transform
Source-level transformation: pi-style JS → grain-style JS.