Skip to main content
An agent written in TypeScript or JavaScript keeps running in Node. The harness, simulate.py, stays in Python and drives your agent through a bridge child process, so the mock environment, scenarios, evals and report are the same as for a Python agent. The scan picks the bridge automatically for every Node agent its preflight accepts:
  • Mastra
  • Vercel AI SDK
  • LangGraph.js
  • OpenAI Agents JS
  • A custom agent loop

Requirements

A bridge setup needs two runtimes on your machine: Your agent’s own dependencies must already be installed (its node_modules). Installing them is up to you; the bridge never installs into your project.

What the bridge installs, and where

Everything the bridge writes lives under the plugin’s work folder, plurai_sim/, in your project: The bridge never reads or changes your package.json or your project’s .npmrc. Its one write outside the work folder is npm’s cache under ~/.npm. If the runtime install fails behind a proxy or private registry, set the registry or proxy in ~/.npmrc. Your project’s .npmrc does not apply to the bridge’s install.

How your agent’s calls are mocked

The scan maps each external system your agent calls at the deepest boundary below your business logic: Anything the map does not route fails closed at run time. An unmapped call, a refused shape, or a call to a host you did not declare voids the turn as a harness fault that names it, even when your agent catches the error. Conversation history stays your agent’s own. Each turn the bridge sends the thread id and the new user message only, and your agent keeps history keyed on the thread, as it does in production.

Refused runtimes and shapes

The bridge refuses these by name, with the reason and a remedy. It never works around them. Some client shapes cannot be mapped at the package level and are mapped at another seam instead. For example, AWS SDK send(new XCommand()) calls are mapped at the HTTP level, and query builders such as knex, drizzle-orm, kysely or @supabase/supabase-js are mapped at HTTP or at your own data-access module. A NestJS app may need a build before the bridge can import it, and a Next.js app’s runtime APIs can be refused. The preflight says so with the remedy.

How a Run reads bridge outcomes

  • A fail-closed event, a mocked call the harness could not serve, or the child’s death is a harness fault. The scenario is void, and the log tail is in its error record.
  • An error your agent’s own code threw is a failed trial, owned by your agent.
  • A provider failure is recorded as provider infrastructure, not as your agent’s failure.
Each scenario process runs one Node child, about 100–200 MB. Cap concurrency to fit your machine’s memory.

Next steps

Scan your agent

Generate the harness and the bridge map.

Run the simulation

Score your agent across the suite.