Adrian TypeScript SDK

June 25, 2026 ยท View on GitHub

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.

Requirements

Node.js 18 or later.

Packages

Packagenpm nameInstallImport
Core@secureagentics/adriannpm install @secureagentics/adrianimport { adrian } from "@secureagentics/adrian"
OpenAI@secureagentics/adrian-openainpm install @secureagentics/adrian-openai openaiimport { adrian } from "@secureagentics/adrian-openai"

Environment

Explicit init() options take precedence over environment variables.

VariableDescription
ADRIAN_API_KEYAPI key used for WebSocket authentication
ADRIAN_LOG_FILELocal JSONL log path (default: events.jsonl)
ADRIAN_WS_URLWebSocket endpoint (default: ws://localhost:8080/ws)
ADRIAN_SESSION_IDSession identifier for grouping events
ADRIAN_BLOCK_TIMEOUTSeconds to wait for a BLOCK-mode verdict before fail-open (default: 30)
ADRIAN_REPLAY_BUFFER_FRAMESWebSocket replay buffer size (default: 1000)

Policy and BLOCK mode

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.

Manual callback wiring

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);

Subpath export

@secureagentics/adrian/capture exposes shared LLM capture helpers used internally by provider packages.

Development

From this directory:

npm install
npm run build
npm test

Build or test the core package only:

npm run build -w @secureagentics/adrian
npm test -w @secureagentics/adrian