npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@cogitator-ai/wasm-tools

v0.5.4

Published

WASM-based tools for Cogitator agents

Downloads

2,510

Readme

@cogitator-ai/wasm-tools

WASM-based tools for Cogitator agents. Secure, sandboxed tool execution using WebAssembly.

Features

  • 🚀 100-500x faster cold start than Docker containers
  • 🔒 Memory-safe execution in isolated Extism sandbox
  • 📦 ~20x lower memory footprint compared to containers
  • 🛠️ Custom tool framework - create your own WASM tools
  • 🔄 Hot-reload support - update WASM modules without restart

Installation

pnpm add @cogitator-ai/wasm-tools

Quick Start

Pre-built Tools

Use the built-in WASM tools:

import {
  createCalcTool,
  createJsonTool,
  createHashTool,
  createBase64Tool,
  createSlugTool,
  createValidationTool,
  createDiffTool,
  createRegexTool,
  createCsvTool,
  createMarkdownTool,
  createXmlTool,
  createDatetimeTool,
  createCompressionTool,
  createSigningTool,
} from '@cogitator-ai/wasm-tools';
import { Cogitator, Agent } from '@cogitator-ai/core';

const agent = new Agent({
  name: 'utility-assistant',
  model: 'gpt-4o',
  tools: [
    createCalcTool(),
    createJsonTool(),
    createHashTool(),
    createBase64Tool(),
    createSlugTool(),
    createValidationTool(),
    createDiffTool(),
    createRegexTool(),
    createCsvTool(),
    createMarkdownTool(),
    createXmlTool(),
    createDatetimeTool(),
    createCompressionTool(),
    createSigningTool(),
  ],
});

const cog = new Cogitator({ llm: { defaultProvider: 'openai' } });
const result = await cog.run(agent, {
  input: 'Calculate the SHA-256 hash of "hello world"',
});

Custom WASM Tools

Create custom tools that run in the WASM sandbox:

import { defineWasmTool } from '@cogitator-ai/wasm-tools';
import { z } from 'zod';

const hashTool = defineWasmTool({
  name: 'hash_text',
  description: 'Hash text using various algorithms',
  wasmModule: './my-hash.wasm',
  wasmFunction: 'hash',
  parameters: z.object({
    text: z.string().describe('Text to hash'),
    algorithm: z.enum(['sha256', 'sha512', 'md5']),
  }),
  category: 'utility',
  tags: ['hash', 'crypto'],
  timeout: 5000,
});

const agent = new Agent({
  name: 'hasher',
  tools: [hashTool],
});

Hot-Reload with WasmToolManager

Watch WASM files and automatically reload on changes:

import { WasmToolManager } from '@cogitator-ai/wasm-tools';
import { Cogitator, Agent } from '@cogitator-ai/core';

const manager = new WasmToolManager({ debounceMs: 200 });

// Watch directory for WASM plugins
await manager.watch('./plugins/*.wasm', {
  onLoad: (name) => console.log(`✓ Loaded: ${name}`),
  onReload: (name) => console.log(`↻ Reloaded: ${name}`),
  onUnload: (name) => console.log(`✗ Unloaded: ${name}`),
  onError: (name, _, err) => console.error(`Error ${name}: ${err.message}`),
});

// Or load a single module
const calcTool = await manager.load('./plugins/calc.wasm');

// Get all tools for agent
const agent = new Agent({
  name: 'wasm-agent',
  tools: manager.getTools(),
});

// Tools automatically use the latest plugin version after reload
const cogitator = new Cogitator({ llm: { defaultProvider: 'openai' } });
await cogitator.run(agent, 'Calculate 2 + 2');

// Cleanup when done
await manager.close();

API Reference

defineWasmTool(config)

Create a custom WASM tool for agent use.

interface WasmToolConfig<TParams> {
  name: string;
  description: string;
  wasmModule: string; // Path to .wasm file
  wasmFunction?: string; // Function to call (default: 'run')
  parameters: ZodType<TParams>;
  category?: ToolCategory;
  tags?: string[];
  timeout?: number; // Execution timeout in ms
  wasi?: boolean; // Enable WASI support
  memoryPages?: number; // WASM memory limit
}

createCalcTool(options?)

Create a calculator tool for mathematical expressions.

const calc = createCalcTool({ timeout: 10000 });

// Supports: +, -, *, /, %, parentheses
// Example: "2 + 2 * 3" → 8

createJsonTool(options?)

Create a JSON processor tool with JSONPath query support.

const json = createJsonTool({ timeout: 10000 });

// Example: { json: '{"a": {"b": 1}}', query: '$.a.b' } → 1

createHashTool(options?)

Create a cryptographic hash tool supporting multiple algorithms.

const hash = createHashTool({ timeout: 10000 });

// Supports: sha256, sha1, md5
// Example: { text: "hello", algorithm: "sha256" } → "2cf24dba5fb0a30e..."

createBase64Tool(options?)

Create a Base64 encoding/decoding tool with URL-safe variant support.

const base64 = createBase64Tool({ timeout: 10000 });

// Example: { text: "hello", operation: "encode" } → "aGVsbG8="
// Example: { text: "aGVsbG8=", operation: "decode" } → "hello"
// URL-safe: { text: "hello", operation: "encode", urlSafe: true }

createSlugTool(options?)

Generate URL-safe slugs from text with Unicode transliteration.

const slug = createSlugTool({ timeout: 10000 });

// Example: { text: "Hello World!" } → "hello-world"
// Example: { text: "Привет мир", separator: "_" } → "privet_mir"

createValidationTool(options?)

Validate common formats: email, URL, UUID, IPv4, IPv6.

