@thinkhive/sdk 4.1.0 → 4.2.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,81 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK - LLM Costs API
4
+ *
5
+ * LLM cost tracking and optimization analytics
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.default = exports.llmCosts = void 0;
9
+ exports.formatCost = formatCost;
10
+ const client_1 = require("../core/client");
11
+ // ============================================================================
12
+ // LLM COSTS API CLIENT
13
+ // ============================================================================
14
+ /**
15
+ * LLM Costs API client for tracking and optimizing LLM spending
16
+ */
17
+ exports.llmCosts = {
18
+ /**
19
+ * Get cost summary across all agents
20
+ *
21
+ * @param opts - Period filter option
22
+ * @returns Cost summary with breakdown
23
+ */
24
+ async getSummary(opts) {
25
+ const params = new URLSearchParams();
26
+ if (opts?.period)
27
+ params.set('period', opts.period);
28
+ const query = params.toString();
29
+ return (0, client_1.apiRequestWithData)(`/llm-costs/summary${query ? `?${query}` : ''}`, {
30
+ apiVersion: 'none',
31
+ });
32
+ },
33
+ /**
34
+ * Get cost breakdown for a specific agent
35
+ *
36
+ * @param agentId - The agent ID
37
+ * @param opts - Period filter option
38
+ * @returns Agent cost breakdown
39
+ */
40
+ async getBreakdown(agentId, opts) {
41
+ const params = new URLSearchParams();
42
+ if (opts?.period)
43
+ params.set('period', opts.period);
44
+ const query = params.toString();
45
+ return (0, client_1.apiRequestWithData)(`/llm-costs/breakdown/${agentId}${query ? `?${query}` : ''}`, { apiVersion: 'none' });
46
+ },
47
+ /**
48
+ * Get cost savings from optimizations
49
+ *
50
+ * @returns Savings data and optimization history
51
+ */
52
+ async getSavings() {
53
+ return (0, client_1.apiRequestWithData)('/llm-costs/savings', {
54
+ apiVersion: 'none',
55
+ });
56
+ },
57
+ /**
58
+ * Get optimization statistics and recommendations
59
+ *
60
+ * @returns Optimization stats with recommendations
61
+ */
62
+ async getOptimizationStats() {
63
+ return (0, client_1.apiRequestWithData)('/llm-costs/optimization-stats', {
64
+ apiVersion: 'none',
65
+ });
66
+ },
67
+ };
68
+ exports.default = exports.llmCosts;
69
+ // ============================================================================
70
+ // HELPER FUNCTIONS
71
+ // ============================================================================
72
+ /**
73
+ * Format a cost amount as a currency string
74
+ *
75
+ * @param amount - The cost amount in dollars
76
+ * @returns Formatted string (e.g., "$12.34")
77
+ */
78
+ function formatCost(amount) {
79
+ return `$${amount.toFixed(2)}`;
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGxtLWNvc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9sbG0tY29zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQXNKSCxnQ0FFQztBQXRKRCwyQ0FBb0Q7QUF5RXBELCtFQUErRTtBQUMvRSx1QkFBdUI7QUFDdkIsK0VBQStFO0FBRS9FOztHQUVHO0FBQ1UsUUFBQSxRQUFRLEdBQUc7SUFDdEI7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLElBQXVCO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLEVBQUUsTUFBTTtZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFBLDJCQUFrQixFQUFjLHFCQUFxQixLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3RGLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWUsRUFBRSxJQUF1QjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxFQUFFLE1BQU07WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsd0JBQXdCLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUM1RCxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxPQUFPLElBQUEsMkJBQWtCLEVBQWMsb0JBQW9CLEVBQUU7WUFDM0QsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLE9BQU8sSUFBQSwyQkFBa0IsRUFBb0IsK0JBQStCLEVBQUU7WUFDNUUsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUM7QUFnQm1CLGtCQXhFUixnQkFBUSxDQXdFTztBQWQ1QiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7Ozs7R0FLRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxNQUFjO0lBQ3ZDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyAtIExMTSBDb3N0cyBBUElcbiAqXG4gKiBMTE0gY29zdCB0cmFja2luZyBhbmQgb3B0aW1pemF0aW9uIGFuYWx5dGljc1xuICovXG5cbmltcG9ydCB7IGFwaVJlcXVlc3RXaXRoRGF0YSB9IGZyb20gJy4uL2NvcmUvY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIE9wdGlvbnMgZm9yIGNvc3Qgc3VtbWFyeSBhbmQgYnJlYWtkb3duICovXG5leHBvcnQgaW50ZXJmYWNlIENvc3RRdWVyeU9wdGlvbnMge1xuICBwZXJpb2Q/OiAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAncXVhcnRlcicgfCAneWVhcic7XG59XG5cbi8qKiBDb3N0IHN1bW1hcnkgYWNyb3NzIGFsbCBhZ2VudHMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29zdFN1bW1hcnkge1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxSZXF1ZXN0czogbnVtYmVyO1xuICBwZXJpb2Q6IHN0cmluZztcbiAgYnJlYWtkb3duOiBDb3N0QnJlYWtkb3duSXRlbVtdO1xufVxuXG4vKiogQ29zdCBicmVha2Rvd24gaXRlbSAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3N0QnJlYWtkb3duSXRlbSB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG4gIGNvc3Q6IG51bWJlcjtcbiAgdG9rZW5zOiBudW1iZXI7XG4gIHJlcXVlc3RzOiBudW1iZXI7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xufVxuXG4vKiogQWdlbnQtbGV2ZWwgY29zdCBicmVha2Rvd24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3N0QnJlYWtkb3duIHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxSZXF1ZXN0czogbnVtYmVyO1xuICBwZXJpb2Q6IHN0cmluZztcbiAgbW9kZWxzOiBDb3N0QnJlYWtkb3duSXRlbVtdO1xufVxuXG4vKiogQ29zdCBzYXZpbmdzIGRhdGEgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29zdFNhdmluZ3Mge1xuICB0b3RhbFNhdmVkOiBudW1iZXI7XG4gIHNhdmluZ3NQZXJjZW50OiBudW1iZXI7XG4gIG9wdGltaXphdGlvbnM6IE9wdGltaXphdGlvbkVudHJ5W107XG59XG5cbi8qKiBBIHNpbmdsZSBvcHRpbWl6YXRpb24gZW50cnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW1pemF0aW9uRW50cnkge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHNhdmVkQW1vdW50OiBudW1iZXI7XG4gIGFwcGxpZWRBdDogc3RyaW5nO1xufVxuXG4vKiogT3B0aW1pemF0aW9uIHN0YXRpc3RpY3MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW1pemF0aW9uU3RhdHMge1xuICBjYWNoZUhpdFJhdGU6IG51bWJlcjtcbiAgYXZnVG9rZW5SZWR1Y3Rpb246IG51bWJlcjtcbiAgbW9kZWxEb3duZ3JhZGVDb3VudDogbnVtYmVyO1xuICB0b3RhbE9wdGltaXphdGlvbnM6IG51bWJlcjtcbiAgcmVjb21tZW5kYXRpb25zOiBPcHRpbWl6YXRpb25SZWNvbW1lbmRhdGlvbltdO1xufVxuXG4vKiogT3B0aW1pemF0aW9uIHJlY29tbWVuZGF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGltaXphdGlvblJlY29tbWVuZGF0aW9uIHtcbiAgdHlwZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBlc3RpbWF0ZWRTYXZpbmdzOiBudW1iZXI7XG4gIHByaW9yaXR5OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMTE0gQ09TVFMgQVBJIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIExMTSBDb3N0cyBBUEkgY2xpZW50IGZvciB0cmFja2luZyBhbmQgb3B0aW1pemluZyBMTE0gc3BlbmRpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGxsbUNvc3RzID0ge1xuICAvKipcbiAgICogR2V0IGNvc3Qgc3VtbWFyeSBhY3Jvc3MgYWxsIGFnZW50c1xuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIFBlcmlvZCBmaWx0ZXIgb3B0aW9uXG4gICAqIEByZXR1cm5zIENvc3Qgc3VtbWFyeSB3aXRoIGJyZWFrZG93blxuICAgKi9cbiAgYXN5bmMgZ2V0U3VtbWFyeShvcHRzPzogQ29zdFF1ZXJ5T3B0aW9ucyk6IFByb21pc2U8Q29zdFN1bW1hcnk+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdHM/LnBlcmlvZCkgcGFyYW1zLnNldCgncGVyaW9kJywgb3B0cy5wZXJpb2QpO1xuXG4gICAgY29uc3QgcXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPENvc3RTdW1tYXJ5PihgL2xsbS1jb3N0cy9zdW1tYXJ5JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgY29zdCBicmVha2Rvd24gZm9yIGEgc3BlY2lmaWMgYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSURcbiAgICogQHBhcmFtIG9wdHMgLSBQZXJpb2QgZmlsdGVyIG9wdGlvblxuICAgKiBAcmV0dXJucyBBZ2VudCBjb3N0IGJyZWFrZG93blxuICAgKi9cbiAgYXN5bmMgZ2V0QnJlYWtkb3duKGFnZW50SWQ6IHN0cmluZywgb3B0cz86IENvc3RRdWVyeU9wdGlvbnMpOiBQcm9taXNlPEFnZW50Q29zdEJyZWFrZG93bj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8ucGVyaW9kKSBwYXJhbXMuc2V0KCdwZXJpb2QnLCBvcHRzLnBlcmlvZCk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8QWdlbnRDb3N0QnJlYWtkb3duPihcbiAgICAgIGAvbGxtLWNvc3RzL2JyZWFrZG93bi8ke2FnZW50SWR9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCxcbiAgICAgIHsgYXBpVmVyc2lvbjogJ25vbmUnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgY29zdCBzYXZpbmdzIGZyb20gb3B0aW1pemF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBTYXZpbmdzIGRhdGEgYW5kIG9wdGltaXphdGlvbiBoaXN0b3J5XG4gICAqL1xuICBhc3luYyBnZXRTYXZpbmdzKCk6IFByb21pc2U8Q29zdFNhdmluZ3M+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPENvc3RTYXZpbmdzPignL2xsbS1jb3N0cy9zYXZpbmdzJywge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgb3B0aW1pemF0aW9uIHN0YXRpc3RpY3MgYW5kIHJlY29tbWVuZGF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBPcHRpbWl6YXRpb24gc3RhdHMgd2l0aCByZWNvbW1lbmRhdGlvbnNcbiAgICovXG4gIGFzeW5jIGdldE9wdGltaXphdGlvblN0YXRzKCk6IFByb21pc2U8T3B0aW1pemF0aW9uU3RhdHM+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPE9wdGltaXphdGlvblN0YXRzPignL2xsbS1jb3N0cy9vcHRpbWl6YXRpb24tc3RhdHMnLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRm9ybWF0IGEgY29zdCBhbW91bnQgYXMgYSBjdXJyZW5jeSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGNvc3QgYW1vdW50IGluIGRvbGxhcnNcbiAqIEByZXR1cm5zIEZvcm1hdHRlZCBzdHJpbmcgKGUuZy4sIFwiJDEyLjM0XCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb3N0KGFtb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAkJHthbW91bnQudG9GaXhlZCgyKX1gO1xufVxuXG5leHBvcnQgeyBsbG1Db3N0cyBhcyBkZWZhdWx0IH07XG4iXX0=
@@ -0,0 +1,103 @@
1
+ /**
2
+ * ThinkHive SDK - Notifications API
3
+ *
4
+ * Notification rules and alert management
5
+ */
6
+ /** Notification rule definition */
7
+ export interface NotificationRule {
8
+ id: string;
9
+ agentId: string;
10
+ name: string;
11
+ condition: string;
12
+ channel: string;
13
+ isEnabled: boolean;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ [key: string]: unknown;
17
+ }
18
+ /** Data for creating a notification rule */
19
+ export interface CreateNotificationRuleData {
20
+ agentId: string;
21
+ name: string;
22
+ condition: string;
23
+ channel: string;
24
+ isEnabled?: boolean;
25
+ threshold?: number;
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ /** Data for updating a notification rule */
29
+ export interface UpdateNotificationRuleData {
30
+ name?: string;
31
+ condition?: string;
32
+ channel?: string;
33
+ isEnabled?: boolean;
34
+ threshold?: number;
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+ /** A notification alert */
38
+ export interface Notification {
39
+ id: string;
40
+ agentId: string;
41
+ ruleId: string;
42
+ message: string;
43
+ isRead: boolean;
44
+ createdAt: string;
45
+ metadata?: Record<string, unknown>;
46
+ }
47
+ /**
48
+ * Notifications API client for managing notification rules and alerts
49
+ */
50
+ export declare const notifications: {
51
+ /**
52
+ * List notification rules for an agent
53
+ *
54
+ * @param agentId - The agent ID to list rules for
55
+ * @returns List of notification rules
56
+ */
57
+ listRules(agentId: string): Promise<NotificationRule[]>;
58
+ /**
59
+ * Get a notification rule by ID
60
+ *
61
+ * @param id - The rule ID
62
+ * @param agentId - Optional agent ID for scoping
63
+ * @returns The notification rule
64
+ */
65
+ getRule(id: string, agentId?: string): Promise<NotificationRule>;
66
+ /**
67
+ * Create a new notification rule
68
+ *
69
+ * @param data - Rule configuration data
70
+ * @returns The created notification rule
71
+ */
72
+ createRule(data: CreateNotificationRuleData): Promise<NotificationRule>;
73
+ /**
74
+ * Update an existing notification rule
75
+ *
76
+ * @param id - The rule ID to update
77
+ * @param data - Fields to update
78
+ * @returns The updated notification rule
79
+ */
80
+ updateRule(id: string, data: UpdateNotificationRuleData): Promise<NotificationRule>;
81
+ /**
82
+ * Delete a notification rule
83
+ *
84
+ * @param id - The rule ID to delete
85
+ */
86
+ deleteRule(id: string): Promise<void>;
87
+ /**
88
+ * List notifications for an agent
89
+ *
90
+ * @param agentId - The agent ID
91
+ * @param unreadOnly - Whether to only return unread notifications
92
+ * @returns List of notifications
93
+ */
94
+ listNotifications(agentId: string, unreadOnly?: boolean): Promise<Notification[]>;
95
+ /**
96
+ * Mark a notification as read
97
+ *
98
+ * @param id - The notification ID to mark as read
99
+ * @returns The updated notification
100
+ */
101
+ markAsRead(id: string): Promise<Notification>;
102
+ };
103
+ export { notifications as default };
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK - Notifications API
4
+ *
5
+ * Notification rules and alert management
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.default = exports.notifications = void 0;
9
+ const client_1 = require("../core/client");
10
+ // ============================================================================
11
+ // NOTIFICATIONS API CLIENT
12
+ // ============================================================================
13
+ /**
14
+ * Notifications API client for managing notification rules and alerts
15
+ */
16
+ exports.notifications = {
17
+ /**
18
+ * List notification rules for an agent
19
+ *
20
+ * @param agentId - The agent ID to list rules for
21
+ * @returns List of notification rules
22
+ */
23
+ async listRules(agentId) {
24
+ const params = new URLSearchParams({ agentId });
25
+ return (0, client_1.apiRequestWithData)(`/notification-rules?${params}`, {
26
+ apiVersion: 'none',
27
+ });
28
+ },
29
+ /**
30
+ * Get a notification rule by ID
31
+ *
32
+ * @param id - The rule ID
33
+ * @param agentId - Optional agent ID for scoping
34
+ * @returns The notification rule
35
+ */
36
+ async getRule(id, agentId) {
37
+ const params = new URLSearchParams();
38
+ if (agentId)
39
+ params.set('agentId', agentId);
40
+ const query = params.toString();
41
+ return (0, client_1.apiRequestWithData)(`/notification-rules/${id}${query ? `?${query}` : ''}`, { apiVersion: 'none' });
42
+ },
43
+ /**
44
+ * Create a new notification rule
45
+ *
46
+ * @param data - Rule configuration data
47
+ * @returns The created notification rule
48
+ */
49
+ async createRule(data) {
50
+ return (0, client_1.apiRequestWithData)('/notification-rules', {
51
+ method: 'POST',
52
+ body: data,
53
+ apiVersion: 'none',
54
+ });
55
+ },
56
+ /**
57
+ * Update an existing notification rule
58
+ *
59
+ * @param id - The rule ID to update
60
+ * @param data - Fields to update
61
+ * @returns The updated notification rule
62
+ */
63
+ async updateRule(id, data) {
64
+ return (0, client_1.apiRequestWithData)(`/notification-rules/${id}`, {
65
+ method: 'PATCH',
66
+ body: data,
67
+ apiVersion: 'none',
68
+ });
69
+ },
70
+ /**
71
+ * Delete a notification rule
72
+ *
73
+ * @param id - The rule ID to delete
74
+ */
75
+ async deleteRule(id) {
76
+ return (0, client_1.apiRequest)(`/notification-rules/${id}`, {
77
+ method: 'DELETE',
78
+ apiVersion: 'none',
79
+ });
80
+ },
81
+ /**
82
+ * List notifications for an agent
83
+ *
84
+ * @param agentId - The agent ID
85
+ * @param unreadOnly - Whether to only return unread notifications
86
+ * @returns List of notifications
87
+ */
88
+ async listNotifications(agentId, unreadOnly) {
89
+ const params = new URLSearchParams({ agentId });
90
+ if (unreadOnly !== undefined)
91
+ params.set('unreadOnly', String(unreadOnly));
92
+ return (0, client_1.apiRequestWithData)(`/notifications?${params}`, {
93
+ apiVersion: 'none',
94
+ });
95
+ },
96
+ /**
97
+ * Mark a notification as read
98
+ *
99
+ * @param id - The notification ID to mark as read
100
+ * @returns The updated notification
101
+ */
102
+ async markAsRead(id) {
103
+ return (0, client_1.apiRequestWithData)(`/notifications/${id}/read`, {
104
+ method: 'PATCH',
105
+ apiVersion: 'none',
106
+ });
107
+ },
108
+ };
109
+ exports.default = exports.notifications;
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMkNBQWdFO0FBbURoRSwrRUFBK0U7QUFDL0UsMkJBQTJCO0FBQzNCLCtFQUErRTtBQUUvRTs7R0FFRztBQUNVLFFBQUEsYUFBYSxHQUFHO0lBQzNCOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFlO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRCxPQUFPLElBQUEsMkJBQWtCLEVBQXFCLHVCQUF1QixNQUFNLEVBQUUsRUFBRTtZQUM3RSxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFVLEVBQUUsT0FBZ0I7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU87WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFBLDJCQUFrQixFQUN2Qix1QkFBdUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQ3RELEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFnQztRQUMvQyxPQUFPLElBQUEsMkJBQWtCLEVBQW1CLHFCQUFxQixFQUFFO1lBQ2pFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFVLEVBQUUsSUFBZ0M7UUFDM0QsT0FBTyxJQUFBLDJCQUFrQixFQUFtQix1QkFBdUIsRUFBRSxFQUFFLEVBQUU7WUFDdkUsTUFBTSxFQUFFLE9BQU87WUFDZixJQUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFVO1FBQ3pCLE9BQU8sSUFBQSxtQkFBVSxFQUFPLHVCQUF1QixFQUFFLEVBQUUsRUFBRTtZQUNuRCxNQUFNLEVBQUUsUUFBUTtZQUNoQixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxVQUFvQjtRQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxVQUFVLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sSUFBQSwyQkFBa0IsRUFBaUIsa0JBQWtCLE1BQU0sRUFBRSxFQUFFO1lBQ3BFLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBVTtRQUN6QixPQUFPLElBQUEsMkJBQWtCLEVBQWUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFO1lBQ25FLE1BQU0sRUFBRSxPQUFPO1lBQ2YsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUM7QUFFd0Isa0JBckdiLHFCQUFhLENBcUdPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlua0hpdmUgU0RLIC0gTm90aWZpY2F0aW9ucyBBUElcbiAqXG4gKiBOb3RpZmljYXRpb24gcnVsZXMgYW5kIGFsZXJ0IG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgeyBhcGlSZXF1ZXN0LCBhcGlSZXF1ZXN0V2l0aERhdGEgfSBmcm9tICcuLi9jb3JlL2NsaWVudCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBOb3RpZmljYXRpb24gcnVsZSBkZWZpbml0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvblJ1bGUge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgaXNFbmFibGVkOiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKiBEYXRhIGZvciBjcmVhdGluZyBhIG5vdGlmaWNhdGlvbiBydWxlICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGlmaWNhdGlvblJ1bGVEYXRhIHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbmRpdGlvbjogc3RyaW5nO1xuICBjaGFubmVsOiBzdHJpbmc7XG4gIGlzRW5hYmxlZD86IGJvb2xlYW47XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIERhdGEgZm9yIHVwZGF0aW5nIGEgbm90aWZpY2F0aW9uIHJ1bGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTm90aWZpY2F0aW9uUnVsZURhdGEge1xuICBuYW1lPzogc3RyaW5nO1xuICBjb25kaXRpb24/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGlzRW5hYmxlZD86IGJvb2xlYW47XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIEEgbm90aWZpY2F0aW9uIGFsZXJ0ICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIGFnZW50SWQ6IHN0cmluZztcbiAgcnVsZUlkOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXNSZWFkOiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTk9USUZJQ0FUSU9OUyBBUEkgQ0xJRU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTm90aWZpY2F0aW9ucyBBUEkgY2xpZW50IGZvciBtYW5hZ2luZyBub3RpZmljYXRpb24gcnVsZXMgYW5kIGFsZXJ0c1xuICovXG5leHBvcnQgY29uc3Qgbm90aWZpY2F0aW9ucyA9IHtcbiAgLyoqXG4gICAqIExpc3Qgbm90aWZpY2F0aW9uIHJ1bGVzIGZvciBhbiBhZ2VudFxuICAgKlxuICAgKiBAcGFyYW0gYWdlbnRJZCAtIFRoZSBhZ2VudCBJRCB0byBsaXN0IHJ1bGVzIGZvclxuICAgKiBAcmV0dXJucyBMaXN0IG9mIG5vdGlmaWNhdGlvbiBydWxlc1xuICAgKi9cbiAgYXN5bmMgbGlzdFJ1bGVzKGFnZW50SWQ6IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUnVsZVtdPiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGFnZW50SWQgfSk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxOb3RpZmljYXRpb25SdWxlW10+KGAvbm90aWZpY2F0aW9uLXJ1bGVzPyR7cGFyYW1zfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGEgbm90aWZpY2F0aW9uIHJ1bGUgYnkgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIHJ1bGUgSURcbiAgICogQHBhcmFtIGFnZW50SWQgLSBPcHRpb25hbCBhZ2VudCBJRCBmb3Igc2NvcGluZ1xuICAgKiBAcmV0dXJucyBUaGUgbm90aWZpY2F0aW9uIHJ1bGVcbiAgICovXG4gIGFzeW5jIGdldFJ1bGUoaWQ6IHN0cmluZywgYWdlbnRJZD86IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUnVsZT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAoYWdlbnRJZCkgcGFyYW1zLnNldCgnYWdlbnRJZCcsIGFnZW50SWQpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxOb3RpZmljYXRpb25SdWxlPihcbiAgICAgIGAvbm90aWZpY2F0aW9uLXJ1bGVzLyR7aWR9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCxcbiAgICAgIHsgYXBpVmVyc2lvbjogJ25vbmUnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uIHJ1bGVcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSdWxlIGNvbmZpZ3VyYXRpb24gZGF0YVxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBub3RpZmljYXRpb24gcnVsZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUnVsZShkYXRhOiBDcmVhdGVOb3RpZmljYXRpb25SdWxlRGF0YSk6IFByb21pc2U8Tm90aWZpY2F0aW9uUnVsZT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8Tm90aWZpY2F0aW9uUnVsZT4oJy9ub3RpZmljYXRpb24tcnVsZXMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBub3RpZmljYXRpb24gcnVsZVxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgcnVsZSBJRCB0byB1cGRhdGVcbiAgICogQHBhcmFtIGRhdGEgLSBGaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIG5vdGlmaWNhdGlvbiBydWxlXG4gICAqL1xuICBhc3luYyB1cGRhdGVSdWxlKGlkOiBzdHJpbmcsIGRhdGE6IFVwZGF0ZU5vdGlmaWNhdGlvblJ1bGVEYXRhKTogUHJvbWlzZTxOb3RpZmljYXRpb25SdWxlPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxOb3RpZmljYXRpb25SdWxlPihgL25vdGlmaWNhdGlvbi1ydWxlcy8ke2lkfWAsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIG5vdGlmaWNhdGlvbiBydWxlXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBydWxlIElEIHRvIGRlbGV0ZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlUnVsZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3Q8dm9pZD4oYC9ub3RpZmljYXRpb24tcnVsZXMvJHtpZH1gLCB7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0IG5vdGlmaWNhdGlvbnMgZm9yIGFuIGFnZW50XG4gICAqXG4gICAqIEBwYXJhbSBhZ2VudElkIC0gVGhlIGFnZW50IElEXG4gICAqIEBwYXJhbSB1bnJlYWRPbmx5IC0gV2hldGhlciB0byBvbmx5IHJldHVybiB1bnJlYWQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyBMaXN0IG9mIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIGFzeW5jIGxpc3ROb3RpZmljYXRpb25zKGFnZW50SWQ6IHN0cmluZywgdW5yZWFkT25seT86IGJvb2xlYW4pOiBQcm9taXNlPE5vdGlmaWNhdGlvbltdPiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGFnZW50SWQgfSk7XG4gICAgaWYgKHVucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgndW5yZWFkT25seScsIFN0cmluZyh1bnJlYWRPbmx5KSk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxOb3RpZmljYXRpb25bXT4oYC9ub3RpZmljYXRpb25zPyR7cGFyYW1zfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogTWFyayBhIG5vdGlmaWNhdGlvbiBhcyByZWFkXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBub3RpZmljYXRpb24gSUQgdG8gbWFyayBhcyByZWFkXG4gICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgbWFya0FzUmVhZChpZDogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb24+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPE5vdGlmaWNhdGlvbj4oYC9ub3RpZmljYXRpb25zLyR7aWR9L3JlYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgeyBub3RpZmljYXRpb25zIGFzIGRlZmF1bHQgfTtcbiJdfQ==
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ThinkHive SDK - Sessions API
3
+ *
4
+ * Trace session grouping for multi-turn conversation tracking
5
+ */
6
+ /** Options for listing sessions */
7
+ export interface ListSessionsOptions {
8
+ limit?: number;
9
+ offset?: number;
10
+ }
11
+ /** A trace session */
12
+ export interface Session {
13
+ sessionId: string;
14
+ agentId: string;
15
+ traceCount: number;
16
+ firstTraceAt: string;
17
+ lastTraceAt: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ /** A trace within a session */
21
+ export interface SessionTrace {
22
+ id: string;
23
+ agentId: string;
24
+ sessionId: string;
25
+ input?: unknown;
26
+ output?: unknown;
27
+ status: string;
28
+ createdAt: string;
29
+ [key: string]: unknown;
30
+ }
31
+ /**
32
+ * Sessions API client for trace session grouping
33
+ */
34
+ export declare const sessions: {
35
+ /**
36
+ * List sessions for an agent
37
+ *
38
+ * @param agentId - The agent ID
39
+ * @param opts - Pagination options
40
+ * @returns List of sessions
41
+ */
42
+ list(agentId: string, opts?: ListSessionsOptions): Promise<{
43
+ sessions: Session[];
44
+ limit: number;
45
+ offset: number;
46
+ hasMore: boolean;
47
+ }>;
48
+ /**
49
+ * Get traces for a specific session
50
+ *
51
+ * @param sessionId - The session ID
52
+ * @param agentId - The agent ID
53
+ * @returns List of traces in the session
54
+ */
55
+ getTraces(sessionId: string, agentId: string): Promise<SessionTrace[]>;
56
+ };
57
+ export { sessions as default };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK - Sessions API
4
+ *
5
+ * Trace session grouping for multi-turn conversation tracking
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.default = exports.sessions = void 0;
9
+ const client_1 = require("../core/client");
10
+ // ============================================================================
11
+ // SESSIONS API CLIENT
12
+ // ============================================================================
13
+ /**
14
+ * Sessions API client for trace session grouping
15
+ */
16
+ exports.sessions = {
17
+ /**
18
+ * List sessions for an agent
19
+ *
20
+ * @param agentId - The agent ID
21
+ * @param opts - Pagination options
22
+ * @returns List of sessions
23
+ */
24
+ async list(agentId, opts) {
25
+ const params = new URLSearchParams({ agentId });
26
+ if (opts?.limit !== undefined)
27
+ params.set('limit', String(opts.limit));
28
+ if (opts?.offset !== undefined)
29
+ params.set('offset', String(opts.offset));
30
+ return (0, client_1.apiRequestWithData)(`/traces/sessions?${params}`, {
31
+ apiVersion: 'none',
32
+ });
33
+ },
34
+ /**
35
+ * Get traces for a specific session
36
+ *
37
+ * @param sessionId - The session ID
38
+ * @param agentId - The agent ID
39
+ * @returns List of traces in the session
40
+ */
41
+ async getTraces(sessionId, agentId) {
42
+ const params = new URLSearchParams({ agentId, sessionId });
43
+ return (0, client_1.apiRequestWithData)(`/traces?${params}`, {
44
+ apiVersion: 'none',
45
+ });
46
+ },
47
+ };
48
+ exports.default = exports.sessions;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3Nlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUFFSCwyQ0FBb0Q7QUFrQ3BELCtFQUErRTtBQUMvRSxzQkFBc0I7QUFDdEIsK0VBQStFO0FBRS9FOztHQUVHO0FBQ1UsUUFBQSxRQUFRLEdBQUc7SUFDdEI7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLEVBQUUsSUFBMEI7UUFNcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxFQUFFLEtBQUssS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxFQUFFLE1BQU0sS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTFFLE9BQU8sSUFBQSwyQkFBa0IsRUFBQyxvQkFBb0IsTUFBTSxFQUFFLEVBQUU7WUFDdEQsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFBLDJCQUFrQixFQUFpQixXQUFXLE1BQU0sRUFBRSxFQUFFO1lBQzdELFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDO0FBRW1CLGtCQXRDUixnQkFBUSxDQXNDTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyAtIFNlc3Npb25zIEFQSVxuICpcbiAqIFRyYWNlIHNlc3Npb24gZ3JvdXBpbmcgZm9yIG11bHRpLXR1cm4gY29udmVyc2F0aW9uIHRyYWNraW5nXG4gKi9cblxuaW1wb3J0IHsgYXBpUmVxdWVzdFdpdGhEYXRhIH0gZnJvbSAnLi4vY29yZS9jbGllbnQnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogT3B0aW9ucyBmb3IgbGlzdGluZyBzZXNzaW9ucyAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0U2Vzc2lvbnNPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqIEEgdHJhY2Ugc2Vzc2lvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGFnZW50SWQ6IHN0cmluZztcbiAgdHJhY2VDb3VudDogbnVtYmVyO1xuICBmaXJzdFRyYWNlQXQ6IHN0cmluZztcbiAgbGFzdFRyYWNlQXQ6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIEEgdHJhY2Ugd2l0aGluIGEgc2Vzc2lvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uVHJhY2Uge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpbnB1dD86IHVua25vd247XG4gIG91dHB1dD86IHVua25vd247XG4gIHN0YXR1czogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU0VTU0lPTlMgQVBJIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNlc3Npb25zIEFQSSBjbGllbnQgZm9yIHRyYWNlIHNlc3Npb24gZ3JvdXBpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHNlc3Npb25zID0ge1xuICAvKipcbiAgICogTGlzdCBzZXNzaW9ucyBmb3IgYW4gYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSURcbiAgICogQHBhcmFtIG9wdHMgLSBQYWdpbmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgTGlzdCBvZiBzZXNzaW9uc1xuICAgKi9cbiAgYXN5bmMgbGlzdChhZ2VudElkOiBzdHJpbmcsIG9wdHM/OiBMaXN0U2Vzc2lvbnNPcHRpb25zKTogUHJvbWlzZTx7XG4gICAgc2Vzc2lvbnM6IFNlc3Npb25bXTtcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIGhhc01vcmU6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYWdlbnRJZCB9KTtcbiAgICBpZiAob3B0cz8ubGltaXQgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCkpO1xuICAgIGlmIChvcHRzPy5vZmZzZXQgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnb2Zmc2V0JywgU3RyaW5nKG9wdHMub2Zmc2V0KSk7XG5cbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhKGAvdHJhY2VzL3Nlc3Npb25zPyR7cGFyYW1zfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHRyYWNlcyBmb3IgYSBzcGVjaWZpYyBzZXNzaW9uXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgLSBUaGUgc2Vzc2lvbiBJRFxuICAgKiBAcGFyYW0gYWdlbnRJZCAtIFRoZSBhZ2VudCBJRFxuICAgKiBAcmV0dXJucyBMaXN0IG9mIHRyYWNlcyBpbiB0aGUgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhY2VzKHNlc3Npb25JZDogc3RyaW5nLCBhZ2VudElkOiBzdHJpbmcpOiBQcm9taXNlPFNlc3Npb25UcmFjZVtdPiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGFnZW50SWQsIHNlc3Npb25JZCB9KTtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFNlc3Npb25UcmFjZVtdPihgL3RyYWNlcz8ke3BhcmFtc31gLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgeyBzZXNzaW9ucyBhcyBkZWZhdWx0IH07XG4iXX0=
@@ -0,0 +1,78 @@
1
+ /**
2
+ * ThinkHive SDK - Shadow Tests API
3
+ *
4
+ * Shadow test execution for validating proposed fixes
5
+ */
6
+ /** Data for creating a shadow test */
7
+ export interface CreateShadowTestData {
8
+ fixId: string;
9
+ agentId: string;
10
+ testName: string;
11
+ inputData: unknown;
12
+ expectedOutput: unknown;
13
+ }
14
+ /** Data for updating a shadow test */
15
+ export interface UpdateShadowTestData {
16
+ testName?: string;
17
+ status?: string;
18
+ actualOutput?: unknown;
19
+ passed?: boolean;
20
+ metadata?: Record<string, unknown>;
21
+ }
22
+ /** A shadow test record */
23
+ export interface ShadowTest {
24
+ id: string;
25
+ fixId: string;
26
+ agentId: string;
27
+ testName: string;
28
+ inputData: unknown;
29
+ expectedOutput: unknown;
30
+ actualOutput?: unknown;
31
+ status: string;
32
+ passed?: boolean;
33
+ createdAt: string;
34
+ completedAt?: string;
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+ /**
38
+ * Shadow tests API client for managing shadow test execution
39
+ */
40
+ export declare const shadowTests: {
41
+ /**
42
+ * List shadow tests for an agent
43
+ *
44
+ * @param agentId - The agent ID
45
+ * @returns List of shadow tests
46
+ */
47
+ list(agentId: string): Promise<ShadowTest[]>;
48
+ /**
49
+ * Get a shadow test by ID
50
+ *
51
+ * @param id - The shadow test ID
52
+ * @returns The shadow test details
53
+ */
54
+ get(id: string): Promise<ShadowTest>;
55
+ /**
56
+ * Get shadow tests for a specific fix
57
+ *
58
+ * @param fixId - The fix ID
59
+ * @returns List of shadow tests for the fix
60
+ */
61
+ getByFix(fixId: string): Promise<ShadowTest[]>;
62
+ /**
63
+ * Create a new shadow test
64
+ *
65
+ * @param data - Shadow test configuration
66
+ * @returns The created shadow test
67
+ */
68
+ create(data: CreateShadowTestData): Promise<ShadowTest>;
69
+ /**
70
+ * Update a shadow test
71
+ *
72
+ * @param id - The shadow test ID to update
73
+ * @param data - Fields to update
74
+ * @returns The updated shadow test
75
+ */
76
+ update(id: string, data: UpdateShadowTestData): Promise<ShadowTest>;
77
+ };
78
+ export { shadowTests as default };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK - Shadow Tests API
4
+ *
5
+ * Shadow test execution for validating proposed fixes
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.default = exports.shadowTests = void 0;
9
+ const client_1 = require("../core/client");
10
+ // ============================================================================
11
+ // SHADOW TESTS API CLIENT
12
+ // ============================================================================
13
+ /**
14
+ * Shadow tests API client for managing shadow test execution
15
+ */
16
+ exports.shadowTests = {
17
+ /**
18
+ * List shadow tests for an agent
19
+ *
20
+ * @param agentId - The agent ID
21
+ * @returns List of shadow tests
22
+ */
23
+ async list(agentId) {
24
+ const params = new URLSearchParams({ agentId });
25
+ return (0, client_1.apiRequestWithData)(`/shadow-tests?${params}`, {
26
+ apiVersion: 'none',
27
+ });
28
+ },
29
+ /**
30
+ * Get a shadow test by ID
31
+ *
32
+ * @param id - The shadow test ID
33
+ * @returns The shadow test details
34
+ */
35
+ async get(id) {
36
+ return (0, client_1.apiRequestWithData)(`/shadow-tests/${id}`, {
37
+ apiVersion: 'none',
38
+ });
39
+ },
40
+ /**
41
+ * Get shadow tests for a specific fix
42
+ *
43
+ * @param fixId - The fix ID
44
+ * @returns List of shadow tests for the fix
45
+ */
46
+ async getByFix(fixId) {
47
+ return (0, client_1.apiRequestWithData)(`/fixes/${fixId}/shadow-tests`, {
48
+ apiVersion: 'none',
49
+ });
50
+ },
51
+ /**
52
+ * Create a new shadow test
53
+ *
54
+ * @param data - Shadow test configuration
55
+ * @returns The created shadow test
56
+ */
57
+ async create(data) {
58
+ return (0, client_1.apiRequestWithData)('/shadow-tests', {
59
+ method: 'POST',
60
+ body: data,
61
+ apiVersion: 'none',
62
+ });
63
+ },
64
+ /**
65
+ * Update a shadow test
66
+ *
67
+ * @param id - The shadow test ID to update
68
+ * @param data - Fields to update
69
+ * @returns The updated shadow test
70
+ */
71
+ async update(id, data) {
72
+ return (0, client_1.apiRequestWithData)(`/shadow-tests/${id}`, {
73
+ method: 'PATCH',
74
+ body: data,
75
+ apiVersion: 'none',
76
+ });
77
+ },
78
+ };
79
+ exports.default = exports.shadowTests;
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZG93LXRlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zaGFkb3ctdGVzdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDJDQUFvRDtBQXdDcEQsK0VBQStFO0FBQy9FLDBCQUEwQjtBQUMxQiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDVSxRQUFBLFdBQVcsR0FBRztJQUN6Qjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZTtRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEQsT0FBTyxJQUFBLDJCQUFrQixFQUFlLGlCQUFpQixNQUFNLEVBQUUsRUFBRTtZQUNqRSxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQVU7UUFDbEIsT0FBTyxJQUFBLDJCQUFrQixFQUFhLGlCQUFpQixFQUFFLEVBQUUsRUFBRTtZQUMzRCxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWE7UUFDMUIsT0FBTyxJQUFBLDJCQUFrQixFQUFlLFVBQVUsS0FBSyxlQUFlLEVBQUU7WUFDdEUsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUEwQjtRQUNyQyxPQUFPLElBQUEsMkJBQWtCLEVBQWEsZUFBZSxFQUFFO1lBQ3JELE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFVLEVBQUUsSUFBMEI7UUFDakQsT0FBTyxJQUFBLDJCQUFrQixFQUFhLGlCQUFpQixFQUFFLEVBQUUsRUFBRTtZQUMzRCxNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRSxJQUFJO1lBQ1YsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUM7QUFFc0Isa0JBcEVYLG1CQUFXLENBb0VPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlua0hpdmUgU0RLIC0gU2hhZG93IFRlc3RzIEFQSVxuICpcbiAqIFNoYWRvdyB0ZXN0IGV4ZWN1dGlvbiBmb3IgdmFsaWRhdGluZyBwcm9wb3NlZCBmaXhlc1xuICovXG5cbmltcG9ydCB7IGFwaVJlcXVlc3RXaXRoRGF0YSB9IGZyb20gJy4uL2NvcmUvY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIERhdGEgZm9yIGNyZWF0aW5nIGEgc2hhZG93IHRlc3QgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU2hhZG93VGVzdERhdGEge1xuICBmaXhJZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHRlc3ROYW1lOiBzdHJpbmc7XG4gIGlucHV0RGF0YTogdW5rbm93bjtcbiAgZXhwZWN0ZWRPdXRwdXQ6IHVua25vd247XG59XG5cbi8qKiBEYXRhIGZvciB1cGRhdGluZyBhIHNoYWRvdyB0ZXN0ICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVNoYWRvd1Rlc3REYXRhIHtcbiAgdGVzdE5hbWU/OiBzdHJpbmc7XG4gIHN0YXR1cz86IHN0cmluZztcbiAgYWN0dWFsT3V0cHV0PzogdW5rbm93bjtcbiAgcGFzc2VkPzogYm9vbGVhbjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIEEgc2hhZG93IHRlc3QgcmVjb3JkICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYWRvd1Rlc3Qge1xuICBpZDogc3RyaW5nO1xuICBmaXhJZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHRlc3ROYW1lOiBzdHJpbmc7XG4gIGlucHV0RGF0YTogdW5rbm93bjtcbiAgZXhwZWN0ZWRPdXRwdXQ6IHVua25vd247XG4gIGFjdHVhbE91dHB1dD86IHVua25vd247XG4gIHN0YXR1czogc3RyaW5nO1xuICBwYXNzZWQ/OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNIQURPVyBURVNUUyBBUEkgQ0xJRU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2hhZG93IHRlc3RzIEFQSSBjbGllbnQgZm9yIG1hbmFnaW5nIHNoYWRvdyB0ZXN0IGV4ZWN1dGlvblxuICovXG5leHBvcnQgY29uc3Qgc2hhZG93VGVzdHMgPSB7XG4gIC8qKlxuICAgKiBMaXN0IHNoYWRvdyB0ZXN0cyBmb3IgYW4gYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSURcbiAgICogQHJldHVybnMgTGlzdCBvZiBzaGFkb3cgdGVzdHNcbiAgICovXG4gIGFzeW5jIGxpc3QoYWdlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxTaGFkb3dUZXN0W10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYWdlbnRJZCB9KTtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFNoYWRvd1Rlc3RbXT4oYC9zaGFkb3ctdGVzdHM/JHtwYXJhbXN9YCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSBzaGFkb3cgdGVzdCBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2hhZG93IHRlc3QgSURcbiAgICogQHJldHVybnMgVGhlIHNoYWRvdyB0ZXN0IGRldGFpbHNcbiAgICovXG4gIGFzeW5jIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxTaGFkb3dUZXN0PiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaGFkb3dUZXN0PihgL3NoYWRvdy10ZXN0cy8ke2lkfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHNoYWRvdyB0ZXN0cyBmb3IgYSBzcGVjaWZpYyBmaXhcbiAgICpcbiAgICogQHBhcmFtIGZpeElkIC0gVGhlIGZpeCBJRFxuICAgKiBAcmV0dXJucyBMaXN0IG9mIHNoYWRvdyB0ZXN0cyBmb3IgdGhlIGZpeFxuICAgKi9cbiAgYXN5bmMgZ2V0QnlGaXgoZml4SWQ6IHN0cmluZyk6IFByb21pc2U8U2hhZG93VGVzdFtdPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaGFkb3dUZXN0W10+KGAvZml4ZXMvJHtmaXhJZH0vc2hhZG93LXRlc3RzYCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2hhZG93IHRlc3RcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaGFkb3cgdGVzdCBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHNoYWRvdyB0ZXN0XG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogQ3JlYXRlU2hhZG93VGVzdERhdGEpOiBQcm9taXNlPFNoYWRvd1Rlc3Q+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFNoYWRvd1Rlc3Q+KCcvc2hhZG93LXRlc3RzJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBzaGFkb3cgdGVzdFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2hhZG93IHRlc3QgSUQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBkYXRhIC0gRmllbGRzIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBzaGFkb3cgdGVzdFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKGlkOiBzdHJpbmcsIGRhdGE6IFVwZGF0ZVNoYWRvd1Rlc3REYXRhKTogUHJvbWlzZTxTaGFkb3dUZXN0PiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaGFkb3dUZXN0PihgL3NoYWRvdy10ZXN0cy8ke2lkfWAsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgeyBzaGFkb3dUZXN0cyBhcyBkZWZhdWx0IH07XG4iXX0=