@wice24/tars-sdk
v0.2.0
Published
Client SDK for TARS — the self-hosted managed-agents platform (sessions, streaming turns, client tools, MCP credentials, skills, files, usage, tenant administration)
Readme
@wice24/tars-sdk
TypeScript client for TARS — a self-hosted managed-agents platform: server-side agent loops in sandboxes, an append-only session event log with SSE streaming + replay, client-executed tools, per-end-user MCP credentials, skills, files, and usage metering.
npm install @wice24/tars-sdkQuickstart
import { TarsClient } from '@wice24/tars-sdk';
const tars = new TarsClient({
apiKey: process.env.TARS_API_KEY!, // tars_sk_…
baseUrl: 'https://your-tars-host',
});
const agent = await tars.agents.create({
name: 'assistant',
system: 'You are a helpful assistant.',
model: 'openrouter/anthropic/claude-sonnet-5',
});
const session = await tars.sessions.create({ agentId: agent.id });
for await (const event of session.send('Summarize the attached file.')) {
if (event.type === 'text_delta') process.stdout.write(event.text);
}Streaming surfaces
session.send(text)— yields the turn's events; client-executed tools you registered (sessions.create({ tools })/session.onToolCall) are run and their results returned to the turn automatically.session.sendRaw(text)— same events, no auto-dispatch: hosts that own their tool dispatcher consume this.session.stream({ after })— full event log: replay after a seq cursor, then live-tail. Survives page refreshes and server restarts.session.resume({ after })— current-turn reconnect: replay after the cursor, then close immediately when idle or right afterturn_end. Never re-dispatches client tools.session.interrupt()— abort the in-flight turn; partial text is kept.
Every event carries a monotonic seq — persist the last one you rendered and
reconnect with it.
Beyond sessions
tars.agents (versioned configs, skills pins, MCP servers, sandbox
environment), tars.skills (zip bundles with a SKILL.md, immutable
versions), tars.files (upload / mount / outputs), tars.mcpCredentials
(per-end-user or tenant-wide, OAuth refresh with rotation), tars.usage,
tars.apiKeys, and tars.completions for cheap one-shot generations.
Testing
Inject fetchImpl to stub transport:
const tars = new TarsClient({ apiKey: 'tars_sk_test', fetchImpl: myStub });Requirements
Node 18+ (global fetch). ESM only.
