
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
trusera-sdk
Advanced tools
TypeScript SDK for monitoring AI agents with Trusera - intercept HTTP (fetch, axios, undici), evaluate Cedar policies
Beta — This SDK is under active development. Expected GA: April 2026.
The official TypeScript/JavaScript SDK for monitoring AI agents with Trusera. Provides transparent HTTP interception, policy enforcement, and comprehensive observability for AI agent applications.
fetch, axios, and undicinpm install trusera-sdk
The simplest way to get started is with the HTTP interceptor:
import { TruseraClient, TruseraInterceptor } from "trusera-sdk";
// Create client
const client = new TruseraClient({
apiKey: "tsk_your_api_key_here",
agentId: "my-agent-123",
});
// Install interceptor
const interceptor = new TruseraInterceptor();
interceptor.install(client, {
enforcement: "log", // or "warn" or "block"
});
// All fetch calls are now automatically tracked
await fetch("https://api.github.com/repos/anthropics/claude");
await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ model: "gpt-4", messages: [] }),
});
// Cleanup
await client.close();
interceptor.uninstall();
Track LLM calls, tool executions, and chain steps automatically:
import { ChatOpenAI } from "langchain/chat_models/openai";
import { TruseraClient, TruseraLangChainHandler } from "trusera-sdk";
const client = new TruseraClient({ apiKey: "tsk_xxx" });
const handler = new TruseraLangChainHandler(client);
const model = new ChatOpenAI({
callbacks: [handler],
});
await model.invoke("What are the top AI security risks?");
await client.close();
The interceptor automatically detects and patches axios and undici if they
are installed. No additional configuration is needed:
import axios from "axios";
import { TruseraClient, TruseraInterceptor } from "trusera-sdk";
const client = new TruseraClient({ apiKey: "tsk_xxx" });
const interceptor = new TruseraInterceptor();
interceptor.install(client, { enforcement: "warn" });
// axios requests are now tracked automatically
await axios.get("https://api.openai.com/v1/models");
// undici requests too (if undici is installed)
// import { request } from "undici";
// await request("https://api.openai.com/v1/models");
await client.close();
interceptor.uninstall();
Libraries are detected via require() at install-time. If a library is not
installed, it is silently skipped with no errors.
Add Cedar policy enforcement to tool and LLM calls:
import { TruseraClient, TruseraLangChainHandler, CedarEvaluator } from "trusera-sdk";
const evaluator = new CedarEvaluator();
await evaluator.loadPolicy(`
forbid (principal, action == Action::"*", resource)
when { resource.hostname == "langchain" };
`);
const handler = new TruseraLangChainHandler(client, {
enforcement: "block",
cedarEvaluator: evaluator,
});
// Denied tool/LLM calls throw in block mode
For custom instrumentation:
import { TruseraClient, EventType, createEvent } from "trusera-sdk";
const client = new TruseraClient({ apiKey: "tsk_xxx" });
// Track tool call
client.track(
createEvent(EventType.TOOL_CALL, "github.search_repos", {
query: "AI security",
language: "TypeScript",
})
);
// Track LLM invocation
client.track(
createEvent(EventType.LLM_INVOKE, "openai.gpt4", {
model: "gpt-4",
tokens: 150,
temperature: 0.7,
})
);
// Track data access
client.track(
createEvent(EventType.DATA_ACCESS, "database.users.read", {
table: "users",
query: "SELECT * FROM users WHERE id = ?",
})
);
await client.close();
interface TruseraClientOptions {
/** API key for authenticating with Trusera (required) */
apiKey: string;
/** Base URL for Trusera API (default: https://api.trusera.io) */
baseUrl?: string;
/** Agent identifier (auto-registered if not provided) */
agentId?: string;
/** Interval in ms to auto-flush events (default: 5000) */
flushInterval?: number;
/** Max events per batch (default: 100) */
batchSize?: number;
/** Enable debug logging (default: false) */
debug?: boolean;
}
interface InterceptorOptions {
/** How to handle policy violations (default: "log") */
enforcement?: "block" | "warn" | "log";
/** Cedar policy service URL for runtime policy checks */
policyUrl?: string;
/** URL patterns to exclude from interception (regex strings) */
excludePatterns?: string[];
/** Enable debug logging (default: false) */
debug?: boolean;
}
The interceptor supports three enforcement modes for policy violations:
log (default)Logs violations silently, allows all requests to proceed.
interceptor.install(client, { enforcement: "log" });
warnLogs warnings to console but allows requests to proceed.
interceptor.install(client, { enforcement: "warn" });
// Outputs: [Trusera] Policy violation (allowed): Unauthorized API access
blockThrows an error and blocks the request.
interceptor.install(client, { enforcement: "block" });
// Throws: Error: [Trusera] Policy violation: Unauthorized API access
Connect to a Cedar policy service for runtime access control:
interceptor.install(client, {
enforcement: "block",
policyUrl: "https://policy.trusera.io/evaluate",
});
// This request will be evaluated against Cedar policies
// If denied, an error will be thrown before the request executes
await fetch("https://api.stripe.com/v1/customers");
Prevent interception of internal or infrastructure URLs:
interceptor.install(client, {
excludePatterns: [
"^https://api\\.trusera\\.io/.*", // Exclude Trusera API
"^https://internal\\.company\\.com/.*", // Exclude internal services
"^http://localhost.*", // Exclude localhost
],
});
Register a new agent programmatically:
const client = new TruseraClient({ apiKey: "tsk_xxx" });
const agentId = await client.registerAgent("my-chatbot", "langchain");
console.log(`Agent registered: ${agentId}`);
// Use the returned ID for future sessions
const client2 = new TruseraClient({
apiKey: "tsk_xxx",
agentId: agentId,
});
Control when events are sent:
const client = new TruseraClient({
apiKey: "tsk_xxx",
flushInterval: 999999, // Disable auto-flush
batchSize: 50,
});
// Track events
client.track(createEvent(EventType.TOOL_CALL, "test"));
// Manually flush when ready
await client.flush();
The SDK tracks six core event types:
| Event Type | Description | Example Use Cases |
|---|---|---|
TOOL_CALL | Tool or function call by the agent | API calls, file operations, searches |
LLM_INVOKE | LLM inference invocation | OpenAI, Anthropic, local models |
DATA_ACCESS | Data read/write operations | Database queries, file I/O |
API_CALL | Outbound HTTP API calls | Third-party APIs, webhooks |
FILE_WRITE | File write operations | Log files, cache writes |
DECISION | Decision points or chain steps | Agent reasoning, workflow branches |
TruseraClientconstructor(options: TruseraClientOptions): Create a new clienttrack(event: Event): void: Queue an event for transmissionflush(): Promise<void>: Immediately send all queued eventsregisterAgent(name: string, framework: string): Promise<string>: Register a new agentclose(): Promise<void>: Flush events and shutdown clientgetQueueSize(): number: Get current queue sizegetAgentId(): string | undefined: Get the current agent IDTruseraInterceptorinstall(client: TruseraClient, options?: InterceptorOptions): void: Install HTTP interceptor for fetch, axios (if available), and undici (if available)uninstall(): void: Restore original fetch, eject axios interceptors, and restore undici functionsTruseraLangChainHandlerconstructor(client: TruseraClient, options?: LangChainHandlerOptions): Create handler for LangChain callbacks with optional Cedar enforcementgetPendingEventCount(): number: Get count of incomplete eventsclearPendingEvents(): void: Clear all pending eventsinterface LangChainHandlerOptions {
enforcement?: "block" | "warn" | "log";
cedarEvaluator?: CedarEvaluator;
}
When enforcement is "block" and a Cedar policy denies a tool/LLM call, the handler throws an Error. In "warn" mode it logs via console.warn. In "log" mode (default) violations are tracked silently.
createEvent(type: EventType, name: string, payload?, metadata?): Event: Create a well-formed eventisValidEvent(obj: unknown): boolean: Type guard to validate eventsimport { TruseraClient, TruseraInterceptor, EventType, createEvent } from "trusera-sdk";
const client = new TruseraClient({ apiKey: process.env.TRUSERA_API_KEY });
const interceptor = new TruseraInterceptor();
interceptor.install(client, {
enforcement: "warn",
excludePatterns: ["^http://localhost.*"],
});
// Tool execution wrapper
async function executeTool(name: string, input: any) {
const startTime = Date.now();
try {
// Tool logic here
const result = await fetch("https://api.example.com/tool", {
method: "POST",
body: JSON.stringify(input),
});
const duration = Date.now() - startTime;
client.track(
createEvent(EventType.TOOL_CALL, `tool.${name}.success`, {
input,
duration_ms: duration,
})
);
return result;
} catch (error) {
client.track(
createEvent(EventType.TOOL_CALL, `tool.${name}.error`, {
input,
error: error.message,
})
);
throw error;
}
}
await executeTool("search", { query: "AI security" });
await client.close();
interceptor.uninstall();
const agent1 = new TruseraClient({
apiKey: "tsk_xxx",
agentId: "planner",
});
const agent2 = new TruseraClient({
apiKey: "tsk_xxx",
agentId: "executor",
});
// Track coordination events
agent1.track(
createEvent(EventType.DECISION, "coordination.delegate", {
target_agent: "executor",
task: "web_search",
})
);
agent2.track(
createEvent(EventType.TOOL_CALL, "search.execute", {
delegated_from: "planner",
})
);
await Promise.all([agent1.close(), agent2.close()]);
Apache 2.0 - see LICENSE for details.
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Built with care by the Trusera team. Making AI agents safe and observable.
FAQs
TypeScript SDK for monitoring AI agents with Trusera - intercept HTTP (fetch, axios, undici), evaluate Cedar policies
The npm package trusera-sdk receives a total of 10 weekly downloads. As such, trusera-sdk popularity was classified as not popular.
We found that trusera-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.