From ec247f8a54d17c1a6aa7371e86e358d09d14633a Mon Sep 17 00:00:00 2001 From: ruv Date: Fri, 6 Nov 2026 11:40:08 -0500 Subject: [PATCH] lean-agentic 0.3.4: working root entry point, quiet MCP stdout (#5) - `require("lean-agentic")` and `import "lean-agentic"` loaded ../wasm/, a bundler-target build that was never published. The root entry is now the Node.js build (same API as lean-agentic/node, plus init()). - `import "lean-agentic/node"` failed too: dist/node.mjs was a copy of the CommonJS file. The build now writes real ESM wrappers for node and index that load the CommonJS build through createRequire. - The WASM module logged "Initializing Lean-Agentic WASM..." and per-call diagnostics with console.log, which went to stdout and corrupted the MCP server's JSON-RPC stream. Logging is now off by default, goes to console.error when on, and is controlled by LEAN_AGENTIC_DEBUG or setDebug(). wasm-node and wasm-web are rebuilt from leanr-wasm. - The MCP server sends console.log/info/debug to stderr, no longer answers notifications, and `lean-agentic mcp start` now actually starts it (requiring server.js did not, because of its require.main guard). - exports adds ./package.json; files drops the unused wasm/ entry; build:wasm builds the nodejs and web targets that ship; prepublishOnly runs build:js only, so the published tarball matches the tested one. - Type definitions match the real API (getStats, benchmarkEquality, setDebug, init on the root entry). - CI packs the package, installs the tarball into a temp project, loads every entry point with require and import, runs the CLI, and checks that the MCP server's stdout is nothing but JSON-RPC (scripts/check-package.mjs). Co-Authored-By: claude-flow --- .github/workflows/ci.yml | 6 +- leanr-wasm/src/lib.rs | 30 +++- npm/lean-agentic/README.md | 13 +- npm/lean-agentic/cli/index.js | 8 +- npm/lean-agentic/dist/index.d.ts | 60 +------ npm/lean-agentic/dist/index.js | 78 ++------- npm/lean-agentic/dist/index.mjs | 85 +-------- npm/lean-agentic/dist/node.d.ts | 45 ++++- npm/lean-agentic/dist/node.js | 14 ++ npm/lean-agentic/dist/node.mjs | 86 +-------- npm/lean-agentic/dist/web.d.ts | 32 +++- npm/lean-agentic/dist/web.mjs | 10 ++ npm/lean-agentic/mcp/server.js | 25 ++- npm/lean-agentic/package-lock.json | 4 +- npm/lean-agentic/package.json | 18 +- npm/lean-agentic/scripts/build.js | 124 +++++-------- npm/lean-agentic/scripts/check-package.mjs | 164 ++++++++++++++++++ npm/lean-agentic/src/index.js | 80 ++------- npm/lean-agentic/src/node.js | 14 ++ npm/lean-agentic/src/web.js | 10 ++ npm/lean-agentic/wasm-node/leanr_wasm.d.ts | 30 ++-- npm/lean-agentic/wasm-node/leanr_wasm.js | 65 +++---- npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm | Bin 65641 -> 63577 bytes .../wasm-node/leanr_wasm_bg.wasm.d.ts | 15 +- npm/lean-agentic/wasm-node/package.json | 2 +- npm/lean-agentic/wasm-web/leanr_wasm.d.ts | 45 ++--- npm/lean-agentic/wasm-web/leanr_wasm.js | 65 +++---- npm/lean-agentic/wasm-web/leanr_wasm_bg.wasm | Bin 65557 -> 63493 bytes .../wasm-web/leanr_wasm_bg.wasm.d.ts | 15 +- npm/lean-agentic/wasm-web/package.json | 2 +- 30 files changed, 569 insertions(+), 576 deletions(-) create mode 100644 npm/lean-agentic/scripts/check-package.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e29aad..9e85c4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,11 @@ jobs: timeout 60 node -e "require('./dist/node.js').createDemo().createIdentity()" - name: Audit runtime dependencies run: npm audit --omit=dev --audit-level=high - - run: npm pack --dry-run --ignore-scripts + - name: Pack, install the tarball into a temp project, check every entry point and MCP stdio + run: | + npm pack --ignore-scripts --pack-destination "$RUNNER_TEMP" + version=$(node -p "require('./package.json').version") + timeout 600 node scripts/check-package.mjs "$RUNNER_TEMP/lean-agentic-$version.tgz" rust: name: cargo test diff --git a/leanr-wasm/src/lib.rs b/leanr-wasm/src/lib.rs index f3e311c..82cd0fe 100644 --- a/leanr-wasm/src/lib.rs +++ b/leanr-wasm/src/lib.rs @@ -7,8 +7,26 @@ use lean_agentic::{Arena, Environment, SymbolTable}; use lean_agentic::level::LevelArena; use lean_agentic::term::{Binder, BinderInfo}; use wasm_bindgen::prelude::*; +use std::sync::atomic::{AtomicBool, Ordering}; use web_sys::console; +/// Diagnostic logging is off by default. When on, it goes to `console.error` +/// (stderr under Node), so it never mixes with stdout, which the MCP server +/// uses for JSON-RPC. +static DEBUG: AtomicBool = AtomicBool::new(false); + +fn debug_log(msg: &str) { + if DEBUG.load(Ordering::Relaxed) { + console::error_1(&msg.into()); + } +} + +/// Turn diagnostic logging on or off (off by default). +#[wasm_bindgen(js_name = setDebug)] +pub fn set_debug(enabled: bool) { + DEBUG.store(enabled, Ordering::Relaxed); +} + /// Demo struct showing hash-consing performance in WASM #[wasm_bindgen] pub struct LeanDemo { @@ -24,7 +42,7 @@ impl LeanDemo { /// Create a new Lean demo instance #[wasm_bindgen(constructor)] pub fn new() -> Self { - console::log_1(&"Initializing Lean-Agentic WASM...".into()); + debug_log("Initializing Lean-Agentic WASM..."); Self { arena: Arena::new(), @@ -41,7 +59,7 @@ impl LeanDemo { pub fn create_variable(&mut self, index: u32) -> bool { let term = self.arena.mk_var(index); self.term_counter += 1; - console::log_1(&format!("Created variable with index {} -> TermId {:?}", index, term).into()); + debug_log(&format!("Created variable with index {} -> TermId {:?}", index, term)); true } @@ -54,10 +72,10 @@ impl LeanDemo { let same = var1 == var2; - console::log_1(&format!( + debug_log(&format!( "Hash-consing test: var1={:?}, var2={:?}, same={}", var1, var2, same - ).into()); + )); same } @@ -77,7 +95,7 @@ impl LeanDemo { let level_zero = self.levels.zero(); let type_term = self.arena.mk_sort(level_zero); self.term_counter += 1; - console::log_1(&format!("Created Type: {:?}", type_term).into()); + debug_log(&format!("Created Type: {:?}", type_term)); true } @@ -100,7 +118,7 @@ impl LeanDemo { let lambda = self.arena.mk_lam(binder, var_x); self.term_counter += 3; - console::log_1(&format!("Created identity function: λx:Type. x = {:?}", lambda).into()); + debug_log(&format!("Created identity function: λx:Type. x = {:?}", lambda)); true } diff --git a/npm/lean-agentic/README.md b/npm/lean-agentic/README.md index 0b7a06d..296894b 100644 --- a/npm/lean-agentic/README.md +++ b/npm/lean-agentic/README.md @@ -549,7 +549,11 @@ demo.createApplication(); demo.demonstrateHashConsing(); ``` -### Bundler API +### Root entry point (Node.js) + +The root entry point is the Node.js build (same API as `lean-agentic/node`, plus `init()`). In the browser, use `lean-agentic/web`. + +The WASM module is silent by default. Set `LEAN_AGENTIC_DEBUG=1` (or call `setDebug(true)`) to print its diagnostic logs; they go to stderr, so they never mix with the MCP server's JSON-RPC on stdout. ```javascript import { init, createDemo } from 'lean-agentic'; @@ -610,11 +614,9 @@ console.timeEnd('Hash-consed equality'); | Platform | Support | Import | |----------|---------|--------| -| Node.js 18+ | ✅ | `lean-agentic/node` | +| Node.js 18+ | ✅ | `lean-agentic` or `lean-agentic/node` | | Browser (ESM) | ✅ | `lean-agentic/web` | -| Webpack | ✅ | `lean-agentic` | -| Vite | ✅ | `lean-agentic` | -| Rollup | ✅ | `lean-agentic` | +| Webpack / Vite / Rollup (browser) | ✅ | `lean-agentic/web` | | Deno | ✅ | `npm:lean-agentic` | | Bun | ✅ | `lean-agentic` | @@ -671,7 +673,6 @@ cd lean-agentic cd leanr-wasm wasm-pack build --target nodejs --out-dir ../npm/lean-agentic/wasm-node wasm-pack build --target web --out-dir ../npm/lean-agentic/wasm-web -wasm-pack build --target bundler --out-dir ../npm/lean-agentic/wasm # Install dependencies cd ../npm/lean-agentic diff --git a/npm/lean-agentic/cli/index.js b/npm/lean-agentic/cli/index.js index 4c8262e..7f66095 100755 --- a/npm/lean-agentic/cli/index.js +++ b/npm/lean-agentic/cli/index.js @@ -164,9 +164,13 @@ mcp console.error('Tools: 5 | Resources: 2 | Prompts: 2'); console.error('Ready for Claude Code integration\n'); - // Launch the MCP server + // Launch the MCP server. Requiring server.js alone does not start it + // (it only auto-starts when run directly), so call startServer(). const serverPath = join(__dirname, '../mcp/server.js'); - require(serverPath); + require(serverPath).startServer().catch((error) => { + process.stderr.write(`Fatal error: ${error}\n`); + process.exit(1); + }); }); mcp diff --git a/npm/lean-agentic/dist/index.d.ts b/npm/lean-agentic/dist/index.d.ts index a5aa192..7586efa 100644 --- a/npm/lean-agentic/dist/index.d.ts +++ b/npm/lean-agentic/dist/index.d.ts @@ -1,73 +1,31 @@ /** * lean-agentic TypeScript definitions * - * Hash-consed dependent types with 150x faster equality + * Hash-consed dependent types with 150x faster equality. Under Node.js the + * root entry point has the same API as `lean-agentic/node`, plus `init()`. + * Browsers should use `lean-agentic/web`. * * @module lean-agentic * @author ruv.io * @license Apache-2.0 */ -/** - * Initialize the WASM module - */ -export function init(): Promise; +import { LeanDemo, createDemo, quickStart, setDebug, wasm } from './node'; -/** - * Main interface for lean-agentic theorem prover - */ -export class LeanDemo { - constructor(); - - /** - * Create identity function: λx:Type. x - * @returns JSON representation of the identity function - */ - createIdentity(): string; - - /** - * Create and verify an application - * @returns JSON representation of the application - */ - createApplication(): string; - - /** - * Demonstrate hash-consing by creating identical terms - * @returns JSON showing term equality - */ - demonstrateHashConsing(): string; -} +export { LeanDemo, createDemo, quickStart, setDebug, wasm }; /** - * Create a new LeanDemo instance + * Kept for API compatibility. Resolves immediately: the Node WASM build is + * ready as soon as it is loaded. */ -export function createDemo(): LeanDemo; - -/** - * Quick start: Create identity function - */ -export function quickStart(): Promise; - -/** - * WASM module exports - */ -export namespace wasm { - export class LeanDemo { - constructor(); - create_identity(): string; - create_application(): string; - demonstrate_hash_consing(): string; - } -} +export function init(): Promise; -/** - * Default export - */ declare const _default: { init: typeof init; LeanDemo: typeof LeanDemo; createDemo: typeof createDemo; quickStart: typeof quickStart; + setDebug: typeof setDebug; wasm: typeof wasm; }; diff --git a/npm/lean-agentic/dist/index.js b/npm/lean-agentic/dist/index.js index bbb626e..c94e0b2 100644 --- a/npm/lean-agentic/dist/index.js +++ b/npm/lean-agentic/dist/index.js @@ -1,81 +1,29 @@ /** * lean-agentic - Hash-consed dependent types with 150x faster equality * + * Root entry point. Under Node.js this is the same API as `lean-agentic/node`, + * plus an `init()` that resolves immediately (the Node WASM build loads + * synchronously). Browsers should use `lean-agentic/web`. + * * @module lean-agentic * @author ruv.io * @license Apache-2.0 */ -const wasm = require('../wasm/leanr_wasm.js'); +const node = require('./node.js'); /** - * Initialize the WASM module + * Kept for API compatibility: the Node WASM build is ready as soon as it is + * required, so there is nothing to wait for. * @returns {Promise} */ -export async function init() { - // WASM is already initialized when imported - return Promise.resolve(); -} - -/** - * LeanDemo - Main interface for lean-agentic - */ -class LeanDemo { - constructor() { - this._inner = new wasm.LeanDemo(); - } - - /** - * Create identity function: λx:Type. x - * @returns {string} JSON representation of the identity function - */ - createIdentity() { - return this._inner.create_identity(); - } - - /** - * Create and verify an application - * @returns {string} JSON representation of the application - */ - createApplication() { - return this._inner.create_application(); - } - - /** - * Demonstrate hash-consing by creating identical terms - * @returns {string} JSON showing term equality - */ - demonstrateHashConsing() { - return this._inner.demonstrate_hash_consing(); - } -} - -/** - * Create a new LeanDemo instance - * @returns {LeanDemo} - */ -function createDemo() { - return new LeanDemo(); -} - -/** - * Quick start: Create identity function - * @returns {Promise} - */ -export async function quickStart() { - await init(); - const demo = createDemo(); - return demo.createIdentity(); -} - -// Re-export WASM types -module.exports = { wasm }; +async function init() {} -// Default export module.exports = { init, - LeanDemo, - createDemo, - quickStart, - wasm + LeanDemo: node.LeanDemo, + createDemo: node.createDemo, + quickStart: node.quickStart, + setDebug: node.setDebug, + wasm: node.wasm }; diff --git a/npm/lean-agentic/dist/index.mjs b/npm/lean-agentic/dist/index.mjs index 9eec57c..70fcbea 100644 --- a/npm/lean-agentic/dist/index.mjs +++ b/npm/lean-agentic/dist/index.mjs @@ -1,81 +1,8 @@ -/** - * lean-agentic - Hash-consed dependent types with 150x faster equality - * - * @module lean-agentic - * @author ruv.io - * @license Apache-2.0 - */ +// Generated by scripts/build.js. Do not edit. +import { createRequire } from 'node:module'; -import * as wasm from '../wasm/leanr_wasm.js'; +const require = createRequire(import.meta.url); +const mod = require('./index.js'); -/** - * Initialize the WASM module - * @returns {Promise} - */ -export async function init() { - // WASM is already initialized when imported - return Promise.resolve(); -} - -/** - * LeanDemo - Main interface for lean-agentic - */ -export class LeanDemo { - constructor() { - this._inner = new wasm.LeanDemo(); - } - - /** - * Create identity function: λx:Type. x - * @returns {string} JSON representation of the identity function - */ - createIdentity() { - return this._inner.create_identity(); - } - - /** - * Create and verify an application - * @returns {string} JSON representation of the application - */ - createApplication() { - return this._inner.create_application(); - } - - /** - * Demonstrate hash-consing by creating identical terms - * @returns {string} JSON showing term equality - */ - demonstrateHashConsing() { - return this._inner.demonstrate_hash_consing(); - } -} - -/** - * Create a new LeanDemo instance - * @returns {LeanDemo} - */ -export function createDemo() { - return new LeanDemo(); -} - -/** - * Quick start: Create identity function - * @returns {Promise} - */ -export async function quickStart() { - await init(); - const demo = createDemo(); - return demo.createIdentity(); -} - -// Re-export WASM types -export { wasm }; - -// Default export -export default { - init, - LeanDemo, - createDemo, - quickStart, - wasm -}; +export const { LeanDemo, createDemo, init, quickStart, setDebug, wasm } = mod; +export default mod; diff --git a/npm/lean-agentic/dist/node.d.ts b/npm/lean-agentic/dist/node.d.ts index 2eb7904..35db556 100644 --- a/npm/lean-agentic/dist/node.d.ts +++ b/npm/lean-agentic/dist/node.d.ts @@ -12,19 +12,48 @@ */ export class LeanDemo { constructor(); + /** JSON describing the identity function λx:Type. x */ createIdentity(): string; + /** JSON describing an application (var0 var1) */ createApplication(): string; + /** JSON showing that identical terms share one TermId */ demonstrateHashConsing(): string; + /** JSON with arena statistics */ + getStats(): string; + benchmarkEquality(): string; } export function createDemo(): LeanDemo; export function quickStart(): Promise; -export namespace wasm { - export class LeanDemo { - constructor(); - create_identity(): string; - create_application(): string; - demonstrate_hash_consing(): string; - } -} +/** + * Turn the WASM module's diagnostic logging on or off. Logs go to stderr. + * Off by default; LEAN_AGENTIC_DEBUG=1 turns it on at load time. + */ +export function setDebug(enabled: boolean): void; + +/** Raw wasm-bindgen module (types: wasm-node/leanr_wasm.d.ts) */ +export const wasm: { + LeanDemo: new () => { + free(): void; + createVariable(index: number): boolean; + demonstrateHashConsing(): boolean; + getStats(): string; + createType(): boolean; + createIdentityFunction(): boolean; + benchmarkEquality(): string; + }; + greet(name: string): string; + getVersion(): string; + setDebug(enabled: boolean): void; +}; + +declare const _default: { + LeanDemo: typeof LeanDemo; + createDemo: typeof createDemo; + quickStart: typeof quickStart; + setDebug: typeof setDebug; + wasm: typeof wasm; +}; + +export default _default; diff --git a/npm/lean-agentic/dist/node.js b/npm/lean-agentic/dist/node.js index 535c5b7..3c03817 100644 --- a/npm/lean-agentic/dist/node.js +++ b/npm/lean-agentic/dist/node.js @@ -8,6 +8,19 @@ const wasm = require('../wasm-node/leanr_wasm.js'); +/** + * Turn the WASM module's diagnostic logging on or off. Logs go to stderr + * (console.error), never stdout. Off by default; set LEAN_AGENTIC_DEBUG=1 + * to turn it on at load time. + * @param {boolean} enabled + */ +function setDebug(enabled) { + wasm.setDebug(Boolean(enabled)); +} + +const debugEnv = process.env.LEAN_AGENTIC_DEBUG; +setDebug(debugEnv !== undefined && debugEnv !== '' && debugEnv !== '0' && debugEnv !== 'false'); + /** * LeanDemo - Node.js interface */ @@ -78,5 +91,6 @@ module.exports = { LeanDemo, createDemo, quickStart, + setDebug, wasm }; diff --git a/npm/lean-agentic/dist/node.mjs b/npm/lean-agentic/dist/node.mjs index 535c5b7..5fe085e 100644 --- a/npm/lean-agentic/dist/node.mjs +++ b/npm/lean-agentic/dist/node.mjs @@ -1,82 +1,8 @@ -/** - * lean-agentic/node - Node.js-specific bindings - * - * @module lean-agentic/node - * @author ruv.io - * @license Apache-2.0 - */ +// Generated by scripts/build.js. Do not edit. +import { createRequire } from 'node:module'; -const wasm = require('../wasm-node/leanr_wasm.js'); +const require = createRequire(import.meta.url); +const mod = require('./node.js'); -/** - * LeanDemo - Node.js interface - */ -class LeanDemo { - constructor() { - this._inner = new wasm.LeanDemo(); - } - - createIdentity() { - this._inner.createIdentityFunction(); - return JSON.stringify({ - term: "Lambda", - description: "λx:Type. x (identity function)", - note: "Hash-consed for O(1) equality" - }); - } - - createApplication() { - this._inner.createVariable(0); - this._inner.createVariable(1); - return JSON.stringify({ - term: "Application", - description: "(var0 var1)", - note: "Zero-copy arena allocation" - }); - } - - demonstrateHashConsing() { - const result = this._inner.demonstrateHashConsing(); - return JSON.stringify({ - demo: "Hash-Consing", - all_equal: result, - explanation: "Identical terms share the same TermId! Equality is O(1) pointer comparison.", - speedup: "150x faster than structural equality" - }); - } - - getStats() { - const stats = this._inner.getStats(); - // Parse the stats string into JSON format - // Format: "Arena operations: N (hash-consed for 150x faster equality)" - const match = stats.match(/Arena operations: (\d+)/); - const operations = match ? parseInt(match[1]) : 0; - - return JSON.stringify({ - unique_terms: operations, - message: stats, - hash_consing_enabled: true, - performance_multiplier: "150x faster" - }); - } - - benchmarkEquality() { - return this._inner.benchmarkEquality(); - } -} - -function createDemo() { - return new LeanDemo(); -} - -async function quickStart() { - const demo = createDemo(); - return demo.createIdentity(); -} - -module.exports = { - LeanDemo, - createDemo, - quickStart, - wasm -}; +export const { LeanDemo, createDemo, quickStart, setDebug, wasm } = mod; +export default mod; diff --git a/npm/lean-agentic/dist/web.d.ts b/npm/lean-agentic/dist/web.d.ts index 2ae16c9..1fc30f4 100644 --- a/npm/lean-agentic/dist/web.d.ts +++ b/npm/lean-agentic/dist/web.d.ts @@ -21,23 +21,39 @@ export class LeanDemo { createIdentity(): string; createApplication(): string; demonstrateHashConsing(): string; + getStats(): string; + benchmarkEquality(): string; } export function createDemo(): LeanDemo; -export namespace wasm { - export class LeanDemo { - constructor(); - create_identity(): string; - create_application(): string; - demonstrate_hash_consing(): string; - } -} +/** + * Turn the WASM module's diagnostic logging (console.error) on or off. + * Off by default. Call after initWeb(). + */ +export function setDebug(enabled: boolean): void; + +/** Raw wasm-bindgen module (types: wasm-web/leanr_wasm.d.ts) */ +export const wasm: { + LeanDemo: new () => { + free(): void; + createVariable(index: number): boolean; + demonstrateHashConsing(): boolean; + getStats(): string; + createType(): boolean; + createIdentityFunction(): boolean; + benchmarkEquality(): string; + }; + greet(name: string): string; + getVersion(): string; + setDebug(enabled: boolean): void; +}; declare const _default: { initWeb: typeof initWeb; LeanDemo: typeof LeanDemo; createDemo: typeof createDemo; + setDebug: typeof setDebug; wasm: typeof wasm; }; diff --git a/npm/lean-agentic/dist/web.mjs b/npm/lean-agentic/dist/web.mjs index 05aa215..5920b7c 100644 --- a/npm/lean-agentic/dist/web.mjs +++ b/npm/lean-agentic/dist/web.mjs @@ -87,6 +87,15 @@ export class LeanDemo { } } +/** + * Turn the WASM module's diagnostic logging (console.error) on or off. + * Off by default. Call after initWeb(). + * @param {boolean} enabled + */ +export function setDebug(enabled) { + wasm.setDebug(Boolean(enabled)); +} + export function createDemo() { return new LeanDemo(); } @@ -95,5 +104,6 @@ export default { initWeb, LeanDemo, createDemo, + setDebug, wasm }; diff --git a/npm/lean-agentic/mcp/server.js b/npm/lean-agentic/mcp/server.js index 2eadf4d..4bb31a7 100755 --- a/npm/lean-agentic/mcp/server.js +++ b/npm/lean-agentic/mcp/server.js @@ -525,6 +525,11 @@ class LeanAgenticMCPServer { return; } + // Notifications (e.g. notifications/initialized) get no response. + if (id === undefined && typeof method === 'string' && method.startsWith('notifications/')) { + return; + } + this.log(`Handling ${method} request`); switch (method) { @@ -565,6 +570,13 @@ class LeanAgenticMCPServer { * Start the stdio server */ async start() { + // stdout carries JSON-RPC only. Send anything that calls console.log, + // console.info or console.debug (dependencies included) to stderr. + const toStderr = (...args) => console.error(...args); + console.log = toStderr; + console.info = toStderr; + console.debug = toStderr; + await this.initialize(); const rl = readline.createInterface({ @@ -594,13 +606,20 @@ class LeanAgenticMCPServer { } } +/** + * Start the stdio server in this process. + */ +function startServer() { + const server = new LeanAgenticMCPServer(); + return server.start(); +} + // Start the server if (require.main === module) { - const server = new LeanAgenticMCPServer(); - server.start().catch((error) => { + startServer().catch((error) => { process.stderr.write(`Fatal error: ${error}\n`); process.exit(1); }); } -module.exports = { LeanAgenticMCPServer }; +module.exports = { LeanAgenticMCPServer, startServer }; diff --git a/npm/lean-agentic/package-lock.json b/npm/lean-agentic/package-lock.json index 331d04a..f79443b 100644 --- a/npm/lean-agentic/package-lock.json +++ b/npm/lean-agentic/package-lock.json @@ -1,12 +1,12 @@ { "name": "lean-agentic", - "version": "0.3.3", + "version": "0.3.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lean-agentic", - "version": "0.3.3", + "version": "0.3.4", "license": "Apache-2.0", "dependencies": { "commander": "^12.0.0" diff --git a/npm/lean-agentic/package.json b/npm/lean-agentic/package.json index 64cdada..eeacc23 100644 --- a/npm/lean-agentic/package.json +++ b/npm/lean-agentic/package.json @@ -1,6 +1,6 @@ { "name": "lean-agentic", - "version": "0.3.3", + "version": "0.3.4", "description": "High-performance WebAssembly theorem prover with dependent types, hash-consing (150x faster), Ed25519 proof signatures, MCP support for Claude Code, AgentDB vector search, episodic memory, and ReasoningBank learning. Formal verification with cryptographic attestation and AI-powered proof recommendations.", "main": "dist/index.js", "module": "dist/index.mjs", @@ -14,21 +14,21 @@ "import": "./dist/index.mjs", "require": "./dist/index.js" }, - "./web": { - "types": "./dist/web.d.ts", - "import": "./dist/web.mjs" - }, "./node": { "types": "./dist/node.d.ts", "import": "./dist/node.mjs", "require": "./dist/node.js" - } + }, + "./web": { + "types": "./dist/web.d.ts", + "import": "./dist/web.mjs" + }, + "./package.json": "./package.json" }, "files": [ "dist", "cli", "src", - "wasm", "wasm-node", "wasm-web", "mcp", @@ -38,9 +38,9 @@ ], "scripts": { "build": "npm run build:wasm && npm run build:js", - "build:wasm": "cd ../../leanr-wasm && wasm-pack build --target bundler --out-dir ../npm/lean-agentic/wasm", + "build:wasm": "cd ../../leanr-wasm && wasm-pack build --release --target nodejs --out-dir ../npm/lean-agentic/wasm-node && wasm-pack build --release --target web --out-dir ../npm/lean-agentic/wasm-web && rm -f ../npm/lean-agentic/wasm-node/.gitignore ../npm/lean-agentic/wasm-web/.gitignore", "build:js": "node scripts/build.js", - "prepublishOnly": "npm run build", + "prepublishOnly": "npm run build:js", "test": "node --test tests/agentdb/*.test.js tests/theorems/basic-theorems.test.js tests/theorems/dependent-types.test.js", "example:node": "node examples/node-example.js", "example:web": "npx serve examples", diff --git a/npm/lean-agentic/scripts/build.js b/npm/lean-agentic/scripts/build.js index 96f265b..b24ea66 100755 --- a/npm/lean-agentic/scripts/build.js +++ b/npm/lean-agentic/scripts/build.js @@ -1,8 +1,15 @@ #!/usr/bin/env node /** - * Build script for lean-agentic npm package - * Creates both CommonJS and ESM bundles + * Build script for lean-agentic npm package. + * + * dist/node.js and dist/index.js - CommonJS, copied from src/ + * dist/node.mjs and dist/index.mjs - ESM wrappers that load the CommonJS + * build through createRequire, so both + * module systems share one WASM instance + * dist/web.mjs - ESM, copied from src/ + * + * Diagnostics go to stderr so `node scripts/build.js` stays quiet on stdout. */ const fs = require('fs'); @@ -11,88 +18,39 @@ const path = require('path'); const srcDir = path.join(__dirname, '..', 'src'); const distDir = path.join(__dirname, '..', 'dist'); -// Ensure dist directory exists -if (!fs.existsSync(distDir)) { - fs.mkdirSync(distDir, { recursive: true }); -} - -// Files to build -const files = [ - { name: 'index', hasCommonJS: true }, - { name: 'node', hasCommonJS: true }, - { name: 'web', hasCommonJS: false } // Web only needs ESM -]; - -console.log('📦 Building lean-agentic...\n'); - -files.forEach(({ name, hasCommonJS }) => { - const srcFile = path.join(srcDir, `${name}.js`); - - if (!fs.existsSync(srcFile)) { - console.warn(`⚠️ Warning: ${srcFile} not found, skipping...`); - return; - } - - const content = fs.readFileSync(srcFile, 'utf-8'); - - // Create ESM version (.mjs) - const mjsFile = path.join(distDir, `${name}.mjs`); - fs.writeFileSync(mjsFile, content); - console.log(`✅ Created ${name}.mjs`); - - // Create CommonJS version (.js) if needed - if (hasCommonJS) { - const cjsFile = path.join(distDir, `${name}.js`); - const cjsContent = convertToCommonJS(content, name); - fs.writeFileSync(cjsFile, cjsContent); - console.log(`✅ Created ${name}.js`); - } -}); - -console.log('\n✨ Build complete!\n'); -console.log('📁 Output:'); -console.log(' - dist/*.mjs (ES Modules)'); -console.log(' - dist/*.js (CommonJS)'); -console.log(' - dist/*.d.ts (TypeScript definitions)\n'); +fs.mkdirSync(distDir, { recursive: true }); -/** - * Convert ES Module syntax to CommonJS - */ -function convertToCommonJS(content, moduleName) { - // Handle different module types - if (moduleName === 'node') { - // node.js already uses CommonJS, just copy it - return content; - } +function copy(from, to) { + fs.copyFileSync(path.join(srcDir, from), path.join(distDir, to)); + console.error(`created dist/${to}`); +} - if (moduleName === 'web') { - // Web module doesn't need CommonJS - return content; +function esmWrapper(cjsName) { + // Load the CommonJS build to learn its export names. + const mod = require(path.join(distDir, `${cjsName}.js`)); + const names = Object.keys(mod).sort(); + for (const name of names) { + if (!/^[A-Za-z_$][\w$]*$/.test(name) || name === 'default') { + throw new Error(`dist/${cjsName}.js exports an unsupported name: ${name}`); + } } - - // For index.js (bundler), convert import/export to require/module.exports - let cjs = content - // Convert: import ... from '../wasm/...' - .replace(/import\s+(\w+|\{[^}]+\}|\*\s+as\s+\w+)\s+from\s+['"]([^'"]+)['"]/g, - (match, imports, path) => { - if (imports.startsWith('*')) { - const varName = imports.match(/\*\s+as\s+(\w+)/)[1]; - return `const ${varName} = require('${path}')`; - } else if (imports.startsWith('{')) { - return `const ${imports} = require('${path}')`; - } else { - return `const ${imports} = require('${path}')`; - } - }) - // Convert: export class/function - .replace(/export\s+(class|function|const|let|var)\s+(\w+)/g, '$1 $2') - // Convert: export default - .replace(/export\s+default\s+/g, 'module.exports = ') - // Convert: export { ... } - .replace(/export\s*\{([^}]+)\}/g, (match, exports) => { - const items = exports.split(',').map(e => e.trim()); - return `module.exports = { ${items.join(', ')} }`; - }); - - return cjs; + const body = [ + '// Generated by scripts/build.js. Do not edit.', + "import { createRequire } from 'node:module';", + '', + 'const require = createRequire(import.meta.url);', + `const mod = require('./${cjsName}.js');`, + '', + `export const { ${names.join(', ')} } = mod;`, + 'export default mod;', + '' + ].join('\n'); + fs.writeFileSync(path.join(distDir, `${cjsName}.mjs`), body); + console.error(`created dist/${cjsName}.mjs`); } + +copy('node.js', 'node.js'); +copy('index.js', 'index.js'); +copy('web.js', 'web.mjs'); +esmWrapper('node'); +esmWrapper('index'); diff --git a/npm/lean-agentic/scripts/check-package.mjs b/npm/lean-agentic/scripts/check-package.mjs new file mode 100644 index 0000000..63a3095 --- /dev/null +++ b/npm/lean-agentic/scripts/check-package.mjs @@ -0,0 +1,164 @@ +#!/usr/bin/env node +/** + * Install lean-agentic into a fresh temp project and check what a user gets: + * every documented entry point loads under require and import, the CLI runs, + * and the MCP server's stdout carries nothing but JSON-RPC. + * + * Usage: + * node scripts/check-package.mjs ./lean-agentic-0.3.4.tgz # packed tarball + * node scripts/check-package.mjs lean-agentic@0.3.4 # from the registry + */ + +import { execFileSync, spawn, spawnSync } from 'node:child_process'; +import { existsSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join, resolve } from 'node:path'; + +const spec = process.argv[2]; +if (!spec) { + console.error('usage: check-package.mjs '); + process.exit(2); +} +const installSpec = existsSync(spec) ? resolve(spec) : spec; + +const dir = mkdtempSync(join(tmpdir(), 'lean-agentic-check-')); +let failures = 0; + +function pass(name) { + console.log(`ok ${name}`); +} + +function fail(name, detail) { + failures++; + console.log(`FAIL ${name}`); + if (detail) console.log(String(detail).trim().replace(/^/gm, ' ')); +} + +function runNode(args, input) { + return spawnSync(process.execPath, args, { + cwd: dir, + input, + encoding: 'utf8', + timeout: 60_000 + }); +} + +try { + writeFileSync(join(dir, 'package.json'), JSON.stringify({ name: 'check', version: '1.0.0', private: true })); + execFileSync('npm', ['install', '--no-audit', '--no-fund', '--loglevel=error', installSpec], { + cwd: dir, + stdio: ['ignore', 'ignore', 'inherit'], + timeout: 300_000 + }); + pass(`install ${spec}`); + + // Each case runs in its own process. It must print exactly the marker line + // on stdout: anything else (e.g. WASM init logs) is a failure. + const useDemo = ` + const d = m.createDemo(); + for (const k of ['createIdentity', 'createApplication', 'demonstrateHashConsing', 'getStats']) JSON.parse(d[k]()); + `; + const cases = [ + ['require("lean-agentic")', ['-e', `const m = require('lean-agentic'); ${useDemo} if (typeof m.init !== 'function') throw new Error('init missing'); console.log('MARK')`]], + ['import "lean-agentic"', ['--input-type=module', '-e', `import * as m from 'lean-agentic'; import def from 'lean-agentic'; ${useDemo} await m.init(); if (def.createDemo !== m.createDemo) throw new Error('default export mismatch'); console.log('MARK')`]], + ['require("lean-agentic/node")', ['-e', `const m = require('lean-agentic/node'); ${useDemo} console.log('MARK')`]], + ['import "lean-agentic/node"', ['--input-type=module', '-e', `import * as m from 'lean-agentic/node'; ${useDemo} console.log('MARK')`]], + ['import "lean-agentic/web"', ['--input-type=module', '-e', `import * as m from 'lean-agentic/web'; for (const k of ['initWeb', 'createDemo', 'setDebug']) if (typeof m[k] !== 'function') throw new Error(k + ' missing'); console.log('MARK')`]], + ['require("lean-agentic/package.json")', ['-e', `const p = require('lean-agentic/package.json'); if (!p.version) throw new Error('no version'); console.log('MARK')`]], + ['LEAN_AGENTIC_DEBUG logs to stderr only', ['-e', `process.env.LEAN_AGENTIC_DEBUG = '1'; const m = require('lean-agentic/node'); m.createDemo().createIdentity(); console.log('MARK')`]] + ]; + for (const [name, args] of cases) { + const r = runNode(args); + if (r.status === 0 && r.stdout === 'MARK\n') pass(name); + else fail(name, `exit ${r.status}\nstdout: ${JSON.stringify(r.stdout)}\nstderr: ${r.stderr}`); + } + + // CLI + const bin = join(dir, 'node_modules', 'lean-agentic', 'cli', 'index.js'); + for (const args of [['--version'], ['demo']]) { + const r = runNode([bin, ...args]); + if (r.status === 0 && r.stdout.trim()) pass(`cli ${args.join(' ')}`); + else fail(`cli ${args.join(' ')}`, `exit ${r.status}\n${r.stdout}\n${r.stderr}`); + } + + // MCP over stdio: initialize, the initialized notification, then tool calls + // that construct the WASM demo (where the old logs came from). + const requests = [ + { jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'check', version: '1' } } }, + { jsonrpc: '2.0', method: 'notifications/initialized' }, + { jsonrpc: '2.0', id: 2, method: 'tools/call', params: { name: 'create_identity', arguments: {} } }, + { jsonrpc: '2.0', id: 3, method: 'tools/call', params: { name: 'demonstrate_hash_consing', arguments: {} } } + ]; + const input = requests.map((r) => JSON.stringify(r)).join('\n') + '\n'; + const servers = [ + ['mcp/server.js', [join(dir, 'node_modules', 'lean-agentic', 'mcp', 'server.js')]], + ['cli mcp start', [bin, 'mcp', 'start']] + ]; + for (const [name, args] of servers) { + const out = await runServer(args, input, 3); + const lines = out.split('\n').filter((l) => l.length > 0); + const problems = []; + let first; + try { + first = JSON.parse(lines[0]); + } catch { + problems.push(`first stdout line is not JSON: ${JSON.stringify(lines[0])}`); + } + if (first && !(first.jsonrpc === '2.0' && first.id === 1 && first.result)) { + problems.push(`first stdout line is not the initialize result: ${lines[0]}`); + } + const ids = []; + for (const line of lines) { + try { + const msg = JSON.parse(line); + if (msg.jsonrpc !== '2.0') problems.push(`not JSON-RPC 2.0: ${line}`); + if (msg.error) problems.push(`error response: ${line}`); + ids.push(msg.id); + } catch { + problems.push(`non-JSON stdout line: ${JSON.stringify(line)}`); + } + } + if (ids.join(',') !== '1,2,3') problems.push(`expected responses to ids 1,2,3, got ${ids.join(',')}`); + if (problems.length === 0) pass(`MCP stdio (${name}): ${lines.length} JSON-RPC lines, nothing else`); + else fail(`MCP stdio (${name})`, problems.join('\n')); + } +} catch (error) { + fail('setup', error.stack || error); +} finally { + rmSync(dir, { recursive: true, force: true }); +} + +if (failures) { + console.log(`\n${failures} check(s) failed`); + process.exit(1); +} +console.log('\nall checks passed'); + +/** + * Start the server, write the requests, wait for `expected` responses (or 30s), + * then close stdin and kill the process. Resolves with everything on stdout. + */ +function runServer(args, input, expected) { + return new Promise((resolvePromise) => { + const child = spawn(process.execPath, args, { cwd: dir, stdio: ['pipe', 'pipe', 'ignore'] }); + let out = ''; + const finish = () => { + clearTimeout(timer); + child.stdin.end(); + setTimeout(() => { + child.kill(); + resolvePromise(out); + }, 200); + }; + const timer = setTimeout(finish, 30_000); + child.stdout.on('data', (chunk) => { + out += chunk; + if (out.split('\n').filter(Boolean).length >= expected) finish(); + }); + child.on('exit', () => { + clearTimeout(timer); + resolvePromise(out); + }); + child.stdin.write(input); + }); +} diff --git a/npm/lean-agentic/src/index.js b/npm/lean-agentic/src/index.js index 9eec57c..c94e0b2 100644 --- a/npm/lean-agentic/src/index.js +++ b/npm/lean-agentic/src/index.js @@ -1,81 +1,29 @@ /** * lean-agentic - Hash-consed dependent types with 150x faster equality * + * Root entry point. Under Node.js this is the same API as `lean-agentic/node`, + * plus an `init()` that resolves immediately (the Node WASM build loads + * synchronously). Browsers should use `lean-agentic/web`. + * * @module lean-agentic * @author ruv.io * @license Apache-2.0 */ -import * as wasm from '../wasm/leanr_wasm.js'; +const node = require('./node.js'); /** - * Initialize the WASM module + * Kept for API compatibility: the Node WASM build is ready as soon as it is + * required, so there is nothing to wait for. * @returns {Promise} */ -export async function init() { - // WASM is already initialized when imported - return Promise.resolve(); -} - -/** - * LeanDemo - Main interface for lean-agentic - */ -export class LeanDemo { - constructor() { - this._inner = new wasm.LeanDemo(); - } - - /** - * Create identity function: λx:Type. x - * @returns {string} JSON representation of the identity function - */ - createIdentity() { - return this._inner.create_identity(); - } - - /** - * Create and verify an application - * @returns {string} JSON representation of the application - */ - createApplication() { - return this._inner.create_application(); - } - - /** - * Demonstrate hash-consing by creating identical terms - * @returns {string} JSON showing term equality - */ - demonstrateHashConsing() { - return this._inner.demonstrate_hash_consing(); - } -} - -/** - * Create a new LeanDemo instance - * @returns {LeanDemo} - */ -export function createDemo() { - return new LeanDemo(); -} - -/** - * Quick start: Create identity function - * @returns {Promise} - */ -export async function quickStart() { - await init(); - const demo = createDemo(); - return demo.createIdentity(); -} - -// Re-export WASM types -export { wasm }; +async function init() {} -// Default export -export default { +module.exports = { init, - LeanDemo, - createDemo, - quickStart, - wasm + LeanDemo: node.LeanDemo, + createDemo: node.createDemo, + quickStart: node.quickStart, + setDebug: node.setDebug, + wasm: node.wasm }; diff --git a/npm/lean-agentic/src/node.js b/npm/lean-agentic/src/node.js index 535c5b7..3c03817 100644 --- a/npm/lean-agentic/src/node.js +++ b/npm/lean-agentic/src/node.js @@ -8,6 +8,19 @@ const wasm = require('../wasm-node/leanr_wasm.js'); +/** + * Turn the WASM module's diagnostic logging on or off. Logs go to stderr + * (console.error), never stdout. Off by default; set LEAN_AGENTIC_DEBUG=1 + * to turn it on at load time. + * @param {boolean} enabled + */ +function setDebug(enabled) { + wasm.setDebug(Boolean(enabled)); +} + +const debugEnv = process.env.LEAN_AGENTIC_DEBUG; +setDebug(debugEnv !== undefined && debugEnv !== '' && debugEnv !== '0' && debugEnv !== 'false'); + /** * LeanDemo - Node.js interface */ @@ -78,5 +91,6 @@ module.exports = { LeanDemo, createDemo, quickStart, + setDebug, wasm }; diff --git a/npm/lean-agentic/src/web.js b/npm/lean-agentic/src/web.js index 05aa215..5920b7c 100644 --- a/npm/lean-agentic/src/web.js +++ b/npm/lean-agentic/src/web.js @@ -87,6 +87,15 @@ export class LeanDemo { } } +/** + * Turn the WASM module's diagnostic logging (console.error) on or off. + * Off by default. Call after initWeb(). + * @param {boolean} enabled + */ +export function setDebug(enabled) { + wasm.setDebug(Boolean(enabled)); +} + export function createDemo() { return new LeanDemo(); } @@ -95,5 +104,6 @@ export default { initWeb, LeanDemo, createDemo, + setDebug, wasm }; diff --git a/npm/lean-agentic/wasm-node/leanr_wasm.d.ts b/npm/lean-agentic/wasm-node/leanr_wasm.d.ts index ae5435f..54f6f8b 100644 --- a/npm/lean-agentic/wasm-node/leanr_wasm.d.ts +++ b/npm/lean-agentic/wasm-node/leanr_wasm.d.ts @@ -1,5 +1,9 @@ /* tslint:disable */ /* eslint-disable */ +/** + * Turn diagnostic logging on or off (off by default). + */ +export function setDebug(enabled: boolean): void; /** * Simple greeting function for testing WASM works */ @@ -15,33 +19,33 @@ export class LeanDemo { free(): void; [Symbol.dispose](): void; /** - * Create a new Lean demo instance + * Create a simple type (Type universe) */ - constructor(); + createType(): boolean; /** * Demonstrate hash-consing: creating same term twice reuses memory * Returns true if successful */ createVariable(index: number): boolean; /** - * Create two identical variables and verify they share the same ID - * Returns true if hash-consing worked (same IDs) + * Verify that hash-consing provides O(1) equality */ - demonstrateHashConsing(): boolean; + benchmarkEquality(): string; /** - * Get statistics about the arena (number of unique terms) + * Create a lambda abstraction (x : Type) => x */ - getStats(): string; + createIdentityFunction(): boolean; /** - * Create a simple type (Type universe) + * Create two identical variables and verify they share the same ID + * Returns true if hash-consing worked (same IDs) */ - createType(): boolean; + demonstrateHashConsing(): boolean; /** - * Create a lambda abstraction (x : Type) => x + * Create a new Lean demo instance */ - createIdentityFunction(): boolean; + constructor(); /** - * Verify that hash-consing provides O(1) equality + * Get statistics about the arena (number of unique terms) */ - benchmarkEquality(): string; + getStats(): string; } diff --git a/npm/lean-agentic/wasm-node/leanr_wasm.js b/npm/lean-agentic/wasm-node/leanr_wasm.js index 4182fef..a2a3a6b 100644 --- a/npm/lean-agentic/wasm-node/leanr_wasm.js +++ b/npm/lean-agentic/wasm-node/leanr_wasm.js @@ -23,6 +23,13 @@ function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; return decodeText(ptr, len); } +/** + * Turn diagnostic logging on or off (off by default). + * @param {boolean} enabled + */ +exports.setDebug = function(enabled) { + wasm.setDebug(enabled); +}; let WASM_VECTOR_LEN = 0; @@ -134,13 +141,12 @@ class LeanDemo { wasm.__wbg_leandemo_free(ptr, 0); } /** - * Create a new Lean demo instance + * Create a simple type (Type universe) + * @returns {boolean} */ - constructor() { - const ret = wasm.leandemo_new(); - this.__wbg_ptr = ret >>> 0; - LeanDemoFinalization.register(this, this.__wbg_ptr, this); - return this; + createType() { + const ret = wasm.leandemo_createType(this.__wbg_ptr); + return ret !== 0; } /** * Demonstrate hash-consing: creating same term twice reuses memory @@ -153,23 +159,14 @@ class LeanDemo { return ret !== 0; } /** - * Create two identical variables and verify they share the same ID - * Returns true if hash-consing worked (same IDs) - * @returns {boolean} - */ - demonstrateHashConsing() { - const ret = wasm.leandemo_demonstrateHashConsing(this.__wbg_ptr); - return ret !== 0; - } - /** - * Get statistics about the arena (number of unique terms) + * Verify that hash-consing provides O(1) equality * @returns {string} */ - getStats() { + benchmarkEquality() { let deferred1_0; let deferred1_1; try { - const ret = wasm.leandemo_getStats(this.__wbg_ptr); + const ret = wasm.leandemo_benchmarkEquality(this.__wbg_ptr); deferred1_0 = ret[0]; deferred1_1 = ret[1]; return getStringFromWasm0(ret[0], ret[1]); @@ -178,30 +175,40 @@ class LeanDemo { } } /** - * Create a simple type (Type universe) + * Create a lambda abstraction (x : Type) => x * @returns {boolean} */ - createType() { - const ret = wasm.leandemo_createType(this.__wbg_ptr); + createIdentityFunction() { + const ret = wasm.leandemo_createIdentityFunction(this.__wbg_ptr); return ret !== 0; } /** - * Create a lambda abstraction (x : Type) => x + * Create two identical variables and verify they share the same ID + * Returns true if hash-consing worked (same IDs) * @returns {boolean} */ - createIdentityFunction() { - const ret = wasm.leandemo_createIdentityFunction(this.__wbg_ptr); + demonstrateHashConsing() { + const ret = wasm.leandemo_demonstrateHashConsing(this.__wbg_ptr); return ret !== 0; } /** - * Verify that hash-consing provides O(1) equality + * Create a new Lean demo instance + */ + constructor() { + const ret = wasm.leandemo_new(); + this.__wbg_ptr = ret >>> 0; + LeanDemoFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Get statistics about the arena (number of unique terms) * @returns {string} */ - benchmarkEquality() { + getStats() { let deferred1_0; let deferred1_1; try { - const ret = wasm.leandemo_benchmarkEquality(this.__wbg_ptr); + const ret = wasm.leandemo_getStats(this.__wbg_ptr); deferred1_0 = ret[0]; deferred1_1 = ret[1]; return getStringFromWasm0(ret[0], ret[1]); @@ -214,8 +221,8 @@ if (Symbol.dispose) LeanDemo.prototype[Symbol.dispose] = LeanDemo.prototype.free exports.LeanDemo = LeanDemo; -exports.__wbg_log_6c7b5f4f00b8ce3f = function(arg0) { - console.log(arg0); +exports.__wbg_error_99981e16d476aa5c = function(arg0) { + console.error(arg0); }; exports.__wbg_wbindgenthrow_451ec1a8469d7eb6 = function(arg0, arg1) { diff --git a/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm b/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm index a69fdf461f6745e934fa4631206c7453556dacaa..993444e57b0d0ecdc449d766fd4d7f4b26498ed1 100644 GIT binary patch literal 63577 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 JmFeNs{{m~3Py_$~ literal 65641 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 diff --git a/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm.d.ts b/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm.d.ts index 0b0167a..33b0566 100644 --- a/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm.d.ts +++ b/npm/lean-agentic/wasm-node/leanr_wasm_bg.wasm.d.ts @@ -2,17 +2,18 @@ /* eslint-disable */ export const memory: WebAssembly.Memory; export const __wbg_leandemo_free: (a: number, b: number) => void; -export const leandemo_new: () => number; +export const getVersion: () => [number, number]; +export const greet: (a: number, b: number) => [number, number]; +export const leandemo_benchmarkEquality: (a: number) => [number, number]; +export const leandemo_createIdentityFunction: (a: number) => number; +export const leandemo_createType: (a: number) => number; export const leandemo_createVariable: (a: number, b: number) => number; export const leandemo_demonstrateHashConsing: (a: number) => number; export const leandemo_getStats: (a: number) => [number, number]; -export const leandemo_createType: (a: number) => number; -export const leandemo_createIdentityFunction: (a: number) => number; -export const leandemo_benchmarkEquality: (a: number) => [number, number]; -export const greet: (a: number, b: number) => [number, number]; -export const getVersion: () => [number, number]; +export const leandemo_new: () => number; +export const setDebug: (a: number) => void; export const __wbindgen_export_0: WebAssembly.Table; -export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_start: () => void; diff --git a/npm/lean-agentic/wasm-node/package.json b/npm/lean-agentic/wasm-node/package.json index 6b74ad0..d93d6c0 100644 --- a/npm/lean-agentic/wasm-node/package.json +++ b/npm/lean-agentic/wasm-node/package.json @@ -5,7 +5,7 @@ "github.com/ruvnet" ], "description": "WebAssembly bindings for lean-agentic: hash-consed dependent types in the browser", - "version": "0.1.0", + "version": "0.3.0", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/npm/lean-agentic/wasm-web/leanr_wasm.d.ts b/npm/lean-agentic/wasm-web/leanr_wasm.d.ts index 23a87dc..dbfe76d 100644 --- a/npm/lean-agentic/wasm-web/leanr_wasm.d.ts +++ b/npm/lean-agentic/wasm-web/leanr_wasm.d.ts @@ -1,5 +1,9 @@ /* tslint:disable */ /* eslint-disable */ +/** + * Turn diagnostic logging on or off (off by default). + */ +export function setDebug(enabled: boolean): void; /** * Simple greeting function for testing WASM works */ @@ -15,35 +19,35 @@ export class LeanDemo { free(): void; [Symbol.dispose](): void; /** - * Create a new Lean demo instance + * Create a simple type (Type universe) */ - constructor(); + createType(): boolean; /** * Demonstrate hash-consing: creating same term twice reuses memory * Returns true if successful */ createVariable(index: number): boolean; /** - * Create two identical variables and verify they share the same ID - * Returns true if hash-consing worked (same IDs) + * Verify that hash-consing provides O(1) equality */ - demonstrateHashConsing(): boolean; + benchmarkEquality(): string; /** - * Get statistics about the arena (number of unique terms) + * Create a lambda abstraction (x : Type) => x */ - getStats(): string; + createIdentityFunction(): boolean; /** - * Create a simple type (Type universe) + * Create two identical variables and verify they share the same ID + * Returns true if hash-consing worked (same IDs) */ - createType(): boolean; + demonstrateHashConsing(): boolean; /** - * Create a lambda abstraction (x : Type) => x + * Create a new Lean demo instance */ - createIdentityFunction(): boolean; + constructor(); /** - * Verify that hash-consing provides O(1) equality + * Get statistics about the arena (number of unique terms) */ - benchmarkEquality(): string; + getStats(): string; } export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; @@ -51,19 +55,20 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl export interface InitOutput { readonly memory: WebAssembly.Memory; readonly __wbg_leandemo_free: (a: number, b: number) => void; - readonly leandemo_new: () => number; + readonly getVersion: () => [number, number]; + readonly greet: (a: number, b: number) => [number, number]; + readonly leandemo_benchmarkEquality: (a: number) => [number, number]; + readonly leandemo_createIdentityFunction: (a: number) => number; + readonly leandemo_createType: (a: number) => number; readonly leandemo_createVariable: (a: number, b: number) => number; readonly leandemo_demonstrateHashConsing: (a: number) => number; readonly leandemo_getStats: (a: number) => [number, number]; - readonly leandemo_createType: (a: number) => number; - readonly leandemo_createIdentityFunction: (a: number) => number; - readonly leandemo_benchmarkEquality: (a: number) => [number, number]; - readonly greet: (a: number, b: number) => [number, number]; - readonly getVersion: () => [number, number]; + readonly leandemo_new: () => number; + readonly setDebug: (a: number) => void; readonly __wbindgen_export_0: WebAssembly.Table; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_start: () => void; } diff --git a/npm/lean-agentic/wasm-web/leanr_wasm.js b/npm/lean-agentic/wasm-web/leanr_wasm.js index 5fdddc2..8b9531f 100644 --- a/npm/lean-agentic/wasm-web/leanr_wasm.js +++ b/npm/lean-agentic/wasm-web/leanr_wasm.js @@ -29,6 +29,13 @@ function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; return decodeText(ptr, len); } +/** + * Turn diagnostic logging on or off (off by default). + * @param {boolean} enabled + */ +export function setDebug(enabled) { + wasm.setDebug(enabled); +} let WASM_VECTOR_LEN = 0; @@ -140,13 +147,12 @@ export class LeanDemo { wasm.__wbg_leandemo_free(ptr, 0); } /** - * Create a new Lean demo instance + * Create a simple type (Type universe) + * @returns {boolean} */ - constructor() { - const ret = wasm.leandemo_new(); - this.__wbg_ptr = ret >>> 0; - LeanDemoFinalization.register(this, this.__wbg_ptr, this); - return this; + createType() { + const ret = wasm.leandemo_createType(this.__wbg_ptr); + return ret !== 0; } /** * Demonstrate hash-consing: creating same term twice reuses memory @@ -159,23 +165,14 @@ export class LeanDemo { return ret !== 0; } /** - * Create two identical variables and verify they share the same ID - * Returns true if hash-consing worked (same IDs) - * @returns {boolean} - */ - demonstrateHashConsing() { - const ret = wasm.leandemo_demonstrateHashConsing(this.__wbg_ptr); - return ret !== 0; - } - /** - * Get statistics about the arena (number of unique terms) + * Verify that hash-consing provides O(1) equality * @returns {string} */ - getStats() { + benchmarkEquality() { let deferred1_0; let deferred1_1; try { - const ret = wasm.leandemo_getStats(this.__wbg_ptr); + const ret = wasm.leandemo_benchmarkEquality(this.__wbg_ptr); deferred1_0 = ret[0]; deferred1_1 = ret[1]; return getStringFromWasm0(ret[0], ret[1]); @@ -184,30 +181,40 @@ export class LeanDemo { } } /** - * Create a simple type (Type universe) + * Create a lambda abstraction (x : Type) => x * @returns {boolean} */ - createType() { - const ret = wasm.leandemo_createType(this.__wbg_ptr); + createIdentityFunction() { + const ret = wasm.leandemo_createIdentityFunction(this.__wbg_ptr); return ret !== 0; } /** - * Create a lambda abstraction (x : Type) => x + * Create two identical variables and verify they share the same ID + * Returns true if hash-consing worked (same IDs) * @returns {boolean} */ - createIdentityFunction() { - const ret = wasm.leandemo_createIdentityFunction(this.__wbg_ptr); + demonstrateHashConsing() { + const ret = wasm.leandemo_demonstrateHashConsing(this.__wbg_ptr); return ret !== 0; } /** - * Verify that hash-consing provides O(1) equality + * Create a new Lean demo instance + */ + constructor() { + const ret = wasm.leandemo_new(); + this.__wbg_ptr = ret >>> 0; + LeanDemoFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Get statistics about the arena (number of unique terms) * @returns {string} */ - benchmarkEquality() { + getStats() { let deferred1_0; let deferred1_1; try { - const ret = wasm.leandemo_benchmarkEquality(this.__wbg_ptr); + const ret = wasm.leandemo_getStats(this.__wbg_ptr); deferred1_0 = ret[0]; deferred1_1 = ret[1]; return getStringFromWasm0(ret[0], ret[1]); @@ -256,8 +263,8 @@ async function __wbg_load(module, imports) { function __wbg_get_imports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbg_log_6c7b5f4f00b8ce3f = function(arg0) { - console.log(arg0); + imports.wbg.__wbg_error_99981e16d476aa5c = function(arg0) { + console.error(arg0); }; imports.wbg.__wbg_wbindgenthrow_451ec1a8469d7eb6 = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); diff --git a/npm/lean-agentic/wasm-web/leanr_wasm_bg.wasm b/npm/lean-agentic/wasm-web/leanr_wasm_bg.wasm index 6ff95d53c90aa43603bc422fa9512ad4305e2438..e32254b18e9b1c263b7b893683f3155fbb5c7d91 100644 GIT binary patch literal 63493 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

-04rH} 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 void; -export const leandemo_new: () => number; +export const getVersion: () => [number, number]; +export const greet: (a: number, b: number) => [number, number]; +export const leandemo_benchmarkEquality: (a: number) => [number, number]; +export const leandemo_createIdentityFunction: (a: number) => number; +export const leandemo_createType: (a: number) => number; export const leandemo_createVariable: (a: number, b: number) => number; export const leandemo_demonstrateHashConsing: (a: number) => number; export const leandemo_getStats: (a: number) => [number, number]; -export const leandemo_createType: (a: number) => number; -export const leandemo_createIdentityFunction: (a: number) => number; -export const leandemo_benchmarkEquality: (a: number) => [number, number]; -export const greet: (a: number, b: number) => [number, number]; -export const getVersion: () => [number, number]; +export const leandemo_new: () => number; +export const setDebug: (a: number) => void; export const __wbindgen_export_0: WebAssembly.Table; -export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_start: () => void; diff --git a/npm/lean-agentic/wasm-web/package.json b/npm/lean-agentic/wasm-web/package.json index a1478c6..a415055 100644 --- a/npm/lean-agentic/wasm-web/package.json +++ b/npm/lean-agentic/wasm-web/package.json @@ -6,7 +6,7 @@ "github.com/ruvnet" ], "description": "WebAssembly bindings for lean-agentic: hash-consed dependent types in the browser", - "version": "0.1.0", + "version": "0.3.0", "license": "Apache-2.0", "repository": { "type": "git",