@tuteliq/sdk 2.1.0
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/LICENSE +21 -0
- package/README.md +1034 -0
- package/dist/cjs/client.js +1283 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/constants.js +179 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.js +129 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/account.js +6 -0
- package/dist/cjs/types/account.js.map +1 -0
- package/dist/cjs/types/analysis.js +6 -0
- package/dist/cjs/types/analysis.js.map +1 -0
- package/dist/cjs/types/guidance.js +3 -0
- package/dist/cjs/types/guidance.js.map +1 -0
- package/dist/cjs/types/index.js +28 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/media.js +6 -0
- package/dist/cjs/types/media.js.map +1 -0
- package/dist/cjs/types/policy.js +6 -0
- package/dist/cjs/types/policy.js.map +1 -0
- package/dist/cjs/types/pricing.js +6 -0
- package/dist/cjs/types/pricing.js.map +1 -0
- package/dist/cjs/types/reports.js +3 -0
- package/dist/cjs/types/reports.js.map +1 -0
- package/dist/cjs/types/safety.js +7 -0
- package/dist/cjs/types/safety.js.map +1 -0
- package/dist/cjs/types/voice-stream.js +6 -0
- package/dist/cjs/types/voice-stream.js.map +1 -0
- package/dist/cjs/types/webhooks.js +6 -0
- package/dist/cjs/types/webhooks.js.map +1 -0
- package/dist/cjs/utils/retry.js +64 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/voice-stream.js +184 -0
- package/dist/cjs/voice-stream.js.map +1 -0
- package/dist/client.d.ts +643 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1280 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +141 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +176 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +81 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +116 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/account.d.ts +161 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +5 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/analysis.d.ts +41 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +4 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/guidance.d.ts +35 -0
- package/dist/types/guidance.d.ts.map +1 -0
- package/dist/types/guidance.js +2 -0
- package/dist/types/guidance.js.map +1 -0
- package/dist/types/index.d.ts +231 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/media.d.ts +121 -0
- package/dist/types/media.d.ts.map +1 -0
- package/dist/types/media.js +4 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/policy.d.ts +54 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +5 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/types/pricing.d.ts +53 -0
- package/dist/types/pricing.d.ts.map +1 -0
- package/dist/types/pricing.js +5 -0
- package/dist/types/pricing.js.map +1 -0
- package/dist/types/reports.d.ts +44 -0
- package/dist/types/reports.d.ts.map +1 -0
- package/dist/types/reports.js +2 -0
- package/dist/types/reports.js.map +1 -0
- package/dist/types/safety.d.ts +151 -0
- package/dist/types/safety.d.ts.map +1 -0
- package/dist/types/safety.js +4 -0
- package/dist/types/safety.js.map +1 -0
- package/dist/types/voice-stream.d.ts +97 -0
- package/dist/types/voice-stream.d.ts.map +1 -0
- package/dist/types/voice-stream.js +5 -0
- package/dist/types/voice-stream.js.map +1 -0
- package/dist/types/webhooks.d.ts +110 -0
- package/dist/types/webhooks.d.ts.map +1 -0
- package/dist/types/webhooks.js +4 -0
- package/dist/types/webhooks.js.map +1 -0
- package/dist/utils/retry.d.ts +17 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +61 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/voice-stream.d.ts +16 -0
- package/dist/voice-stream.d.ts.map +1 -0
- package/dist/voice-stream.js +148 -0
- package/dist/voice-stream.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RateLimitError, ServerError, NetworkError, TimeoutError } from '../errors.js';
|
|
2
|
+
const DEFAULT_OPTIONS = {
|
|
3
|
+
maxRetries: 3,
|
|
4
|
+
initialDelay: 1000,
|
|
5
|
+
maxDelay: 30000,
|
|
6
|
+
backoffMultiplier: 2,
|
|
7
|
+
isRetryable: defaultIsRetryable,
|
|
8
|
+
};
|
|
9
|
+
function defaultIsRetryable(error) {
|
|
10
|
+
// Retry on rate limit, server errors, network errors, and timeouts
|
|
11
|
+
if (error instanceof RateLimitError)
|
|
12
|
+
return true;
|
|
13
|
+
if (error instanceof ServerError)
|
|
14
|
+
return true;
|
|
15
|
+
if (error instanceof NetworkError)
|
|
16
|
+
return true;
|
|
17
|
+
if (error instanceof TimeoutError)
|
|
18
|
+
return true;
|
|
19
|
+
// Retry on fetch errors (network issues)
|
|
20
|
+
if (error instanceof TypeError && error.message.includes('fetch'))
|
|
21
|
+
return true;
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function sleep(ms) {
|
|
25
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
26
|
+
}
|
|
27
|
+
function calculateDelay(attempt, options) {
|
|
28
|
+
const delay = options.initialDelay * Math.pow(options.backoffMultiplier, attempt);
|
|
29
|
+
// Add jitter (0-25% of delay)
|
|
30
|
+
const jitter = delay * Math.random() * 0.25;
|
|
31
|
+
return Math.min(delay + jitter, options.maxDelay);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Execute a function with exponential backoff retry
|
|
35
|
+
*/
|
|
36
|
+
export async function withRetry(fn, options = {}) {
|
|
37
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
38
|
+
let lastError;
|
|
39
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
40
|
+
try {
|
|
41
|
+
return await fn();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
// Check if we should retry
|
|
46
|
+
if (attempt >= opts.maxRetries || !opts.isRetryable(error)) {
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
// Handle rate limit with retry-after header
|
|
50
|
+
if (error instanceof RateLimitError && error.retryAfter) {
|
|
51
|
+
await sleep(error.retryAfter * 1000);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const delay = calculateDelay(attempt, opts);
|
|
55
|
+
await sleep(delay);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
throw lastError;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAevF,MAAM,eAAe,GAA2B;IAC5C,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,iBAAiB,EAAE,CAAC;IACpB,WAAW,EAAE,kBAAkB;CAClC,CAAC;AAEF,SAAS,kBAAkB,CAAC,KAAc;IACtC,mEAAmE;IACnE,IAAI,KAAK,YAAY,cAAc;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/C,yCAAyC;IACzC,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/E,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAA+B;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAClF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,EAAoB,EACpB,UAAiC,EAAE;IAEnC,MAAM,IAAI,GAA2B,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAExE,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,SAAS,GAAG,KAAK,CAAC;YAElB,2BAA2B;YAC3B,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,MAAM,KAAK,CAAC;YAChB,CAAC;YAED,4CAA4C;YAC5C,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,SAAS,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { VoiceStreamConfig, VoiceStreamHandlers, VoiceStreamSession } from './types/voice-stream.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a voice streaming session over WebSocket.
|
|
4
|
+
*
|
|
5
|
+
* Requires the `ws` package to be installed:
|
|
6
|
+
* ```bash
|
|
7
|
+
* npm install ws
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* @param apiKey - Tuteliq API key for authentication
|
|
11
|
+
* @param config - Optional session configuration
|
|
12
|
+
* @param handlers - Optional event handler callbacks
|
|
13
|
+
* @returns A VoiceStreamSession for sending audio and controlling the session
|
|
14
|
+
*/
|
|
15
|
+
export declare function createVoiceStream(apiKey: string, config?: VoiceStreamConfig, handlers?: VoiceStreamHandlers): VoiceStreamSession;
|
|
16
|
+
//# sourceMappingURL=voice-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-stream.d.ts","sourceRoot":"","sources":["../src/voice-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAGrB,MAAM,yBAAyB,CAAC;AAKjC;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,mBAAmB,GAC/B,kBAAkB,CAqJpB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/** WebSocket URL for voice streaming */
|
|
2
|
+
const VOICE_STREAM_URL = 'wss://api.tuteliq.ai/voice/stream';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a voice streaming session over WebSocket.
|
|
5
|
+
*
|
|
6
|
+
* Requires the `ws` package to be installed:
|
|
7
|
+
* ```bash
|
|
8
|
+
* npm install ws
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* @param apiKey - Tuteliq API key for authentication
|
|
12
|
+
* @param config - Optional session configuration
|
|
13
|
+
* @param handlers - Optional event handler callbacks
|
|
14
|
+
* @returns A VoiceStreamSession for sending audio and controlling the session
|
|
15
|
+
*/
|
|
16
|
+
export function createVoiceStream(apiKey, config, handlers) {
|
|
17
|
+
let ws = null;
|
|
18
|
+
let sessionId = null;
|
|
19
|
+
let active = false;
|
|
20
|
+
let summaryResolve = null;
|
|
21
|
+
let summaryReject = null;
|
|
22
|
+
// Dynamically import ws
|
|
23
|
+
let WebSocketCtor = null;
|
|
24
|
+
const init = async () => {
|
|
25
|
+
try {
|
|
26
|
+
const wsModule = await import('ws');
|
|
27
|
+
WebSocketCtor = wsModule.default || wsModule.WebSocket;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error('The "ws" package is required for voice streaming. ' +
|
|
31
|
+
'Install it with: npm install ws');
|
|
32
|
+
}
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
ws = new WebSocketCtor(VOICE_STREAM_URL, {
|
|
35
|
+
headers: {
|
|
36
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
ws.on('open', () => {
|
|
40
|
+
active = true;
|
|
41
|
+
// Send initial config if provided
|
|
42
|
+
if (config) {
|
|
43
|
+
const configMsg = {
|
|
44
|
+
type: 'config',
|
|
45
|
+
interval_seconds: config.intervalSeconds,
|
|
46
|
+
analysis_types: config.analysisTypes,
|
|
47
|
+
context: config.context,
|
|
48
|
+
};
|
|
49
|
+
ws.send(JSON.stringify(configMsg));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
ws.on('message', (data) => {
|
|
53
|
+
try {
|
|
54
|
+
const text = data.toString();
|
|
55
|
+
const event = JSON.parse(text);
|
|
56
|
+
switch (event.type) {
|
|
57
|
+
case 'ready':
|
|
58
|
+
sessionId = event.session_id;
|
|
59
|
+
handlers?.onReady?.(event);
|
|
60
|
+
resolve();
|
|
61
|
+
break;
|
|
62
|
+
case 'transcription':
|
|
63
|
+
handlers?.onTranscription?.(event);
|
|
64
|
+
break;
|
|
65
|
+
case 'alert':
|
|
66
|
+
handlers?.onAlert?.(event);
|
|
67
|
+
break;
|
|
68
|
+
case 'session_summary':
|
|
69
|
+
handlers?.onSessionSummary?.(event);
|
|
70
|
+
summaryResolve?.(event);
|
|
71
|
+
summaryResolve = null;
|
|
72
|
+
summaryReject = null;
|
|
73
|
+
break;
|
|
74
|
+
case 'config_updated':
|
|
75
|
+
handlers?.onConfigUpdated?.(event);
|
|
76
|
+
break;
|
|
77
|
+
case 'error':
|
|
78
|
+
handlers?.onError?.(event);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Ignore non-JSON messages (e.g. pong frames)
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
ws.on('close', (code, reason) => {
|
|
87
|
+
active = false;
|
|
88
|
+
const reasonStr = reason.toString();
|
|
89
|
+
handlers?.onClose?.(code, reasonStr);
|
|
90
|
+
if (summaryReject) {
|
|
91
|
+
summaryReject(new Error(`Connection closed before session summary (code: ${code})`));
|
|
92
|
+
summaryResolve = null;
|
|
93
|
+
summaryReject = null;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
ws.on('error', (err) => {
|
|
97
|
+
active = false;
|
|
98
|
+
reject(err);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
// Start connection immediately
|
|
103
|
+
const ready = init();
|
|
104
|
+
const session = {
|
|
105
|
+
sendAudio(data) {
|
|
106
|
+
if (!ws || !active) {
|
|
107
|
+
throw new Error('Voice stream is not connected');
|
|
108
|
+
}
|
|
109
|
+
ws.send(data);
|
|
110
|
+
},
|
|
111
|
+
updateConfig(newConfig) {
|
|
112
|
+
if (!ws || !active) {
|
|
113
|
+
throw new Error('Voice stream is not connected');
|
|
114
|
+
}
|
|
115
|
+
const configMsg = {
|
|
116
|
+
type: 'config',
|
|
117
|
+
interval_seconds: newConfig.intervalSeconds,
|
|
118
|
+
analysis_types: newConfig.analysisTypes,
|
|
119
|
+
context: newConfig.context,
|
|
120
|
+
};
|
|
121
|
+
ws.send(JSON.stringify(configMsg));
|
|
122
|
+
},
|
|
123
|
+
async end() {
|
|
124
|
+
await ready;
|
|
125
|
+
if (!ws || !active) {
|
|
126
|
+
throw new Error('Voice stream is not connected');
|
|
127
|
+
}
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
summaryResolve = resolve;
|
|
130
|
+
summaryReject = reject;
|
|
131
|
+
ws.send(JSON.stringify({ type: 'end' }));
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
close() {
|
|
135
|
+
active = false;
|
|
136
|
+
ws?.close();
|
|
137
|
+
ws = null;
|
|
138
|
+
},
|
|
139
|
+
get sessionId() {
|
|
140
|
+
return sessionId;
|
|
141
|
+
},
|
|
142
|
+
get isActive() {
|
|
143
|
+
return active;
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
return session;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=voice-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-stream.js","sourceRoot":"","sources":["../src/voice-stream.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tuteliq/sdk",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "TypeScript SDK for Tuteliq AI child safety API - Detect bullying, grooming, and unsafe content",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"require": "./dist/cjs/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./constants": {
|
|
15
|
+
"import": "./dist/constants.js",
|
|
16
|
+
"require": "./dist/cjs/constants.js",
|
|
17
|
+
"types": "./dist/constants.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./types": {
|
|
20
|
+
"import": "./dist/types/index.js",
|
|
21
|
+
"require": "./dist/cjs/types/index.js",
|
|
22
|
+
"types": "./dist/types/index.d.ts"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc && tsc -p tsconfig.cjs.json",
|
|
32
|
+
"clean": "rm -rf dist",
|
|
33
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"tuteliq",
|
|
39
|
+
"child-safety",
|
|
40
|
+
"content-moderation",
|
|
41
|
+
"bullying-detection",
|
|
42
|
+
"grooming-detection",
|
|
43
|
+
"ai",
|
|
44
|
+
"sdk",
|
|
45
|
+
"typescript",
|
|
46
|
+
"parental-control",
|
|
47
|
+
"online-safety"
|
|
48
|
+
],
|
|
49
|
+
"author": "Tuteliq <hello@tuteliq.ai>",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"homepage": "https://tuteliq.ai",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "https://github.com/Tuteliq/node.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/Tuteliq/node/issues",
|
|
58
|
+
"email": "support@tuteliq.ai"
|
|
59
|
+
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"ws": ">=8.0.0"
|
|
62
|
+
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"ws": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=18.0.0"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@types/node": "^25.2.1",
|
|
73
|
+
"@types/ws": "^8.5.0",
|
|
74
|
+
"typescript": "^5.7.2",
|
|
75
|
+
"vitest": "^2.1.8",
|
|
76
|
+
"ws": "^8.18.0"
|
|
77
|
+
},
|
|
78
|
+
"publishConfig": {
|
|
79
|
+
"access": "public"
|
|
80
|
+
}
|
|
81
|
+
}
|