Open-source TypeScript agent framework
agentfootprint: Your agent decides what a person used to. Only one of them leaves a reason.
- 21,800+npm installs a month
- MITopen source, no seat fees
- No telemetryit never phones home
- 9,800+tests on every release
- Begin at the current step. The graph defines the instructions and working context available there.
- Act, then observe. Models and tools return evidence to the run.
- Advance through the graph. The next transition can be linear, rule-based, or model-selected.
- Keep the path as it runs. Context → decision → action → outcome stay connected.
An agent inherits the context a person used to carry.
Then the runbook has to become executable.
- Humancarries context between systems
- Agentinherits the same responsibility
- Whole runbookloads every instruction at once
- Current stepreveals what is needed now
- Traversaladvances and records together
The path is already a footprint as it runs.
A developer’s operating model
Four stages. The API you need at each one.
01 · Build
Turn the runbook into a path the agent can walk.
Scope
One state. One reachable skill.
Only its procedure, tools, and model enter the step.
Build the graph →Route
Keep the payload out of the prompt.
For stored results, the model gets a ticket. Your product redeems the real data.
Follow the two lanes →02 · Debug
Open the run before you change the agent.
View · five lenses
One recorded run. Five ways to inspect it.
- Read the estate
- Assess each cluster
- Assess each subject
- Posture
- Collect
- FlowWhat did it actually run?Every stage, in the order it took them — the chart the run really walked, not a diagram of the chart you wrote.
- WhyWhy did it decide that?The decision and the evidence beneath it, quoted from the run, with time travel to any moment.
- StoryCan someone else follow it?The same run as prose, for the people who will never open a graph and still have to sign off.
- Skill graphWhat could it even reach?Which procedure was live at each step, and the tools that step exposed — instead of a flat surface of everything.
- Data graphWhere did the numbers come from?How rows were shaped, tool by tool, into the ones the answer rests on. Running in an application today, landing in the lens next.
Test
Remove one source. Rerun the case.
If the output changes under the same baseline, you have evidence of dependence in this case—not hidden reasoning.
Test a source →- intent
support.refund - skill
billing.refund - context
policy/refunds-v1suspect
Dependence confirmed
Counterfactual replay tests the recorded run. It does not expose private model reasoning.
03 · Run in production
Serve on your stack. Keep the graph.
Bind
One graph. Your stack.
Every backend is a typed port; every vendor is an adapter behind it. Pick the ground and the adapters resolve — the agent you wrote does not move.
Wire your first port →Infrastructure detail
One customer implementation
Better evaluated responses with a lower-cost model.
Field result, not a benchmark. Reproduce it on your workload.See the comparison method →- ModelsOpenAI · Anthropic · Bedrock · Gemini · Azure OpenAI · Foundry · Ollama
- Memory + dataRedis · PostgreSQL · SQLite · S3 · Cloud Storage
- Toolsyour functions · MCP servers, local or remote
- Identity + secretsJWKS · Vault · Entra ID · declare-and-push credentials
- Runtime + sessionsAgentCore · Vertex sessions · your own process
- ObserveOpenTelemetry · CloudWatch · X-Ray · audit bundles
- AWSBedrock models · AgentCore runtime · S3 · CloudWatch · X-Ray
- Google CloudGemini and Vertex models · Vertex sessions · Cloud Storage
- Microsoft FoundryFoundry hosting and models · Azure OpenAI · Entra ID
- Your own hardwareOllama · PostgreSQL · SQLite · your process · OpenTelemetry
04 · Monitor
Watch, export, archive, and learn from the same event stream.
- Watch and exportUse
.on()for typed decisions, tools, cost, errors, and coverage; mount.enable.observability()to send the same stream to OTel, CloudWatch, NDJSON, or an audit bundle. - Archive the joined run
recordRun()captures state, events, and structure together;persistRecording()writes the versioned envelope to your sink. - Learn across runs
contextLedger()already aggregates which skills, tools, and injections earned their context. Dedicated cross-session coverage-gap queries are in progress; today, aggregate the typed absence and coverage events in your sink.

Try agentfootprint
A front-end developer would never debug blind — they open DevTools. Your agents deserve the same.
