// open-source TypeScript multi-agent framework

A self-organizing team of AI agents, in an environment you control.

Every seam, an interface. Every run, a record. Describe the goal; the coordinator plans the rest, and every step stays in your hands.

const oma = new OpenMultiAgent({ maxConcurrency: 3 })
const team = oma.createTeam('security-analysis-team', { agents: [
{ name: 'attack-surface-reviewer', systemPrompt: '…', maxTurns: 2 },
// … data-security-reviewer, supply-chain-reviewer, synthesizer
] })
const goal = 'Review this service for security vulnerabilities…'
const result = await oma.runTeam(team, goal)
decomposes into
parallel ×3
QUEUEDRUNNINGDONE#4f90f545Attack surface review: authentication, endpoints, and trust boundariesattack-surface-reviewer10.7s
QUEUEDRUNNINGDONE#b47191e7Data security review: injection, secret handling, and sensitive datadata-security-reviewer34.8s
QUEUEDRUNNINGDONE#d1c1ab67Supply chain review: dependencies, configuration, and deploymentsupply-chain-reviewer40.8s
QUEUEDRUNNINGDONE#168862baafter 3Synthesize severity-ranked security reportsynthesizer51.3s
real run · runTeam() · deepseek-v4-flash · 4 tasks · 122s · run 8412d609
01 Why OMA

From intent to a controlled, inspectable run.

Choose the topology, move ready work, gate or suspend at the right boundary, recover and revise, and keep evidence you can verify.

01plan → route
Start from an outcome—or an explicit graph.

Give runTeam() a goal and get a reviewable task DAG, or hand runTasks() the graph you wrote. Mode, governance, or an ExecutionRouter decides single agent or team.

runTeam · runTasks · mode · strategy: 'hybrid'
02schedule → dispatch
Move work as soon as dependencies are ready.

Downstream tasks start the moment their dependencies finish, with no round barriers. Approve each dispatch, and a task no agent can satisfy is rejected before it runs.

event-driven · onTaskDispatch · requires · taskResults
03approve → suspend
Gate each boundary, decide out of process.

Gate the plan, a ready task, or a consequential tool call, each at its own boundary. Return { action: 'suspend' } and the decision waits in the checkpoint store until another process makes it.

onPlanReady · onToolCall · { action: 'suspend' } · decideApproval · restore
04recover → revise
Resume from the last safe boundary, revise what has not run.

Restore resumes from the last safe boundary and replays committed tool results instead of re-running them. In repairable mode, a validated PlanPatch revises the part of the graph that has not run.

checkpoint · toolCallId · recovery.mode: 'repairable' · PlanPatch · maxCostBudget
05inspect → verify
Turn a run into evidence you can check.

Receipts, traces, and the offline Run Viewer show what each run did. Turn on the run journal and verifyRun() proves what the model saw from the events alone; the same records feed EvalSets and CI gates.

receipt · TraceStore · RunJournal · verifyRun · EvalSet
06your environment
Run where your data already lives.

Cloud, local, or air-gapped models on your credentials, with three runtime dependencies. Tools are default-deny, egress policy bounds the built-in adapters, and Claude Code, Codex, or Gemini CLI join the DAG over ACP.

default-deny tools · egressPolicy · ShellExecutor · ACP
Run evidence

Inspect what happened after every run.

The offline Run Viewer turns a completed run into reviewable evidence, without sending it to a hosted OMA service. With the run journal on, verifyRun() checks the same run again from its own events.

  • Task DAG and assignees
  • Model, provider, token, and cost rollups
  • Tool calls, status, and safe evidence details
  • Journaled runs: every adapter call and every block the model saw
Open the observability reference
// mentioned
A brilliant TypeScript-native multi-agent orchestration framework.
GithubAwesome · 58K subscribers · GitHub Trending Monthly #6
Watch on YouTube: GithubAwesome's GitHub Trending Monthly #6, paused on the open-multi-agent GitHub repository (6k stars).
04 FAQ

How the TypeScript runtime behaves.

Straight answers to the questions that come up most. The full reference lives in the docs.

05 get started

Your first team. One command.Run locally. No signup.

Quick Start