@wice24/tars-sdk 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +54 -5
- package/dist/index.js +43 -2
- package/dist/types.d.ts +76 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Agent, AgentVersion, ClientTool, CreateAgentInput, FileMeta, ListMcpToolsInput, McpCredentialInput, McpCredentialStatus, McpServerTools, ReasoningConfig, SessionEvent, ModelInfo, ProviderKeys, ProviderStatusReport, SessionInfo, SessionListItem, UpdateAgentInput, UploadFileInput, UsageSummary, SessionUsageRow, DailyUsageRow, McpServer, Skill, SkillVersion, ApiKeyInfo, ClientIdentity, ClientRole, PlatformStats, Tenant } from './types.js';
|
|
1
|
+
import type { Agent, AgentVersion, ClientTool, CompactResult, CreateAgentInput, FileMeta, ListMcpToolsInput, McpCredentialInput, McpCredentialStatus, McpServerTools, ReasoningConfig, SessionEvent, ModelInfo, ProviderKeys, ProviderStatusReport, SessionInfo, SessionListItem, UpdateAgentInput, UploadFileInput, UsageSummary, SessionUsageRow, DailyUsageRow, McpServer, Skill, SkillVersion, ApiKeyInfo, ClientIdentity, ClientRole, PlatformStats, Tenant } from './types.js';
|
|
2
2
|
type ToolHandler = (input: any) => unknown | Promise<unknown>;
|
|
3
3
|
export * from './types.js';
|
|
4
4
|
/** The providers `providerKeys` accepts. */
|
|
@@ -17,9 +17,9 @@ export interface TarsClientOptions {
|
|
|
17
17
|
* Admin keys only: scope every request to this tenant id (sent as the
|
|
18
18
|
* `X-Tars-Tenant` header). Act-as is READ-ONLY — GETs return the target
|
|
19
19
|
* tenant's data; any write is refused with 403 `act_as_read_only`, and so
|
|
20
|
-
* is live SSE (`
|
|
21
|
-
* a side effect): read the journal via `sessions.get` /
|
|
22
|
-
* instead. Non-admin keys get 403 `admin_required`; an unknown tenant id
|
|
20
|
+
* is live SSE (`streamEvents` / `TarsSession.stream` / `resume` — sandbox
|
|
21
|
+
* reattachment is a side effect): read the journal via `sessions.get` /
|
|
22
|
+
* `sessions.events` instead. Non-admin keys get 403 `admin_required`; an unknown tenant id
|
|
23
23
|
* 404s on every call; an empty value 400s. The effective role is always
|
|
24
24
|
* `tenant`, so `admin.*` calls under act-as also get 403 `admin_required`
|
|
25
25
|
* — use a client WITHOUT this option to administrate.
|
|
@@ -58,11 +58,15 @@ export declare class TarsClient {
|
|
|
58
58
|
}) => Promise<Agent[]>;
|
|
59
59
|
get: (id: string) => Promise<Agent>;
|
|
60
60
|
update: (id: string, patch: UpdateAgentInput) => Promise<Agent>;
|
|
61
|
+
/** Archived agents refuse new sessions (409) and updates; existing
|
|
62
|
+
* sessions keep running. */
|
|
61
63
|
archive: (id: string) => Promise<{
|
|
62
64
|
ok: boolean;
|
|
65
|
+
status: "archived";
|
|
63
66
|
}>;
|
|
64
67
|
unarchive: (id: string) => Promise<{
|
|
65
68
|
ok: boolean;
|
|
69
|
+
status: "active";
|
|
66
70
|
}>;
|
|
67
71
|
versions: (id: string) => Promise<AgentVersion[]>;
|
|
68
72
|
};
|
|
@@ -96,6 +100,20 @@ export declare class TarsClient {
|
|
|
96
100
|
rename: (id: string, title: string) => Promise<{
|
|
97
101
|
ok: boolean;
|
|
98
102
|
}>;
|
|
103
|
+
/**
|
|
104
|
+
* One page of the session's journal — the same events `get()` inlines,
|
|
105
|
+
* for incremental readers on long sessions. `afterSeq` is the last seq
|
|
106
|
+
* you hold (-1 = from the start); `limit` 1..1000 (default 500).
|
|
107
|
+
* `has_more` says another page follows. Allowed under act-as, unlike the
|
|
108
|
+
* live stream.
|
|
109
|
+
*/
|
|
110
|
+
events: (id: string, opts?: {
|
|
111
|
+
afterSeq?: number;
|
|
112
|
+
limit?: number;
|
|
113
|
+
}) => Promise<{
|
|
114
|
+
events: SessionEvent[];
|
|
115
|
+
has_more: boolean;
|
|
116
|
+
}>;
|
|
99
117
|
/** Replace the session's extra MCP server set (takes effect next turn;
|
|
100
118
|
* 409s while a turn is in flight). */
|
|
101
119
|
setMcpServers: (id: string, servers: McpServer[]) => Promise<{
|
|
@@ -112,6 +130,17 @@ export declare class TarsClient {
|
|
|
112
130
|
ok: boolean;
|
|
113
131
|
interrupted: boolean;
|
|
114
132
|
}>;
|
|
133
|
+
/**
|
|
134
|
+
* Compact the session's context now: the older history is folded into a
|
|
135
|
+
* checkpoint summary and the recent tail kept verbatim — what the
|
|
136
|
+
* platform does on its own as a session nears its model's context
|
|
137
|
+
* window (the `compaction` event either way). Idle sessions only
|
|
138
|
+
* (`turn_in_progress` otherwise). `instructions` is an optional focus
|
|
139
|
+
* for the summary ("keep every SQL statement verbatim").
|
|
140
|
+
*/
|
|
141
|
+
compact: (id: string, opts?: {
|
|
142
|
+
instructions?: string;
|
|
143
|
+
}) => Promise<CompactResult>;
|
|
115
144
|
usage: (id: string) => Promise<{
|
|
116
145
|
session_id: string;
|
|
117
146
|
model: string;
|
|
@@ -163,12 +192,17 @@ export declare class TarsClient {
|
|
|
163
192
|
list: () => Promise<Skill[]>;
|
|
164
193
|
get: (id: string) => Promise<Skill>;
|
|
165
194
|
versions: (id: string) => Promise<SkillVersion[]>;
|
|
166
|
-
/** Upload a new immutable version from zip bytes.
|
|
195
|
+
/** Upload a new immutable version from zip bytes. `name` / `description`
|
|
196
|
+
* are what SKILL.md's front matter declared (null when absent); `files`
|
|
197
|
+
* counts the bundle's entries. */
|
|
167
198
|
pushVersion: (id: string, zipBytes: Uint8Array) => Promise<{
|
|
168
199
|
skill_id: string;
|
|
169
200
|
slug: string;
|
|
170
201
|
version: number;
|
|
202
|
+
name: string | null;
|
|
203
|
+
description: string | null;
|
|
171
204
|
files: number;
|
|
205
|
+
size_bytes: number;
|
|
172
206
|
}>;
|
|
173
207
|
/**
|
|
174
208
|
* Download one immutable version's zip bytes — exactly what `pushVersion`
|
|
@@ -177,12 +211,14 @@ export declare class TarsClient {
|
|
|
177
211
|
downloadVersion: (id: string, version: number) => Promise<Uint8Array>;
|
|
178
212
|
};
|
|
179
213
|
readonly apiKeys: {
|
|
214
|
+
/** Mint another key for this tenant. `key` is returned ONCE. */
|
|
180
215
|
create: (input?: {
|
|
181
216
|
name?: string;
|
|
182
217
|
}) => Promise<{
|
|
183
218
|
id: string;
|
|
184
219
|
key: string;
|
|
185
220
|
key_prefix: string;
|
|
221
|
+
name: string | null;
|
|
186
222
|
}>;
|
|
187
223
|
list: () => Promise<ApiKeyInfo[]>;
|
|
188
224
|
revoke: (id: string) => Promise<{
|
|
@@ -241,6 +277,11 @@ export declare class TarsClient {
|
|
|
241
277
|
usage: {
|
|
242
278
|
input_tokens: number;
|
|
243
279
|
output_tokens: number;
|
|
280
|
+
cache_read_tokens: number;
|
|
281
|
+
cache_write_tokens: number;
|
|
282
|
+
cost_usd?: number;
|
|
283
|
+
cost_source?: "provider";
|
|
284
|
+
upstream_cost_usd?: number;
|
|
244
285
|
};
|
|
245
286
|
}>;
|
|
246
287
|
};
|
|
@@ -301,6 +342,8 @@ export declare class TarsClient {
|
|
|
301
342
|
fileId: string;
|
|
302
343
|
mountPath?: string;
|
|
303
344
|
}): Promise<{
|
|
345
|
+
ok: boolean;
|
|
346
|
+
file_id: string;
|
|
304
347
|
mount_path: string;
|
|
305
348
|
size_bytes: number;
|
|
306
349
|
}>;
|
|
@@ -335,6 +378,8 @@ export declare class TarsSession {
|
|
|
335
378
|
after?: number;
|
|
336
379
|
}): AsyncGenerator<SessionEvent>;
|
|
337
380
|
mountFile(fileId: string, mountPath?: string): Promise<{
|
|
381
|
+
ok: boolean;
|
|
382
|
+
file_id: string;
|
|
338
383
|
mount_path: string;
|
|
339
384
|
size_bytes: number;
|
|
340
385
|
}>;
|
|
@@ -349,6 +394,10 @@ export declare class TarsSession {
|
|
|
349
394
|
ok: boolean;
|
|
350
395
|
interrupted: boolean;
|
|
351
396
|
}>;
|
|
397
|
+
/** Compact the context now — see `TarsClient.sessions.compact`. */
|
|
398
|
+
compact(opts?: {
|
|
399
|
+
instructions?: string;
|
|
400
|
+
}): Promise<CompactResult>;
|
|
352
401
|
destroy(): Promise<{
|
|
353
402
|
ok: boolean;
|
|
354
403
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -67,6 +67,8 @@ export class TarsClient {
|
|
|
67
67
|
},
|
|
68
68
|
get: (id) => this.request('GET', `/v1/agents/${id}`),
|
|
69
69
|
update: (id, patch) => this.request('PATCH', `/v1/agents/${id}`, patch),
|
|
70
|
+
/** Archived agents refuse new sessions (409) and updates; existing
|
|
71
|
+
* sessions keep running. */
|
|
70
72
|
archive: (id) => this.request('POST', `/v1/agents/${id}/archive`),
|
|
71
73
|
unarchive: (id) => this.request('POST', `/v1/agents/${id}/unarchive`),
|
|
72
74
|
versions: async (id) => {
|
|
@@ -115,6 +117,22 @@ export class TarsClient {
|
|
|
115
117
|
return { sessions: res.sessions, nextCursor: res.next_cursor };
|
|
116
118
|
},
|
|
117
119
|
rename: (id, title) => this.request('PATCH', `/v1/sessions/${id}`, { title }),
|
|
120
|
+
/**
|
|
121
|
+
* One page of the session's journal — the same events `get()` inlines,
|
|
122
|
+
* for incremental readers on long sessions. `afterSeq` is the last seq
|
|
123
|
+
* you hold (-1 = from the start); `limit` 1..1000 (default 500).
|
|
124
|
+
* `has_more` says another page follows. Allowed under act-as, unlike the
|
|
125
|
+
* live stream.
|
|
126
|
+
*/
|
|
127
|
+
events: async (id, opts) => {
|
|
128
|
+
const params = new URLSearchParams();
|
|
129
|
+
if (opts?.afterSeq !== undefined)
|
|
130
|
+
params.set('after_seq', String(opts.afterSeq));
|
|
131
|
+
if (opts?.limit)
|
|
132
|
+
params.set('limit', String(opts.limit));
|
|
133
|
+
const qs = params.size ? `?${params}` : '';
|
|
134
|
+
return this.request('GET', `/v1/sessions/${id}/events${qs}`);
|
|
135
|
+
},
|
|
118
136
|
/** Replace the session's extra MCP server set (takes effect next turn;
|
|
119
137
|
* 409s while a turn is in flight). */
|
|
120
138
|
setMcpServers: (id, servers) => this.request('PATCH', `/v1/sessions/${id}`, { mcp_servers: servers }),
|
|
@@ -131,6 +149,15 @@ export class TarsClient {
|
|
|
131
149
|
}),
|
|
132
150
|
/** Abort the in-flight turn, if any. Idempotent. */
|
|
133
151
|
interrupt: (id) => this.request('POST', `/v1/sessions/${id}/interrupt`),
|
|
152
|
+
/**
|
|
153
|
+
* Compact the session's context now: the older history is folded into a
|
|
154
|
+
* checkpoint summary and the recent tail kept verbatim — what the
|
|
155
|
+
* platform does on its own as a session nears its model's context
|
|
156
|
+
* window (the `compaction` event either way). Idle sessions only
|
|
157
|
+
* (`turn_in_progress` otherwise). `instructions` is an optional focus
|
|
158
|
+
* for the summary ("keep every SQL statement verbatim").
|
|
159
|
+
*/
|
|
160
|
+
compact: (id, opts) => this.request('POST', `/v1/sessions/${id}/compact`, opts ?? {}),
|
|
134
161
|
usage: (id) => this.request('GET', `/v1/sessions/${id}/usage`),
|
|
135
162
|
get: (id) => this.request('GET', `/v1/sessions/${id}`),
|
|
136
163
|
// Re-open an existing session (e.g. after a page refresh or on another
|
|
@@ -199,7 +226,9 @@ export class TarsClient {
|
|
|
199
226
|
list: async () => (await this.request('GET', '/v1/skills')).skills,
|
|
200
227
|
get: (id) => this.request('GET', `/v1/skills/${id}`),
|
|
201
228
|
versions: async (id) => (await this.request('GET', `/v1/skills/${id}/versions`)).versions,
|
|
202
|
-
/** Upload a new immutable version from zip bytes.
|
|
229
|
+
/** Upload a new immutable version from zip bytes. `name` / `description`
|
|
230
|
+
* are what SKILL.md's front matter declared (null when absent); `files`
|
|
231
|
+
* counts the bundle's entries. */
|
|
203
232
|
pushVersion: async (id, zipBytes) => {
|
|
204
233
|
const res = await this.fetchImpl(`${this.baseUrl}/v1/skills/${id}/versions`, {
|
|
205
234
|
method: 'POST',
|
|
@@ -225,6 +254,7 @@ export class TarsClient {
|
|
|
225
254
|
};
|
|
226
255
|
// ── api keys / identity ──────────────────────────────────────
|
|
227
256
|
apiKeys = {
|
|
257
|
+
/** Mint another key for this tenant. `key` is returned ONCE. */
|
|
228
258
|
create: (input) => this.request('POST', '/v1/api-keys', { ...(input?.name ? { name: input.name } : {}) }),
|
|
229
259
|
list: async () => (await this.request('GET', '/v1/api-keys')).keys,
|
|
230
260
|
revoke: (id) => this.request('DELETE', `/v1/api-keys/${id}`),
|
|
@@ -257,7 +287,14 @@ export class TarsClient {
|
|
|
257
287
|
};
|
|
258
288
|
// ── completions / providers (any key) ────────────────────────
|
|
259
289
|
// Cheap non-session completion (titles and other one-shots) — routed
|
|
260
|
-
// through the same provider seam as agent turns
|
|
290
|
+
// through the same provider seam as agent turns, on this client's
|
|
291
|
+
// `providerKeys` (400 `provider_not_configured` when the model's provider
|
|
292
|
+
// is not routable). `maxTokens` defaults to 256 and is capped at 1024;
|
|
293
|
+
// `model` defaults to `openrouter/anthropic/claude-haiku-4-5`. In `usage`,
|
|
294
|
+
// the cache counts make a caching claim checkable from outside; `cost_usd`
|
|
295
|
+
// is present only when the provider reported a bill (`cost_source:
|
|
296
|
+
// 'provider'`), and `upstream_cost_usd`, under BYOK through OpenRouter, is
|
|
297
|
+
// what the vendor charged the key's owner.
|
|
261
298
|
completions = {
|
|
262
299
|
create: (input) => this.request('POST', '/v1/completions', {
|
|
263
300
|
prompt: input.prompt,
|
|
@@ -531,6 +568,10 @@ export class TarsSession {
|
|
|
531
568
|
interrupt() {
|
|
532
569
|
return this.client.sessions.interrupt(this.info.id);
|
|
533
570
|
}
|
|
571
|
+
/** Compact the context now — see `TarsClient.sessions.compact`. */
|
|
572
|
+
compact(opts) {
|
|
573
|
+
return this.client.sessions.compact(this.info.id, opts);
|
|
574
|
+
}
|
|
534
575
|
destroy() {
|
|
535
576
|
return this.client.sessions.destroy(this.info.id);
|
|
536
577
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -71,7 +71,7 @@ export type SessionEvent = {
|
|
|
71
71
|
* descriptions, input schemas) add to every request of the turn,
|
|
72
72
|
* at ~4 chars/token — size connectors against each other and
|
|
73
73
|
* against the rest of the prompt. Absent on rows journaled
|
|
74
|
-
* before 0.
|
|
74
|
+
* before 0.3.0. */
|
|
75
75
|
schema_tokens?: number;
|
|
76
76
|
/** The tool names the model received from this server (its own
|
|
77
77
|
* unprefixed names, in server order) — what `tool_count` counts.
|
|
@@ -96,7 +96,44 @@ export type SessionEvent = {
|
|
|
96
96
|
message: string;
|
|
97
97
|
server?: string;
|
|
98
98
|
retry_status: 'terminal' | 'exhausted';
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Context compaction: the older history was folded into a summary
|
|
102
|
+
* checkpoint and the recent tail kept verbatim, so the session stays under
|
|
103
|
+
* the model's context window. Nested discriminant on `status`, like
|
|
104
|
+
* mcp_connect: `started` opens the (possibly long) summarization,
|
|
105
|
+
* `completed` carries the checkpoint the model now runs on, `failed` says
|
|
106
|
+
* the history is unchanged. `reason`: `auto` = the threshold check before
|
|
107
|
+
* a model call, `overflow` = the provider rejected the prompt as too long,
|
|
108
|
+
* `manual` = `sessions.compact()`.
|
|
109
|
+
*/
|
|
110
|
+
| ({
|
|
111
|
+
type: 'compaction';
|
|
112
|
+
reason: CompactionReason;
|
|
113
|
+
} & ({
|
|
114
|
+
status: 'started';
|
|
115
|
+
} | {
|
|
116
|
+
status: 'completed';
|
|
117
|
+
/** The checkpoint text the model sees in place of the summarized
|
|
118
|
+
* messages — the tenant-visible record of what was kept. */
|
|
119
|
+
summary: string;
|
|
120
|
+
/** Estimated prompt tokens before and after (chars/4 over the
|
|
121
|
+
* history; the provider's own count lands on the next turn_end). */
|
|
122
|
+
tokens_before: number;
|
|
123
|
+
tokens_after: number;
|
|
124
|
+
/** How many history messages the summary replaced, and how many
|
|
125
|
+
* recent ones stayed verbatim after it. */
|
|
126
|
+
summarized_messages: number;
|
|
127
|
+
kept_messages: number;
|
|
128
|
+
/** The model that wrote the summary; `fallback` when the
|
|
129
|
+
* summarizer failed during overflow recovery and a deterministic
|
|
130
|
+
* checkpoint (the dropped requests, listed) was written instead. */
|
|
131
|
+
model: string;
|
|
99
132
|
} | {
|
|
133
|
+
status: 'failed';
|
|
134
|
+
code: AgentErrorCode;
|
|
135
|
+
message: string;
|
|
136
|
+
})) | {
|
|
100
137
|
type: 'turn_end';
|
|
101
138
|
reason: 'completed' | 'interrupted' | 'error';
|
|
102
139
|
usage?: {
|
|
@@ -108,8 +145,33 @@ export type SessionEvent = {
|
|
|
108
145
|
cacheReadTokens?: number;
|
|
109
146
|
/** Input tokens written to the provider's prompt cache. */
|
|
110
147
|
cacheWriteTokens?: number;
|
|
148
|
+
/** The LAST model step's full prompt size (uncached + cache read +
|
|
149
|
+
* cache write) as the provider counted it — what the next turn
|
|
150
|
+
* starts from, and the exact figure for a context gauge. The
|
|
151
|
+
* buckets above are SUMS over the turn's steps. Absent on turns
|
|
152
|
+
* that ended before a step completed. */
|
|
153
|
+
contextTokens?: number;
|
|
111
154
|
};
|
|
112
155
|
});
|
|
156
|
+
/** Why a compaction ran — see the `compaction` event. */
|
|
157
|
+
export type CompactionReason = 'auto' | 'overflow' | 'manual';
|
|
158
|
+
/** `sessions.compact()` — the no-op success (`compacted: false`) means the
|
|
159
|
+
* history was too short to fold; a summarizer failure is a thrown
|
|
160
|
+
* `TarsApiError` (502, code `compaction_failed`) and leaves the history as
|
|
161
|
+
* is. */
|
|
162
|
+
export type CompactResult = {
|
|
163
|
+
ok: true;
|
|
164
|
+
compacted: true;
|
|
165
|
+
/** Estimated prompt tokens before and after (chars/4 over the history). */
|
|
166
|
+
tokens_before: number;
|
|
167
|
+
tokens_after: number;
|
|
168
|
+
summarized_messages: number;
|
|
169
|
+
kept_messages: number;
|
|
170
|
+
} | {
|
|
171
|
+
ok: true;
|
|
172
|
+
compacted: false;
|
|
173
|
+
reason: 'nothing_to_compact';
|
|
174
|
+
};
|
|
113
175
|
export type BuiltInTool = 'bash' | 'read_file' | 'write_file' | 'edit_file' | 'glob' | 'grep' | 'web_fetch';
|
|
114
176
|
/**
|
|
115
177
|
* Extended-thinking depth. Provider-neutral: TARS maps it to Anthropic's
|
|
@@ -184,6 +246,9 @@ export interface Skill {
|
|
|
184
246
|
display_title: string;
|
|
185
247
|
latest_version: number;
|
|
186
248
|
created_at: string;
|
|
249
|
+
/** Present on `get()` / `list()`; the `create()` echo omits both. */
|
|
250
|
+
client_id?: string;
|
|
251
|
+
updated_at?: string;
|
|
187
252
|
}
|
|
188
253
|
export interface SkillVersion {
|
|
189
254
|
version: number;
|
|
@@ -217,6 +282,9 @@ export interface ProviderStatusReport {
|
|
|
217
282
|
export interface ModelInfo {
|
|
218
283
|
id: string;
|
|
219
284
|
name: string;
|
|
285
|
+
/** Context window in tokens, when the provider's catalog publishes one
|
|
286
|
+
* (OpenRouter, TensorX). Absent for the direct routes. */
|
|
287
|
+
context_window?: number;
|
|
220
288
|
pricing: {
|
|
221
289
|
input: number;
|
|
222
290
|
output: number;
|
|
@@ -299,6 +367,9 @@ export interface McpCredentialStatus {
|
|
|
299
367
|
auth_type: 'bearer' | 'oauth';
|
|
300
368
|
expires_at: string | null;
|
|
301
369
|
updated_at: string;
|
|
370
|
+
/** Can TARS renew this credential itself? `false` on an oauth credential
|
|
371
|
+
* means it will dead-end at `connect_required` when it expires. */
|
|
372
|
+
refreshable: boolean;
|
|
302
373
|
}
|
|
303
374
|
/** How `mcp.listTools` names the server: the same fields a declaration
|
|
304
375
|
* carries (so the credential lookup and the dial match a turn's), plus whose
|
|
@@ -509,8 +580,12 @@ export interface DailyUsageRow {
|
|
|
509
580
|
}
|
|
510
581
|
export interface SessionListItem {
|
|
511
582
|
id: string;
|
|
583
|
+
/** A `SessionStatus` value (typed loosely for compatibility). */
|
|
512
584
|
status: string;
|
|
513
585
|
turn_state: TurnState;
|
|
586
|
+
/** Only meaningful with `includeArchived`; absent from servers predating
|
|
587
|
+
* this field. */
|
|
588
|
+
archived?: boolean;
|
|
514
589
|
model: string;
|
|
515
590
|
agent_id: string | null;
|
|
516
591
|
end_user_id: string | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wice24/tars-sdk",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Client SDK for TARS — the self-hosted managed-agents platform (sessions, streaming turns, client tools, MCP credentials, skills, files, usage, tenant administration)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|