@thinkhive/sdk 3.1.1 → 4.0.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/MIGRATION.md +83 -12
- package/README.md +279 -128
- package/dist/api/agents.d.ts +169 -0
- package/dist/api/agents.js +185 -0
- package/dist/api/apiKeys.d.ts +252 -0
- package/dist/api/apiKeys.js +298 -0
- package/dist/api/business-metrics.d.ts +188 -0
- package/dist/api/business-metrics.js +213 -0
- package/dist/api/calibration.d.ts +0 -62
- package/dist/api/calibration.js +5 -48
- package/dist/api/claims.js +10 -7
- package/dist/api/conversation-eval.d.ts +200 -0
- package/dist/api/conversation-eval.js +235 -0
- package/dist/api/deterministic-graders.d.ts +205 -0
- package/dist/api/deterministic-graders.js +191 -0
- package/dist/api/eval-health.d.ts +250 -0
- package/dist/api/eval-health.js +224 -0
- package/dist/api/human-review.d.ts +275 -0
- package/dist/api/human-review.js +236 -0
- package/dist/api/nondeterminism.d.ts +300 -0
- package/dist/api/nondeterminism.js +250 -0
- package/dist/api/quality-metrics.d.ts +303 -0
- package/dist/api/quality-metrics.js +198 -0
- package/dist/api/roi-analytics.d.ts +263 -0
- package/dist/api/roi-analytics.js +204 -0
- package/dist/api/runs.js +12 -6
- package/dist/api/transcript-patterns.d.ts +204 -0
- package/dist/api/transcript-patterns.js +227 -0
- package/dist/core/client.d.ts +83 -9
- package/dist/core/client.js +229 -34
- package/dist/core/config.d.ts +2 -3
- package/dist/core/config.js +3 -4
- package/dist/core/types.d.ts +57 -4
- package/dist/core/types.js +1 -1
- package/dist/index.d.ts +429 -76
- package/dist/index.js +262 -42
- package/package.json +2 -2
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK v3.0 - Transcript Patterns API
|
|
4
|
+
*
|
|
5
|
+
* API for transcript pattern detection and analysis
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.transcriptPatterns = void 0;
|
|
9
|
+
exports.isHighRisk = isHighRisk;
|
|
10
|
+
exports.getMatchesByCategory = getMatchesByCategory;
|
|
11
|
+
exports.getCriticalInsights = getCriticalInsights;
|
|
12
|
+
exports.hasPiiExposure = hasPiiExposure;
|
|
13
|
+
exports.hasFrustrationSignals = hasFrustrationSignals;
|
|
14
|
+
exports.hasEscalationRequest = hasEscalationRequest;
|
|
15
|
+
exports.getCategoryDistribution = getCategoryDistribution;
|
|
16
|
+
exports.getRecommendations = getRecommendations;
|
|
17
|
+
exports.getOverallSentiment = getOverallSentiment;
|
|
18
|
+
exports.needsAttention = needsAttention;
|
|
19
|
+
exports.getSeverityLevel = getSeverityLevel;
|
|
20
|
+
exports.sortMatchesBySeverity = sortMatchesBySeverity;
|
|
21
|
+
const client_1 = require("../core/client");
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// TRANSCRIPT PATTERNS API CLIENT
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Transcript Patterns API client for pattern detection and analysis
|
|
27
|
+
*/
|
|
28
|
+
exports.transcriptPatterns = {
|
|
29
|
+
/**
|
|
30
|
+
* Analyze a trace for patterns
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const result = await transcriptPatterns.analyze('trace_123');
|
|
35
|
+
* console.log(`Found ${result.patternsMatched} patterns`);
|
|
36
|
+
* console.log(`Risk score: ${result.riskScore}`);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
async analyze(traceId) {
|
|
40
|
+
return (0, client_1.apiRequestWithData)('/transcript-patterns/analyze', {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
body: { traceId },
|
|
43
|
+
apiVersion: 'none',
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* Analyze multiple traces for patterns
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const { results, summary } = await transcriptPatterns.bulkAnalyze([
|
|
52
|
+
* 'trace_1', 'trace_2', 'trace_3'
|
|
53
|
+
* ]);
|
|
54
|
+
* console.log(`${summary.tracesWithMatches} traces have patterns`);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
async bulkAnalyze(traceIds) {
|
|
58
|
+
return (0, client_1.apiRequestWithData)('/transcript-patterns/bulk-analyze', {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body: { traceIds },
|
|
61
|
+
apiVersion: 'none',
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* Get available pattern categories with descriptions
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const categories = await transcriptPatterns.getCategories();
|
|
70
|
+
* for (const category of categories) {
|
|
71
|
+
* console.log(`${category.name}: ${category.description}`);
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
async getCategories() {
|
|
76
|
+
return (0, client_1.apiRequestWithData)('/transcript-patterns/categories', { apiVersion: 'none' });
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Get built-in patterns
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const patterns = await transcriptPatterns.getBuiltInPatterns();
|
|
84
|
+
* const frustrationPatterns = patterns.filter(p => p.category === 'frustration');
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
async getBuiltInPatterns() {
|
|
88
|
+
return (0, client_1.apiRequestWithData)('/transcript-patterns/built-in', { apiVersion: 'none' });
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
// ============================================================================
|
|
92
|
+
// HELPER FUNCTIONS
|
|
93
|
+
// ============================================================================
|
|
94
|
+
/**
|
|
95
|
+
* Check if analysis result indicates high risk
|
|
96
|
+
*
|
|
97
|
+
* @param result - Analysis result to check
|
|
98
|
+
* @param threshold - Risk score threshold (default 70)
|
|
99
|
+
* @returns Whether the result indicates high risk
|
|
100
|
+
*/
|
|
101
|
+
function isHighRisk(result, threshold = 70) {
|
|
102
|
+
return result.riskScore >= threshold;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get matches by category
|
|
106
|
+
*
|
|
107
|
+
* @param result - Analysis result
|
|
108
|
+
* @param category - Pattern category to filter by
|
|
109
|
+
* @returns Filtered pattern matches
|
|
110
|
+
*/
|
|
111
|
+
function getMatchesByCategory(result, category) {
|
|
112
|
+
return result.matches.filter(m => m.category === category);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get critical insights from analysis
|
|
116
|
+
*
|
|
117
|
+
* @param result - Analysis result
|
|
118
|
+
* @returns Critical severity insights
|
|
119
|
+
*/
|
|
120
|
+
function getCriticalInsights(result) {
|
|
121
|
+
return result.insights.filter(i => i.severity === 'critical');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if analysis detected PII
|
|
125
|
+
*
|
|
126
|
+
* @param result - Analysis result
|
|
127
|
+
* @returns Whether PII was detected
|
|
128
|
+
*/
|
|
129
|
+
function hasPiiExposure(result) {
|
|
130
|
+
return result.matches.some(m => m.category === 'pii_exposure');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if analysis detected frustration
|
|
134
|
+
*
|
|
135
|
+
* @param result - Analysis result
|
|
136
|
+
* @returns Whether frustration was detected
|
|
137
|
+
*/
|
|
138
|
+
function hasFrustrationSignals(result) {
|
|
139
|
+
return result.matches.some(m => m.category === 'frustration');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if analysis detected escalation request
|
|
143
|
+
*
|
|
144
|
+
* @param result - Analysis result
|
|
145
|
+
* @returns Whether escalation was requested
|
|
146
|
+
*/
|
|
147
|
+
function hasEscalationRequest(result) {
|
|
148
|
+
return result.matches.some(m => m.category === 'escalation');
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Calculate category distribution
|
|
152
|
+
*
|
|
153
|
+
* @param result - Analysis result
|
|
154
|
+
* @returns Object with counts per category
|
|
155
|
+
*/
|
|
156
|
+
function getCategoryDistribution(result) {
|
|
157
|
+
const distribution = {
|
|
158
|
+
frustration: 0,
|
|
159
|
+
confusion: 0,
|
|
160
|
+
success: 0,
|
|
161
|
+
failure: 0,
|
|
162
|
+
escalation: 0,
|
|
163
|
+
pii_exposure: 0,
|
|
164
|
+
hallucination: 0,
|
|
165
|
+
custom: 0,
|
|
166
|
+
};
|
|
167
|
+
for (const match of result.matches) {
|
|
168
|
+
distribution[match.category]++;
|
|
169
|
+
}
|
|
170
|
+
return distribution;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get actionable recommendations from insights
|
|
174
|
+
*
|
|
175
|
+
* @param result - Analysis result
|
|
176
|
+
* @returns Array of recommendation strings
|
|
177
|
+
*/
|
|
178
|
+
function getRecommendations(result) {
|
|
179
|
+
return result.insights
|
|
180
|
+
.filter(i => i.recommendation)
|
|
181
|
+
.map(i => i.recommendation);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Calculate overall sentiment from analysis
|
|
185
|
+
*
|
|
186
|
+
* @param result - Analysis result
|
|
187
|
+
* @returns Sentiment score (-1 to 1) or null if not available
|
|
188
|
+
*/
|
|
189
|
+
function getOverallSentiment(result) {
|
|
190
|
+
return result.sentimentScores?.overall ?? null;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Determine if conversation needs attention based on patterns
|
|
194
|
+
*
|
|
195
|
+
* @param result - Analysis result
|
|
196
|
+
* @returns Whether the conversation needs attention
|
|
197
|
+
*/
|
|
198
|
+
function needsAttention(result) {
|
|
199
|
+
return (result.riskScore >= 50 ||
|
|
200
|
+
hasPiiExposure(result) ||
|
|
201
|
+
hasEscalationRequest(result) ||
|
|
202
|
+
result.insights.some(i => i.severity === 'critical'));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get severity level as numeric value
|
|
206
|
+
*
|
|
207
|
+
* @param severity - Pattern severity
|
|
208
|
+
* @returns Numeric severity (1-3)
|
|
209
|
+
*/
|
|
210
|
+
function getSeverityLevel(severity) {
|
|
211
|
+
switch (severity) {
|
|
212
|
+
case 'info': return 1;
|
|
213
|
+
case 'warning': return 2;
|
|
214
|
+
case 'critical': return 3;
|
|
215
|
+
default: return 0;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Sort matches by severity (critical first)
|
|
220
|
+
*
|
|
221
|
+
* @param matches - Pattern matches to sort
|
|
222
|
+
* @returns Sorted matches
|
|
223
|
+
*/
|
|
224
|
+
function sortMatchesBySeverity(matches) {
|
|
225
|
+
return [...matches].sort((a, b) => getSeverityLevel(b.severity) - getSeverityLevel(a.severity));
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1wYXR0ZXJucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdHJhbnNjcmlwdC1wYXR0ZXJucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBeUtILGdDQUVDO0FBU0Qsb0RBS0M7QUFRRCxrREFFQztBQVFELHdDQUVDO0FBUUQsc0RBRUM7QUFRRCxvREFFQztBQVFELDBEQWlCQztBQVFELGdEQUlDO0FBUUQsa0RBRUM7QUFRRCx3Q0FPQztBQVFELDRDQU9DO0FBUUQsc0RBRUM7QUF0VEQsMkNBQW9EO0FBNEVwRCwrRUFBK0U7QUFDL0UsaUNBQWlDO0FBQ2pDLCtFQUErRTtBQUUvRTs7R0FFRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEM7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFlO1FBQzNCLE9BQU8sSUFBQSwyQkFBa0IsRUFBaUIsOEJBQThCLEVBQUU7WUFDeEUsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUU7WUFDakIsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWtCO1FBQ2xDLE9BQU8sSUFBQSwyQkFBa0IsRUFBcUIsbUNBQW1DLEVBQUU7WUFDakYsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUU7WUFDbEIsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtB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QUFDLE1BQU0sQ0FBQztRQUN0QixvQkFBb0IsQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBeUI7SUFDeEQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLEtBQUssU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsS0FBSyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsT0FBdUI7SUFDM0QsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaW5rSGl2ZSBTREsgdjMuMCAtIFRyYW5zY3JpcHQgUGF0dGVybnMgQVBJXG4gKlxuICogQVBJIGZvciB0cmFuc2NyaXB0IHBhdHRlcm4gZGV0ZWN0aW9uIGFuZCBhbmFseXNpc1xuICovXG5cbmltcG9ydCB7IGFwaVJlcXVlc3RXaXRoRGF0YSB9IGZyb20gJy4uL2NvcmUvY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgUGF0dGVybkNhdGVnb3J5ID1cbiAgfCAnZnJ1c3RyYXRpb24nXG4gIHwgJ2NvbmZ1c2lvbidcbiAgfCAnc3VjY2VzcydcbiAgfCAnZmFpbHVyZSdcbiAgfCAnZXNjYWxhdGlvbidcbiAgfCAncGlpX2V4cG9zdXJlJ1xuICB8ICdoYWxsdWNpbmF0aW9uJ1xuICB8ICdjdXN0b20nO1xuXG5leHBvcnQgdHlwZSBQYXR0ZXJuT3V0Y29tZSA9ICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdlc2NhbGF0aW9uJyB8ICduZXV0cmFsJztcbmV4cG9ydCB0eXBlIFBhdHRlcm5TZXZlcml0eSA9ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdjcml0aWNhbCc7XG5leHBvcnQgdHlwZSBEZXRlY3Rpb25UeXBlID0gJ3NlcXVlbmNlJyB8ICdrZXl3b3JkcycgfCAncmVnZXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhdHRlcm5NYXRjaCB7XG4gIHBhdHRlcm5JZDogc3RyaW5nO1xuICBwYXR0ZXJuTmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGF0dGVybkNhdGVnb3J5O1xuICBtYXRjaGVkVGV4dD86IHN0cmluZztcbiAgcG9zaXRpb24/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgc2V2ZXJpdHk6IFBhdHRlcm5TZXZlcml0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXR0ZXJuSW5zaWdodCB7XG4gIHR5cGU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXZlcml0eTogUGF0dGVyblNldmVyaXR5O1xuICByZWNvbW1lbmRhdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBwYXR0ZXJuc01hdGNoZWQ6IG51bWJlcjtcbiAgcmlza1Njb3JlOiBudW1iZXI7XG4gIHByZWRpY3RlZE91dGNvbWU/OiBQYXR0ZXJuT3V0Y29tZTtcbiAgcHJlZGljdGlvbkNvbmZpZGVuY2U/OiBudW1iZXI7XG4gIG1hdGNoZXM6IFBhdHRlcm5NYXRjaFtdO1xuICBpbnNpZ2h0czogUGF0dGVybkluc2lnaHRbXTtcbiAgc2VudGltZW50U2NvcmVzPzoge1xuICAgIG92ZXJhbGw6IG51bWJlcjtcbiAgICBieVR1cm4/OiBBcnJheTx7IHR1cm46IG51bWJlcjsgc2VudGltZW50OiBudW1iZXI7IGNvbmZpZGVuY2U6IG51bWJlciB9PjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrQW5hbHlzaXNSZXN1bHQge1xuICByZXN1bHRzOiBBcnJheTxBbmFseXNpc1Jlc3VsdCAmIHsgZXJyb3I/OiBzdHJpbmcgfT47XG4gIHN1bW1hcnk6IHtcbiAgICB0cmFjZXNBbmFseXplZDogbnVtYmVyO1xuICAgIHRvdGFsTWF0Y2hlczogbnVtYmVyO1xuICAgIHRyYWNlc1dpdGhNYXRjaGVzOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0dGVybkNhdGVnb3J5SW5mbyB7XG4gIGlkOiBQYXR0ZXJuQ2F0ZWdvcnk7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaW5kaWNhdG9yczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbHRJblBhdHRlcm4ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBQYXR0ZXJuQ2F0ZWdvcnk7XG4gIGRldGVjdGlvblR5cGU6IERldGVjdGlvblR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRSQU5TQ1JJUFQgUEFUVEVSTlMgQVBJIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRyYW5zY3JpcHQgUGF0dGVybnMgQVBJIGNsaWVudCBmb3IgcGF0dGVybiBkZXRlY3Rpb24gYW5kIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2NyaXB0UGF0dGVybnMgPSB7XG4gIC8qKlxuICAgKiBBbmFseXplIGEgdHJhY2UgZm9yIHBhdHRlcm5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNjcmlwdFBhdHRlcm5zLmFuYWx5emUoJ3RyYWNlXzEyMycpO1xuICAgKiBjb25zb2xlLmxvZyhgRm91bmQgJHtyZXN1bHQucGF0dGVybnNNYXRjaGVkfSBwYXR0ZXJuc2ApO1xuICAgKiBjb25zb2xlLmxvZyhgUmlzayBzY29yZTogJHtyZXN1bHQucmlza1Njb3JlfWApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGFuYWx5emUodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBbmFseXNpc1Jlc3VsdD4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8QW5hbHlzaXNSZXN1bHQ+KCcvdHJhbnNjcmlwdC1wYXR0ZXJucy9hbmFseXplJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiB7IHRyYWNlSWQgfSxcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQW5hbHl6ZSBtdWx0aXBsZSB0cmFjZXMgZm9yIHBhdHRlcm5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyByZXN1bHRzLCBzdW1tYXJ5IH0gPSBhd2FpdCB0cmFuc2NyaXB0UGF0dGVybnMuYnVsa0FuYWx5emUoW1xuICAgKiAgICd0cmFjZV8xJywgJ3RyYWNlXzInLCAndHJhY2VfMydcbiAgICogXSk7XG4gICAqIGNvbnNvbGUubG9nKGAke3N1bW1hcnkudHJhY2VzV2l0aE1hdGNoZXN9IHRyYWNlcyBoYXZlIHBhdHRlcm5zYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYnVsa0FuYWx5emUodHJhY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxCdWxrQW5hbHlzaXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPEJ1bGtBbmFseXNpc1Jlc3VsdD4oJy90cmFuc2NyaXB0LXBhdHRlcm5zL2J1bGstYW5hbHl6ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogeyB0cmFjZUlkcyB9LFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYXZhaWxhYmxlIHBhdHRlcm4gY2F0ZWdvcmllcyB3aXRoIGRlc2NyaXB0aW9uc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNhdGVnb3JpZXMgPSBhd2FpdCB0cmFuc2NyaXB0UGF0dGVybnMuZ2V0Q2F0ZWdvcmllcygpO1xuICAgKiBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXMpIHtcbiAgICogICBjb25zb2xlLmxvZyhgJHtjYXRlZ29yeS5uYW1lfTogJHtjYXRlZ29yeS5kZXNjcmlwdGlvbn1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENhdGVnb3JpZXMoKTogUHJvbWlzZTxQYXR0ZXJuQ2F0ZWdvcnlJbmZvW10+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFBhdHRlcm5DYXRlZ29yeUluZm9bXT4oXG4gICAgICAnL3RyYW5zY3JpcHQtcGF0dGVybnMvY2F0ZWdvcmllcycsXG4gICAgICB7IGFwaVZlcnNpb246ICdub25lJyB9XG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGJ1aWx0LWluIHBhdHRlcm5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF0dGVybnMgPSBhd2FpdCB0cmFuc2NyaXB0UGF0dGVybnMuZ2V0QnVpbHRJblBhdHRlcm5zKCk7XG4gICAqIGNvbnN0IGZydXN0cmF0aW9uUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmNhdGVnb3J5ID09PSAnZnJ1c3RyYXRpb24nKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRCdWlsdEluUGF0dGVybnMoKTogUHJvbWlzZTxCdWlsdEluUGF0dGVybltdPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxCdWlsdEluUGF0dGVybltdPihcbiAgICAgICcvdHJhbnNjcmlwdC1wYXR0ZXJucy9idWlsdC1pbicsXG4gICAgICB7IGFwaVZlcnNpb246ICdub25lJyB9XG4gICAgKTtcbiAgfSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVjayBpZiBhbmFseXNpcyByZXN1bHQgaW5kaWNhdGVzIGhpZ2ggcmlza1xuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBBbmFseXNpcyByZXN1bHQgdG8gY2hlY2tcbiAqIEBwYXJhbSB0aHJlc2hvbGQgLSBSaXNrIHNjb3JlIHRocmVzaG9sZCAoZGVmYXVsdCA3MClcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJlc3VsdCBpbmRpY2F0ZXMgaGlnaCByaXNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hpZ2hSaXNrKHJlc3VsdDogQW5hbHlzaXNSZXN1bHQsIHRocmVzaG9sZCA9IDcwKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXN1bHQucmlza1Njb3JlID49IHRocmVzaG9sZDtcbn1cblxuLyoqXG4gKiBHZXQgbWF0Y2hlcyBieSBjYXRlZ29yeVxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBBbmFseXNpcyByZXN1bHRcbiAqIEBwYXJhbSBjYXRlZ29yeSAtIFBhdHRlcm4gY2F0ZWdvcnkgdG8gZmlsdGVyIGJ5XG4gKiBAcmV0dXJucyBGaWx0ZXJlZCBwYXR0ZXJuIG1hdGNoZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hdGNoZXNCeUNhdGVnb3J5KFxuICByZXN1bHQ6IEFuYWx5c2lzUmVzdWx0LFxuICBjYXRlZ29yeTogUGF0dGVybkNhdGVnb3J5XG4pOiBQYXR0ZXJuTWF0Y2hbXSB7XG4gIHJldHVybiByZXN1bHQubWF0Y2hlcy5maWx0ZXIobSA9PiBtLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG59XG5cbi8qKlxuICogR2V0IGNyaXRpY2FsIGluc2lnaHRzIGZyb20gYW5hbHlzaXNcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gQW5hbHlzaXMgcmVzdWx0XG4gKiBAcmV0dXJucyBDcml0aWNhbCBzZXZlcml0eSBpbnNpZ2h0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JpdGljYWxJbnNpZ2h0cyhyZXN1bHQ6IEFuYWx5c2lzUmVzdWx0KTogUGF0dGVybkluc2lnaHRbXSB7XG4gIHJldHVybiByZXN1bHQuaW5zaWdodHMuZmlsdGVyKGkgPT4gaS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJyk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW5hbHlzaXMgZGV0ZWN0ZWQgUElJXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgV2hldGhlciBQSUkgd2FzIGRldGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQaWlFeHBvc3VyZShyZXN1bHQ6IEFuYWx5c2lzUmVzdWx0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXN1bHQubWF0Y2hlcy5zb21lKG0gPT4gbS5jYXRlZ29yeSA9PT0gJ3BpaV9leHBvc3VyZScpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuYWx5c2lzIGRldGVjdGVkIGZydXN0cmF0aW9uXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgV2hldGhlciBmcnVzdHJhdGlvbiB3YXMgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ZydXN0cmF0aW9uU2lnbmFscyhyZXN1bHQ6IEFuYWx5c2lzUmVzdWx0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXN1bHQubWF0Y2hlcy5zb21lKG0gPT4gbS5jYXRlZ29yeSA9PT0gJ2ZydXN0cmF0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW5hbHlzaXMgZGV0ZWN0ZWQgZXNjYWxhdGlvbiByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgV2hldGhlciBlc2NhbGF0aW9uIHdhcyByZXF1ZXN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VzY2FsYXRpb25SZXF1ZXN0KHJlc3VsdDogQW5hbHlzaXNSZXN1bHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3VsdC5tYXRjaGVzLnNvbWUobSA9PiBtLmNhdGVnb3J5ID09PSAnZXNjYWxhdGlvbicpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBjYXRlZ29yeSBkaXN0cmlidXRpb25cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gQW5hbHlzaXMgcmVzdWx0XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjb3VudHMgcGVyIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXRlZ29yeURpc3RyaWJ1dGlvbihyZXN1bHQ6IEFuYWx5c2lzUmVzdWx0KTogUmVjb3JkPFBhdHRlcm5DYXRlZ29yeSwgbnVtYmVyPiB7XG4gIGNvbnN0IGRpc3RyaWJ1dGlvbjogUmVjb3JkPFBhdHRlcm5DYXRlZ29yeSwgbnVtYmVyPiA9IHtcbiAgICBmcnVzdHJhdGlvbjogMCxcbiAgICBjb25mdXNpb246IDAsXG4gICAgc3VjY2VzczogMCxcbiAgICBmYWlsdXJlOiAwLFxuICAgIGVzY2FsYXRpb246IDAsXG4gICAgcGlpX2V4cG9zdXJlOiAwLFxuICAgIGhhbGx1Y2luYXRpb246IDAsXG4gICAgY3VzdG9tOiAwLFxuICB9O1xuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzdWx0Lm1hdGNoZXMpIHtcbiAgICBkaXN0cmlidXRpb25bbWF0Y2guY2F0ZWdvcnldKys7XG4gIH1cblxuICByZXR1cm4gZGlzdHJpYnV0aW9uO1xufVxuXG4vKipcbiAqIEdldCBhY3Rpb25hYmxlIHJlY29tbWVuZGF0aW9ucyBmcm9tIGluc2lnaHRzXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgQXJyYXkgb2YgcmVjb21tZW5kYXRpb24gc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjb21tZW5kYXRpb25zKHJlc3VsdDogQW5hbHlzaXNSZXN1bHQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXN1bHQuaW5zaWdodHNcbiAgICAuZmlsdGVyKGkgPT4gaS5yZWNvbW1lbmRhdGlvbilcbiAgICAubWFwKGkgPT4gaS5yZWNvbW1lbmRhdGlvbiBhcyBzdHJpbmcpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBvdmVyYWxsIHNlbnRpbWVudCBmcm9tIGFuYWx5c2lzXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgU2VudGltZW50IHNjb3JlICgtMSB0byAxKSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE92ZXJhbGxTZW50aW1lbnQocmVzdWx0OiBBbmFseXNpc1Jlc3VsdCk6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gcmVzdWx0LnNlbnRpbWVudFNjb3Jlcz8ub3ZlcmFsbCA/PyBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBjb252ZXJzYXRpb24gbmVlZHMgYXR0ZW50aW9uIGJhc2VkIG9uIHBhdHRlcm5zXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIEFuYWx5c2lzIHJlc3VsdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgY29udmVyc2F0aW9uIG5lZWRzIGF0dGVudGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNBdHRlbnRpb24ocmVzdWx0OiBBbmFseXNpc1Jlc3VsdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHJlc3VsdC5yaXNrU2NvcmUgPj0gNTAgfHxcbiAgICBoYXNQaWlFeHBvc3VyZShyZXN1bHQpIHx8XG4gICAgaGFzRXNjYWxhdGlvblJlcXVlc3QocmVzdWx0KSB8fFxuICAgIHJlc3VsdC5pbnNpZ2h0cy5zb21lKGkgPT4gaS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJylcbiAgKTtcbn1cblxuLyoqXG4gKiBHZXQgc2V2ZXJpdHkgbGV2ZWwgYXMgbnVtZXJpYyB2YWx1ZVxuICpcbiAqIEBwYXJhbSBzZXZlcml0eSAtIFBhdHRlcm4gc2V2ZXJpdHlcbiAqIEByZXR1cm5zIE51bWVyaWMgc2V2ZXJpdHkgKDEtMylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldmVyaXR5TGV2ZWwoc2V2ZXJpdHk6IFBhdHRlcm5TZXZlcml0eSk6IG51bWJlciB7XG4gIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICBjYXNlICdpbmZvJzogcmV0dXJuIDE7XG4gICAgY2FzZSAnd2FybmluZyc6IHJldHVybiAyO1xuICAgIGNhc2UgJ2NyaXRpY2FsJzogcmV0dXJuIDM7XG4gICAgZGVmYXVsdDogcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IG1hdGNoZXMgYnkgc2V2ZXJpdHkgKGNyaXRpY2FsIGZpcnN0KVxuICpcbiAqIEBwYXJhbSBtYXRjaGVzIC0gUGF0dGVybiBtYXRjaGVzIHRvIHNvcnRcbiAqIEByZXR1cm5zIFNvcnRlZCBtYXRjaGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0TWF0Y2hlc0J5U2V2ZXJpdHkobWF0Y2hlczogUGF0dGVybk1hdGNoW10pOiBQYXR0ZXJuTWF0Y2hbXSB7XG4gIHJldHVybiBbLi4ubWF0Y2hlc10uc29ydCgoYSwgYikgPT4gZ2V0U2V2ZXJpdHlMZXZlbChiLnNldmVyaXR5KSAtIGdldFNldmVyaXR5TGV2ZWwoYS5zZXZlcml0eSkpO1xufVxuIl19
|
package/dist/core/client.d.ts
CHANGED
|
@@ -4,26 +4,100 @@
|
|
|
4
4
|
* Centralized HTTP client with authentication and error handling
|
|
5
5
|
*/
|
|
6
6
|
export interface RequestOptions {
|
|
7
|
-
method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
7
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
8
8
|
body?: unknown;
|
|
9
9
|
headers?: Record<string, string>;
|
|
10
|
-
/** Override API version for this request */
|
|
11
|
-
apiVersion?: 'v1' | 'v3';
|
|
10
|
+
/** Override API version for this request. Use 'none' for unversioned routes (e.g., /api/agents). */
|
|
11
|
+
apiVersion?: 'v1' | 'v2' | 'v3' | 'none';
|
|
12
|
+
/** Override max retries for this request */
|
|
13
|
+
maxRetries?: number;
|
|
14
|
+
/** Request timeout in milliseconds */
|
|
15
|
+
timeout?: number;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
14
|
-
* Make an authenticated API request
|
|
18
|
+
* Make an authenticated API request with retry logic
|
|
15
19
|
*/
|
|
16
20
|
export declare function apiRequest<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
17
21
|
/**
|
|
18
22
|
* Make an API request and extract data from response wrapper
|
|
19
23
|
*/
|
|
20
24
|
export declare function apiRequestWithData<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Base error class for ThinkHive SDK errors
|
|
27
|
+
*/
|
|
28
|
+
export declare class ThinkHiveError extends Error {
|
|
29
|
+
readonly code: string;
|
|
30
|
+
readonly statusCode?: number | undefined;
|
|
31
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
32
|
+
constructor(message: string, code: string, statusCode?: number | undefined, details?: Record<string, unknown> | undefined);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* API request error - returned from ThinkHive server
|
|
36
|
+
*/
|
|
37
|
+
export declare class ThinkHiveApiError extends ThinkHiveError {
|
|
38
|
+
constructor(message: string, statusCode: number, code?: string);
|
|
25
39
|
}
|
|
26
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Validation error - invalid input parameters
|
|
42
|
+
*/
|
|
43
|
+
export declare class ThinkHiveValidationError extends ThinkHiveError {
|
|
27
44
|
readonly field?: string | undefined;
|
|
28
45
|
constructor(message: string, field?: string | undefined);
|
|
29
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Permission denied error - API key lacks required permissions
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* try {
|
|
52
|
+
* await thinkHive.traces.create(...);
|
|
53
|
+
* } catch (error) {
|
|
54
|
+
* if (error instanceof PermissionDeniedError) {
|
|
55
|
+
* console.log('API key needs write permission');
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare class PermissionDeniedError extends ThinkHiveError {
|
|
61
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Agent scope violation error - API key not authorized for this agent
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* // Create key scoped to specific agents
|
|
68
|
+
* const key = await thinkHive.apiKeys.create({
|
|
69
|
+
* name: 'Agent A Key',
|
|
70
|
+
* allowedAgentIds: ['agent-a-id']
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // Attempting to use for Agent B will throw AgentScopeError
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class AgentScopeError extends ThinkHiveError {
|
|
77
|
+
constructor(agentId: string, allowedAgents: string[]);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Rate limit exceeded error
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* try {
|
|
84
|
+
* await thinkHive.traces.create(...);
|
|
85
|
+
* } catch (error) {
|
|
86
|
+
* if (error instanceof RateLimitError) {
|
|
87
|
+
* // Wait and retry
|
|
88
|
+
* await sleep(error.retryAfter);
|
|
89
|
+
* await thinkHive.traces.create(...);
|
|
90
|
+
* }
|
|
91
|
+
* }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare class RateLimitError extends ThinkHiveError {
|
|
95
|
+
readonly retryAfter: number;
|
|
96
|
+
constructor(retryAfter: number);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* IP whitelist violation error
|
|
100
|
+
*/
|
|
101
|
+
export declare class IpWhitelistError extends ThinkHiveError {
|
|
102
|
+
constructor(clientIp: string);
|
|
103
|
+
}
|