@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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1034 -0
  3. package/dist/cjs/client.js +1283 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/constants.js +179 -0
  6. package/dist/cjs/constants.js.map +1 -0
  7. package/dist/cjs/errors.js +129 -0
  8. package/dist/cjs/errors.js.map +1 -0
  9. package/dist/cjs/index.js +37 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/types/account.js +6 -0
  12. package/dist/cjs/types/account.js.map +1 -0
  13. package/dist/cjs/types/analysis.js +6 -0
  14. package/dist/cjs/types/analysis.js.map +1 -0
  15. package/dist/cjs/types/guidance.js +3 -0
  16. package/dist/cjs/types/guidance.js.map +1 -0
  17. package/dist/cjs/types/index.js +28 -0
  18. package/dist/cjs/types/index.js.map +1 -0
  19. package/dist/cjs/types/media.js +6 -0
  20. package/dist/cjs/types/media.js.map +1 -0
  21. package/dist/cjs/types/policy.js +6 -0
  22. package/dist/cjs/types/policy.js.map +1 -0
  23. package/dist/cjs/types/pricing.js +6 -0
  24. package/dist/cjs/types/pricing.js.map +1 -0
  25. package/dist/cjs/types/reports.js +3 -0
  26. package/dist/cjs/types/reports.js.map +1 -0
  27. package/dist/cjs/types/safety.js +7 -0
  28. package/dist/cjs/types/safety.js.map +1 -0
  29. package/dist/cjs/types/voice-stream.js +6 -0
  30. package/dist/cjs/types/voice-stream.js.map +1 -0
  31. package/dist/cjs/types/webhooks.js +6 -0
  32. package/dist/cjs/types/webhooks.js.map +1 -0
  33. package/dist/cjs/utils/retry.js +64 -0
  34. package/dist/cjs/utils/retry.js.map +1 -0
  35. package/dist/cjs/voice-stream.js +184 -0
  36. package/dist/cjs/voice-stream.js.map +1 -0
  37. package/dist/client.d.ts +643 -0
  38. package/dist/client.d.ts.map +1 -0
  39. package/dist/client.js +1280 -0
  40. package/dist/client.js.map +1 -0
  41. package/dist/constants.d.ts +141 -0
  42. package/dist/constants.d.ts.map +1 -0
  43. package/dist/constants.js +176 -0
  44. package/dist/constants.js.map +1 -0
  45. package/dist/errors.d.ts +81 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +116 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/index.d.ts +6 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +9 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/types/account.d.ts +161 -0
  54. package/dist/types/account.d.ts.map +1 -0
  55. package/dist/types/account.js +5 -0
  56. package/dist/types/account.js.map +1 -0
  57. package/dist/types/analysis.d.ts +41 -0
  58. package/dist/types/analysis.d.ts.map +1 -0
  59. package/dist/types/analysis.js +4 -0
  60. package/dist/types/analysis.js.map +1 -0
  61. package/dist/types/guidance.d.ts +35 -0
  62. package/dist/types/guidance.d.ts.map +1 -0
  63. package/dist/types/guidance.js +2 -0
  64. package/dist/types/guidance.js.map +1 -0
  65. package/dist/types/index.d.ts +231 -0
  66. package/dist/types/index.d.ts.map +1 -0
  67. package/dist/types/index.js +12 -0
  68. package/dist/types/index.js.map +1 -0
  69. package/dist/types/media.d.ts +121 -0
  70. package/dist/types/media.d.ts.map +1 -0
  71. package/dist/types/media.js +4 -0
  72. package/dist/types/media.js.map +1 -0
  73. package/dist/types/policy.d.ts +54 -0
  74. package/dist/types/policy.d.ts.map +1 -0
  75. package/dist/types/policy.js +5 -0
  76. package/dist/types/policy.js.map +1 -0
  77. package/dist/types/pricing.d.ts +53 -0
  78. package/dist/types/pricing.d.ts.map +1 -0
  79. package/dist/types/pricing.js +5 -0
  80. package/dist/types/pricing.js.map +1 -0
  81. package/dist/types/reports.d.ts +44 -0
  82. package/dist/types/reports.d.ts.map +1 -0
  83. package/dist/types/reports.js +2 -0
  84. package/dist/types/reports.js.map +1 -0
  85. package/dist/types/safety.d.ts +151 -0
  86. package/dist/types/safety.d.ts.map +1 -0
  87. package/dist/types/safety.js +4 -0
  88. package/dist/types/safety.js.map +1 -0
  89. package/dist/types/voice-stream.d.ts +97 -0
  90. package/dist/types/voice-stream.d.ts.map +1 -0
  91. package/dist/types/voice-stream.js +5 -0
  92. package/dist/types/voice-stream.js.map +1 -0
  93. package/dist/types/webhooks.d.ts +110 -0
  94. package/dist/types/webhooks.d.ts.map +1 -0
  95. package/dist/types/webhooks.js +4 -0
  96. package/dist/types/webhooks.js.map +1 -0
  97. package/dist/utils/retry.d.ts +17 -0
  98. package/dist/utils/retry.d.ts.map +1 -0
  99. package/dist/utils/retry.js +61 -0
  100. package/dist/utils/retry.js.map +1 -0
  101. package/dist/voice-stream.d.ts +16 -0
  102. package/dist/voice-stream.d.ts.map +1 -0
  103. package/dist/voice-stream.js +148 -0
  104. package/dist/voice-stream.js.map +1 -0
  105. package/package.json +81 -0
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withRetry = withRetry;
4
+ const errors_js_1 = require("../errors.js");
5
+ const DEFAULT_OPTIONS = {
6
+ maxRetries: 3,
7
+ initialDelay: 1000,
8
+ maxDelay: 30000,
9
+ backoffMultiplier: 2,
10
+ isRetryable: defaultIsRetryable,
11
+ };
12
+ function defaultIsRetryable(error) {
13
+ // Retry on rate limit, server errors, network errors, and timeouts
14
+ if (error instanceof errors_js_1.RateLimitError)
15
+ return true;
16
+ if (error instanceof errors_js_1.ServerError)
17
+ return true;
18
+ if (error instanceof errors_js_1.NetworkError)
19
+ return true;
20
+ if (error instanceof errors_js_1.TimeoutError)
21
+ return true;
22
+ // Retry on fetch errors (network issues)
23
+ if (error instanceof TypeError && error.message.includes('fetch'))
24
+ return true;
25
+ return false;
26
+ }
27
+ function sleep(ms) {
28
+ return new Promise((resolve) => setTimeout(resolve, ms));
29
+ }
30
+ function calculateDelay(attempt, options) {
31
+ const delay = options.initialDelay * Math.pow(options.backoffMultiplier, attempt);
32
+ // Add jitter (0-25% of delay)
33
+ const jitter = delay * Math.random() * 0.25;
34
+ return Math.min(delay + jitter, options.maxDelay);
35
+ }
36
+ /**
37
+ * Execute a function with exponential backoff retry
38
+ */
39
+ async function withRetry(fn, options = {}) {
40
+ const opts = { ...DEFAULT_OPTIONS, ...options };
41
+ let lastError;
42
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
43
+ try {
44
+ return await fn();
45
+ }
46
+ catch (error) {
47
+ lastError = error;
48
+ // Check if we should retry
49
+ if (attempt >= opts.maxRetries || !opts.isRetryable(error)) {
50
+ throw error;
51
+ }
52
+ // Handle rate limit with retry-after header
53
+ if (error instanceof errors_js_1.RateLimitError && error.retryAfter) {
54
+ await sleep(error.retryAfter * 1000);
55
+ }
56
+ else {
57
+ const delay = calculateDelay(attempt, opts);
58
+ await sleep(delay);
59
+ }
60
+ }
61
+ }
62
+ throw lastError;
63
+ }
64
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":";;AAkDA,8BA8BC;AAhFD,4CAAuF;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,0BAAc;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,KAAK,YAAY,uBAAW;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,KAAK,YAAY,wBAAY;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,KAAK,YAAY,wBAAY;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;AACI,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,0BAAc,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,184 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createVoiceStream = createVoiceStream;
37
+ /** WebSocket URL for voice streaming */
38
+ const VOICE_STREAM_URL = 'wss://api.tuteliq.ai/voice/stream';
39
+ /**
40
+ * Creates a voice streaming session over WebSocket.
41
+ *
42
+ * Requires the `ws` package to be installed:
43
+ * ```bash
44
+ * npm install ws
45
+ * ```
46
+ *
47
+ * @param apiKey - Tuteliq API key for authentication
48
+ * @param config - Optional session configuration
49
+ * @param handlers - Optional event handler callbacks
50
+ * @returns A VoiceStreamSession for sending audio and controlling the session
51
+ */
52
+ function createVoiceStream(apiKey, config, handlers) {
53
+ let ws = null;
54
+ let sessionId = null;
55
+ let active = false;
56
+ let summaryResolve = null;
57
+ let summaryReject = null;
58
+ // Dynamically import ws
59
+ let WebSocketCtor = null;
60
+ const init = async () => {
61
+ try {
62
+ const wsModule = await Promise.resolve().then(() => __importStar(require('ws')));
63
+ WebSocketCtor = wsModule.default || wsModule.WebSocket;
64
+ }
65
+ catch {
66
+ throw new Error('The "ws" package is required for voice streaming. ' +
67
+ 'Install it with: npm install ws');
68
+ }
69
+ return new Promise((resolve, reject) => {
70
+ ws = new WebSocketCtor(VOICE_STREAM_URL, {
71
+ headers: {
72
+ 'Authorization': `Bearer ${apiKey}`,
73
+ },
74
+ });
75
+ ws.on('open', () => {
76
+ active = true;
77
+ // Send initial config if provided
78
+ if (config) {
79
+ const configMsg = {
80
+ type: 'config',
81
+ interval_seconds: config.intervalSeconds,
82
+ analysis_types: config.analysisTypes,
83
+ context: config.context,
84
+ };
85
+ ws.send(JSON.stringify(configMsg));
86
+ }
87
+ });
88
+ ws.on('message', (data) => {
89
+ try {
90
+ const text = data.toString();
91
+ const event = JSON.parse(text);
92
+ switch (event.type) {
93
+ case 'ready':
94
+ sessionId = event.session_id;
95
+ handlers?.onReady?.(event);
96
+ resolve();
97
+ break;
98
+ case 'transcription':
99
+ handlers?.onTranscription?.(event);
100
+ break;
101
+ case 'alert':
102
+ handlers?.onAlert?.(event);
103
+ break;
104
+ case 'session_summary':
105
+ handlers?.onSessionSummary?.(event);
106
+ summaryResolve?.(event);
107
+ summaryResolve = null;
108
+ summaryReject = null;
109
+ break;
110
+ case 'config_updated':
111
+ handlers?.onConfigUpdated?.(event);
112
+ break;
113
+ case 'error':
114
+ handlers?.onError?.(event);
115
+ break;
116
+ }
117
+ }
118
+ catch {
119
+ // Ignore non-JSON messages (e.g. pong frames)
120
+ }
121
+ });
122
+ ws.on('close', (code, reason) => {
123
+ active = false;
124
+ const reasonStr = reason.toString();
125
+ handlers?.onClose?.(code, reasonStr);
126
+ if (summaryReject) {
127
+ summaryReject(new Error(`Connection closed before session summary (code: ${code})`));
128
+ summaryResolve = null;
129
+ summaryReject = null;
130
+ }
131
+ });
132
+ ws.on('error', (err) => {
133
+ active = false;
134
+ reject(err);
135
+ });
136
+ });
137
+ };
138
+ // Start connection immediately
139
+ const ready = init();
140
+ const session = {
141
+ sendAudio(data) {
142
+ if (!ws || !active) {
143
+ throw new Error('Voice stream is not connected');
144
+ }
145
+ ws.send(data);
146
+ },
147
+ updateConfig(newConfig) {
148
+ if (!ws || !active) {
149
+ throw new Error('Voice stream is not connected');
150
+ }
151
+ const configMsg = {
152
+ type: 'config',
153
+ interval_seconds: newConfig.intervalSeconds,
154
+ analysis_types: newConfig.analysisTypes,
155
+ context: newConfig.context,
156
+ };
157
+ ws.send(JSON.stringify(configMsg));
158
+ },
159
+ async end() {
160
+ await ready;
161
+ if (!ws || !active) {
162
+ throw new Error('Voice stream is not connected');
163
+ }
164
+ return new Promise((resolve, reject) => {
165
+ summaryResolve = resolve;
166
+ summaryReject = reject;
167
+ ws.send(JSON.stringify({ type: 'end' }));
168
+ });
169
+ },
170
+ close() {
171
+ active = false;
172
+ ws?.close();
173
+ ws = null;
174
+ },
175
+ get sessionId() {
176
+ return sessionId;
177
+ },
178
+ get isActive() {
179
+ return active;
180
+ },
181
+ };
182
+ return session;
183
+ }
184
+ //# 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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"}