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 subscriptionspi.registerCommand/pi.registerShortcutctx.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.