@thinkhive/sdk 4.1.0 → 4.2.1

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,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=
@@ -0,0 +1,177 @@
1
+ /**
2
+ * ThinkHive SDK - Signals API
3
+ *
4
+ * Behavioral signal management for detecting patterns in agent interactions
5
+ */
6
+ /** Signal detection configuration */
7
+ export interface DetectionConfig {
8
+ type: string;
9
+ threshold?: number;
10
+ pattern?: string;
11
+ [key: string]: unknown;
12
+ }
13
+ /** Options for creating a signal */
14
+ export interface CreateSignalOptions {
15
+ description?: string;
16
+ isEnabled?: boolean;
17
+ severity?: string;
18
+ }
19
+ /** Options for updating a signal */
20
+ export interface UpdateSignalOptions {
21
+ name?: string;
22
+ group?: string;
23
+ description?: string;
24
+ detectionConfig?: DetectionConfig;
25
+ isEnabled?: boolean;
26
+ severity?: string;
27
+ }
28
+ /** Options for listing signals */
29
+ export interface ListSignalsOptions {
30
+ group?: string;
31
+ source?: string;
32
+ isEnabled?: boolean;
33
+ }
34
+ /** Options for getting signal stats */
35
+ export interface SignalStatsOptions {
36
+ startDate?: string;
37
+ endDate?: string;
38
+ agentId?: string;
39
+ }
40
+ /** Options for getting signal trends */
41
+ export interface SignalTrendsOptions {
42
+ startDate?: string;
43
+ endDate?: string;
44
+ agentId?: string;
45
+ granularity?: 'hour' | 'day' | 'week' | 'month';
46
+ }
47
+ /** Options for getting signal traces */
48
+ export interface SignalTracesOptions {
49
+ limit?: number;
50
+ offset?: number;
51
+ startDate?: string;
52
+ endDate?: string;
53
+ agentId?: string;
54
+ }
55
+ /** Options for getting signal events */
56
+ export interface SignalEventsOptions {
57
+ limit?: number;
58
+ offset?: number;
59
+ }
60
+ /** A behavioral signal definition */
61
+ export interface Signal {
62
+ id: string;
63
+ name: string;
64
+ group: string;
65
+ description?: string;
66
+ detectionConfig: DetectionConfig;
67
+ isEnabled: boolean;
68
+ severity?: string;
69
+ source?: string;
70
+ createdAt: string;
71
+ updatedAt: string;
72
+ }
73
+ /** Signal statistics */
74
+ export interface SignalStats {
75
+ signalId: string;
76
+ name: string;
77
+ eventCount: number;
78
+ traceCount: number;
79
+ lastTriggeredAt?: string;
80
+ }
81
+ /** Signal trend data point */
82
+ export interface SignalTrendPoint {
83
+ period: string;
84
+ eventCount: number;
85
+ traceCount: number;
86
+ }
87
+ /** A signal event occurrence */
88
+ export interface SignalEvent {
89
+ id: string;
90
+ signalId: string;
91
+ traceId: string;
92
+ detectedAt: string;
93
+ metadata?: Record<string, unknown>;
94
+ }
95
+ /**
96
+ * Signals API client for managing behavioral signal detection
97
+ */
98
+ export declare const signals: {
99
+ /**
100
+ * List all signals with optional filters
101
+ *
102
+ * @param opts - Filter options for group, source, or enabled status
103
+ * @returns List of signals
104
+ */
105
+ list(opts?: ListSignalsOptions): Promise<Signal[]>;
106
+ /**
107
+ * Create a new behavioral signal
108
+ *
109
+ * @param name - Signal name
110
+ * @param group - Signal group/category
111
+ * @param detectionConfig - Detection configuration
112
+ * @param opts - Additional signal options
113
+ * @returns The created signal
114
+ */
115
+ create(name: string, group: string, detectionConfig: DetectionConfig, opts?: CreateSignalOptions): Promise<Signal>;
116
+ /**
117
+ * Update an existing signal
118
+ *
119
+ * @param id - Signal ID to update
120
+ * @param opts - Fields to update
121
+ * @returns The updated signal
122
+ */
123
+ update(id: string, opts: UpdateSignalOptions): Promise<Signal>;
124
+ /**
125
+ * Delete a signal
126
+ *
127
+ * @param id - Signal ID to delete
128
+ */
129
+ remove(id: string): Promise<void>;
130
+ /**
131
+ * Seed default signal definitions
132
+ *
133
+ * @returns List of seeded signals
134
+ */
135
+ seedDefaults(): Promise<Signal[]>;
136
+ /**
137
+ * Get signal statistics
138
+ *
139
+ * @param opts - Date range and agent filter options
140
+ * @returns Signal statistics
141
+ */
142
+ getStats(opts?: SignalStatsOptions): Promise<SignalStats[]>;
143
+ /**
144
+ * Get signal trend data over time
145
+ *
146
+ * @param opts - Date range, agent, and granularity options
147
+ * @returns Signal trend data points
148
+ */
149
+ getTrends(opts?: SignalTrendsOptions): Promise<SignalTrendPoint[]>;
150
+ /**
151
+ * Get traces that triggered a specific signal
152
+ *
153
+ * @param id - Signal ID
154
+ * @param opts - Pagination and filter options
155
+ * @returns Traces associated with the signal
156
+ */
157
+ getTraces(id: string, opts?: SignalTracesOptions): Promise<{
158
+ traces: any[];
159
+ limit: number;
160
+ offset: number;
161
+ hasMore: boolean;
162
+ }>;
163
+ /**
164
+ * Get events for a specific signal
165
+ *
166
+ * @param id - Signal ID
167
+ * @param opts - Pagination options
168
+ * @returns Signal events
169
+ */
170
+ getEvents(id: string, opts?: SignalEventsOptions): Promise<{
171
+ events: SignalEvent[];
172
+ limit: number;
173
+ offset: number;
174
+ hasMore: boolean;
175
+ }>;
176
+ };
177
+ export { signals as default };
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK - Signals API
4
+ *
5
+ * Behavioral signal management for detecting patterns in agent interactions
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.default = exports.signals = void 0;
9
+ const client_1 = require("../core/client");
10
+ // ============================================================================
11
+ // SIGNALS API CLIENT
12
+ // ============================================================================
13
+ /**
14
+ * Signals API client for managing behavioral signal detection
15
+ */
16
+ exports.signals = {
17
+ /**
18
+ * List all signals with optional filters
19
+ *
20
+ * @param opts - Filter options for group, source, or enabled status
21
+ * @returns List of signals
22
+ */
23
+ async list(opts) {
24
+ const params = new URLSearchParams();
25
+ if (opts?.group)
26
+ params.set('group', opts.group);
27
+ if (opts?.source)
28
+ params.set('source', opts.source);
29
+ if (opts?.isEnabled !== undefined)
30
+ params.set('isEnabled', String(opts.isEnabled));
31
+ const query = params.toString();
32
+ return (0, client_1.apiRequestWithData)(`/signals/${query ? `?${query}` : ''}`, {
33
+ apiVersion: 'v1',
34
+ });
35
+ },
36
+ /**
37
+ * Create a new behavioral signal
38
+ *
39
+ * @param name - Signal name
40
+ * @param group - Signal group/category
41
+ * @param detectionConfig - Detection configuration
42
+ * @param opts - Additional signal options
43
+ * @returns The created signal
44
+ */
45
+ async create(name, group, detectionConfig, opts) {
46
+ return (0, client_1.apiRequestWithData)('/signals/', {
47
+ method: 'POST',
48
+ body: { name, group, detectionConfig, ...opts },
49
+ apiVersion: 'v1',
50
+ });
51
+ },
52
+ /**
53
+ * Update an existing signal
54
+ *
55
+ * @param id - Signal ID to update
56
+ * @param opts - Fields to update
57
+ * @returns The updated signal
58
+ */
59
+ async update(id, opts) {
60
+ return (0, client_1.apiRequestWithData)(`/signals/${id}`, {
61
+ method: 'PUT',
62
+ body: opts,
63
+ apiVersion: 'v1',
64
+ });
65
+ },
66
+ /**
67
+ * Delete a signal
68
+ *
69
+ * @param id - Signal ID to delete
70
+ */
71
+ async remove(id) {
72
+ return (0, client_1.apiRequest)(`/signals/${id}`, {
73
+ method: 'DELETE',
74
+ apiVersion: 'v1',
75
+ });
76
+ },
77
+ /**
78
+ * Seed default signal definitions
79
+ *
80
+ * @returns List of seeded signals
81
+ */
82
+ async seedDefaults() {
83
+ return (0, client_1.apiRequestWithData)('/signals/seed', {
84
+ method: 'POST',
85
+ apiVersion: 'v1',
86
+ });
87
+ },
88
+ /**
89
+ * Get signal statistics
90
+ *
91
+ * @param opts - Date range and agent filter options
92
+ * @returns Signal statistics
93
+ */
94
+ async getStats(opts) {
95
+ const params = new URLSearchParams();
96
+ if (opts?.startDate)
97
+ params.set('startDate', opts.startDate);
98
+ if (opts?.endDate)
99
+ params.set('endDate', opts.endDate);
100
+ if (opts?.agentId)
101
+ params.set('agentId', opts.agentId);
102
+ const query = params.toString();
103
+ return (0, client_1.apiRequestWithData)(`/signals/stats${query ? `?${query}` : ''}`, {
104
+ apiVersion: 'v1',
105
+ });
106
+ },
107
+ /**
108
+ * Get signal trend data over time
109
+ *
110
+ * @param opts - Date range, agent, and granularity options
111
+ * @returns Signal trend data points
112
+ */
113
+ async getTrends(opts) {
114
+ const params = new URLSearchParams();
115
+ if (opts?.startDate)
116
+ params.set('startDate', opts.startDate);
117
+ if (opts?.endDate)
118
+ params.set('endDate', opts.endDate);
119
+ if (opts?.agentId)
120
+ params.set('agentId', opts.agentId);
121
+ if (opts?.granularity)
122
+ params.set('granularity', opts.granularity);
123
+ const query = params.toString();
124
+ return (0, client_1.apiRequestWithData)(`/signals/trends${query ? `?${query}` : ''}`, {
125
+ apiVersion: 'v1',
126
+ });
127
+ },
128
+ /**
129
+ * Get traces that triggered a specific signal
130
+ *
131
+ * @param id - Signal ID
132
+ * @param opts - Pagination and filter options
133
+ * @returns Traces associated with the signal
134
+ */
135
+ async getTraces(id, opts) {
136
+ const params = new URLSearchParams();
137
+ if (opts?.limit !== undefined)
138
+ params.set('limit', String(opts.limit));
139
+ if (opts?.offset !== undefined)
140
+ params.set('offset', String(opts.offset));
141
+ if (opts?.startDate)
142
+ params.set('startDate', opts.startDate);
143
+ if (opts?.endDate)
144
+ params.set('endDate', opts.endDate);
145
+ if (opts?.agentId)
146
+ params.set('agentId', opts.agentId);
147
+ const query = params.toString();
148
+ return (0, client_1.apiRequestWithData)(`/signals/${id}/traces${query ? `?${query}` : ''}`, {
149
+ apiVersion: 'v1',
150
+ });
151
+ },
152
+ /**
153
+ * Get events for a specific signal
154
+ *
155
+ * @param id - Signal ID
156
+ * @param opts - Pagination options
157
+ * @returns Signal events
158
+ */
159
+ async getEvents(id, opts) {
160
+ const params = new URLSearchParams();
161
+ if (opts?.limit !== undefined)
162
+ params.set('limit', String(opts.limit));
163
+ if (opts?.offset !== undefined)
164
+ params.set('offset', String(opts.offset));
165
+ const query = params.toString();
166
+ return (0, client_1.apiRequestWithData)(`/signals/${id}/events${query ? `?${query}` : ''}`, {
167
+ apiVersion: 'v1',
168
+ });
169
+ },
170
+ };
171
+ exports.default = exports.signals;
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc2lnbmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMkNBQWdFO0FBMkdoRSwrRUFBK0U7QUFDL0UscUJBQXFCO0FBQ3JCLCtFQUErRTtBQUUvRTs7R0FFRztBQUNVLFFBQUEsT0FBTyxHQUFHO0lBQ3JCOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUF5QjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxFQUFFLEtBQUs7WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLEVBQUUsTUFBTTtZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksRUFBRSxTQUFTLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVuRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFBLDJCQUFrQixFQUFXLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMxRSxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUNWLElBQVksRUFDWixLQUFhLEVBQ2IsZUFBZ0MsRUFDaEMsSUFBMEI7UUFFMUIsT0FBTyxJQUFBLDJCQUFrQixFQUFTLFdBQVcsRUFBRTtZQUM3QyxNQUFN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QUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxFQUFFLE1BQU0sS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUEsMkJBQWtCLEVBQUMsWUFBWSxFQUFFLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUM1RSxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YsQ0FBQztBQUVrQixrQkF2S1AsZUFBTyxDQXVLTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyAtIFNpZ25hbHMgQVBJXG4gKlxuICogQmVoYXZpb3JhbCBzaWduYWwgbWFuYWdlbWVudCBmb3IgZGV0ZWN0aW5nIHBhdHRlcm5zIGluIGFnZW50IGludGVyYWN0aW9uc1xuICovXG5cbmltcG9ydCB7IGFwaVJlcXVlc3QsIGFwaVJlcXVlc3RXaXRoRGF0YSB9IGZyb20gJy4uL2NvcmUvY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIFNpZ25hbCBkZXRlY3Rpb24gY29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3Rpb25Db25maWcge1xuICB0eXBlOiBzdHJpbmc7XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgcGF0dGVybj86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgc2lnbmFsICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVNpZ25hbE9wdGlvbnMge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaXNFbmFibGVkPzogYm9vbGVhbjtcbiAgc2V2ZXJpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGZvciB1cGRhdGluZyBhIHNpZ25hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVTaWduYWxPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBkZXRlY3Rpb25Db25maWc/OiBEZXRlY3Rpb25Db25maWc7XG4gIGlzRW5hYmxlZD86IGJvb2xlYW47XG4gIHNldmVyaXR5Pzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgbGlzdGluZyBzaWduYWxzICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RTaWduYWxzT3B0aW9ucyB7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBzb3VyY2U/OiBzdHJpbmc7XG4gIGlzRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKiBPcHRpb25zIGZvciBnZXR0aW5nIHNpZ25hbCBzdGF0cyAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTdGF0c09wdGlvbnMge1xuICBzdGFydERhdGU/OiBzdHJpbmc7XG4gIGVuZERhdGU/OiBzdHJpbmc7XG4gIGFnZW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGZvciBnZXR0aW5nIHNpZ25hbCB0cmVuZHMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsVHJlbmRzT3B0aW9ucyB7XG4gIHN0YXJ0RGF0ZT86IHN0cmluZztcbiAgZW5kRGF0ZT86IHN0cmluZztcbiAgYWdlbnRJZD86IHN0cmluZztcbiAgZ3JhbnVsYXJpdHk/OiAnaG91cicgfCAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCc7XG59XG5cbi8qKiBPcHRpb25zIGZvciBnZXR0aW5nIHNpZ25hbCB0cmFjZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsVHJhY2VzT3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHN0YXJ0RGF0ZT86IHN0cmluZztcbiAgZW5kRGF0ZT86IHN0cmluZztcbiAgYWdlbnRJZD86IHN0cmluZztcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGdldHRpbmcgc2lnbmFsIGV2ZW50cyAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmVudHNPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqIEEgYmVoYXZpb3JhbCBzaWduYWwgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWwge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGdyb3VwOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBkZXRlY3Rpb25Db25maWc6IERldGVjdGlvbkNvbmZpZztcbiAgaXNFbmFibGVkOiBib29sZWFuO1xuICBzZXZlcml0eT86IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBTaWduYWwgc3RhdGlzdGljcyAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTdGF0cyB7XG4gIHNpZ25hbElkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZXZlbnRDb3VudDogbnVtYmVyO1xuICB0cmFjZUNvdW50OiBudW1iZXI7XG4gIGxhc3RUcmlnZ2VyZWRBdD86IHN0cmluZztcbn1cblxuLyoqIFNpZ25hbCB0cmVuZCBkYXRhIHBvaW50ICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFRyZW5kUG9pbnQge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgZXZlbnRDb3VudDogbnVtYmVyO1xuICB0cmFjZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKiBBIHNpZ25hbCBldmVudCBvY2N1cnJlbmNlICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2ZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgc2lnbmFsSWQ6IHN0cmluZztcbiAgdHJhY2VJZDogc3RyaW5nO1xuICBkZXRlY3RlZEF0OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNJR05BTFMgQVBJIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpZ25hbHMgQVBJIGNsaWVudCBmb3IgbWFuYWdpbmcgYmVoYXZpb3JhbCBzaWduYWwgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBzaWduYWxzID0ge1xuICAvKipcbiAgICogTGlzdCBhbGwgc2lnbmFscyB3aXRoIG9wdGlvbmFsIGZpbHRlcnNcbiAgICpcbiAgICogQHBhcmFtIG9wdHMgLSBGaWx0ZXIgb3B0aW9ucyBmb3IgZ3JvdXAsIHNvdXJjZSwgb3IgZW5hYmxlZCBzdGF0dXNcbiAgICogQHJldHVybnMgTGlzdCBvZiBzaWduYWxzXG4gICAqL1xuICBhc3luYyBsaXN0KG9wdHM/OiBMaXN0U2lnbmFsc09wdGlvbnMpOiBQcm9taXNlPFNpZ25hbFtdPiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChvcHRzPy5ncm91cCkgcGFyYW1zLnNldCgnZ3JvdXAnLCBvcHRzLmdyb3VwKTtcbiAgICBpZiAob3B0cz8uc291cmNlKSBwYXJhbXMuc2V0KCdzb3VyY2UnLCBvcHRzLnNvdXJjZSk7XG4gICAgaWYgKG9wdHM/LmlzRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdpc0VuYWJsZWQnLCBTdHJpbmcob3B0cy5pc0VuYWJsZWQpKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaWduYWxbXT4oYC9zaWduYWxzLyR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICd2MScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBiZWhhdmlvcmFsIHNpZ25hbFxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFNpZ25hbCBuYW1lXG4gICAqIEBwYXJhbSBncm91cCAtIFNpZ25hbCBncm91cC9jYXRlZ29yeVxuICAgKiBAcGFyYW0gZGV0ZWN0aW9uQ29uZmlnIC0gRGV0ZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdHMgLSBBZGRpdGlvbmFsIHNpZ25hbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHNpZ25hbFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncm91cDogc3RyaW5nLFxuICAgIGRldGVjdGlvbkNvbmZpZzogRGV0ZWN0aW9uQ29uZmlnLFxuICAgIG9wdHM/OiBDcmVhdGVTaWduYWxPcHRpb25zXG4gICk6IFByb21pc2U8U2lnbmFsPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaWduYWw+KCcvc2lnbmFscy8nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHsgbmFtZSwgZ3JvdXAsIGRldGVjdGlvbkNvbmZpZywgLi4ub3B0cyB9LFxuICAgICAgYXBpVmVyc2lvbjogJ3YxJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIHNpZ25hbFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBTaWduYWwgSUQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBvcHRzIC0gRmllbGRzIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBzaWduYWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShpZDogc3RyaW5nLCBvcHRzOiBVcGRhdGVTaWduYWxPcHRpb25zKTogUHJvbWlzZTxTaWduYWw+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFNpZ25hbD4oYC9zaWduYWxzLyR7aWR9YCwge1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGJvZHk6IG9wdHMsXG4gICAgICBhcGlWZXJzaW9uOiAndjEnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBzaWduYWxcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gU2lnbmFsIElEIHRvIGRlbGV0ZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdDx2b2lkPihgL3NpZ25hbHMvJHtpZH1gLCB7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgYXBpVmVyc2lvbjogJ3YxJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogU2VlZCBkZWZhdWx0IHNpZ25hbCBkZWZpbml0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBMaXN0IG9mIHNlZWRlZCBzaWduYWxzXG4gICAqL1xuICBhc3luYyBzZWVkRGVmYXVsdHMoKTogUHJvbWlzZTxTaWduYWxbXT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8U2lnbmFsW10+KCcvc2lnbmFscy9zZWVkJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBhcGlWZXJzaW9uOiAndjEnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgc2lnbmFsIHN0YXRpc3RpY3NcbiAgICpcbiAgICogQHBhcmFtIG9wdHMgLSBEYXRlIHJhbmdlIGFuZCBhZ2VudCBmaWx0ZXIgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBTaWduYWwgc3RhdGlzdGljc1xuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHMob3B0cz86IFNpZ25hbFN0YXRzT3B0aW9ucyk6IFByb21pc2U8U2lnbmFsU3RhdHNbXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8uc3RhcnREYXRlKSBwYXJhbXMuc2V0KCdzdGFydERhdGUnLCBvcHRzLnN0YXJ0RGF0ZSk7XG4gICAgaWYgKG9wdHM/LmVuZERhdGUpIHBhcmFtcy5zZXQoJ2VuZERhdGUnLCBvcHRzLmVuZERhdGUpO1xuICAgIGlmIChvcHRzPy5hZ2VudElkKSBwYXJhbXMuc2V0KCdhZ2VudElkJywgb3B0cy5hZ2VudElkKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxTaWduYWxTdGF0c1tdPihgL3NpZ25hbHMvc3RhdHMke3F1ZXJ5ID8gYD8ke3F1ZXJ5fWAgOiAnJ31gLCB7XG4gICAgICBhcGlWZXJzaW9uOiAndjEnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgc2lnbmFsIHRyZW5kIGRhdGEgb3ZlciB0aW1lXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzIC0gRGF0ZSByYW5nZSwgYWdlbnQsIGFuZCBncmFudWxhcml0eSBvcHRpb25zXG4gICAqIEByZXR1cm5zIFNpZ25hbCB0cmVuZCBkYXRhIHBvaW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0VHJlbmRzKG9wdHM/OiBTaWduYWxUcmVuZHNPcHRpb25zKTogUHJvbWlzZTxTaWduYWxUcmVuZFBvaW50W10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdHM/LnN0YXJ0RGF0ZSkgcGFyYW1zLnNldCgnc3RhcnREYXRlJywgb3B0cy5zdGFydERhdGUpO1xuICAgIGlmIChvcHRzPy5lbmREYXRlKSBwYXJhbXMuc2V0KCdlbmREYXRlJywgb3B0cy5lbmREYXRlKTtcbiAgICBpZiAob3B0cz8uYWdlbnRJZCkgcGFyYW1zLnNldCgnYWdlbnRJZCcsIG9wdHMuYWdlbnRJZCk7XG4gICAgaWYgKG9wdHM/LmdyYW51bGFyaXR5KSBwYXJhbXMuc2V0KCdncmFudWxhcml0eScsIG9wdHMuZ3JhbnVsYXJpdHkpO1xuXG4gICAgY29uc3QgcXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPFNpZ25hbFRyZW5kUG9pbnRbXT4oYC9zaWduYWxzL3RyZW5kcyR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICd2MScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCB0cmFjZXMgdGhhdCB0cmlnZ2VyZWQgYSBzcGVjaWZpYyBzaWduYWxcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gU2lnbmFsIElEXG4gICAqIEBwYXJhbSBvcHRzIC0gUGFnaW5hdGlvbiBhbmQgZmlsdGVyIG9wdGlvbnNcbiAgICogQHJldHVybnMgVHJhY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmFsXG4gICAqL1xuICBhc3luYyBnZXRUcmFjZXMoaWQ6IHN0cmluZywgb3B0cz86IFNpZ25hbFRyYWNlc09wdGlvbnMpOiBQcm9taXNlPHtcbiAgICB0cmFjZXM6IGFueVtdO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgaGFzTW9yZTogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8ubGltaXQgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCkpO1xuICAgIGlmIChvcHRzPy5vZmZzZXQgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnb2Zmc2V0JywgU3RyaW5nKG9wdHMub2Zmc2V0KSk7XG4gICAgaWYgKG9wdHM/LnN0YXJ0RGF0ZSkgcGFyYW1zLnNldCgnc3RhcnREYXRlJywgb3B0cy5zdGFydERhdGUpO1xuICAgIGlmIChvcHRzPy5lbmREYXRlKSBwYXJhbXMuc2V0KCdlbmREYXRlJywgb3B0cy5lbmREYXRlKTtcbiAgICBpZiAob3B0cz8uYWdlbnRJZCkgcGFyYW1zLnNldCgnYWdlbnRJZCcsIG9wdHMuYWdlbnRJZCk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGEoYC9zaWduYWxzLyR7aWR9L3RyYWNlcyR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICd2MScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBldmVudHMgZm9yIGEgc3BlY2lmaWMgc2lnbmFsXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFNpZ25hbCBJRFxuICAgKiBAcGFyYW0gb3B0cyAtIFBhZ2luYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBTaWduYWwgZXZlbnRzXG4gICAqL1xuICBhc3luYyBnZXRFdmVudHMoaWQ6IHN0cmluZywgb3B0cz86IFNpZ25hbEV2ZW50c09wdGlvbnMpOiBQcm9taXNlPHtcbiAgICBldmVudHM6IFNpZ25hbEV2ZW50W107XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChvcHRzPy5saW1pdCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRzLmxpbWl0KSk7XG4gICAgaWYgKG9wdHM/Lm9mZnNldCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcob3B0cy5vZmZzZXQpKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YShgL3NpZ25hbHMvJHtpZH0vZXZlbnRzJHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCwge1xuICAgICAgYXBpVmVyc2lvbjogJ3YxJyxcbiAgICB9KTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7IHNpZ25hbHMgYXMgZGVmYXVsdCB9O1xuIl19
@@ -13,6 +13,8 @@ export interface RequestOptions {
13
13
  maxRetries?: number;
14
14
  /** Request timeout in milliseconds */
15
15
  timeout?: number;
16
+ /** Use path as-is without prepending /api/ prefix (for routes like /v1/guardrails/scan) */
17
+ rawPath?: boolean;
16
18
  }
17
19
  /**
18
20
  * Make an authenticated API request with retry logic