Monorepo for the Adrian TypeScript SDK. The core package owns the event pipeline: event pairing, PII redaction, JSONL logging, WebSocket streaming, policy verdicts, and shared capture helpers.
Node.js 18 or later.
| Package | npm name | Install | Import |
|---|---|---|---|
| Core | @secureagentics/adrian |
npm install @secureagentics/adrian |
import { adrian } from "@secureagentics/adrian" |
| OpenAI | @secureagentics/adrian-openai |
npm install @secureagentics/adrian-openai openai |
import { adrian } from "@secureagentics/adrian-openai" |
Explicit init() options take precedence over environment variables.
| Variable | Description |
|---|---|
ADRIAN_API_KEY |
API key used for WebSocket authentication |
ADRIAN_LOG_FILE |
Local JSONL log path (default: events.jsonl) |
ADRIAN_WS_URL |
WebSocket endpoint (default: ws://localhost:8080/ws) |
ADRIAN_SESSION_ID |
Session identifier for grouping events |
ADRIAN_BLOCK_TIMEOUT |
Seconds to wait for a BLOCK-mode verdict before fail-open (default: 30) |
ADRIAN_REPLAY_BUFFER_FRAMES |
WebSocket replay buffer size (default: 1000) |
When connected over WebSocket and the dashboard policy is in BLOCK or HITL mode, the SDK waits for backend verdicts on tool calls proposed by an LLM turn. In BLOCK mode, if no verdict arrives within blockTimeout seconds, the SDK fail-open and allows execution (matching the Python SDK). Dashboard-configurable failure policy is planned for a later release.
For custom integrations, pair an LLM start and end with the same runId:
import { randomUUID } from "node:crypto";
import { adrian } from "@secureagentics/adrian";
await adrian.init({ wsUrl: null });
const handler = adrian.getHandler();
const runId = randomUUID();
await handler?.handleChatModelStart(
{ name: "custom-model" },
[[{ role: "user", content: "Hello" }]],
runId,
);
await handler?.handleLLMEnd(
{
output: "Hi there",
toolCalls: [],
usage: { promptTokens: 1, completionTokens: 2, totalTokens: 3 },
},
runId,
);
await adrian.shutdown();Manual tool events work the same way:
const toolRunId = randomUUID();
await handler?.handleToolStart(
{ name: "lookup_user" },
JSON.stringify({ userId: "user_123" }),
toolRunId,
undefined,
{ tool_call_id: "call_123", metadata: { source: "custom-integration" } },
);
await handler?.handleToolEnd(JSON.stringify({ ok: true }), toolRunId);@secureagentics/adrian/capture exposes shared LLM capture helpers used internally by provider packages.
From this directory:
npm install
npm run build
npm testBuild or test the core package only:
npm run build -w @secureagentics/adrian
npm test -w @secureagentics/adrian