@talk2view/sdk 0.2.0 → 0.2.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/README.md +87 -1
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +59 -10
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +2 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/react/useT2VTools.d.ts.map +1 -1
- package/dist/react/useT2VTools.js +6 -0
- package/dist/react/useT2VTools.js.map +1 -1
- package/dist/tools.d.ts +6 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +57 -0
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -88,6 +88,13 @@ Every request requires a partner API key (`X-T2V-Partner-Key` header). Keys are
|
|
|
88
88
|
|
|
89
89
|
The SDK attaches this header automatically.
|
|
90
90
|
|
|
91
|
+
**Partner keys are public identifiers**, not secrets. They identify your application but do not grant access to user data — every data-accessing request also requires a user JWT. It is safe to include partner keys in client-side bundles.
|
|
92
|
+
|
|
93
|
+
Best practices:
|
|
94
|
+
- Inject keys via environment variables at build time (e.g. `VITE_T2V_PARTNER_KEY`)
|
|
95
|
+
- Use separate `pk_test_` and `pk_live_` keys for development and production
|
|
96
|
+
- To rotate a key, generate a new key in the Talk2View dashboard, update your app, then deactivate the old key
|
|
97
|
+
|
|
91
98
|
### Two-Tier Authentication
|
|
92
99
|
|
|
93
100
|
Talk2View uses two layers of auth on every request:
|
|
@@ -196,6 +203,8 @@ const {
|
|
|
196
203
|
isLoading, // boolean — true while streaming
|
|
197
204
|
error, // string | null
|
|
198
205
|
threadId, // string | null
|
|
206
|
+
agentStatus, // { type: string; message: string } | null — real-time agent status
|
|
207
|
+
todos, // string — agent's current todo/plan text
|
|
199
208
|
sendMessage, // (content: string) => Promise<void>
|
|
200
209
|
clearMessages, // () => void
|
|
201
210
|
clearError, // () => void
|
|
@@ -320,6 +329,43 @@ for await (const event of t2v.chat('Zoom in please')) {
|
|
|
320
329
|
}
|
|
321
330
|
```
|
|
322
331
|
|
|
332
|
+
#### `t2v.clearSession()`
|
|
333
|
+
|
|
334
|
+
Reset the current session. Clears the thread ID so the next `chat()` call starts a fresh conversation.
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
t2v.clearSession();
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
#### `t2v.listModels()` / `t2v.listAudioModels()`
|
|
341
|
+
|
|
342
|
+
List available models:
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
const models = await t2v.listModels(); // Chat/completion models
|
|
346
|
+
const audioModels = await t2v.listAudioModels(); // Speech-to-text models
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### `t2v.transcribe()`
|
|
350
|
+
|
|
351
|
+
Transcribe an audio file using the server's speech-to-text service:
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
const result = await t2v.transcribe(audioBlob, 'whisper-1', 'en');
|
|
355
|
+
console.log(result.text);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
#### `t2v.completions()`
|
|
359
|
+
|
|
360
|
+
Send a raw completions request (non-streaming):
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
const response = await t2v.completions({
|
|
364
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
365
|
+
model: 'gpt-4.1-mini',
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
323
369
|
#### `t2v.createSession()` / `t2v.getSession()`
|
|
324
370
|
|
|
325
371
|
For advanced use cases where you need direct session control:
|
|
@@ -433,6 +479,19 @@ Stored keys:
|
|
|
433
479
|
|
|
434
480
|
On logout, all keys are cleared and a `talk2view_auth_cleared` event is dispatched on `window` for cross-component synchronization.
|
|
435
481
|
|
|
482
|
+
### Security Considerations
|
|
483
|
+
|
|
484
|
+
The SDK stores tokens in `localStorage` for persistence across page reloads. This is a deliberate trade-off — `localStorage` is accessible to any JavaScript running on the same origin, which means XSS vulnerabilities could expose tokens.
|
|
485
|
+
|
|
486
|
+
To mitigate this:
|
|
487
|
+
|
|
488
|
+
- **Use a Content Security Policy (CSP)** that restricts script sources to trusted origins
|
|
489
|
+
- **Keep token lifetimes short** — the SDK automatically refreshes tokens, so short-lived access tokens limit the window of exposure
|
|
490
|
+
- **Always serve your application over HTTPS**
|
|
491
|
+
- **Sanitize user-generated content** to prevent XSS injection
|
|
492
|
+
|
|
493
|
+
**CSRF protection:** The SDK sends a custom `X-T2V-Partner-Key` header on every request. Browsers block cross-origin requests with custom headers unless the server explicitly allows the origin via CORS. This makes CSRF attacks infeasible — a forged request from a malicious site would be blocked by the browser's preflight check.
|
|
494
|
+
|
|
436
495
|
---
|
|
437
496
|
|
|
438
497
|
## Error Handling
|
|
@@ -447,8 +506,10 @@ The SDK throws typed errors:
|
|
|
447
506
|
| `NetworkError` | Network failure, server unreachable |
|
|
448
507
|
| `T2VError` | Base class for all SDK errors |
|
|
449
508
|
|
|
509
|
+
All errors extend `T2VError`, which exposes `message`, `type`, `statusCode`, and `code`:
|
|
510
|
+
|
|
450
511
|
```typescript
|
|
451
|
-
import { AuthenticationError, NetworkError } from '@talk2view/sdk';
|
|
512
|
+
import { T2VError, AuthenticationError, NetworkError, SessionError } from '@talk2view/sdk';
|
|
452
513
|
|
|
453
514
|
try {
|
|
454
515
|
await t2v.auth.login(email, password);
|
|
@@ -457,14 +518,22 @@ try {
|
|
|
457
518
|
console.log('Bad credentials');
|
|
458
519
|
} else if (err instanceof NetworkError) {
|
|
459
520
|
console.log('Server unreachable');
|
|
521
|
+
} else if (err instanceof SessionError) {
|
|
522
|
+
console.log('Session issue:', err.message);
|
|
523
|
+
} else if (err instanceof T2VError) {
|
|
524
|
+
// Access the error code for programmatic handling
|
|
525
|
+
console.log(`Error [${err.code}]: ${err.message} (HTTP ${err.statusCode})`);
|
|
460
526
|
}
|
|
461
527
|
}
|
|
462
528
|
```
|
|
463
529
|
|
|
530
|
+
**Rate limiting:** The server may return HTTP 429 when rate limits are exceeded. This surfaces as a `T2VError` with `statusCode: 429`. Rate limiting is enforced server-side; implement app-level retry logic if needed.
|
|
531
|
+
|
|
464
532
|
In React, the hooks catch errors internally and expose them via the `error` state:
|
|
465
533
|
|
|
466
534
|
```tsx
|
|
467
535
|
const { error, clearError } = useT2VAuth();
|
|
536
|
+
const { error: chatError } = useT2VChat({ systemPrompt: '...' });
|
|
468
537
|
// error is a string message, not a thrown exception
|
|
469
538
|
```
|
|
470
539
|
|
|
@@ -479,6 +548,23 @@ const { error, clearError } = useT2VAuth();
|
|
|
479
548
|
| `partnerKey` | `string` | Yes | — | Your partner API key |
|
|
480
549
|
| `baseUrl` | `string` | No | `'http://localhost:8100'` | Talk2View API server URL |
|
|
481
550
|
| `model` | `string` | No | Server default | LLM model to use |
|
|
551
|
+
| `requestTimeout` | `number` | No | `30000` | HTTP request timeout in ms. Does not apply to SSE streams after connection. |
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## System Prompts
|
|
556
|
+
|
|
557
|
+
System prompts set the AI's behavior and context for your application. Pass them to `ChatPanel` or `useT2VChat`:
|
|
558
|
+
|
|
559
|
+
```tsx
|
|
560
|
+
<ChatPanel systemPrompt="You are a medical imaging assistant. Use the provided tools to control the DICOM viewer." />
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
Best practices:
|
|
564
|
+
- **Keep prompts concise** — every token in the system prompt is sent with every request and adds to cost
|
|
565
|
+
- **Focus on tools and context** — describe what tools are available and when to use them, rather than general personality traits
|
|
566
|
+
- **Be specific about your domain** — mention the application type and expected user intents
|
|
567
|
+
- **Avoid conflicting instructions** — the system prompt should complement, not contradict, tool descriptions
|
|
482
568
|
|
|
483
569
|
---
|
|
484
570
|
|
package/dist/client.d.ts
CHANGED
|
@@ -5,9 +5,14 @@ import type { ChatCompletionChunk, T2VConfig } from './types';
|
|
|
5
5
|
export declare class T2VClient {
|
|
6
6
|
private readonly baseUrl;
|
|
7
7
|
private readonly partnerKey;
|
|
8
|
+
private readonly requestTimeout;
|
|
8
9
|
private isRefreshing;
|
|
9
10
|
private refreshPromise;
|
|
10
11
|
constructor(config: T2VConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Create an AbortController that auto-aborts after the configured timeout.
|
|
14
|
+
*/
|
|
15
|
+
private makeTimeoutSignal;
|
|
11
16
|
/**
|
|
12
17
|
* Execute a fetch with network-error wrapping, 401 refresh/retry, and error parsing.
|
|
13
18
|
*/
|
|
@@ -24,6 +29,11 @@ export declare class T2VClient {
|
|
|
24
29
|
uploadRequest<T>(endpoint: string, formData: FormData, requiresAuth?: boolean): Promise<T>;
|
|
25
30
|
/**
|
|
26
31
|
* Make an authenticated SSE streaming request.
|
|
32
|
+
*
|
|
33
|
+
* The request timeout applies only to the initial POST (connection establishment).
|
|
34
|
+
* Once the SSE stream begins, no timeout is enforced — streams are long-lived by design.
|
|
35
|
+
* Mid-stream re-authentication is not supported; however, in practice access tokens
|
|
36
|
+
* outlive individual streams. The initial POST benefits from 401 refresh+retry.
|
|
27
37
|
*/
|
|
28
38
|
streamRequest(endpoint: string, body: object): AsyncGenerator<ChatCompletionChunk>;
|
|
29
39
|
private tryRefreshToken;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,KAAK,EACV,mBAAmB,EAEnB,SAAS,EACV,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,KAAK,EACV,mBAAmB,EAEnB,SAAS,EACV,MAAM,SAAS,CAAC;AAKjB,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAiC;gBAE3C,MAAM,EAAE,SAAS;IAM7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;YACW,aAAa;IAsD3B,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,EACzB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC;IAcb;;;OAGG;IACG,aAAa,CAAC,CAAC,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC;IAiBb;;;;;;;OAOG;IACI,aAAa,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,cAAc,CAAC,mBAAmB,CAAC;YAmBxB,eAAe;YAgBf,cAAc;CAwB7B"}
|
package/dist/client.js
CHANGED
|
@@ -5,34 +5,59 @@ import { AuthenticationError, NetworkError, T2VError } from './errors';
|
|
|
5
5
|
import { clearAuth, getAccessToken, getRefreshToken, setAccessToken, setRefreshToken, } from './storage';
|
|
6
6
|
import { decodeSSEStream } from './streaming';
|
|
7
7
|
const DEFAULT_BASE_URL = 'https://engine.talk2view.com';
|
|
8
|
+
const DEFAULT_REQUEST_TIMEOUT = 30_000;
|
|
8
9
|
export class T2VClient {
|
|
9
10
|
baseUrl;
|
|
10
11
|
partnerKey;
|
|
12
|
+
requestTimeout;
|
|
11
13
|
isRefreshing = false;
|
|
12
14
|
refreshPromise = null;
|
|
13
15
|
constructor(config) {
|
|
14
16
|
this.partnerKey = config.partnerKey;
|
|
15
17
|
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
18
|
+
this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create an AbortController that auto-aborts after the configured timeout.
|
|
22
|
+
*/
|
|
23
|
+
makeTimeoutSignal() {
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timer = setTimeout(() => controller.abort(), this.requestTimeout);
|
|
26
|
+
return { signal: controller.signal, clear: () => clearTimeout(timer) };
|
|
16
27
|
}
|
|
17
28
|
/**
|
|
18
29
|
* Execute a fetch with network-error wrapping, 401 refresh/retry, and error parsing.
|
|
19
30
|
*/
|
|
20
|
-
async fetchWithAuth(endpoint, init, headers, requiresAuth) {
|
|
31
|
+
async fetchWithAuth(endpoint, init, headers, requiresAuth, signal) {
|
|
32
|
+
const fetchInit = signal ? { ...init, headers, signal } : { ...init, headers };
|
|
21
33
|
let response;
|
|
22
34
|
try {
|
|
23
|
-
response = await fetch(`${this.baseUrl}${endpoint}`,
|
|
35
|
+
response = await fetch(`${this.baseUrl}${endpoint}`, fetchInit);
|
|
24
36
|
}
|
|
25
37
|
catch (err) {
|
|
38
|
+
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
39
|
+
throw new NetworkError(`Request timed out after ${this.requestTimeout}ms`);
|
|
40
|
+
}
|
|
26
41
|
throw new NetworkError(`Request failed: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
27
42
|
}
|
|
28
43
|
if (response.status === 401 && requiresAuth) {
|
|
29
44
|
const refreshed = await this.tryRefreshToken();
|
|
30
45
|
if (refreshed) {
|
|
31
46
|
headers['Authorization'] = `Bearer ${getAccessToken()}`;
|
|
32
|
-
const
|
|
47
|
+
const retryInit = signal ? { ...init, headers, signal } : { ...init, headers };
|
|
48
|
+
let retryResponse;
|
|
49
|
+
try {
|
|
50
|
+
retryResponse = await fetch(`${this.baseUrl}${endpoint}`, retryInit);
|
|
51
|
+
}
|
|
52
|
+
catch (retryErr) {
|
|
53
|
+
if (retryErr instanceof DOMException && retryErr.name === 'AbortError') {
|
|
54
|
+
throw new NetworkError(`Request timed out after ${this.requestTimeout}ms`);
|
|
55
|
+
}
|
|
56
|
+
throw new NetworkError(`Request failed: ${retryErr instanceof Error ? retryErr.message : 'Unknown error'}`);
|
|
57
|
+
}
|
|
33
58
|
if (!retryResponse.ok) {
|
|
34
59
|
const error = await retryResponse.json().catch(() => ({ error: { message: 'Request failed' } }));
|
|
35
|
-
throw new T2VError(error?.error?.message ?? 'Request failed', error?.error?.type, retryResponse.status);
|
|
60
|
+
throw new T2VError(error?.error?.message ?? 'Request failed', error?.error?.type, retryResponse.status, error?.error?.code);
|
|
36
61
|
}
|
|
37
62
|
return retryResponse;
|
|
38
63
|
}
|
|
@@ -41,7 +66,7 @@ export class T2VClient {
|
|
|
41
66
|
}
|
|
42
67
|
if (!response.ok) {
|
|
43
68
|
const error = await response.json().catch(() => ({ error: { message: 'Request failed' } }));
|
|
44
|
-
throw new T2VError(error?.error?.message ?? 'Request failed', error?.error?.type, response.status);
|
|
69
|
+
throw new T2VError(error?.error?.message ?? 'Request failed', error?.error?.type, response.status, error?.error?.code);
|
|
45
70
|
}
|
|
46
71
|
return response;
|
|
47
72
|
}
|
|
@@ -66,8 +91,14 @@ export class T2VClient {
|
|
|
66
91
|
'Content-Type': 'application/json',
|
|
67
92
|
...options.headers,
|
|
68
93
|
});
|
|
69
|
-
const
|
|
70
|
-
|
|
94
|
+
const { signal, clear } = this.makeTimeoutSignal();
|
|
95
|
+
try {
|
|
96
|
+
const response = await this.fetchWithAuth(endpoint, options, headers, requiresAuth, signal);
|
|
97
|
+
return response.json();
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
clear();
|
|
101
|
+
}
|
|
71
102
|
}
|
|
72
103
|
/**
|
|
73
104
|
* Make an authenticated multipart upload request (e.g. audio files).
|
|
@@ -75,16 +106,34 @@ export class T2VClient {
|
|
|
75
106
|
*/
|
|
76
107
|
async uploadRequest(endpoint, formData, requiresAuth = true) {
|
|
77
108
|
const headers = this.buildHeaders(requiresAuth);
|
|
78
|
-
const
|
|
79
|
-
|
|
109
|
+
const { signal, clear } = this.makeTimeoutSignal();
|
|
110
|
+
try {
|
|
111
|
+
const response = await this.fetchWithAuth(endpoint, { method: 'POST', body: formData }, headers, requiresAuth, signal);
|
|
112
|
+
return response.json();
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
clear();
|
|
116
|
+
}
|
|
80
117
|
}
|
|
81
118
|
/**
|
|
82
119
|
* Make an authenticated SSE streaming request.
|
|
120
|
+
*
|
|
121
|
+
* The request timeout applies only to the initial POST (connection establishment).
|
|
122
|
+
* Once the SSE stream begins, no timeout is enforced — streams are long-lived by design.
|
|
123
|
+
* Mid-stream re-authentication is not supported; however, in practice access tokens
|
|
124
|
+
* outlive individual streams. The initial POST benefits from 401 refresh+retry.
|
|
83
125
|
*/
|
|
84
126
|
async *streamRequest(endpoint, body) {
|
|
85
127
|
const headers = this.buildHeaders(true, { 'Content-Type': 'application/json' });
|
|
86
128
|
const serializedBody = JSON.stringify(body);
|
|
87
|
-
const
|
|
129
|
+
const { signal, clear } = this.makeTimeoutSignal();
|
|
130
|
+
let response;
|
|
131
|
+
try {
|
|
132
|
+
response = await this.fetchWithAuth(endpoint, { method: 'POST', body: serializedBody }, headers, true, signal);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
clear();
|
|
136
|
+
}
|
|
88
137
|
yield* decodeSSEStream(response);
|
|
89
138
|
}
|
|
90
139
|
async tryRefreshToken() {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,cAAc,CAAS;IAChC,YAAY,GAAG,KAAK,CAAC;IACrB,cAAc,GAA4B,IAAI,CAAC;IAEvD,YAAY,MAAiB;QAC3B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,uBAAuB,CAAC;IACzE,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACxE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IACzE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,QAAgB,EAChB,IAAiB,EACjB,OAA+B,EAC/B,YAAqB,EACrB,MAAoB;QAEpB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/E,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC7D,MAAM,IAAI,YAAY,CAAC,2BAA2B,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,cAAc,EAAE,EAAE,CAAC;gBACxD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC/E,IAAI,aAAuB,CAAC;gBAC5B,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;gBACvE,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,IAAI,QAAQ,YAAY,YAAY,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBACvE,MAAM,IAAI,YAAY,CAAC,2BAA2B,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;oBAC7E,CAAC;oBACD,MAAM,IAAI,YAAY,CACpB,mBAAmB,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACpF,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;oBACtB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;oBACjG,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC9H,CAAC;gBACD,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,SAAS,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5F,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACzH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,YAAY,CAClB,YAAqB,EACrB,KAA8B;QAE9B,MAAM,OAAO,GAA2B;YACtC,mBAAmB,EAAE,IAAI,CAAC,UAAU;YACpC,GAAG,KAAK;SACT,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,UAAuB,EAAE,EACzB,YAAY,GAAG,IAAI;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;YAC9C,cAAc,EAAE,kBAAkB;YAClC,GAAI,OAAO,CAAC,OAA8C;SAC3D,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;YAC5F,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,QAAgB,EAChB,QAAkB,EAClB,YAAY,GAAG,IAAI;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CACvC,QAAQ,EACR,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,CACP,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,aAAa,CAClB,QAAgB,EAChB,IAAY;QAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CACjC,QAAQ,EACR,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EACxC,OAAO,EACP,IAAI,EACJ,MAAM,CACP,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,KAAK,EAAE,CAAC;QACV,CAAC;QACD,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,cAAe,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EAAE;gBAC9D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,mBAAmB,EAAE,IAAI,CAAC,UAAU;iBACrC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;aACtD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAE/B,MAAM,IAAI,GAAoB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpD,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
export declare class T2VError extends Error {
|
|
5
5
|
readonly type: string;
|
|
6
6
|
readonly statusCode?: number | undefined;
|
|
7
|
-
|
|
7
|
+
readonly code?: string | undefined;
|
|
8
|
+
constructor(message: string, type?: string, statusCode?: number | undefined, code?: string | undefined);
|
|
8
9
|
}
|
|
9
10
|
export declare class AuthenticationError extends T2VError {
|
|
10
11
|
constructor(message: string);
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,EAAE,MAAM;aACZ,UAAU,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,EAAE,MAAM;aACZ,UAAU,CAAC,EAAE,MAAM;aACnB,IAAI,CAAC,EAAE,MAAM;gBAH7B,OAAO,EAAE,MAAM,EACC,IAAI,GAAE,MAAoB,EAC1B,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/errors.js
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
export class T2VError extends Error {
|
|
5
5
|
type;
|
|
6
6
|
statusCode;
|
|
7
|
-
|
|
7
|
+
code;
|
|
8
|
+
constructor(message, type = 'sdk_error', statusCode, code) {
|
|
8
9
|
super(message);
|
|
9
10
|
this.type = type;
|
|
10
11
|
this.statusCode = statusCode;
|
|
12
|
+
this.code = code;
|
|
11
13
|
this.name = 'T2VError';
|
|
12
14
|
}
|
|
13
15
|
}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IACA;IAJlB,YACE,OAAe,EACC,OAAe,WAAW,EAC1B,UAAmB,EACnB,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAsB;QAC1B,eAAU,GAAV,UAAU,CAAS;QACnB,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,12 +28,14 @@ import { T2VAuth } from './auth';
|
|
|
28
28
|
import { T2VSession } from './sessions';
|
|
29
29
|
import { T2VTools } from './tools';
|
|
30
30
|
import type { AudioModelsResponse, ChatEvent, ChatMessage, ModelsResponse, T2VConfig, TranscriptionResponse } from './types';
|
|
31
|
+
type SessionClearCallback = () => void;
|
|
31
32
|
export declare class Talk2View {
|
|
32
33
|
readonly auth: T2VAuth;
|
|
33
34
|
readonly tools: T2VTools;
|
|
34
35
|
private readonly client;
|
|
35
36
|
readonly config: T2VConfig;
|
|
36
37
|
private currentSession;
|
|
38
|
+
private sessionClearListeners;
|
|
37
39
|
constructor(config: T2VConfig);
|
|
38
40
|
/**
|
|
39
41
|
* Create a new chat session.
|
|
@@ -82,6 +84,16 @@ export declare class Talk2View {
|
|
|
82
84
|
* Also deletes the session on the server so conversation history is reset.
|
|
83
85
|
*/
|
|
84
86
|
clearSession(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Subscribe to session clear events.
|
|
89
|
+
*
|
|
90
|
+
* Listeners are called when {@link clearSession} runs. This allows hooks
|
|
91
|
+
* like `useT2VTools` to reset client-side state (e.g. tool registration)
|
|
92
|
+
* so that tools are re-registered on the next session.
|
|
93
|
+
*
|
|
94
|
+
* @returns An unsubscribe function.
|
|
95
|
+
*/
|
|
96
|
+
onSessionClear(callback: SessionClearCallback): () => void;
|
|
85
97
|
}
|
|
86
98
|
export { T2VAuth } from './auth';
|
|
87
99
|
export { T2VClient } from './client';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAS,cAAc,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEpI,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,cAAc,CAA2B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAS,cAAc,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEpI,KAAK,oBAAoB,GAAG,MAAM,IAAI,CAAC;AAEvC,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,qBAAqB,CAAwC;gBAEzD,MAAM,EAAE,SAAS;IAc7B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAe1C;;;;;OAKG;IACI,IAAI,CACT,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE,GAC3D,cAAc,CAAC,SAAS,CAAC;IAQ5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAI3C;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIpE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIrD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACpD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpB;;OAEG;IACH,UAAU,IAAI,UAAU,GAAG,IAAI;IAI/B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAYpB;;;;;;;;OAQG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;CAM3D;AAGD,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtG,YAAY,EACV,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,GAChB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ export class Talk2View {
|
|
|
34
34
|
client;
|
|
35
35
|
config;
|
|
36
36
|
currentSession = null;
|
|
37
|
+
sessionClearListeners = new Set();
|
|
37
38
|
constructor(config) {
|
|
38
39
|
if (config.voiceApiUrl) {
|
|
39
40
|
console.warn('[Talk2View] voiceApiUrl is deprecated and has no effect. ' +
|
|
@@ -113,6 +114,24 @@ export class Talk2View {
|
|
|
113
114
|
this.client.request(`/v1/sessions/${sessionId}`, { method: 'DELETE' }).catch(() => { });
|
|
114
115
|
}
|
|
115
116
|
this.currentSession = null;
|
|
117
|
+
for (const listener of this.sessionClearListeners) {
|
|
118
|
+
listener();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Subscribe to session clear events.
|
|
123
|
+
*
|
|
124
|
+
* Listeners are called when {@link clearSession} runs. This allows hooks
|
|
125
|
+
* like `useT2VTools` to reset client-side state (e.g. tool registration)
|
|
126
|
+
* so that tools are re-registered on the next session.
|
|
127
|
+
*
|
|
128
|
+
* @returns An unsubscribe function.
|
|
129
|
+
*/
|
|
130
|
+
onSessionClear(callback) {
|
|
131
|
+
this.sessionClearListeners.add(callback);
|
|
132
|
+
return () => {
|
|
133
|
+
this.sessionClearListeners.delete(callback);
|
|
134
|
+
};
|
|
116
135
|
}
|
|
117
136
|
}
|
|
118
137
|
// Re-export types and classes for consumers
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useT2VTools.d.ts","sourceRoot":"","sources":["../../src/react/useT2VTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGpF,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,EAAE,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5F,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW,IAAI,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useT2VTools.d.ts","sourceRoot":"","sources":["../../src/react/useT2VTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGpF,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,EAAE,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5F,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW,IAAI,iBAAiB,CAgC/C"}
|
|
@@ -17,6 +17,12 @@ export function useT2VTools() {
|
|
|
17
17
|
setRegisteredTools([]);
|
|
18
18
|
}
|
|
19
19
|
}, [isAuthenticated]);
|
|
20
|
+
// Reset when session is cleared (tools are session-scoped on the server)
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
return t2v.onSessionClear(() => {
|
|
23
|
+
setRegisteredTools([]);
|
|
24
|
+
});
|
|
25
|
+
}, [t2v]);
|
|
20
26
|
return {
|
|
21
27
|
registerTools,
|
|
22
28
|
registeredTools,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useT2VTools.js","sourceRoot":"","sources":["../../src/react/useT2VTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAQvC,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EAAE,KAAwC,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,OAAO;QACL,aAAa;QACb,eAAe;QACf,YAAY,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;KACzC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"useT2VTools.js","sourceRoot":"","sources":["../../src/react/useT2VTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAQvC,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EAAE,KAAwC,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE;YAC7B,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO;QACL,aAAa;QACb,eAAe;QACf,YAAY,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;KACzC,CAAC;AACJ,CAAC"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -8,6 +8,12 @@ export declare class T2VTools {
|
|
|
8
8
|
private handlers;
|
|
9
9
|
private schemas;
|
|
10
10
|
constructor(client: T2VClient);
|
|
11
|
+
/**
|
|
12
|
+
* Validate tool arguments against the registered schema.
|
|
13
|
+
* Returns an error message string, or null if valid.
|
|
14
|
+
*/
|
|
15
|
+
private validateArgs;
|
|
16
|
+
private checkType;
|
|
11
17
|
/**
|
|
12
18
|
* Register a handler for a specific tool name.
|
|
13
19
|
* When the agent calls this tool, the handler executes locally.
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhG,qBAAa,QAAQ;IAIP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA0B;gBAEZ,MAAM,EAAE,SAAS;IAE9C;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIpD;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2BxF;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhG,qBAAa,QAAQ;IAIP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA0B;gBAEZ,MAAM,EAAE,SAAS;IAE9C;;;OAGG;IACH,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,SAAS;IAkBjB;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIpD;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2BxF;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IA0ChD;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,aAAa,IAAI,gBAAgB,EAAE;CAGpC"}
|
package/dist/tools.js
CHANGED
|
@@ -8,6 +8,56 @@ export class T2VTools {
|
|
|
8
8
|
constructor(client) {
|
|
9
9
|
this.client = client;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate tool arguments against the registered schema.
|
|
13
|
+
* Returns an error message string, or null if valid.
|
|
14
|
+
*/
|
|
15
|
+
validateArgs(toolName, args) {
|
|
16
|
+
const schema = this.schemas.find((s) => s.name === toolName);
|
|
17
|
+
if (!schema)
|
|
18
|
+
return null; // no schema to validate against
|
|
19
|
+
const { properties, required } = schema.parameters;
|
|
20
|
+
// Check required fields
|
|
21
|
+
if (required) {
|
|
22
|
+
for (const field of required) {
|
|
23
|
+
if (!(field in args) || args[field] === undefined) {
|
|
24
|
+
return `Missing required argument: ${field}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Type-check provided fields
|
|
29
|
+
for (const [key, value] of Object.entries(args)) {
|
|
30
|
+
const propSchema = properties[key];
|
|
31
|
+
if (!propSchema)
|
|
32
|
+
continue; // allow extra properties
|
|
33
|
+
const expectedType = propSchema.type;
|
|
34
|
+
if (expectedType && !this.checkType(value, expectedType)) {
|
|
35
|
+
return `Argument "${key}" expected type "${expectedType}", got ${typeof value}`;
|
|
36
|
+
}
|
|
37
|
+
// Enum constraint
|
|
38
|
+
if (propSchema.enum && !propSchema.enum.includes(String(value))) {
|
|
39
|
+
return `Argument "${key}" must be one of: ${propSchema.enum.join(', ')}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
checkType(value, expectedType) {
|
|
45
|
+
switch (expectedType) {
|
|
46
|
+
case 'string':
|
|
47
|
+
return typeof value === 'string';
|
|
48
|
+
case 'number':
|
|
49
|
+
case 'integer':
|
|
50
|
+
return typeof value === 'number';
|
|
51
|
+
case 'boolean':
|
|
52
|
+
return typeof value === 'boolean';
|
|
53
|
+
case 'array':
|
|
54
|
+
return Array.isArray(value);
|
|
55
|
+
case 'object':
|
|
56
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
57
|
+
default:
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
11
61
|
/**
|
|
12
62
|
* Register a handler for a specific tool name.
|
|
13
63
|
* When the agent calls this tool, the handler executes locally.
|
|
@@ -55,6 +105,13 @@ export class T2VTools {
|
|
|
55
105
|
isError: true,
|
|
56
106
|
};
|
|
57
107
|
}
|
|
108
|
+
const validationError = this.validateArgs(toolName, args);
|
|
109
|
+
if (validationError) {
|
|
110
|
+
return {
|
|
111
|
+
result: JSON.stringify({ error: validationError }),
|
|
112
|
+
isError: true,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
58
115
|
try {
|
|
59
116
|
const raw = await handler(args);
|
|
60
117
|
const result = typeof raw === 'string' ? raw : JSON.stringify(raw) ?? '';
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface T2VConfig {
|
|
|
4
4
|
/** @deprecated Voice requests now route through baseUrl. This option will be removed in a future version. */
|
|
5
5
|
voiceApiUrl?: string;
|
|
6
6
|
model?: string;
|
|
7
|
+
/** Timeout in milliseconds for HTTP requests. Defaults to 30000 (30s). Does not apply to SSE streams after connection. */
|
|
8
|
+
requestTimeout?: number;
|
|
7
9
|
}
|
|
8
10
|
export interface LoginRequest {
|
|
9
11
|
email: string;
|
|
@@ -148,6 +150,7 @@ export interface APIErrorBody {
|
|
|
148
150
|
error: {
|
|
149
151
|
type: string;
|
|
150
152
|
message: string;
|
|
153
|
+
code?: string;
|
|
151
154
|
};
|
|
152
155
|
}
|
|
153
156
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|