@thinkhive/sdk 2.0.0 → 3.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,200 @@
1
+ /**
2
+ * ThinkHive SDK v3.0 - Runs API
3
+ *
4
+ * Run-centric API for creating and managing runs (the atomic unit in v3)
5
+ */
6
+ import type { RunOptions, RunResponse, CustomerContextSnapshot, ConversationMessage, RunOutcome } from '../core/types';
7
+ /**
8
+ * List runs query options
9
+ */
10
+ export interface ListRunsOptions {
11
+ agentId?: string;
12
+ ticketId?: string;
13
+ customerAccountId?: string;
14
+ outcome?: RunOutcome;
15
+ startedAfter?: string | Date;
16
+ startedBefore?: string | Date;
17
+ limit?: number;
18
+ offset?: number;
19
+ }
20
+ /**
21
+ * Run stats response
22
+ */
23
+ export interface RunStats {
24
+ agentId: string;
25
+ period: {
26
+ from: string;
27
+ to: string;
28
+ };
29
+ totalRuns: number;
30
+ outcomeBreakdown: Record<RunOutcome, number>;
31
+ avgDurationMs: number;
32
+ linkedTickets: number;
33
+ unlinkedRuns: number;
34
+ }
35
+ /**
36
+ * Runs API client for v3 run-centric operations
37
+ */
38
+ export declare const runs: {
39
+ /**
40
+ * Create a new run
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const run = await runs.create({
45
+ * agentId: 'agent_123',
46
+ * conversationMessages: [
47
+ * { role: 'user', content: 'Help me with my order' },
48
+ * { role: 'assistant', content: 'I can help with that...' },
49
+ * ],
50
+ * outcome: 'resolved',
51
+ * customerContext: {
52
+ * arr: 50000,
53
+ * healthScore: 85,
54
+ * segment: 'enterprise',
55
+ * },
56
+ * });
57
+ * ```
58
+ */
59
+ create(options: RunOptions): Promise<RunResponse>;
60
+ /**
61
+ * Get a run by ID
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const run = await runs.get('run_abc123');
66
+ * ```
67
+ */
68
+ get(runId: string): Promise<RunResponse>;
69
+ /**
70
+ * List runs with filters
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const { items, hasMore } = await runs.list({
75
+ * agentId: 'agent_123',
76
+ * outcome: 'failed',
77
+ * limit: 20,
78
+ * });
79
+ * ```
80
+ */
81
+ list(options?: ListRunsOptions): Promise<{
82
+ items: RunResponse[];
83
+ limit: number;
84
+ offset: number;
85
+ hasMore: boolean;
86
+ }>;
87
+ /**
88
+ * Update a run
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * await runs.update('run_abc123', {
93
+ * outcome: 'resolved',
94
+ * outcomeReason: 'Customer confirmed issue resolved',
95
+ * });
96
+ * ```
97
+ */
98
+ update(runId: string, updates: Partial<Pick<RunOptions, "outcome" | "outcomeReason" | "endedAt" | "metadata">>): Promise<RunResponse>;
99
+ /**
100
+ * Delete a run
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * await runs.delete('run_abc123');
105
+ * ```
106
+ */
107
+ delete(runId: string): Promise<void>;
108
+ /**
109
+ * Create multiple runs in batch
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * const { created, failed } = await runs.batch([
114
+ * { agentId: 'agent_1', conversationMessages: [...] },
115
+ * { agentId: 'agent_1', conversationMessages: [...] },
116
+ * ]);
117
+ * ```
118
+ */
119
+ batch(runsData: RunOptions[]): Promise<{
120
+ created: RunResponse[];
121
+ failed: Array<{
122
+ index: number;
123
+ error: string;
124
+ }>;
125
+ }>;
126
+ /**
127
+ * Get run statistics for an agent
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const stats = await runs.stats('agent_123', {
132
+ * from: '2024-01-01',
133
+ * to: '2024-01-31',
134
+ * });
135
+ * ```
136
+ */
137
+ stats(agentId: string, options?: {
138
+ from?: string | Date;
139
+ to?: string | Date;
140
+ }): Promise<RunStats>;
141
+ /**
142
+ * Get traces for a run
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * const traces = await runs.getTraces('run_abc123');
147
+ * ```
148
+ */
149
+ getTraces(runId: string): Promise<unknown[]>;
150
+ /**
151
+ * Add a trace to a run
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * await runs.addTrace('run_abc123', {
156
+ * spans: [...],
157
+ * timestamp: new Date().toISOString(),
158
+ * });
159
+ * ```
160
+ */
161
+ addTrace(runId: string, traceData: {
162
+ spans?: unknown[];
163
+ timestamp?: string;
164
+ metadata?: Record<string, unknown>;
165
+ }): Promise<{
166
+ traceId: string;
167
+ }>;
168
+ };
169
+ /**
170
+ * Create a run with customer context snapshot
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * const run = await createRunWithContext({
175
+ * agentId: 'agent_123',
176
+ * conversationMessages: [...],
177
+ * customerContext: {
178
+ * arr: 100000,
179
+ * healthScore: 92,
180
+ * },
181
+ * });
182
+ * ```
183
+ */
184
+ export declare function createRunWithContext(options: RunOptions & {
185
+ customerContext: CustomerContextSnapshot;
186
+ }): Promise<RunResponse>;
187
+ /**
188
+ * Convert conversation messages to OpenAI format
189
+ */
190
+ export declare function toOpenAIMessages(messages: ConversationMessage[]): Array<{
191
+ role: string;
192
+ content: string;
193
+ }>;
194
+ /**
195
+ * Convert OpenAI format messages to ThinkHive format
196
+ */
197
+ export declare function fromOpenAIMessages(messages: Array<{
198
+ role: string;
199
+ content: string;
200
+ }>): ConversationMessage[];
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK v3.0 - Runs API
4
+ *
5
+ * Run-centric API for creating and managing runs (the atomic unit in v3)
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runs = void 0;
9
+ exports.createRunWithContext = createRunWithContext;
10
+ exports.toOpenAIMessages = toOpenAIMessages;
11
+ exports.fromOpenAIMessages = fromOpenAIMessages;
12
+ const client_1 = require("../core/client");
13
+ /**
14
+ * Runs API client for v3 run-centric operations
15
+ */
16
+ exports.runs = {
17
+ /**
18
+ * Create a new run
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const run = await runs.create({
23
+ * agentId: 'agent_123',
24
+ * conversationMessages: [
25
+ * { role: 'user', content: 'Help me with my order' },
26
+ * { role: 'assistant', content: 'I can help with that...' },
27
+ * ],
28
+ * outcome: 'resolved',
29
+ * customerContext: {
30
+ * arr: 50000,
31
+ * healthScore: 85,
32
+ * segment: 'enterprise',
33
+ * },
34
+ * });
35
+ * ```
36
+ */
37
+ async create(options) {
38
+ const startedAt = options.startedAt
39
+ ? new Date(options.startedAt).toISOString()
40
+ : new Date().toISOString();
41
+ const payload = {
42
+ agentId: options.agentId,
43
+ startedAt,
44
+ endedAt: options.endedAt
45
+ ? new Date(options.endedAt).toISOString()
46
+ : undefined,
47
+ outcome: options.outcome,
48
+ outcomeReason: options.outcomeReason,
49
+ conversationMessages: options.conversationMessages,
50
+ modelId: options.modelId,
51
+ promptVersion: options.promptVersion,
52
+ sessionId: options.sessionId,
53
+ customerContext: options.customerContext,
54
+ metadata: options.metadata,
55
+ };
56
+ return (0, client_1.apiRequestWithData)('/runs', {
57
+ method: 'POST',
58
+ body: payload,
59
+ });
60
+ },
61
+ /**
62
+ * Get a run by ID
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const run = await runs.get('run_abc123');
67
+ * ```
68
+ */
69
+ async get(runId) {
70
+ return (0, client_1.apiRequestWithData)(`/runs/${runId}`);
71
+ },
72
+ /**
73
+ * List runs with filters
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const { items, hasMore } = await runs.list({
78
+ * agentId: 'agent_123',
79
+ * outcome: 'failed',
80
+ * limit: 20,
81
+ * });
82
+ * ```
83
+ */
84
+ async list(options = {}) {
85
+ const params = new URLSearchParams();
86
+ if (options.agentId)
87
+ params.set('agentId', options.agentId);
88
+ if (options.ticketId)
89
+ params.set('ticketId', options.ticketId);
90
+ if (options.customerAccountId)
91
+ params.set('customerAccountId', options.customerAccountId);
92
+ if (options.outcome)
93
+ params.set('outcome', options.outcome);
94
+ if (options.startedAfter) {
95
+ params.set('startedAfter', new Date(options.startedAfter).toISOString());
96
+ }
97
+ if (options.startedBefore) {
98
+ params.set('startedBefore', new Date(options.startedBefore).toISOString());
99
+ }
100
+ if (options.limit)
101
+ params.set('limit', String(options.limit));
102
+ if (options.offset)
103
+ params.set('offset', String(options.offset));
104
+ const response = await (0, client_1.apiRequest)(`/runs?${params.toString()}`);
105
+ return response.data;
106
+ },
107
+ /**
108
+ * Update a run
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * await runs.update('run_abc123', {
113
+ * outcome: 'resolved',
114
+ * outcomeReason: 'Customer confirmed issue resolved',
115
+ * });
116
+ * ```
117
+ */
118
+ async update(runId, updates) {
119
+ return (0, client_1.apiRequestWithData)(`/runs/${runId}`, {
120
+ method: 'PUT',
121
+ body: updates,
122
+ });
123
+ },
124
+ /**
125
+ * Delete a run
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * await runs.delete('run_abc123');
130
+ * ```
131
+ */
132
+ async delete(runId) {
133
+ await (0, client_1.apiRequest)(`/runs/${runId}`, { method: 'DELETE' });
134
+ },
135
+ /**
136
+ * Create multiple runs in batch
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const { created, failed } = await runs.batch([
141
+ * { agentId: 'agent_1', conversationMessages: [...] },
142
+ * { agentId: 'agent_1', conversationMessages: [...] },
143
+ * ]);
144
+ * ```
145
+ */
146
+ async batch(runsData) {
147
+ const payload = runsData.map((r) => ({
148
+ agentId: r.agentId,
149
+ startedAt: r.startedAt
150
+ ? new Date(r.startedAt).toISOString()
151
+ : new Date().toISOString(),
152
+ endedAt: r.endedAt ? new Date(r.endedAt).toISOString() : undefined,
153
+ outcome: r.outcome,
154
+ outcomeReason: r.outcomeReason,
155
+ conversationMessages: r.conversationMessages,
156
+ modelId: r.modelId,
157
+ promptVersion: r.promptVersion,
158
+ sessionId: r.sessionId,
159
+ customerContext: r.customerContext,
160
+ metadata: r.metadata,
161
+ }));
162
+ return (0, client_1.apiRequestWithData)('/runs/batch', {
163
+ method: 'POST',
164
+ body: { runs: payload },
165
+ });
166
+ },
167
+ /**
168
+ * Get run statistics for an agent
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const stats = await runs.stats('agent_123', {
173
+ * from: '2024-01-01',
174
+ * to: '2024-01-31',
175
+ * });
176
+ * ```
177
+ */
178
+ async stats(agentId, options = {}) {
179
+ const params = new URLSearchParams();
180
+ if (options.from)
181
+ params.set('from', new Date(options.from).toISOString());
182
+ if (options.to)
183
+ params.set('to', new Date(options.to).toISOString());
184
+ return (0, client_1.apiRequestWithData)(`/runs/stats/${agentId}?${params.toString()}`);
185
+ },
186
+ /**
187
+ * Get traces for a run
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * const traces = await runs.getTraces('run_abc123');
192
+ * ```
193
+ */
194
+ async getTraces(runId) {
195
+ return (0, client_1.apiRequestWithData)(`/runs/${runId}/traces`);
196
+ },
197
+ /**
198
+ * Add a trace to a run
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * await runs.addTrace('run_abc123', {
203
+ * spans: [...],
204
+ * timestamp: new Date().toISOString(),
205
+ * });
206
+ * ```
207
+ */
208
+ async addTrace(runId, traceData) {
209
+ return (0, client_1.apiRequestWithData)(`/runs/${runId}/traces`, {
210
+ method: 'POST',
211
+ body: traceData,
212
+ });
213
+ },
214
+ };
215
+ // ============================================================================
216
+ // HELPER FUNCTIONS
217
+ // ============================================================================
218
+ /**
219
+ * Create a run with customer context snapshot
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * const run = await createRunWithContext({
224
+ * agentId: 'agent_123',
225
+ * conversationMessages: [...],
226
+ * customerContext: {
227
+ * arr: 100000,
228
+ * healthScore: 92,
229
+ * },
230
+ * });
231
+ * ```
232
+ */
233
+ async function createRunWithContext(options) {
234
+ // Ensure capturedAt is set
235
+ const customerContext = {
236
+ ...options.customerContext,
237
+ capturedAt: options.customerContext.capturedAt || new Date().toISOString(),
238
+ };
239
+ return exports.runs.create({
240
+ ...options,
241
+ customerContext,
242
+ });
243
+ }
244
+ /**
245
+ * Convert conversation messages to OpenAI format
246
+ */
247
+ function toOpenAIMessages(messages) {
248
+ return messages.map((m) => ({
249
+ role: m.role,
250
+ content: m.content,
251
+ }));
252
+ }
253
+ /**
254
+ * Convert OpenAI format messages to ThinkHive format
255
+ */
256
+ function fromOpenAIMessages(messages) {
257
+ return messages.map((m) => ({
258
+ role: m.role,
259
+ content: m.content,
260
+ }));
261
+ }
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcnVucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBZ1NILG9EQWFDO0FBS0QsNENBT0M7QUFLRCxnREFPQztBQW5VRCwyQ0FBZ0U7QUEwQ2hFOztHQUVHO0FBQ1UsUUFBQSxJQUFJLEdBQUc7SUFDbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQW1CO1FBQzlCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQzNDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLFNBQVM7WUFDVCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN6QyxDQUFDLENBQUMsU0FBUztZQUNiLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtZQUNsRCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzNCLENBQUM7UUFFRixPQUFPLElBQUEsMkJBQWtCLEVBQWMsT0FBTyxFQUFFO1lBQzlD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Q0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2hDLFFBQWtEO0lBRWxELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQW1DO1FBQzNDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztLQUNuQixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaW5rSGl2ZSBTREsgdjMuMCAtIFJ1bnMgQVBJXG4gKlxuICogUnVuLWNlbnRyaWMgQVBJIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgcnVucyAodGhlIGF0b21pYyB1bml0IGluIHYzKVxuICovXG5cbmltcG9ydCB7IGFwaVJlcXVlc3QsIGFwaVJlcXVlc3RXaXRoRGF0YSB9IGZyb20gJy4uL2NvcmUvY2xpZW50JztcbmltcG9ydCB0eXBlIHtcbiAgUnVuT3B0aW9ucyxcbiAgUnVuUmVzcG9uc2UsXG4gIEFwaVJlc3BvbnNlLFxuICBQYWdpbmF0ZWRSZXNwb25zZSxcbiAgQ3VzdG9tZXJDb250ZXh0U25hcHNob3QsXG4gIENvbnZlcnNhdGlvbk1lc3NhZ2UsXG4gIFJ1bk91dGNvbWUsXG59IGZyb20gJy4uL2NvcmUvdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSVU5TIEFQSSBDTElFTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMaXN0IHJ1bnMgcXVlcnkgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RSdW5zT3B0aW9ucyB7XG4gIGFnZW50SWQ/OiBzdHJpbmc7XG4gIHRpY2tldElkPzogc3RyaW5nO1xuICBjdXN0b21lckFjY291bnRJZD86IHN0cmluZztcbiAgb3V0Y29tZT86IFJ1bk91dGNvbWU7XG4gIHN0YXJ0ZWRBZnRlcj86IHN0cmluZyB8IERhdGU7XG4gIHN0YXJ0ZWRCZWZvcmU/OiBzdHJpbmcgfCBEYXRlO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJ1biBzdGF0cyByZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0YXRzIHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBwZXJpb2Q6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH07XG4gIHRvdGFsUnVuczogbnVtYmVyO1xuICBvdXRjb21lQnJlYWtkb3duOiBSZWNvcmQ8UnVuT3V0Y29tZSwgbnVtYmVyPjtcbiAgYXZnRHVyYXRpb25NczogbnVtYmVyO1xuICBsaW5rZWRUaWNrZXRzOiBudW1iZXI7XG4gIHVubGlua2VkUnVuczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJ1bnMgQVBJIGNsaWVudCBmb3IgdjMgcnVuLWNlbnRyaWMgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgcnVucyA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBydW5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBydW4gPSBhd2FpdCBydW5zLmNyZWF0ZSh7XG4gICAqICAgYWdlbnRJZDogJ2FnZW50XzEyMycsXG4gICAqICAgY29udmVyc2F0aW9uTWVzc2FnZXM6IFtcbiAgICogICAgIHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiAnSGVscCBtZSB3aXRoIG15IG9yZGVyJyB9LFxuICAgKiAgICAgeyByb2xlOiAnYXNzaXN0YW50JywgY29udGVudDogJ0kgY2FuIGhlbHAgd2l0aCB0aGF0Li4uJyB9LFxuICAgKiAgIF0sXG4gICAqICAgb3V0Y29tZTogJ3Jlc29sdmVkJyxcbiAgICogICBjdXN0b21lckNvbnRleHQ6IHtcbiAgICogICAgIGFycjogNTAwMDAsXG4gICAqICAgICBoZWFsdGhTY29yZTogODUsXG4gICAqICAgICBzZWdtZW50OiAnZW50ZXJwcmlzZScsXG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPFJ1blJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gb3B0aW9ucy5zdGFydGVkQXRcbiAgICAgID8gbmV3IERhdGUob3B0aW9ucy5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKClcbiAgICAgIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGFnZW50SWQ6IG9wdGlvbnMuYWdlbnRJZCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGVuZGVkQXQ6IG9wdGlvbnMuZW5kZWRBdFxuICAgICAgICA/IG5ldyBEYXRlKG9wdGlvbnMuZW5kZWRBdCkudG9JU09TdHJpbmcoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG91dGNvbWU6IG9wdGlvbnMub3V0Y29tZSxcbiAgICAgIG91dGNvbWVSZWFzb246IG9wdGlvbnMub3V0Y29tZVJlYXNvbixcbiAgICAgIGNvbnZlcnNhdGlvbk1lc3NhZ2VzOiBvcHRpb25zLmNvbnZlcnNhdGlvbk1lc3NhZ2VzLFxuICAgICAgbW9kZWxJZDogb3B0aW9ucy5tb2RlbElkLFxuICAgICAgcHJvbXB0VmVyc2lvbjogb3B0aW9ucy5wcm9tcHRWZXJzaW9uLFxuICAgICAgc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCxcbiAgICAgIGN1c3RvbWVyQ29udGV4dDogb3B0aW9ucy5jdXN0b21lckNvbnRleHQsXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxSdW5SZXNwb25zZT4oJy9ydW5zJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBwYXlsb2FkLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSBydW4gYnkgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBydW4gPSBhd2FpdCBydW5zLmdldCgncnVuX2FiYzEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldChydW5JZDogc3RyaW5nKTogUHJvbWlzZTxSdW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8UnVuUmVzcG9uc2U+KGAvcnVucy8ke3J1bklkfWApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0IHJ1bnMgd2l0aCBmaWx0ZXJzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBpdGVtcywgaGFzTW9yZSB9ID0gYXdhaXQgcnVucy5saXN0KHtcbiAgICogICBhZ2VudElkOiAnYWdlbnRfMTIzJyxcbiAgICogICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICogICBsaW1pdDogMjAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpc3QoXG4gICAgb3B0aW9uczogTGlzdFJ1bnNPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTx7IGl0ZW1zOiBSdW5SZXNwb25zZVtdOyBsaW1pdDogbnVtYmVyOyBvZmZzZXQ6IG51bWJlcjsgaGFzTW9yZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChvcHRpb25zLmFnZW50SWQpIHBhcmFtcy5zZXQoJ2FnZW50SWQnLCBvcHRpb25zLmFnZW50SWQpO1xuICAgIGlmIChvcHRpb25zLnRpY2tldElkKSBwYXJhbXMuc2V0KCd0aWNrZXRJZCcsIG9wdGlvbnMudGlja2V0SWQpO1xuICAgIGlmIChvcHRpb25zLmN1c3RvbWVyQWNjb3VudElkKSBwYXJhbXMuc2V0KCdjdXN0b21lckFjY291bnRJZCcsIG9wdGlvbnMuY3VzdG9tZXJBY2NvdW50SWQpO1xuICAgIGlmIChvcHRpb25zLm91dGNvbWUpIHBhcmFtcy5zZXQoJ291dGNvbWUnLCBvcHRpb25zLm91dGNvbWUpO1xuICAgIGlmIChvcHRpb25zLnN0YXJ0ZWRBZnRlcikge1xuICAgICAgcGFyYW1zLnNldCgnc3RhcnRlZEFmdGVyJywgbmV3IERhdGUob3B0aW9ucy5zdGFydGVkQWZ0ZXIpLnRvSVNPU3RyaW5nKCkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zdGFydGVkQmVmb3JlKSB7XG4gICAgICBwYXJhbXMuc2V0KCdzdGFydGVkQmVmb3JlJywgbmV3IERhdGUob3B0aW9ucy5zdGFydGVkQmVmb3JlKS50b0lTT1N0cmluZygpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcbiAgICBpZiAob3B0aW9ucy5vZmZzZXQpIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhvcHRpb25zLm9mZnNldCkpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlSZXF1ZXN0PFBhZ2luYXRlZFJlc3BvbnNlPFJ1blJlc3BvbnNlPj4oXG4gICAgICBgL3J1bnM/JHtwYXJhbXMudG9TdHJpbmcoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIGEgcnVuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgcnVucy51cGRhdGUoJ3J1bl9hYmMxMjMnLCB7XG4gICAqICAgb3V0Y29tZTogJ3Jlc29sdmVkJyxcbiAgICogICBvdXRjb21lUmVhc29uOiAnQ3VzdG9tZXIgY29uZmlybWVkIGlzc3VlIHJlc29sdmVkJyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxQaWNrPFJ1bk9wdGlvbnMsICdvdXRjb21lJyB8ICdvdXRjb21lUmVhc29uJyB8ICdlbmRlZEF0JyB8ICdtZXRhZGF0YSc+PlxuICApOiBQcm9taXNlPFJ1blJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxSdW5SZXNwb25zZT4oYC9ydW5zLyR7cnVuSWR9YCwge1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGJvZHk6IHVwZGF0ZXMsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHJ1blxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHJ1bnMuZGVsZXRlKCdydW5fYWJjMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBhcGlSZXF1ZXN0KGAvcnVucy8ke3J1bklkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIHJ1bnMgaW4gYmF0Y2hcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IGNyZWF0ZWQsIGZhaWxlZCB9ID0gYXdhaXQgcnVucy5iYXRjaChbXG4gICAqICAgeyBhZ2VudElkOiAnYWdlbnRfMScsIGNvbnZlcnNhdGlvbk1lc3NhZ2VzOiBbLi4uXSB9LFxuICAgKiAgIHsgYWdlbnRJZDogJ2FnZW50XzEnLCBjb252ZXJzYXRpb25NZXNzYWdlczogWy4uLl0gfSxcbiAgICogXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYmF0Y2goXG4gICAgcnVuc0RhdGE6IFJ1bk9wdGlvbnNbXVxuICApOiBQcm9taXNlPHsgY3JlYXRlZDogUnVuUmVzcG9uc2VbXTsgZmFpbGVkOiBBcnJheTx7IGluZGV4OiBudW1iZXI7IGVycm9yOiBzdHJpbmcgfT4gfT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBydW5zRGF0YS5tYXAoKHIpID0+ICh7XG4gICAgICBhZ2VudElkOiByLmFnZW50SWQsXG4gICAgICBzdGFydGVkQXQ6IHIuc3RhcnRlZEF0XG4gICAgICAgID8gbmV3IERhdGUoci5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBlbmRlZEF0OiByLmVuZGVkQXQgPyBuZXcgRGF0ZShyLmVuZGVkQXQpLnRvSVNPU3RyaW5nKCkgOiB1bmRlZmluZWQsXG4gICAgICBvdXRjb21lOiByLm91dGNvbWUsXG4gICAgICBvdXRjb21lUmVhc29uOiByLm91dGNvbWVSZWFzb24sXG4gICAgICBjb252ZXJzYXRpb25NZXNzYWdlczogci5jb252ZXJzYXRpb25NZXNzYWdlcyxcbiAgICAgIG1vZGVsSWQ6IHIubW9kZWxJZCxcbiAgICAgIHByb21wdFZlcnNpb246IHIucHJvbXB0VmVyc2lvbixcbiAgICAgIHNlc3Npb25JZDogci5zZXNzaW9uSWQsXG4gICAgICBjdXN0b21lckNvbnRleHQ6IHIuY3VzdG9tZXJDb250ZXh0LFxuICAgICAgbWV0YWRhdGE6IHIubWV0YWRhdGEsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YSgnL3J1bnMvYmF0Y2gnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHsgcnVuczogcGF5bG9hZCB9LFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgcnVuIHN0YXRpc3RpY3MgZm9yIGFuIGFnZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHMgPSBhd2FpdCBydW5zLnN0YXRzKCdhZ2VudF8xMjMnLCB7XG4gICAqICAgZnJvbTogJzIwMjQtMDEtMDEnLFxuICAgKiAgIHRvOiAnMjAyNC0wMS0zMScsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHN0YXRzKFxuICAgIGFnZW50SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGZyb20/OiBzdHJpbmcgfCBEYXRlOyB0bz86IHN0cmluZyB8IERhdGUgfSA9IHt9XG4gICk6IFByb21pc2U8UnVuU3RhdHM+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnMuZnJvbSkgcGFyYW1zLnNldCgnZnJvbScsIG5ldyBEYXRlKG9wdGlvbnMuZnJvbSkudG9JU09TdHJpbmcoKSk7XG4gICAgaWYgKG9wdGlvbnMudG8pIHBhcmFtcy5zZXQoJ3RvJywgbmV3IERhdGUob3B0aW9ucy50bykudG9JU09TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFJ1blN0YXRzPihcbiAgICAgIGAvcnVucy9zdGF0cy8ke2FnZW50SWR9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCB0cmFjZXMgZm9yIGEgcnVuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdHJhY2VzID0gYXdhaXQgcnVucy5nZXRUcmFjZXMoJ3J1bl9hYmMxMjMnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRUcmFjZXMocnVuSWQ6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTx1bmtub3duW10+KGAvcnVucy8ke3J1bklkfS90cmFjZXNgKTtcbiAgfSxcblxuICAvKipcbiAgICogQWRkIGEgdHJhY2UgdG8gYSBydW5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBydW5zLmFkZFRyYWNlKCdydW5fYWJjMTIzJywge1xuICAgKiAgIHNwYW5zOiBbLi4uXSxcbiAgICogICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYWRkVHJhY2UoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICB0cmFjZURhdGE6IHsgc3BhbnM/OiB1bmtub3duW107IHRpbWVzdGFtcD86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG4gICk6IFByb21pc2U8eyB0cmFjZUlkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGEoYC9ydW5zLyR7cnVuSWR9L3RyYWNlc2AsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogdHJhY2VEYXRhLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZSBhIHJ1biB3aXRoIGN1c3RvbWVyIGNvbnRleHQgc25hcHNob3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcnVuID0gYXdhaXQgY3JlYXRlUnVuV2l0aENvbnRleHQoe1xuICogICBhZ2VudElkOiAnYWdlbnRfMTIzJyxcbiAqICAgY29udmVyc2F0aW9uTWVzc2FnZXM6IFsuLi5dLFxuICogICBjdXN0b21lckNvbnRleHQ6IHtcbiAqICAgICBhcnI6IDEwMDAwMCxcbiAqICAgICBoZWFsdGhTY29yZTogOTIsXG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUnVuV2l0aENvbnRleHQoXG4gIG9wdGlvbnM6IFJ1bk9wdGlvbnMgJiB7IGN1c3RvbWVyQ29udGV4dDogQ3VzdG9tZXJDb250ZXh0U25hcHNob3QgfVxuKTogUHJvbWlzZTxSdW5SZXNwb25zZT4ge1xuICAvLyBFbnN1cmUgY2FwdHVyZWRBdCBpcyBzZXRcbiAgY29uc3QgY3VzdG9tZXJDb250ZXh0OiBDdXN0b21lckNvbnRleHRTbmFwc2hvdCA9IHtcbiAgICAuLi5vcHRpb25zLmN1c3RvbWVyQ29udGV4dCxcbiAgICBjYXB0dXJlZEF0OiBvcHRpb25zLmN1c3RvbWVyQ29udGV4dC5jYXB0dXJlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgfTtcblxuICByZXR1cm4gcnVucy5jcmVhdGUoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY3VzdG9tZXJDb250ZXh0LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNvbnZlcnNhdGlvbiBtZXNzYWdlcyB0byBPcGVuQUkgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b09wZW5BSU1lc3NhZ2VzKFxuICBtZXNzYWdlczogQ29udmVyc2F0aW9uTWVzc2FnZVtdXG4pOiBBcnJheTx7IHJvbGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobSkgPT4gKHtcbiAgICByb2xlOiBtLnJvbGUsXG4gICAgY29udGVudDogbS5jb250ZW50LFxuICB9KSk7XG59XG5cbi8qKlxuICogQ29udmVydCBPcGVuQUkgZm9ybWF0IG1lc3NhZ2VzIHRvIFRoaW5rSGl2ZSBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21PcGVuQUlNZXNzYWdlcyhcbiAgbWVzc2FnZXM6IEFycmF5PHsgcm9sZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT5cbik6IENvbnZlcnNhdGlvbk1lc3NhZ2VbXSB7XG4gIHJldHVybiBtZXNzYWdlcy5tYXAoKG0pID0+ICh7XG4gICAgcm9sZTogbS5yb2xlIGFzIENvbnZlcnNhdGlvbk1lc3NhZ2VbJ3JvbGUnXSxcbiAgICBjb250ZW50OiBtLmNvbnRlbnQsXG4gIH0pKTtcbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ThinkHive SDK v3.0 - HTTP Client
3
+ *
4
+ * Centralized HTTP client with authentication and error handling
5
+ */
6
+ export interface RequestOptions {
7
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
8
+ body?: unknown;
9
+ headers?: Record<string, string>;
10
+ /** Override API version for this request */
11
+ apiVersion?: 'v1' | 'v3';
12
+ }
13
+ /**
14
+ * Make an authenticated API request
15
+ */
16
+ export declare function apiRequest<T>(path: string, options?: RequestOptions): Promise<T>;
17
+ /**
18
+ * Make an API request and extract data from response wrapper
19
+ */
20
+ 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
+ export declare class ThinkHiveValidationError extends Error {
27
+ readonly field?: string | undefined;
28
+ constructor(message: string, field?: string | undefined);
29
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK v3.0 - HTTP Client
4
+ *
5
+ * Centralized HTTP client with authentication and error handling
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ThinkHiveValidationError = exports.ThinkHiveApiError = void 0;
9
+ exports.apiRequest = apiRequest;
10
+ exports.apiRequestWithData = apiRequestWithData;
11
+ const config_1 = require("./config");
12
+ /**
13
+ * Make an authenticated API request
14
+ */
15
+ async function apiRequest(path, options = {}) {
16
+ const config = (0, config_1.getConfig)();
17
+ const { method = 'GET', body, headers = {}, apiVersion } = options;
18
+ const version = apiVersion || config.apiVersion;
19
+ const url = `${config.endpoint}/api/${version}${path}`;
20
+ const requestHeaders = {
21
+ 'Content-Type': 'application/json',
22
+ 'X-SDK-Version': '3.0.0',
23
+ ...headers,
24
+ };
25
+ if (config.apiKey) {
26
+ requestHeaders['Authorization'] = `Bearer ${config.apiKey}`;
27
+ }
28
+ else if (config.agentId) {
29
+ requestHeaders['X-Agent-ID'] = config.agentId;
30
+ }
31
+ (0, config_1.debugLog)(`${method} ${url}`);
32
+ const response = await fetch(url, {
33
+ method,
34
+ headers: requestHeaders,
35
+ body: body ? JSON.stringify(body) : undefined,
36
+ });
37
+ // Handle deprecation warnings
38
+ if (response.headers.has('Deprecation')) {
39
+ const sunset = response.headers.get('Sunset');
40
+ const link = response.headers.get('Link');
41
+ console.warn(`[ThinkHive] Deprecation warning: This endpoint is deprecated.` +
42
+ (sunset ? ` Sunset: ${sunset}` : '') +
43
+ (link ? ` Successor: ${link}` : ''));
44
+ }
45
+ if (!response.ok) {
46
+ const errorText = await response.text();
47
+ let errorData = {};
48
+ try {
49
+ errorData = JSON.parse(errorText);
50
+ }
51
+ catch {
52
+ errorData = { message: errorText };
53
+ }
54
+ const error = new ThinkHiveApiError(errorData.message || `HTTP ${response.status}`, response.status, errorData.code);
55
+ throw error;
56
+ }
57
+ return response.json();
58
+ }
59
+ /**
60
+ * Make an API request and extract data from response wrapper
61
+ */
62
+ async function apiRequestWithData(path, options = {}) {
63
+ const response = await apiRequest(path, options);
64
+ if (!response.success) {
65
+ throw new ThinkHiveApiError(response.error?.message || 'Unknown error', 500, response.error?.code);
66
+ }
67
+ return response.data;
68
+ }
69
+ // ============================================================================
70
+ // ERRORS
71
+ // ============================================================================
72
+ class ThinkHiveApiError extends Error {
73
+ constructor(message, statusCode, code) {
74
+ super(message);
75
+ this.statusCode = statusCode;
76
+ this.code = code;
77
+ this.name = 'ThinkHiveApiError';
78
+ }
79
+ }
80
+ exports.ThinkHiveApiError = ThinkHiveApiError;
81
+ class ThinkHiveValidationError extends Error {
82
+ constructor(message, field) {
83
+ super(message);
84
+ this.field = field;
85
+ this.name = 'ThinkHiveValidationError';
86
+ }
87
+ }
88
+ exports.ThinkHiveValidationError = ThinkHiveValidationError;
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUFvQkgsZ0NBMkRDO0FBS0QsZ0RBYUM7QUEvRkQscUNBQStDO0FBZS9DOztHQUVHO0FBQ0ksS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBWSxFQUNaLFVBQTBCLEVBQUU7SUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSxrQkFBUyxHQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRW5FLE1BQU0sT0FBTyxHQUFHLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ2hELE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsUUFBUSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFFdkQsTUFBTSxjQUFjLEdBQTJCO1FBQzdDLGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsZUFBZSxFQUFFLE9BQU87UUFDeEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQztJQUVGLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLGNBQWMsQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RCxDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUEsaUJBQVEsRUFBQyxHQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNO1FBQ04sT0FBTyxFQUFFLGNBQWM7UUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUM5QyxDQUFDLENBQUM7SUFFSCw4QkFBOEI7SUFDOUIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0RBQStEO1lBQzdELENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEMsSUFBSSxTQUFTLEdBQXdDLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLGlCQUFpQixDQUNqQyxTQUFTLENBQUMsT0FBTyxJQUFJLFFBQVEsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUM5QyxRQUFRLENBQUMsTUFBTSxFQUNmLFNBQVMsQ0FBQyxJQUFJLENBQ2YsQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBZ0IsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLElBQVksRUFDWixVQUEwQixFQUFFO0lBRTVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFpQixJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksaUJBQWlCLENBQ3pCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQWUsRUFDMUMsR0FBRyxFQUNILFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQVMsQ0FBQztBQUM1QixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLFNBQVM7QUFDVCwrRUFBK0U7QUFFL0UsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQ0UsT0FBZSxFQUNDLFVBQWtCLEVBQ2xCLElBQWE7UUFFN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSEMsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFTO1FBRzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBVEQsOENBU0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLEtBQUs7SUFDakQsWUFDRSxPQUFlLEVBQ0MsS0FBYztRQUU5QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFGQyxVQUFLLEdBQUwsS0FBSyxDQUFTO1FBRzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBUkQsNERBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaW5rSGl2ZSBTREsgdjMuMCAtIEhUVFAgQ2xpZW50XG4gKlxuICogQ2VudHJhbGl6ZWQgSFRUUCBjbGllbnQgd2l0aCBhdXRoZW50aWNhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmdcbiAqL1xuXG5pbXBvcnQgeyBnZXRDb25maWcsIGRlYnVnTG9nIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBBcGlSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIVFRQIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgbWV0aG9kPzogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdERUxFVEUnO1xuICBib2R5PzogdW5rbm93bjtcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBPdmVycmlkZSBBUEkgdmVyc2lvbiBmb3IgdGhpcyByZXF1ZXN0ICovXG4gIGFwaVZlcnNpb24/OiAndjEnIHwgJ3YzJztcbn1cblxuLyoqXG4gKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgQVBJIHJlcXVlc3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwaVJlcXVlc3Q8VD4oXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICBjb25zdCB7IG1ldGhvZCA9ICdHRVQnLCBib2R5LCBoZWFkZXJzID0ge30sIGFwaVZlcnNpb24gfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdmVyc2lvbiA9IGFwaVZlcnNpb24gfHwgY29uZmlnLmFwaVZlcnNpb247XG4gIGNvbnN0IHVybCA9IGAke2NvbmZpZy5lbmRwb2ludH0vYXBpLyR7dmVyc2lvbn0ke3BhdGh9YDtcblxuICBjb25zdCByZXF1ZXN0SGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICdYLVNESy1WZXJzaW9uJzogJzMuMC4wJyxcbiAgICAuLi5oZWFkZXJzLFxuICB9O1xuXG4gIGlmIChjb25maWcuYXBpS2V5KSB7XG4gICAgcmVxdWVzdEhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXBpS2V5fWA7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmFnZW50SWQpIHtcbiAgICByZXF1ZXN0SGVhZGVyc1snWC1BZ2VudC1JRCddID0gY29uZmlnLmFnZW50SWQ7XG4gIH1cblxuICBkZWJ1Z0xvZyhgJHttZXRob2R9ICR7dXJsfWApO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZCxcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzXG4gIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnRGVwcmVjYXRpb24nKSkge1xuICAgIGNvbnN0IHN1bnNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTdW5zZXQnKTtcbiAgICBjb25zdCBsaW5rID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xpbmsnKTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW1RoaW5rSGl2ZV0gRGVwcmVjYXRpb24gd2FybmluZzogVGhpcyBlbmRwb2ludCBpcyBkZXByZWNhdGVkLmAgK1xuICAgICAgICAoc3Vuc2V0ID8gYCBTdW5zZXQ6ICR7c3Vuc2V0fWAgOiAnJykgK1xuICAgICAgICAobGluayA/IGAgU3VjY2Vzc29yOiAke2xpbmt9YCA6ICcnKVxuICAgICk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGxldCBlcnJvckRhdGE6IHsgbWVzc2FnZT86IHN0cmluZzsgY29kZT86IHN0cmluZyB9ID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGVycm9yRGF0YSA9IEpTT04ucGFyc2UoZXJyb3JUZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGVycm9yRGF0YSA9IHsgbWVzc2FnZTogZXJyb3JUZXh0IH07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgVGhpbmtIaXZlQXBpRXJyb3IoXG4gICAgICBlcnJvckRhdGEubWVzc2FnZSB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3JEYXRhLmNvZGVcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPFQ+O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gQVBJIHJlcXVlc3QgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIHJlc3BvbnNlIHdyYXBwZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwaVJlcXVlc3RXaXRoRGF0YTxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlSZXF1ZXN0PEFwaVJlc3BvbnNlPFQ+PihwYXRoLCBvcHRpb25zKTtcbiAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IFRoaW5rSGl2ZUFwaUVycm9yKFxuICAgICAgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InLFxuICAgICAgNTAwLFxuICAgICAgcmVzcG9uc2UuZXJyb3I/LmNvZGVcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5kYXRhIGFzIFQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVSUk9SU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgVGhpbmtIaXZlQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdUaGlua0hpdmVBcGlFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRoaW5rSGl2ZVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZD86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVGhpbmtIaXZlVmFsaWRhdGlvbkVycm9yJztcbiAgfVxufVxuIl19
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ThinkHive SDK v3.0 - Configuration
3
+ */
4
+ import type { InitOptions, Framework } from './types';
5
+ export declare const SDK_VERSION = "3.0.0";
6
+ export declare const DEFAULT_ENDPOINT = "https://thinkhivemind-h25z7pvd3q-uc.a.run.app";
7
+ export declare const DEFAULT_SERVICE_NAME = "my-ai-agent";
8
+ export interface ResolvedConfig {
9
+ apiKey: string;
10
+ agentId: string;
11
+ endpoint: string;
12
+ serviceName: string;
13
+ autoInstrument: boolean;
14
+ frameworks: Framework[];
15
+ debug: boolean;
16
+ apiVersion: 'v1' | 'v3';
17
+ }
18
+ /**
19
+ * Initialize configuration from options
20
+ */
21
+ export declare function initConfig(options?: InitOptions): ResolvedConfig;
22
+ /**
23
+ * Get current configuration
24
+ * @throws if not initialized
25
+ */
26
+ export declare function getConfig(): ResolvedConfig;
27
+ /**
28
+ * Check if SDK is initialized
29
+ */
30
+ export declare function isInitialized(): boolean;
31
+ /**
32
+ * Reset configuration (for testing)
33
+ */
34
+ export declare function resetConfig(): void;
35
+ /**
36
+ * Debug log helper
37
+ */
38
+ export declare function debugLog(...args: unknown[]): void;