@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.
@@ -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
@@ -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
- export declare class ThinkHiveApiError extends Error {
22
- readonly statusCode: number;
23
- readonly code?: string | undefined;
24
- constructor(message: string, statusCode: number, code?: string | undefined);
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
- export declare class ThinkHiveValidationError extends Error {
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
+ }