const validation = createValidationTool({ timeout: 10000 });

// Example: { value: "[email protected]", type: "email" } → { valid: true }
// Example: { value: "192.168.1.1", type: "ipv4" } → { valid: true }

createDiffTool(options?)

Compare texts using Myers diff algorithm.

const diff = createDiffTool({ timeout: 10000 });

// Example: { original: "hello", modified: "hallo" }
// Returns unified diff with additions/deletions count

createRegexTool(options?)

Safe regex operations with ReDoS protection.

const regex = createRegexTool({ timeout: 10000 });

// Example: { text: "hello world", pattern: "\\w+", operation: "matchAll" }
// Supports: match, matchAll, test, replace, split

createCsvTool(options?)

RFC 4180 compliant CSV parsing and generation.

const csv = createCsvTool({ timeout: 10000 });

// Parse: { data: "a,b\n1,2", operation: "parse" }
// Stringify: { data: [["a","b"],["1","2"]], operation: "stringify" }

createMarkdownTool(options?)

Convert Markdown to HTML (GFM subset).

const markdown = createMarkdownTool({ timeout: 10000 });

// Example: { markdown: "# Hello\n**bold**" }
// Returns: { html: "<h1>Hello</h1>\n<p><strong>bold</strong></p>" }
// Supports: headers, bold, italic, links, code, lists, tables

createXmlTool(options?)

Parse XML to JSON with XPath-like queries.

const xml = createXmlTool({ timeout: 10000 });

// Example: { xml: "<root><item>1</item></root>", query: "/root/item" }
// Supports: elements, attributes, CDATA, comments

createDatetimeTool(options?)

Date/time operations with UTC and offset timezone support.

const datetime = createDatetimeTool({ timeout: 10000 });

// Parse: { date: "2024-01-15", operation: "parse" }
// Format: { date: "2024-01-15T10:30:00Z", operation: "format", format: "YYYY-MM-DD" }
// Add: { date: "2024-01-15", operation: "add", amount: 7, unit: "days" }
// Diff: { date: "2024-01-01", operation: "diff", endDate: "2024-01-15", unit: "days" }

createCompressionTool(options?)

Gzip/deflate/zlib compression and decompression.

const compression = createCompressionTool({ timeout: 30000 });

// Compress: { data: "hello", algorithm: "gzip", operation: "compress" }
// Decompress: { data: "H4sIAAAA...", algorithm: "gzip", operation: "decompress" }
// Returns base64-encoded compressed data with size info

createSigningTool(options?)

Ed25519 digital signatures for message authentication.

const signing = createSigningTool({ timeout: 10000 });

// Generate keypair: { operation: "generateKeypair", algorithm: "ed25519" }
// Sign: { operation: "sign", algorithm: "ed25519", message: "hello", privateKey: "..." }
// Verify: { operation: "verify", algorithm: "ed25519", message: "hello", publicKey: "...", signature: "..." }

getWasmPath(name)

Get the path to a pre-built WASM module.

import { getWasmPath } from '@cogitator-ai/wasm-tools';

const calcPath = getWasmPath('calc'); // Path to calc.wasm
const jsonPath = getWasmPath('json'); // Path to json.wasm

WasmToolManager

Manage WASM tools with hot-reload support.

interface WasmToolManagerOptions {
  debounceMs?: number; // File change debounce delay (default: 100ms)
  useWasi?: boolean; // Enable WASI for all modules
}

interface WasmToolCallbacks {
  onLoad?: (name: string, path: string) => void;
  onReload?: (name: string, path: string) => void;
  onUnload?: (name: string, path: string) => void;
  onError?: (name: string, path: string, error: Error) => void;
}

class WasmToolManager {
  constructor(options?: WasmToolManagerOptions);

  // Watch a glob pattern for WASM files
  watch(pattern: string, callbacks?: WasmToolCallbacks): Promise<void>;

  // Load a single WASM module
  load(wasmPath: string): Promise<Tool>;

  // Get all loaded tools
  getTools(): Tool[];

  // Get a tool by module name
  getTool(name: string): Tool | undefined;

  // Get module metadata
  getModule(name: string): LoadedModule | undefined;
  getModules(): LoadedModule[];

  // Close watcher and all plugins
  close(): Promise<void>;
}

Legacy Exports

For direct sandbox usage:

| Export | Description | | ------------------ | ----------------------------------------- | | calcToolConfig | Sandbox config for calculator WASM module | | calcToolSchema | Zod schema for calculator input | | jsonToolConfig | Sandbox config for JSON processor | | jsonToolSchema | Zod schema for JSON processor input | | hashToolConfig | Sandbox config for hash WASM module | | hashToolSchema | Zod schema for hash input | | base64ToolConfig | Sandbox config for base64 WASM module | | base64ToolSchema | Zod schema for base64 input |

Building Custom WASM Modules

WASM modules use the Extism JS PDK:

// my-tool.ts
export function run(): number {
  const input = JSON.parse(Host.inputString());

  // Your logic here
  const result = { processed: input.data };

  Host.outputString(JSON.stringify(result));
  return 0; // 0 = success
}

declare const Host: {
  inputString(): string;
  outputString(s: string): void;
};

Build with:

esbuild my-tool.ts -o temp/my-tool.js --bundle --format=cjs --target=es2020
extism-js temp/my-tool.js -o dist/my-tool.wasm

Security

WASM tools run in a secure Extism sandbox:

  • ❌ No filesystem access (unless WASI enabled)
  • ❌ No network access
  • ✅ Memory limits enforced
  • ✅ Timeout enforcement
  • ✅ Isolated execution environment

License

MIT