@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.
- package/MIGRATION.md +274 -0
- package/dist/api/calibration.d.ts +168 -0
- package/dist/api/calibration.js +176 -0
- package/dist/api/claims.d.ts +262 -0
- package/dist/api/claims.js +262 -0
- package/dist/api/runs.d.ts +200 -0
- package/dist/api/runs.js +262 -0
- package/dist/core/client.d.ts +29 -0
- package/dist/core/client.js +89 -0
- package/dist/core/config.d.ts +38 -0
- package/dist/core/config.js +76 -0
- package/dist/core/types.d.ts +354 -0
- package/dist/core/types.js +8 -0
- package/dist/index.d.ts +222 -512
- package/dist/index.js +169 -394
- package/dist/instrumentation/langchain.d.ts +194 -0
- package/dist/instrumentation/langchain.js +429 -0
- package/dist/instrumentation/openai.d.ts +141 -0
- package/dist/instrumentation/openai.js +279 -0
- package/dist/integrations/customer-context.d.ts +203 -0
- package/dist/integrations/customer-context.js +274 -0
- package/dist/integrations/ticket-linking.d.ts +217 -0
- package/dist/integrations/ticket-linking.js +259 -0
- package/package.json +61 -9
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK v3.0 - Configuration
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_SERVICE_NAME = exports.DEFAULT_ENDPOINT = exports.SDK_VERSION = void 0;
|
|
7
|
+
exports.initConfig = initConfig;
|
|
8
|
+
exports.getConfig = getConfig;
|
|
9
|
+
exports.isInitialized = isInitialized;
|
|
10
|
+
exports.resetConfig = resetConfig;
|
|
11
|
+
exports.debugLog = debugLog;
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// CONSTANTS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
exports.SDK_VERSION = '3.0.0';
|
|
16
|
+
exports.DEFAULT_ENDPOINT = 'https://thinkhivemind-h25z7pvd3q-uc.a.run.app';
|
|
17
|
+
exports.DEFAULT_SERVICE_NAME = 'my-ai-agent';
|
|
18
|
+
let config = null;
|
|
19
|
+
let initialized = false;
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// CONFIG FUNCTIONS
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Initialize configuration from options
|
|
25
|
+
*/
|
|
26
|
+
function initConfig(options = {}) {
|
|
27
|
+
const apiKey = options.apiKey || process.env.THINKHIVE_API_KEY || '';
|
|
28
|
+
const agentId = options.agentId || process.env.THINKHIVE_AGENT_ID || '';
|
|
29
|
+
if (!apiKey && !agentId) {
|
|
30
|
+
throw new Error('Either apiKey or agentId must be provided (or set THINKHIVE_API_KEY env var)');
|
|
31
|
+
}
|
|
32
|
+
config = {
|
|
33
|
+
apiKey,
|
|
34
|
+
agentId,
|
|
35
|
+
endpoint: options.endpoint || process.env.THINKHIVE_ENDPOINT || exports.DEFAULT_ENDPOINT,
|
|
36
|
+
serviceName: options.serviceName || process.env.THINKHIVE_SERVICE_NAME || exports.DEFAULT_SERVICE_NAME,
|
|
37
|
+
autoInstrument: options.autoInstrument ?? false,
|
|
38
|
+
frameworks: options.frameworks || ['langchain', 'openai'],
|
|
39
|
+
debug: options.debug ?? false,
|
|
40
|
+
apiVersion: options.apiVersion ?? 'v3',
|
|
41
|
+
};
|
|
42
|
+
initialized = true;
|
|
43
|
+
return config;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get current configuration
|
|
47
|
+
* @throws if not initialized
|
|
48
|
+
*/
|
|
49
|
+
function getConfig() {
|
|
50
|
+
if (!config || !initialized) {
|
|
51
|
+
throw new Error('ThinkHive SDK not initialized. Call init() first.');
|
|
52
|
+
}
|
|
53
|
+
return config;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if SDK is initialized
|
|
57
|
+
*/
|
|
58
|
+
function isInitialized() {
|
|
59
|
+
return initialized;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reset configuration (for testing)
|
|
63
|
+
*/
|
|
64
|
+
function resetConfig() {
|
|
65
|
+
config = null;
|
|
66
|
+
initialized = false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Debug log helper
|
|
70
|
+
*/
|
|
71
|
+
function debugLog(...args) {
|
|
72
|
+
if (config?.debug) {
|
|
73
|
+
console.log('[ThinkHive]', ...args);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBcUNILGdDQXVCQztBQU1ELDhCQUtDO0FBS0Qsc0NBRUM7QUFLRCxrQ0FHQztBQUtELDRCQUlDO0FBM0ZELCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osK0VBQStFO0FBRWxFLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUN0QixRQUFBLGdCQUFnQixHQUFHLCtDQUErQyxDQUFDO0FBQ25FLFFBQUEsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO0FBaUJsRCxJQUFJLE1BQU0sR0FBMEIsSUFBSSxDQUFDO0FBQ3pDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztBQUV4QiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxVQUF1QixFQUFFO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7SUFDckUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztJQUV4RSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEUsQ0FDL0UsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUc7UUFDUCxNQUFNO1FBQ04sT0FBTztRQUNQLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksd0JBQWdCO1FBQ2hGLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLElBQUksNEJBQW9CO1FBQzlGLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLEtBQUs7UUFDL0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDO1FBQ3pELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUs7UUFDN0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSTtLQUN2QyxDQUFDO0lBRUYsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUztJQUN2QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixhQUFhO0lBQzNCLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFdBQVc7SUFDekIsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNkLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLEdBQUcsSUFBZTtJQUN6QyxJQUFJLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlua0hpdmUgU0RLIHYzLjAgLSBDb25maWd1cmF0aW9uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJbml0T3B0aW9ucywgRnJhbWV3b3JrIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENPTlNUQU5UU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnMy4wLjAnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRU5EUE9JTlQgPSAnaHR0cHM6Ly90aGlua2hpdmVtaW5kLWgyNXo3cHZkM3EtdWMuYS5ydW4uYXBwJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFUlZJQ0VfTkFNRSA9ICdteS1haS1hZ2VudCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEdMT0JBTCBDT05GSUcgU1RBVEVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIGF1dG9JbnN0cnVtZW50OiBib29sZWFuO1xuICBmcmFtZXdvcmtzOiBGcmFtZXdvcmtbXTtcbiAgZGVidWc6IGJvb2xlYW47XG4gIGFwaVZlcnNpb246ICd2MScgfCAndjMnO1xufVxuXG5sZXQgY29uZmlnOiBSZXNvbHZlZENvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENPTkZJRyBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZnJvbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29uZmlnKG9wdGlvbnM6IEluaXRPcHRpb25zID0ge30pOiBSZXNvbHZlZENvbmZpZyB7XG4gIGNvbnN0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LlRISU5LSElWRV9BUElfS0VZIHx8ICcnO1xuICBjb25zdCBhZ2VudElkID0gb3B0aW9ucy5hZ2VudElkIHx8IHByb2Nlc3MuZW52LlRISU5LSElWRV9BR0VOVF9JRCB8fCAnJztcblxuICBpZiAoIWFwaUtleSAmJiAhYWdlbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdFaXRoZXIgYXBpS2V5IG9yIGFnZW50SWQgbXVzdCBiZSBwcm92aWRlZCAob3Igc2V0IFRISU5LSElWRV9BUElfS0VZIGVudiB2YXIpJ1xuICAgICk7XG4gIH1cblxuICBjb25maWcgPSB7XG4gICAgYXBpS2V5LFxuICAgIGFnZW50SWQsXG4gICAgZW5kcG9pbnQ6IG9wdGlvbnMuZW5kcG9pbnQgfHwgcHJvY2Vzcy5lbnYuVEhJTktISVZFX0VORFBPSU5UIHx8IERFRkFVTFRfRU5EUE9JTlQsXG4gICAgc2VydmljZU5hbWU6IG9wdGlvbnMuc2VydmljZU5hbWUgfHwgcHJvY2Vzcy5lbnYuVEhJTktISVZFX1NFUlZJQ0VfTkFNRSB8fCBERUZBVUxUX1NFUlZJQ0VfTkFNRSxcbiAgICBhdXRvSW5zdHJ1bWVudDogb3B0aW9ucy5hdXRvSW5zdHJ1bWVudCA/PyBmYWxzZSxcbiAgICBmcmFtZXdvcmtzOiBvcHRpb25zLmZyYW1ld29ya3MgfHwgWydsYW5nY2hhaW4nLCAnb3BlbmFpJ10sXG4gICAgZGVidWc6IG9wdGlvbnMuZGVidWcgPz8gZmFsc2UsXG4gICAgYXBpVmVyc2lvbjogb3B0aW9ucy5hcGlWZXJzaW9uID8/ICd2MycsXG4gIH07XG5cbiAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3MgaWYgbm90IGluaXRpYWxpemVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoKTogUmVzb2x2ZWRDb25maWcge1xuICBpZiAoIWNvbmZpZyB8fCAhaW5pdGlhbGl6ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaW5rSGl2ZSBTREsgbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXQoKSBmaXJzdC4nKTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIFNESyBpcyBpbml0aWFsaXplZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGluaXRpYWxpemVkO1xufVxuXG4vKipcbiAqIFJlc2V0IGNvbmZpZ3VyYXRpb24gKGZvciB0ZXN0aW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDb25maWcoKTogdm9pZCB7XG4gIGNvbmZpZyA9IG51bGw7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogRGVidWcgbG9nIGhlbHBlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWdMb2coLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gIGlmIChjb25maWc/LmRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coJ1tUaGlua0hpdmVdJywgLi4uYXJncyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkHive SDK v3.0 - Core Types
|
|
3
|
+
*
|
|
4
|
+
* Run-centric types with facts vs inferences and customer context snapshots
|
|
5
|
+
*/
|
|
6
|
+
export interface InitOptions {
|
|
7
|
+
/** ThinkHive API key (starts with th_) */
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
/** Agent ID */
|
|
10
|
+
agentId?: string;
|
|
11
|
+
/** ThinkHive API endpoint */
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
/** Service name for traces */
|
|
14
|
+
serviceName?: string;
|
|
15
|
+
/** Enable auto-instrumentation */
|
|
16
|
+
autoInstrument?: boolean;
|
|
17
|
+
/** Frameworks to auto-instrument */
|
|
18
|
+
frameworks?: Framework[];
|
|
19
|
+
/** Enable debug logging */
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
/** API version (default: 'v3') */
|
|
22
|
+
apiVersion?: 'v1' | 'v3';
|
|
23
|
+
}
|
|
24
|
+
export type Framework = 'langchain' | 'langgraph' | 'openai' | 'openai-assistants' | 'anthropic' | 'llamaindex' | 'n8n' | 'voiceflow';
|
|
25
|
+
/**
|
|
26
|
+
* Options for creating a run (v3 atomic unit)
|
|
27
|
+
*/
|
|
28
|
+
export interface RunOptions {
|
|
29
|
+
/** Agent ID */
|
|
30
|
+
agentId: string;
|
|
31
|
+
/** When the run started */
|
|
32
|
+
startedAt?: string | Date;
|
|
33
|
+
/** When the run ended */
|
|
34
|
+
endedAt?: string | Date;
|
|
35
|
+
/** Run outcome */
|
|
36
|
+
outcome?: RunOutcome;
|
|
37
|
+
/** Reason for the outcome */
|
|
38
|
+
outcomeReason?: string;
|
|
39
|
+
/** Conversation messages */
|
|
40
|
+
conversationMessages: ConversationMessage[];
|
|
41
|
+
/** Model ID used */
|
|
42
|
+
modelId?: string;
|
|
43
|
+
/** Prompt version */
|
|
44
|
+
promptVersion?: string;
|
|
45
|
+
/** Session ID for conversation tracking */
|
|
46
|
+
sessionId?: string;
|
|
47
|
+
/** Customer context snapshot (ARR, health AS OF this run) */
|
|
48
|
+
customerContext?: CustomerContextSnapshot;
|
|
49
|
+
/** Ticket linking options */
|
|
50
|
+
ticketLinking?: TicketLinkingOptions;
|
|
51
|
+
/** Custom metadata */
|
|
52
|
+
metadata?: Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
export type RunOutcome = 'resolved' | 'escalated' | 'abandoned' | 'failed' | 'transferred' | 'pending';
|
|
55
|
+
export interface ConversationMessage {
|
|
56
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
57
|
+
content: string;
|
|
58
|
+
timestamp?: string;
|
|
59
|
+
metadata?: Record<string, unknown>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Customer context captured AS OF the run time (not current values)
|
|
63
|
+
*/
|
|
64
|
+
export interface CustomerContextSnapshot {
|
|
65
|
+
/** Customer account ID */
|
|
66
|
+
customerId?: string;
|
|
67
|
+
/** ARR at the time of the run (not current ARR) */
|
|
68
|
+
arr?: number;
|
|
69
|
+
/** Health score at the time of the run (0-100) */
|
|
70
|
+
healthScore?: number;
|
|
71
|
+
/** Customer segment (e.g., 'enterprise', 'mid-market', 'smb') */
|
|
72
|
+
segment?: string;
|
|
73
|
+
/** When this snapshot was captured */
|
|
74
|
+
capturedAt?: string;
|
|
75
|
+
/** Custom fields (will be validated against schema) */
|
|
76
|
+
customFields?: Record<string, unknown>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Options for deterministic ticket linking
|
|
80
|
+
*/
|
|
81
|
+
export interface TicketLinkingOptions {
|
|
82
|
+
/** Link method to use */
|
|
83
|
+
method: LinkMethod;
|
|
84
|
+
/** Ticket ID (for sdk_explicit method) */
|
|
85
|
+
ticketId?: string;
|
|
86
|
+
/** External ticket ID (e.g., Zendesk ticket ID) */
|
|
87
|
+
externalTicketId?: string;
|
|
88
|
+
/** Platform for external ticket */
|
|
89
|
+
platform?: 'zendesk' | 'intercom' | 'salesforce' | 'freshdesk';
|
|
90
|
+
/** Custom field name for linking */
|
|
91
|
+
customFieldName?: string;
|
|
92
|
+
/** Custom field value */
|
|
93
|
+
customFieldValue?: string;
|
|
94
|
+
}
|
|
95
|
+
export type LinkMethod = 'sdk_explicit' | 'zendesk_marker' | 'custom_field' | 'middleware_stamp' | 'session_match' | 'email_time_window' | 'manual';
|
|
96
|
+
/**
|
|
97
|
+
* Trace options (v2 format, converted to runs internally)
|
|
98
|
+
* @deprecated Use RunOptions instead
|
|
99
|
+
*/
|
|
100
|
+
export interface TraceOptions {
|
|
101
|
+
/** User's message/query */
|
|
102
|
+
userMessage: string;
|
|
103
|
+
/** Agent's response */
|
|
104
|
+
agentResponse: string;
|
|
105
|
+
/** User's detected intent */
|
|
106
|
+
userIntent?: string;
|
|
107
|
+
/** Outcome: success, failure, partial_success */
|
|
108
|
+
outcome?: 'success' | 'failure' | 'partial_success';
|
|
109
|
+
/** Duration in milliseconds */
|
|
110
|
+
duration?: number;
|
|
111
|
+
/** Session ID for conversation tracking */
|
|
112
|
+
sessionId?: string;
|
|
113
|
+
/** Conversation history */
|
|
114
|
+
conversationHistory?: Array<{
|
|
115
|
+
role: string;
|
|
116
|
+
content: string;
|
|
117
|
+
}>;
|
|
118
|
+
/** Span data for detailed analysis */
|
|
119
|
+
spans?: SpanData[];
|
|
120
|
+
/** Business context for ROI calculation */
|
|
121
|
+
businessContext?: BusinessContext;
|
|
122
|
+
/** Custom metadata */
|
|
123
|
+
metadata?: Record<string, unknown>;
|
|
124
|
+
}
|
|
125
|
+
export interface SpanData {
|
|
126
|
+
id?: string;
|
|
127
|
+
name: string;
|
|
128
|
+
type: 'llm' | 'tool' | 'retrieval' | 'embedding' | 'chain' | 'custom';
|
|
129
|
+
startTime?: Date;
|
|
130
|
+
endTime?: Date;
|
|
131
|
+
durationMs?: number;
|
|
132
|
+
status?: 'ok' | 'error' | 'timeout';
|
|
133
|
+
error?: string;
|
|
134
|
+
input?: unknown;
|
|
135
|
+
output?: unknown;
|
|
136
|
+
model?: string;
|
|
137
|
+
provider?: string;
|
|
138
|
+
promptTokens?: number;
|
|
139
|
+
completionTokens?: number;
|
|
140
|
+
toolName?: string;
|
|
141
|
+
toolParameters?: Record<string, unknown>;
|
|
142
|
+
query?: string;
|
|
143
|
+
documentCount?: number;
|
|
144
|
+
topScore?: number;
|
|
145
|
+
sources?: string[];
|
|
146
|
+
children?: SpanData[];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* @deprecated Use CustomerContextSnapshot instead
|
|
150
|
+
*/
|
|
151
|
+
export interface BusinessContext {
|
|
152
|
+
/** Customer ID */
|
|
153
|
+
customerId?: string;
|
|
154
|
+
/** Transaction value in dollars */
|
|
155
|
+
transactionValue?: number;
|
|
156
|
+
/** Priority level */
|
|
157
|
+
priority?: 'low' | 'medium' | 'high' | 'critical';
|
|
158
|
+
/** Department */
|
|
159
|
+
department?: string;
|
|
160
|
+
/** Industry vertical */
|
|
161
|
+
industry?: string;
|
|
162
|
+
/** Custom fields */
|
|
163
|
+
custom?: Record<string, unknown>;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* A claim about a run (fact vs inference)
|
|
167
|
+
*/
|
|
168
|
+
export interface Claim {
|
|
169
|
+
id: string;
|
|
170
|
+
analysisId: string;
|
|
171
|
+
/** Type of claim */
|
|
172
|
+
claimType: ClaimType;
|
|
173
|
+
/** Category of the claim */
|
|
174
|
+
claimCategory: ClaimCategory;
|
|
175
|
+
/** The claim text */
|
|
176
|
+
claimText: string;
|
|
177
|
+
/** Confidence in this claim (0-1) */
|
|
178
|
+
confidence: number;
|
|
179
|
+
/** How well calibrated is this confidence */
|
|
180
|
+
confidenceCalibration: ConfidenceCalibration;
|
|
181
|
+
/** Evidence supporting this claim */
|
|
182
|
+
evidence: EvidenceReference[];
|
|
183
|
+
/** Is this claim explainable to end users */
|
|
184
|
+
isExplainable: boolean;
|
|
185
|
+
/** Probability value for probability claims */
|
|
186
|
+
probabilityValue?: number;
|
|
187
|
+
/** Human-assigned verification status */
|
|
188
|
+
humanVerified?: boolean;
|
|
189
|
+
/** Human verification verdict */
|
|
190
|
+
humanVerdict?: 'confirmed' | 'rejected' | 'modified';
|
|
191
|
+
createdAt?: string;
|
|
192
|
+
}
|
|
193
|
+
export type ClaimType = 'observed' | 'inferred' | 'computed';
|
|
194
|
+
export type ClaimCategory = 'outcome' | 'root_cause' | 'customer_impact' | 'churn_risk' | 'revenue_impact' | 'quality' | 'other';
|
|
195
|
+
export type ConfidenceCalibration = 'calibrated' | 'uncalibrated' | 'needs_more_data';
|
|
196
|
+
export interface EvidenceReference {
|
|
197
|
+
/** Type of evidence */
|
|
198
|
+
type: 'span' | 'message' | 'tool_call' | 'external' | 'computed';
|
|
199
|
+
/** ID of the referenced item */
|
|
200
|
+
referenceId: string;
|
|
201
|
+
/** How relevant is this evidence */
|
|
202
|
+
relevance: string;
|
|
203
|
+
/** Confidence in this evidence */
|
|
204
|
+
confidence: number;
|
|
205
|
+
}
|
|
206
|
+
export interface AnalysisResult {
|
|
207
|
+
id: string;
|
|
208
|
+
runId: string;
|
|
209
|
+
analysisVersion: string;
|
|
210
|
+
modelUsed: string;
|
|
211
|
+
/** Overall outcome verdict */
|
|
212
|
+
outcomeVerdict: 'success' | 'partial_success' | 'failure';
|
|
213
|
+
/** Confidence in the verdict (0-1) */
|
|
214
|
+
outcomeConfidence: number;
|
|
215
|
+
/** Root cause category if failure */
|
|
216
|
+
rootCauseCategory?: string;
|
|
217
|
+
/** Confidence in root cause (0-1) */
|
|
218
|
+
rootCauseConfidence?: number;
|
|
219
|
+
/** Is this the current analysis */
|
|
220
|
+
isCurrent: boolean;
|
|
221
|
+
/** ID of analysis that superseded this one */
|
|
222
|
+
supersededBy?: string;
|
|
223
|
+
/** Claims from this analysis */
|
|
224
|
+
claims: Claim[];
|
|
225
|
+
analyzedAt?: string;
|
|
226
|
+
createdAt?: string;
|
|
227
|
+
}
|
|
228
|
+
export interface CalibrationStatus {
|
|
229
|
+
agentId: string;
|
|
230
|
+
predictionType: PredictionType;
|
|
231
|
+
/** Brier score (lower is better, <0.1 is good) */
|
|
232
|
+
brierScore: number;
|
|
233
|
+
/** Expected Calibration Error */
|
|
234
|
+
ece: number;
|
|
235
|
+
/** Sample count */
|
|
236
|
+
sampleCount: number;
|
|
237
|
+
/** Is the model well-calibrated */
|
|
238
|
+
isCalibrated: boolean;
|
|
239
|
+
/** Calibration by confidence bucket */
|
|
240
|
+
buckets: CalibrationBucket[];
|
|
241
|
+
lastUpdated?: string;
|
|
242
|
+
}
|
|
243
|
+
export type PredictionType = 'outcome' | 'churn_risk' | 'escalation_risk' | 'resolution_time' | 'customer_satisfaction';
|
|
244
|
+
export interface CalibrationBucket {
|
|
245
|
+
bucketStart: number;
|
|
246
|
+
bucketEnd: number;
|
|
247
|
+
predictedProbability: number;
|
|
248
|
+
actualFrequency: number;
|
|
249
|
+
sampleCount: number;
|
|
250
|
+
}
|
|
251
|
+
export interface RoiConfig {
|
|
252
|
+
/** Cost per support ticket deflected */
|
|
253
|
+
ticketDeflectionValue: number;
|
|
254
|
+
/** Cost per escalation */
|
|
255
|
+
escalationCost: number;
|
|
256
|
+
/** Cost per hour of agent time */
|
|
257
|
+
agentHourlyCost: number;
|
|
258
|
+
/** Average resolution time (minutes) */
|
|
259
|
+
avgResolutionMinutes: number;
|
|
260
|
+
/** CSAT impact multiplier */
|
|
261
|
+
csatImpactMultiplier: number;
|
|
262
|
+
}
|
|
263
|
+
export interface RoiSummary {
|
|
264
|
+
period: {
|
|
265
|
+
from: string;
|
|
266
|
+
to: string;
|
|
267
|
+
};
|
|
268
|
+
/** Total estimated savings */
|
|
269
|
+
totalSavings: number;
|
|
270
|
+
/** Breakdown by category */
|
|
271
|
+
breakdown: {
|
|
272
|
+
ticketDeflection: number;
|
|
273
|
+
escalationPrevention: number;
|
|
274
|
+
timeToResolution: number;
|
|
275
|
+
churnPrevention: number;
|
|
276
|
+
};
|
|
277
|
+
/** Confidence in these estimates */
|
|
278
|
+
confidence: 'low' | 'medium' | 'high';
|
|
279
|
+
/** Methodology used */
|
|
280
|
+
methodology: string;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* @deprecated Use AnalysisResult instead
|
|
284
|
+
*/
|
|
285
|
+
export interface ExplainabilityResult {
|
|
286
|
+
traceId: string;
|
|
287
|
+
explainabilityId: string;
|
|
288
|
+
summary: string;
|
|
289
|
+
outcome: {
|
|
290
|
+
verdict: 'success' | 'partial_success' | 'failure';
|
|
291
|
+
confidence: number;
|
|
292
|
+
reasoning: string;
|
|
293
|
+
};
|
|
294
|
+
businessImpact: {
|
|
295
|
+
impactScore: number;
|
|
296
|
+
customerSatisfaction: number;
|
|
297
|
+
revenueRisk: string;
|
|
298
|
+
};
|
|
299
|
+
recommendations: Array<{
|
|
300
|
+
priority: string;
|
|
301
|
+
category: string;
|
|
302
|
+
action: string;
|
|
303
|
+
expectedImpact: string;
|
|
304
|
+
}>;
|
|
305
|
+
ragEvaluation?: {
|
|
306
|
+
groundedness: number;
|
|
307
|
+
faithfulness: number;
|
|
308
|
+
answerRelevance: number;
|
|
309
|
+
};
|
|
310
|
+
hallucinationReport?: {
|
|
311
|
+
detected: boolean;
|
|
312
|
+
types: string[];
|
|
313
|
+
severity: string;
|
|
314
|
+
};
|
|
315
|
+
processingTimeMs: number;
|
|
316
|
+
}
|
|
317
|
+
export interface ApiResponse<T> {
|
|
318
|
+
success: boolean;
|
|
319
|
+
data?: T;
|
|
320
|
+
error?: {
|
|
321
|
+
code: string;
|
|
322
|
+
message: string;
|
|
323
|
+
details?: unknown;
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export interface PaginatedResponse<T> {
|
|
327
|
+
success: boolean;
|
|
328
|
+
data: {
|
|
329
|
+
items: T[];
|
|
330
|
+
limit: number;
|
|
331
|
+
offset: number;
|
|
332
|
+
hasMore: boolean;
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
export interface RunResponse {
|
|
336
|
+
id: string;
|
|
337
|
+
companyId: string;
|
|
338
|
+
agentId: string;
|
|
339
|
+
ticketId?: string;
|
|
340
|
+
customerAccountId?: string;
|
|
341
|
+
sessionId?: string;
|
|
342
|
+
startedAt: string;
|
|
343
|
+
endedAt?: string;
|
|
344
|
+
durationMs?: number;
|
|
345
|
+
outcome?: RunOutcome;
|
|
346
|
+
outcomeReason?: string;
|
|
347
|
+
conversationMessages: ConversationMessage[];
|
|
348
|
+
modelId?: string;
|
|
349
|
+
promptVersion?: string;
|
|
350
|
+
customerContextSnapshot?: CustomerContextSnapshot;
|
|
351
|
+
zendeskMarker?: string;
|
|
352
|
+
createdAt: string;
|
|
353
|
+
updatedAt: string;
|
|
354
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK v3.0 - Core Types
|
|
4
|
+
*
|
|
5
|
+
* Run-centric types with facts vs inferences and customer context snapshots
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyB2My4wIC0gQ29yZSBUeXBlc1xuICpcbiAqIFJ1bi1jZW50cmljIHR5cGVzIHdpdGggZmFjdHMgdnMgaW5mZXJlbmNlcyBhbmQgY3VzdG9tZXIgY29udGV4dCBzbmFwc2hvdHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTklUIE9QVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0T3B0aW9ucyB7XG4gIC8qKiBUaGlua0hpdmUgQVBJIGtleSAoc3RhcnRzIHdpdGggdGhfKSAqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBBZ2VudCBJRCAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xuICAvKiogVGhpbmtIaXZlIEFQSSBlbmRwb2ludCAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgdHJhY2VzICovXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIGF1dG8taW5zdHJ1bWVudGF0aW9uICovXG4gIGF1dG9JbnN0cnVtZW50PzogYm9vbGVhbjtcbiAgLyoqIEZyYW1ld29ya3MgdG8gYXV0by1pbnN0cnVtZW50ICovXG4gIGZyYW1ld29ya3M/OiBGcmFtZXdvcmtbXTtcbiAgLyoqIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIEFQSSB2ZXJzaW9uIChkZWZhdWx0OiAndjMnKSAqL1xuICBhcGlWZXJzaW9uPzogJ3YxJyB8ICd2Myc7XG59XG5cbmV4cG9ydCB0eXBlIEZyYW1ld29yayA9XG4gIHwgJ2xhbmdjaGFpbidcbiAgfCAnbGFuZ2dyYXBoJ1xuICB8ICdvcGVuYWknXG4gIHwgJ29wZW5haS1hc3Npc3RhbnRzJ1xuICB8ICdhbnRocm9waWMnXG4gIHwgJ2xsYW1haW5kZXgnXG4gIHwgJ244bidcbiAgfCAndm9pY2VmbG93JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUlVOIE9QVElPTlMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgcnVuICh2MyBhdG9taWMgdW5pdClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5PcHRpb25zIHtcbiAgLyoqIEFnZW50IElEICovXG4gIGFnZW50SWQ6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIHJ1biBzdGFydGVkICovXG4gIHN0YXJ0ZWRBdD86IHN0cmluZyB8IERhdGU7XG4gIC8qKiBXaGVuIHRoZSBydW4gZW5kZWQgKi9cbiAgZW5kZWRBdD86IHN0cmluZyB8IERhdGU7XG4gIC8qKiBSdW4gb3V0Y29tZSAqL1xuICBvdXRjb21lPzogUnVuT3V0Y29tZTtcbiAgLyoqIFJlYXNvbiBmb3IgdGhlIG91dGNvbWUgKi9cbiAgb3V0Y29tZVJlYXNvbj86IHN0cmluZztcbiAgLyoqIENvbnZlcnNhdGlvbiBtZXNzYWdlcyAqL1xuICBjb252ZXJzYXRpb25NZXNzYWdlczogQ29udmVyc2F0aW9uTWVzc2FnZVtdO1xuICAvKiogTW9kZWwgSUQgdXNlZCAqL1xuICBtb2RlbElkPzogc3RyaW5nO1xuICAvKiogUHJvbXB0IHZlcnNpb24gKi9cbiAgcHJvbXB0VmVyc2lvbj86IHN0cmluZztcbiAgLyoqIFNlc3Npb24gSUQgZm9yIGNvbnZlcnNhdGlvbiB0cmFja2luZyAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b21lciBjb250ZXh0IHNuYXBzaG90IChBUlIsIGhlYWx0aCBBUyBPRiB0aGlzIHJ1bikgKi9cbiAgY3VzdG9tZXJDb250ZXh0PzogQ3VzdG9tZXJDb250ZXh0U25hcHNob3Q7XG4gIC8qKiBUaWNrZXQgbGlua2luZyBvcHRpb25zICovXG4gIHRpY2tldExpbmtpbmc/OiBUaWNrZXRMaW5raW5nT3B0aW9ucztcbiAgLyoqIEN1c3RvbSBtZXRhZGF0YSAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBSdW5PdXRjb21lID1cbiAgfCAncmVzb2x2ZWQnXG4gIHwgJ2VzY2FsYXRlZCdcbiAgfCAnYWJhbmRvbmVkJ1xuICB8ICdmYWlsZWQnXG4gIHwgJ3RyYW5zZmVycmVkJ1xuICB8ICdwZW5kaW5nJztcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25NZXNzYWdlIHtcbiAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAnc3lzdGVtJyB8ICd0b29sJztcbiAgY29udGVudDogc3RyaW5nO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENVU1RPTUVSIENPTlRFWFQgU05BUFNIT1QgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEN1c3RvbWVyIGNvbnRleHQgY2FwdHVyZWQgQVMgT0YgdGhlIHJ1biB0aW1lIChub3QgY3VycmVudCB2YWx1ZXMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJDb250ZXh0U25hcHNob3Qge1xuICAvKiogQ3VzdG9tZXIgYWNjb3VudCBJRCAqL1xuICBjdXN0b21lcklkPzogc3RyaW5nO1xuICAvKiogQVJSIGF0IHRoZSB0aW1lIG9mIHRoZSBydW4gKG5vdCBjdXJyZW50IEFSUikgKi9cbiAgYXJyPzogbnVtYmVyO1xuICAvKiogSGVhbHRoIHNjb3JlIGF0IHRoZSB0aW1lIG9mIHRoZSBydW4gKDAtMTAwKSAqL1xuICBoZWFsdGhTY29yZT86IG51bWJlcjtcbiAgLyoqIEN1c3RvbWVyIHNlZ21lbnQgKGUuZy4sICdlbnRlcnByaXNlJywgJ21pZC1tYXJrZXQnLCAnc21iJykgKi9cbiAgc2VnbWVudD86IHN0cmluZztcbiAgLyoqIFdoZW4gdGhpcyBzbmFwc2hvdCB3YXMgY2FwdHVyZWQgKi9cbiAgY2FwdHVyZWRBdD86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZHMgKHdpbGwgYmUgdmFsaWRhdGVkIGFnYWluc3Qgc2NoZW1hKSAqL1xuICBjdXN0b21GaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVElDS0VUIExJTktJTkcgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRldGVybWluaXN0aWMgdGlja2V0IGxpbmtpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWNrZXRMaW5raW5nT3B0aW9ucyB7XG4gIC8qKiBMaW5rIG1ldGhvZCB0byB1c2UgKi9cbiAgbWV0aG9kOiBMaW5rTWV0aG9kO1xuICAvKiogVGlja2V0IElEIChmb3Igc2RrX2V4cGxpY2l0IG1ldGhvZCkgKi9cbiAgdGlja2V0SWQ/OiBzdHJpbmc7XG4gIC8qKiBFeHRlcm5hbCB0aWNrZXQgSUQgKGUuZy4sIFplbmRlc2sgdGlja2V0IElEKSAqL1xuICBleHRlcm5hbFRpY2tldElkPzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gZm9yIGV4dGVybmFsIHRpY2tldCAqL1xuICBwbGF0Zm9ybT86ICd6ZW5kZXNrJyB8ICdpbnRlcmNvbScgfCAnc2FsZXNmb3JjZScgfCAnZnJlc2hkZXNrJztcbiAgLyoqIEN1c3RvbSBmaWVsZCBuYW1lIGZvciBsaW5raW5nICovXG4gIGN1c3RvbUZpZWxkTmFtZT86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZCB2YWx1ZSAqL1xuICBjdXN0b21GaWVsZFZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMaW5rTWV0aG9kID1cbiAgfCAnc2RrX2V4cGxpY2l0JyAgICAgIC8vIERpcmVjdCBTREsgY2FsbCB3aXRoIHRpY2tldCBJRCAoY29uZmlkZW5jZTogMS4wKVxuICB8ICd6ZW5kZXNrX21hcmtlcicgICAgLy8gRW1iZWRkZWQgVEhJRCBtYXJrZXIgaW4gcmVzcG9uc2UgKGNvbmZpZGVuY2U6IDEuMClcbiAgfCAnY3VzdG9tX2ZpZWxkJyAgICAgIC8vIFplbmRlc2sgY3VzdG9tIGZpZWxkIChjb25maWRlbmNlOiAxLjApXG4gIHwgJ21pZGRsZXdhcmVfc3RhbXAnICAvLyBNaWRkbGV3YXJlLWluamVjdGVkIHRyYWNlIElEIChjb25maWRlbmNlOiAwLjk4KVxuICB8ICdzZXNzaW9uX21hdGNoJyAgICAgLy8gU2Vzc2lvbiBJRCBjb3JyZWxhdGlvbiAoY29uZmlkZW5jZTogMC45NSlcbiAgfCAnZW1haWxfdGltZV93aW5kb3cnIC8vIEVtYWlsICsgMTVtaW4gd2luZG93IChjb25maWRlbmNlOiAwLjYpXG4gIHwgJ21hbnVhbCc7ICAgICAgICAgICAvLyBIdW1hbi1hc3NpZ25lZCAoY29uZmlkZW5jZTogMS4wKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUUkFDRSBPUFRJT05TICh2MiBjb21wYXRpYmlsaXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRyYWNlIG9wdGlvbnMgKHYyIGZvcm1hdCwgY29udmVydGVkIHRvIHJ1bnMgaW50ZXJuYWxseSlcbiAqIEBkZXByZWNhdGVkIFVzZSBSdW5PcHRpb25zIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZU9wdGlvbnMge1xuICAvKiogVXNlcidzIG1lc3NhZ2UvcXVlcnkgKi9cbiAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFnZW50J3MgcmVzcG9uc2UgKi9cbiAgYWdlbnRSZXNwb25zZTogc3RyaW5nO1xuICAvKiogVXNlcidzIGRldGVjdGVkIGludGVudCAqL1xuICB1c2VySW50ZW50Pzogc3RyaW5nO1xuICAvKiogT3V0Y29tZTogc3VjY2VzcywgZmFpbHVyZSwgcGFydGlhbF9zdWNjZXNzICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbF9zdWNjZXNzJztcbiAgLyoqIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgLyoqIFNlc3Npb24gSUQgZm9yIGNvbnZlcnNhdGlvbiB0cmFja2luZyAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb252ZXJzYXRpb24gaGlzdG9yeSAqL1xuICBjb252ZXJzYXRpb25IaXN0b3J5PzogQXJyYXk8eyByb2xlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgLyoqIFNwYW4gZGF0YSBmb3IgZGV0YWlsZWQgYW5hbHlzaXMgKi9cbiAgc3BhbnM/OiBTcGFuRGF0YVtdO1xuICAvKiogQnVzaW5lc3MgY29udGV4dCBmb3IgUk9JIGNhbGN1bGF0aW9uICovXG4gIGJ1c2luZXNzQ29udGV4dD86IEJ1c2luZXNzQ29udGV4dDtcbiAgLyoqIEN1c3RvbSBtZXRhZGF0YSAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYW5EYXRhIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ2xsbScgfCAndG9vbCcgfCAncmV0cmlldmFsJyB8ICdlbWJlZGRpbmcnIHwgJ2NoYWluJyB8ICdjdXN0b20nO1xuICBzdGFydFRpbWU/OiBEYXRlO1xuICBlbmRUaW1lPzogRGF0ZTtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgc3RhdHVzPzogJ29rJyB8ICdlcnJvcicgfCAndGltZW91dCc7XG4gIGVycm9yPzogc3RyaW5nO1xuICBpbnB1dD86IHVua25vd247XG4gIG91dHB1dD86IHVua25vd247XG4gIC8vIExMTS1zcGVjaWZpY1xuICBtb2RlbD86IHN0cmluZztcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIHByb21wdFRva2Vucz86IG51bWJlcjtcbiAgY29tcGxldGlvblRva2Vucz86IG51bWJlcjtcbiAgLy8gVG9vbC1zcGVjaWZpY1xuICB0b29sTmFtZT86IHN0cmluZztcbiAgdG9vbFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLy8gUmV0cmlldmFsLXNwZWNpZmljXG4gIHF1ZXJ5Pzogc3RyaW5nO1xuICBkb2N1bWVudENvdW50PzogbnVtYmVyO1xuICB0b3BTY29yZT86IG51bWJlcjtcbiAgc291cmNlcz86IHN0cmluZ1tdO1xuICAvLyBDaGlsZHJlblxuICBjaGlsZHJlbj86IFNwYW5EYXRhW107XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEN1c3RvbWVyQ29udGV4dFNuYXBzaG90IGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0NvbnRleHQge1xuICAvKiogQ3VzdG9tZXIgSUQgKi9cbiAgY3VzdG9tZXJJZD86IHN0cmluZztcbiAgLyoqIFRyYW5zYWN0aW9uIHZhbHVlIGluIGRvbGxhcnMgKi9cbiAgdHJhbnNhY3Rpb25WYWx1ZT86IG51bWJlcjtcbiAgLyoqIFByaW9yaXR5IGxldmVsICovXG4gIHByaW9yaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG4gIC8qKiBEZXBhcnRtZW50ICovXG4gIGRlcGFydG1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBJbmR1c3RyeSB2ZXJ0aWNhbCAqL1xuICBpbmR1c3RyeT86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZHMgKi9cbiAgY3VzdG9tPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENMQUlNIFRZUEVTICh2Mylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBIGNsYWltIGFib3V0IGEgcnVuIChmYWN0IHZzIGluZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFpbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGFuYWx5c2lzSWQ6IHN0cmluZztcbiAgLyoqIFR5cGUgb2YgY2xhaW0gKi9cbiAgY2xhaW1UeXBlOiBDbGFpbVR5cGU7XG4gIC8qKiBDYXRlZ29yeSBvZiB0aGUgY2xhaW0gKi9cbiAgY2xhaW1DYXRlZ29yeTogQ2xhaW1DYXRlZ29yeTtcbiAgLyoqIFRoZSBjbGFpbSB0ZXh0ICovXG4gIGNsYWltVGV4dDogc3RyaW5nO1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGlzIGNsYWltICgwLTEpICovXG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgLyoqIEhvdyB3ZWxsIGNhbGlicmF0ZWQgaXMgdGhpcyBjb25maWRlbmNlICovXG4gIGNvbmZpZGVuY2VDYWxpYnJhdGlvbjogQ29uZmlkZW5jZUNhbGlicmF0aW9uO1xuICAvKiogRXZpZGVuY2Ugc3VwcG9ydGluZyB0aGlzIGNsYWltICovXG4gIGV2aWRlbmNlOiBFdmlkZW5jZVJlZmVyZW5jZVtdO1xuICAvKiogSXMgdGhpcyBjbGFpbSBleHBsYWluYWJsZSB0byBlbmQgdXNlcnMgKi9cbiAgaXNFeHBsYWluYWJsZTogYm9vbGVhbjtcbiAgLyoqIFByb2JhYmlsaXR5IHZhbHVlIGZvciBwcm9iYWJpbGl0eSBjbGFpbXMgKi9cbiAgcHJvYmFiaWxpdHlWYWx1ZT86IG51bWJlcjtcbiAgLyoqIEh1bWFuLWFzc2lnbmVkIHZlcmlmaWNhdGlvbiBzdGF0dXMgKi9cbiAgaHVtYW5WZXJpZmllZD86IGJvb2xlYW47XG4gIC8qKiBIdW1hbiB2ZXJpZmljYXRpb24gdmVyZGljdCAqL1xuICBodW1hblZlcmRpY3Q/OiAnY29uZmlybWVkJyB8ICdyZWplY3RlZCcgfCAnbW9kaWZpZWQnO1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENsYWltVHlwZSA9ICdvYnNlcnZlZCcgfCAnaW5mZXJyZWQnIHwgJ2NvbXB1dGVkJztcbmV4cG9ydCB0eXBlIENsYWltQ2F0ZWdvcnkgPVxuICB8ICdvdXRjb21lJ1xuICB8ICdyb290X2NhdXNlJ1xuICB8ICdjdXN0b21lcl9pbXBhY3QnXG4gIHwgJ2NodXJuX3Jpc2snXG4gIHwgJ3JldmVudWVfaW1wYWN0J1xuICB8ICdxdWFsaXR5J1xuICB8ICdvdGhlcic7XG5leHBvcnQgdHlwZSBDb25maWRlbmNlQ2FsaWJyYXRpb24gPSAnY2FsaWJyYXRlZCcgfCAndW5jYWxpYnJhdGVkJyB8ICduZWVkc19tb3JlX2RhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2aWRlbmNlUmVmZXJlbmNlIHtcbiAgLyoqIFR5cGUgb2YgZXZpZGVuY2UgKi9cbiAgdHlwZTogJ3NwYW4nIHwgJ21lc3NhZ2UnIHwgJ3Rvb2xfY2FsbCcgfCAnZXh0ZXJuYWwnIHwgJ2NvbXB1dGVkJztcbiAgLyoqIElEIG9mIHRoZSByZWZlcmVuY2VkIGl0ZW0gKi9cbiAgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgLyoqIEhvdyByZWxldmFudCBpcyB0aGlzIGV2aWRlbmNlICovXG4gIHJlbGV2YW5jZTogc3RyaW5nO1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGlzIGV2aWRlbmNlICovXG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5BTFlTSVMgUkVTVUxUICh2Mylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGFuYWx5c2lzVmVyc2lvbjogc3RyaW5nO1xuICBtb2RlbFVzZWQ6IHN0cmluZztcbiAgLyoqIE92ZXJhbGwgb3V0Y29tZSB2ZXJkaWN0ICovXG4gIG91dGNvbWVWZXJkaWN0OiAnc3VjY2VzcycgfCAncGFydGlhbF9zdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqIENvbmZpZGVuY2UgaW4gdGhlIHZlcmRpY3QgKDAtMSkgKi9cbiAgb3V0Y29tZUNvbmZpZGVuY2U6IG51bWJlcjtcbiAgLyoqIFJvb3QgY2F1c2UgY2F0ZWdvcnkgaWYgZmFpbHVyZSAqL1xuICByb290Q2F1c2VDYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIENvbmZpZGVuY2UgaW4gcm9vdCBjYXVzZSAoMC0xKSAqL1xuICByb290Q2F1c2VDb25maWRlbmNlPzogbnVtYmVyO1xuICAvKiogSXMgdGhpcyB0aGUgY3VycmVudCBhbmFseXNpcyAqL1xuICBpc0N1cnJlbnQ6IGJvb2xlYW47XG4gIC8qKiBJRCBvZiBhbmFseXNpcyB0aGF0IHN1cGVyc2VkZWQgdGhpcyBvbmUgKi9cbiAgc3VwZXJzZWRlZEJ5Pzogc3RyaW5nO1xuICAvKiogQ2xhaW1zIGZyb20gdGhpcyBhbmFseXNpcyAqL1xuICBjbGFpbXM6IENsYWltW107XG4gIGFuYWx5emVkQXQ/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0FMSUJSQVRJT04gVFlQRVMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGlicmF0aW9uU3RhdHVzIHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBwcmVkaWN0aW9uVHlwZTogUHJlZGljdGlvblR5cGU7XG4gIC8qKiBCcmllciBzY29yZSAobG93ZXIgaXMgYmV0dGVyLCA8MC4xIGlzIGdvb2QpICovXG4gIGJyaWVyU2NvcmU6IG51bWJlcjtcbiAgLyoqIEV4cGVjdGVkIENhbGlicmF0aW9uIEVycm9yICovXG4gIGVjZTogbnVtYmVyO1xuICAvKiogU2FtcGxlIGNvdW50ICovXG4gIHNhbXBsZUNvdW50OiBudW1iZXI7XG4gIC8qKiBJcyB0aGUgbW9kZWwgd2VsbC1jYWxpYnJhdGVkICovXG4gIGlzQ2FsaWJyYXRlZDogYm9vbGVhbjtcbiAgLyoqIENhbGlicmF0aW9uIGJ5IGNvbmZpZGVuY2UgYnVja2V0ICovXG4gIGJ1Y2tldHM6IENhbGlicmF0aW9uQnVja2V0W107XG4gIGxhc3RVcGRhdGVkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcmVkaWN0aW9uVHlwZSA9XG4gIHwgJ291dGNvbWUnXG4gIHwgJ2NodXJuX3Jpc2snXG4gIHwgJ2VzY2FsYXRpb25fcmlzaydcbiAgfCAncmVzb2x1dGlvbl90aW1lJ1xuICB8ICdjdXN0b21lcl9zYXRpc2ZhY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGlicmF0aW9uQnVja2V0IHtcbiAgYnVja2V0U3RhcnQ6IG51bWJlcjtcbiAgYnVja2V0RW5kOiBudW1iZXI7XG4gIHByZWRpY3RlZFByb2JhYmlsaXR5OiBudW1iZXI7XG4gIGFjdHVhbEZyZXF1ZW5jeTogbnVtYmVyO1xuICBzYW1wbGVDb3VudDogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBST0kgVFlQRVMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvaUNvbmZpZyB7XG4gIC8qKiBDb3N0IHBlciBzdXBwb3J0IHRpY2tldCBkZWZsZWN0ZWQgKi9cbiAgdGlja2V0RGVmbGVjdGlvblZhbHVlOiBudW1iZXI7XG4gIC8qKiBDb3N0IHBlciBlc2NhbGF0aW9uICovXG4gIGVzY2FsYXRpb25Db3N0OiBudW1iZXI7XG4gIC8qKiBDb3N0IHBlciBob3VyIG9mIGFnZW50IHRpbWUgKi9cbiAgYWdlbnRIb3VybHlDb3N0OiBudW1iZXI7XG4gIC8qKiBBdmVyYWdlIHJlc29sdXRpb24gdGltZSAobWludXRlcykgKi9cbiAgYXZnUmVzb2x1dGlvbk1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqIENTQVQgaW1wYWN0IG11bHRpcGxpZXIgKi9cbiAgY3NhdEltcGFjdE11bHRpcGxpZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb2lTdW1tYXJ5IHtcbiAgcGVyaW9kOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9O1xuICAvKiogVG90YWwgZXN0aW1hdGVkIHNhdmluZ3MgKi9cbiAgdG90YWxTYXZpbmdzOiBudW1iZXI7XG4gIC8qKiBCcmVha2Rvd24gYnkgY2F0ZWdvcnkgKi9cbiAgYnJlYWtkb3duOiB7XG4gICAgdGlja2V0RGVmbGVjdGlvbjogbnVtYmVyO1xuICAgIGVzY2FsYXRpb25QcmV2ZW50aW9uOiBudW1iZXI7XG4gICAgdGltZVRvUmVzb2x1dGlvbjogbnVtYmVyO1xuICAgIGNodXJuUHJldmVudGlvbjogbnVtYmVyO1xuICB9O1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGVzZSBlc3RpbWF0ZXMgKi9cbiAgY29uZmlkZW5jZTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgLyoqIE1ldGhvZG9sb2d5IHVzZWQgKi9cbiAgbWV0aG9kb2xvZ3k6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVhQTEFJTkFCSUxJVFkgUkVTVUxUICh2MiBjb21wYXRpYmlsaXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBBbmFseXNpc1Jlc3VsdCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpbmFiaWxpdHlSZXN1bHQge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIGV4cGxhaW5hYmlsaXR5SWQ6IHN0cmluZztcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBvdXRjb21lOiB7XG4gICAgdmVyZGljdDogJ3N1Y2Nlc3MnIHwgJ3BhcnRpYWxfc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICB9O1xuICBidXNpbmVzc0ltcGFjdDoge1xuICAgIGltcGFjdFNjb3JlOiBudW1iZXI7XG4gICAgY3VzdG9tZXJTYXRpc2ZhY3Rpb246IG51bWJlcjtcbiAgICByZXZlbnVlUmlzazogc3RyaW5nO1xuICB9O1xuICByZWNvbW1lbmRhdGlvbnM6IEFycmF5PHtcbiAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgZXhwZWN0ZWRJbXBhY3Q6IHN0cmluZztcbiAgfT47XG4gIHJhZ0V2YWx1YXRpb24/OiB7XG4gICAgZ3JvdW5kZWRuZXNzOiBudW1iZXI7XG4gICAgZmFpdGhmdWxuZXNzOiBudW1iZXI7XG4gICAgYW5zd2VyUmVsZXZhbmNlOiBudW1iZXI7XG4gIH07XG4gIGhhbGx1Y2luYXRpb25SZXBvcnQ/OiB7XG4gICAgZGV0ZWN0ZWQ6IGJvb2xlYW47XG4gICAgdHlwZXM6IHN0cmluZ1tdO1xuICAgIHNldmVyaXR5OiBzdHJpbmc7XG4gIH07XG4gIHByb2Nlc3NpbmdUaW1lTXM6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIFJFU1BPTlNFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpUmVzcG9uc2U8VD4ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhPzogVDtcbiAgZXJyb3I/OiB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZXRhaWxzPzogdW5rbm93bjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXNwb25zZTxUPiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE6IHtcbiAgICBpdGVtczogVFtdO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgaGFzTW9yZTogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5SZXNwb25zZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbXBhbnlJZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHRpY2tldElkPzogc3RyaW5nO1xuICBjdXN0b21lckFjY291bnRJZD86IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZztcbiAgZW5kZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgb3V0Y29tZT86IFJ1bk91dGNvbWU7XG4gIG91dGNvbWVSZWFzb24/OiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbk1lc3NhZ2VzOiBDb252ZXJzYXRpb25NZXNzYWdlW107XG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIHByb21wdFZlcnNpb24/OiBzdHJpbmc7XG4gIGN1c3RvbWVyQ29udGV4dFNuYXBzaG90PzogQ3VzdG9tZXJDb250ZXh0U25hcHNob3Q7XG4gIHplbmRlc2tNYXJrZXI/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cbiJdfQ==
|