@copilotkitnext/angular 0.0.1 → 0.0.4
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/README.md +248 -0
- package/dist/README.md +248 -0
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/styles.css +0 -27
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -39
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/README-agent-context.md +0 -310
- package/ng-package.json +0 -19
- package/slots.md +0 -331
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { Injectable, Inject, signal, computed, effect, untracked, } from "@angular/core";
|
|
2
|
+
import { toObservable } from "@angular/core/rxjs-interop";
|
|
3
|
+
import { COPILOTKIT_RUNTIME_URL, COPILOTKIT_HEADERS, COPILOTKIT_PROPERTIES, COPILOTKIT_AGENTS, COPILOTKIT_RENDER_TOOL_CALLS, COPILOTKIT_FRONTEND_TOOLS, COPILOTKIT_HUMAN_IN_THE_LOOP, } from "./copilotkit.types";
|
|
4
|
+
import { CopilotKitCore, } from "@copilotkitnext/core";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Angular service for managing CopilotKit state and interactions.
|
|
8
|
+
* Provides reactive state management using Angular signals and observables.
|
|
9
|
+
*/
|
|
10
|
+
export class CopilotKitService {
|
|
11
|
+
// Initial values for stability tracking
|
|
12
|
+
initialFrontendTools;
|
|
13
|
+
initialHumanInTheLoop;
|
|
14
|
+
initialRenderToolCalls;
|
|
15
|
+
// Core instance - created once
|
|
16
|
+
copilotkit;
|
|
17
|
+
// State signals
|
|
18
|
+
_renderToolCalls;
|
|
19
|
+
_currentRenderToolCalls;
|
|
20
|
+
_runtimeUrl;
|
|
21
|
+
_headers;
|
|
22
|
+
_properties;
|
|
23
|
+
_agents;
|
|
24
|
+
_frontendTools;
|
|
25
|
+
_humanInTheLoop;
|
|
26
|
+
// Runtime state change notification signal
|
|
27
|
+
_runtimeStateVersion;
|
|
28
|
+
// Computed signals for processed values
|
|
29
|
+
_allTools;
|
|
30
|
+
_allRenderToolCalls;
|
|
31
|
+
// Public readonly signals - will be initialized in constructor
|
|
32
|
+
renderToolCalls;
|
|
33
|
+
currentRenderToolCalls;
|
|
34
|
+
runtimeUrl;
|
|
35
|
+
headers;
|
|
36
|
+
properties;
|
|
37
|
+
agents;
|
|
38
|
+
frontendTools;
|
|
39
|
+
humanInTheLoop;
|
|
40
|
+
runtimeStateVersion;
|
|
41
|
+
// Observable APIs for RxJS users - will be initialized in constructor
|
|
42
|
+
renderToolCalls$;
|
|
43
|
+
currentRenderToolCalls$;
|
|
44
|
+
runtimeUrl$;
|
|
45
|
+
headers$;
|
|
46
|
+
properties$;
|
|
47
|
+
agents$;
|
|
48
|
+
frontendTools$;
|
|
49
|
+
humanInTheLoop$;
|
|
50
|
+
// Context value as computed signal - will be initialized in constructor
|
|
51
|
+
context;
|
|
52
|
+
context$;
|
|
53
|
+
constructor(runtimeUrl, headers, properties, agents, renderToolCalls, frontendTools, humanInTheLoop) {
|
|
54
|
+
// Store initial values for stability checking
|
|
55
|
+
this.initialFrontendTools = frontendTools;
|
|
56
|
+
this.initialHumanInTheLoop = humanInTheLoop;
|
|
57
|
+
this.initialRenderToolCalls = renderToolCalls;
|
|
58
|
+
// Process tools and humanInTheLoop
|
|
59
|
+
const { allTools, allRenderToolCalls } = this.processTools(frontendTools, humanInTheLoop, renderToolCalls);
|
|
60
|
+
// Initialize core instance with processed tools
|
|
61
|
+
this.copilotkit = new CopilotKitCore({
|
|
62
|
+
runtimeUrl: undefined, // Prevent server-side fetching
|
|
63
|
+
headers,
|
|
64
|
+
properties,
|
|
65
|
+
agents,
|
|
66
|
+
tools: allTools,
|
|
67
|
+
});
|
|
68
|
+
// Initialize state signals
|
|
69
|
+
this._renderToolCalls =
|
|
70
|
+
signal(allRenderToolCalls);
|
|
71
|
+
this._currentRenderToolCalls =
|
|
72
|
+
signal(allRenderToolCalls);
|
|
73
|
+
this._runtimeUrl = signal(runtimeUrl);
|
|
74
|
+
this._headers = signal(headers);
|
|
75
|
+
this._properties = signal(properties);
|
|
76
|
+
this._agents = signal(agents);
|
|
77
|
+
this._frontendTools = signal(frontendTools);
|
|
78
|
+
this._humanInTheLoop = signal(humanInTheLoop);
|
|
79
|
+
this._runtimeStateVersion = signal(0);
|
|
80
|
+
// Initialize computed signals for processed values
|
|
81
|
+
this._allTools = computed(() => {
|
|
82
|
+
const tools = {};
|
|
83
|
+
// Add frontend tools
|
|
84
|
+
this._frontendTools().forEach((tool) => {
|
|
85
|
+
tools[tool.name] = tool;
|
|
86
|
+
});
|
|
87
|
+
// Process human-in-the-loop tools
|
|
88
|
+
this._humanInTheLoop().forEach((tool) => {
|
|
89
|
+
const frontendTool = {
|
|
90
|
+
name: tool.name,
|
|
91
|
+
description: tool.description,
|
|
92
|
+
parameters: tool.parameters,
|
|
93
|
+
followUp: tool.followUp,
|
|
94
|
+
handler: async (args) => {
|
|
95
|
+
console.warn(`Human-in-the-loop tool '${tool.name}' called but no interactive handler is set up.`);
|
|
96
|
+
return undefined;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
tools[tool.name] = frontendTool;
|
|
100
|
+
});
|
|
101
|
+
return tools;
|
|
102
|
+
});
|
|
103
|
+
this._allRenderToolCalls = computed(() => {
|
|
104
|
+
const combined = [...this._renderToolCalls()];
|
|
105
|
+
// Add render components from frontend tools
|
|
106
|
+
this._frontendTools().forEach((tool) => {
|
|
107
|
+
if (tool.render && tool.parameters) {
|
|
108
|
+
combined.push({
|
|
109
|
+
name: tool.name,
|
|
110
|
+
args: tool.parameters,
|
|
111
|
+
render: tool.render,
|
|
112
|
+
...(tool.agentId && { agentId: tool.agentId }),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// Add render components from human-in-the-loop tools
|
|
117
|
+
this._humanInTheLoop().forEach((tool) => {
|
|
118
|
+
if (tool.render && tool.parameters) {
|
|
119
|
+
combined.push({
|
|
120
|
+
name: tool.name,
|
|
121
|
+
args: tool.parameters,
|
|
122
|
+
render: tool.render,
|
|
123
|
+
...(tool.agentId && { agentId: tool.agentId }),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return combined;
|
|
128
|
+
});
|
|
129
|
+
// Initialize public readonly signals
|
|
130
|
+
this.renderToolCalls = this._allRenderToolCalls;
|
|
131
|
+
this.currentRenderToolCalls = this._currentRenderToolCalls.asReadonly();
|
|
132
|
+
this.runtimeUrl = this._runtimeUrl.asReadonly();
|
|
133
|
+
this.headers = this._headers.asReadonly();
|
|
134
|
+
this.properties = this._properties.asReadonly();
|
|
135
|
+
this.agents = this._agents.asReadonly();
|
|
136
|
+
this.frontendTools = this._frontendTools.asReadonly();
|
|
137
|
+
this.humanInTheLoop = this._humanInTheLoop.asReadonly();
|
|
138
|
+
this.runtimeStateVersion = this._runtimeStateVersion.asReadonly();
|
|
139
|
+
// Initialize Observable APIs
|
|
140
|
+
this.renderToolCalls$ = toObservable(this.renderToolCalls);
|
|
141
|
+
this.currentRenderToolCalls$ = toObservable(this.currentRenderToolCalls);
|
|
142
|
+
this.runtimeUrl$ = toObservable(this.runtimeUrl);
|
|
143
|
+
this.headers$ = toObservable(this.headers);
|
|
144
|
+
this.properties$ = toObservable(this.properties);
|
|
145
|
+
this.agents$ = toObservable(this.agents);
|
|
146
|
+
this.frontendTools$ = toObservable(this.frontendTools);
|
|
147
|
+
this.humanInTheLoop$ = toObservable(this.humanInTheLoop);
|
|
148
|
+
// Initialize context value as computed signal
|
|
149
|
+
this.context = computed(() => {
|
|
150
|
+
// Touch the runtime state version to ensure this computed updates
|
|
151
|
+
// when runtime events occur (loaded/error)
|
|
152
|
+
this.runtimeStateVersion();
|
|
153
|
+
return {
|
|
154
|
+
copilotkit: this.copilotkit,
|
|
155
|
+
renderToolCalls: this.renderToolCalls(),
|
|
156
|
+
currentRenderToolCalls: this.currentRenderToolCalls(),
|
|
157
|
+
setCurrentRenderToolCalls: (v) => this.setCurrentRenderToolCalls(v),
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
this.context$ = toObservable(this.context);
|
|
161
|
+
// Effects must be created in injection context (constructor)
|
|
162
|
+
this.setupRuntimeSyncEffects();
|
|
163
|
+
this.setupStabilityWarnings();
|
|
164
|
+
this.setupEventSubscription();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Process frontend tools and human-in-the-loop tools
|
|
168
|
+
*/
|
|
169
|
+
processTools(frontendTools, humanInTheLoop, renderToolCalls) {
|
|
170
|
+
const allTools = {};
|
|
171
|
+
const allRenderToolCalls = [...renderToolCalls];
|
|
172
|
+
// Add frontend tools
|
|
173
|
+
frontendTools.forEach((tool) => {
|
|
174
|
+
allTools[tool.name] = tool;
|
|
175
|
+
// Add render component if provided
|
|
176
|
+
if (tool.render && tool.parameters) {
|
|
177
|
+
allRenderToolCalls.push({
|
|
178
|
+
name: tool.name,
|
|
179
|
+
args: tool.parameters,
|
|
180
|
+
render: tool.render,
|
|
181
|
+
...(tool.agentId && { agentId: tool.agentId }),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
// Process human-in-the-loop tools
|
|
186
|
+
humanInTheLoop.forEach((tool) => {
|
|
187
|
+
// Create a frontend tool with placeholder handler
|
|
188
|
+
const frontendTool = {
|
|
189
|
+
name: tool.name,
|
|
190
|
+
description: tool.description,
|
|
191
|
+
parameters: tool.parameters,
|
|
192
|
+
followUp: tool.followUp,
|
|
193
|
+
...(tool.agentId && { agentId: tool.agentId }),
|
|
194
|
+
handler: async (args) => {
|
|
195
|
+
// Placeholder handler - actual implementation will be handled by the render component
|
|
196
|
+
console.warn(`Human-in-the-loop tool '${tool.name}' called but no interactive handler is set up.`);
|
|
197
|
+
return undefined;
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
allTools[tool.name] = frontendTool;
|
|
201
|
+
// Add the render component
|
|
202
|
+
if (tool.render && tool.parameters) {
|
|
203
|
+
allRenderToolCalls.push({
|
|
204
|
+
name: tool.name,
|
|
205
|
+
args: tool.parameters,
|
|
206
|
+
render: tool.render,
|
|
207
|
+
...(tool.agentId && { agentId: tool.agentId }),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return { allTools, allRenderToolCalls };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Setup stability warning effects
|
|
215
|
+
*/
|
|
216
|
+
setupStabilityWarnings() {
|
|
217
|
+
// Warn if frontendTools changes
|
|
218
|
+
effect(() => {
|
|
219
|
+
const current = this._frontendTools();
|
|
220
|
+
if (current !== this.initialFrontendTools &&
|
|
221
|
+
this.initialFrontendTools.length > 0) {
|
|
222
|
+
untracked(() => {
|
|
223
|
+
console.error("frontendTools must be a stable array. To add/remove tools dynamically, use dynamic tool registration.");
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// Warn if humanInTheLoop changes
|
|
228
|
+
effect(() => {
|
|
229
|
+
const current = this._humanInTheLoop();
|
|
230
|
+
if (current !== this.initialHumanInTheLoop &&
|
|
231
|
+
this.initialHumanInTheLoop.length > 0) {
|
|
232
|
+
untracked(() => {
|
|
233
|
+
console.error("humanInTheLoop must be a stable array. To add/remove human-in-the-loop tools dynamically, use dynamic tool registration.");
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
// Warn if renderToolCalls changes
|
|
238
|
+
effect(() => {
|
|
239
|
+
const current = this._renderToolCalls();
|
|
240
|
+
if (current !== this.initialRenderToolCalls &&
|
|
241
|
+
this.initialRenderToolCalls.length > 0) {
|
|
242
|
+
untracked(() => {
|
|
243
|
+
console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Setup effects to sync runtime configuration with CopilotKitCore
|
|
250
|
+
*/
|
|
251
|
+
setupRuntimeSyncEffects() {
|
|
252
|
+
// Sync runtime URL
|
|
253
|
+
effect(() => {
|
|
254
|
+
const url = this.runtimeUrl();
|
|
255
|
+
untracked(() => this.copilotkit.setRuntimeUrl(url));
|
|
256
|
+
});
|
|
257
|
+
// Sync headers
|
|
258
|
+
effect(() => {
|
|
259
|
+
const headers = this.headers();
|
|
260
|
+
untracked(() => this.copilotkit.setHeaders(headers));
|
|
261
|
+
});
|
|
262
|
+
// Sync properties
|
|
263
|
+
effect(() => {
|
|
264
|
+
const properties = this.properties();
|
|
265
|
+
untracked(() => this.copilotkit.setProperties(properties));
|
|
266
|
+
});
|
|
267
|
+
// Sync agents
|
|
268
|
+
effect(() => {
|
|
269
|
+
const agents = this.agents();
|
|
270
|
+
untracked(() => this.copilotkit.setAgents(agents));
|
|
271
|
+
});
|
|
272
|
+
// Sync tools - computed from frontend tools and human-in-the-loop
|
|
273
|
+
effect(() => {
|
|
274
|
+
const tools = this._allTools();
|
|
275
|
+
// Update copilotkit.tools directly since there's no setTools method
|
|
276
|
+
untracked(() => {
|
|
277
|
+
this.copilotkit.tools = tools;
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Subscribe to CopilotKit runtime events
|
|
283
|
+
*/
|
|
284
|
+
setupEventSubscription() {
|
|
285
|
+
const unsubscribe = this.copilotkit.subscribe({
|
|
286
|
+
onRuntimeLoaded: () => {
|
|
287
|
+
// Increment version to notify all consumers that runtime state has changed
|
|
288
|
+
// This triggers re-evaluation of computed signals that depend on runtime state
|
|
289
|
+
this.notifyRuntimeStateChange();
|
|
290
|
+
},
|
|
291
|
+
onRuntimeLoadError: () => {
|
|
292
|
+
// Increment version to notify all consumers that runtime state has changed
|
|
293
|
+
// This triggers re-evaluation of computed signals that depend on runtime state
|
|
294
|
+
this.notifyRuntimeStateChange();
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
// Root service lives for app lifetime; unsubscribe not needed.
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Notify consumers that the runtime state has changed.
|
|
301
|
+
* This is similar to React's forceUpdate - it triggers change detection
|
|
302
|
+
* for any computed signals or effects that depend on runtime state.
|
|
303
|
+
*/
|
|
304
|
+
notifyRuntimeStateChange() {
|
|
305
|
+
this._runtimeStateVersion.update((version) => version + 1);
|
|
306
|
+
}
|
|
307
|
+
// Public mutation methods
|
|
308
|
+
/**
|
|
309
|
+
* Update the runtime URL
|
|
310
|
+
*/
|
|
311
|
+
setRuntimeUrl(url) {
|
|
312
|
+
this._runtimeUrl.set(url);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Update request headers
|
|
316
|
+
*/
|
|
317
|
+
setHeaders(headers) {
|
|
318
|
+
this._headers.set(headers);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Update runtime properties
|
|
322
|
+
*/
|
|
323
|
+
setProperties(properties) {
|
|
324
|
+
this._properties.set(properties);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update agents configuration
|
|
328
|
+
*/
|
|
329
|
+
setAgents(agents) {
|
|
330
|
+
this._agents.set(agents);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Get an agent by ID
|
|
334
|
+
* @param agentId - The agent ID to retrieve
|
|
335
|
+
* @returns The agent or undefined if not found
|
|
336
|
+
*/
|
|
337
|
+
getAgent(agentId) {
|
|
338
|
+
return this.copilotkit.getAgent(agentId);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Update render tool calls (warns if object reference changes)
|
|
342
|
+
*/
|
|
343
|
+
setRenderToolCalls(renderToolCalls) {
|
|
344
|
+
if (renderToolCalls !== this.initialRenderToolCalls) {
|
|
345
|
+
console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
|
|
346
|
+
}
|
|
347
|
+
this._renderToolCalls.set(renderToolCalls);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Update frontend tools array
|
|
351
|
+
*/
|
|
352
|
+
setFrontendTools(frontendTools) {
|
|
353
|
+
if (frontendTools !== this.initialFrontendTools) {
|
|
354
|
+
console.error("frontendTools must be a stable array. To add/remove tools dynamically, use dynamic tool registration.");
|
|
355
|
+
}
|
|
356
|
+
this._frontendTools.set(frontendTools);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Update human-in-the-loop array
|
|
360
|
+
*/
|
|
361
|
+
setHumanInTheLoop(humanInTheLoop) {
|
|
362
|
+
if (humanInTheLoop !== this.initialHumanInTheLoop) {
|
|
363
|
+
console.error("humanInTheLoop must be a stable array. To add/remove human-in-the-loop tools dynamically, use dynamic tool registration.");
|
|
364
|
+
}
|
|
365
|
+
this._humanInTheLoop.set(humanInTheLoop);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Update current render tool calls
|
|
369
|
+
*/
|
|
370
|
+
setCurrentRenderToolCalls(renderToolCalls) {
|
|
371
|
+
this._currentRenderToolCalls.set(renderToolCalls);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Register a tool render
|
|
375
|
+
*/
|
|
376
|
+
registerToolRender(name, render) {
|
|
377
|
+
const current = this._currentRenderToolCalls();
|
|
378
|
+
if (current.find((r) => r.name === name)) {
|
|
379
|
+
console.warn(`Tool render for '${name}' is being overwritten`);
|
|
380
|
+
}
|
|
381
|
+
this._currentRenderToolCalls.set([
|
|
382
|
+
...current.filter((r) => r.name !== name),
|
|
383
|
+
render,
|
|
384
|
+
]);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Unregister a tool render
|
|
388
|
+
*/
|
|
389
|
+
unregisterToolRender(name) {
|
|
390
|
+
const current = this._currentRenderToolCalls();
|
|
391
|
+
const filtered = current.filter((r) => r.name !== name);
|
|
392
|
+
if (filtered.length !== current.length) {
|
|
393
|
+
this._currentRenderToolCalls.set(filtered);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get a specific tool render
|
|
398
|
+
*/
|
|
399
|
+
getToolRender(name) {
|
|
400
|
+
return this._currentRenderToolCalls().find((r) => r.name === name);
|
|
401
|
+
}
|
|
402
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, deps: [{ token: COPILOTKIT_RUNTIME_URL }, { token: COPILOTKIT_HEADERS }, { token: COPILOTKIT_PROPERTIES }, { token: COPILOTKIT_AGENTS }, { token: COPILOTKIT_RENDER_TOOL_CALLS }, { token: COPILOTKIT_FRONTEND_TOOLS }, { token: COPILOTKIT_HUMAN_IN_THE_LOOP }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
403
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, providedIn: "root" });
|
|
404
|
+
}
|
|
405
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, decorators: [{
|
|
406
|
+
type: Injectable,
|
|
407
|
+
args: [{ providedIn: "root" }]
|
|
408
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
409
|
+
type: Inject,
|
|
410
|
+
args: [COPILOTKIT_RUNTIME_URL]
|
|
411
|
+
}] }, { type: undefined, decorators: [{
|
|
412
|
+
type: Inject,
|
|
413
|
+
args: [COPILOTKIT_HEADERS]
|
|
414
|
+
}] }, { type: undefined, decorators: [{
|
|
415
|
+
type: Inject,
|
|
416
|
+
args: [COPILOTKIT_PROPERTIES]
|
|
417
|
+
}] }, { type: undefined, decorators: [{
|
|
418
|
+
type: Inject,
|
|
419
|
+
args: [COPILOTKIT_AGENTS]
|
|
420
|
+
}] }, { type: undefined, decorators: [{
|
|
421
|
+
type: Inject,
|
|
422
|
+
args: [COPILOTKIT_RENDER_TOOL_CALLS]
|
|
423
|
+
}] }, { type: undefined, decorators: [{
|
|
424
|
+
type: Inject,
|
|
425
|
+
args: [COPILOTKIT_FRONTEND_TOOLS]
|
|
426
|
+
}] }, { type: undefined, decorators: [{
|
|
427
|
+
type: Inject,
|
|
428
|
+
args: [COPILOTKIT_HUMAN_IN_THE_LOOP]
|
|
429
|
+
}] }] });
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDRCQUE0QixHQUs3QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxjQUFjLEdBR2YsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHOUI7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qix3Q0FBd0M7SUFDdkIsb0JBQW9CLENBQTZCO0lBQ2pELHFCQUFxQixDQUErQjtJQUNwRCxzQkFBc0IsQ0FBNEI7SUFFbkUsK0JBQStCO0lBQ3RCLFVBQVUsQ0FBaUI7SUFFcEMsZ0JBQWdCO0lBQ0MsZ0JBQWdCLENBRS9CO0lBQ2UsdUJBQXVCLENBRXRDO0lBQ2UsV0FBVyxDQUFnRDtJQUMzRCxRQUFRLENBQW9EO0lBQzVELFdBQVcsQ0FFMUI7SUFDZSxPQUFPLENBRXRCO0lBQ2UsY0FBYyxDQUU3QjtJQUNlLGVBQWUsQ0FFOUI7SUFFRiwyQ0FBMkM7SUFDMUIsb0JBQW9CLENBQW9DO0lBRXpFLHdDQUF3QztJQUN2QixTQUFTLENBRXhCO0lBQ2UsbUJBQW1CLENBRWxDO0lBRUYsK0RBQStEO0lBQ3RELGVBQWUsQ0FBTTtJQUNyQixzQkFBc0IsQ0FBTTtJQUM1QixVQUFVLENBQU07SUFDaEIsT0FBTyxDQUFNO0lBQ2IsVUFBVSxDQUFNO0lBQ2hCLE1B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QUM7UUFDL0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7d0dBMWZVLGlCQUFpQixrQkFvRWxCLHNCQUFzQixhQUN0QixrQkFBa0IsYUFDbEIscUJBQXFCLGFBQ3JCLGlCQUFpQixhQUNqQiw0QkFBNEIsYUFFNUIseUJBQXlCLGFBRXpCLDRCQUE0Qjs0R0E1RTNCLGlCQUFpQixjQURKLE1BQU07OzRGQUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxRTdCLE1BQU07MkJBQUMsc0JBQXNCOzswQkFDN0IsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQzVCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyw0QkFBNEI7OzBCQUVuQyxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBRWhDLE1BQU07MkJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIHVudHJhY2tlZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcFwiO1xuaW1wb3J0IHtcbiAgQ09QSUxPVEtJVF9SVU5USU1FX1VSTCxcbiAgQ09QSUxPVEtJVF9IRUFERVJTLFxuICBDT1BJTE9US0lUX1BST1BFUlRJRVMsXG4gIENPUElMT1RLSVRfQUdFTlRTLFxuICBDT1BJTE9US0lUX1JFTkRFUl9UT09MX0NBTExTLFxuICBDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTLFxuICBDT1BJTE9US0lUX0hVTUFOX0lOX1RIRV9MT09QLFxuICBDb3BpbG90S2l0Q29udGV4dFZhbHVlLFxuICBUb29sQ2FsbFJlbmRlcixcbiAgQW5ndWxhckZyb250ZW5kVG9vbCxcbiAgQW5ndWxhckh1bWFuSW5UaGVMb29wLFxufSBmcm9tIFwiLi9jb3BpbG90a2l0LnR5cGVzXCI7XG5pbXBvcnQge1xuICBDb3BpbG90S2l0Q29yZSxcbiAgQ29waWxvdEtpdENvcmVDb25maWcsXG4gIEZyb250ZW5kVG9vbCxcbn0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9jb3JlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcblxuLyoqXG4gKiBBbmd1bGFyIHNlcnZpY2UgZm9yIG1hbmFnaW5nIENvcGlsb3RLaXQgc3RhdGUgYW5kIGludGVyYWN0aW9ucy5cbiAqIFByb3ZpZGVzIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnQgdXNpbmcgQW5ndWxhciBzaWduYWxzIGFuZCBvYnNlcnZhYmxlcy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RLaXRTZXJ2aWNlIHtcbiAgLy8gSW5pdGlhbCB2YWx1ZXMgZm9yIHN0YWJpbGl0eSB0cmFja2luZ1xuICBwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxGcm9udGVuZFRvb2xzOiBBbmd1bGFyRnJvbnRlbmRUb29sPGFueT5bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsSHVtYW5JblRoZUxvb3A6IEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXTtcblxuICAvLyBDb3JlIGluc3RhbmNlIC0gY3JlYXRlZCBvbmNlXG4gIHJlYWRvbmx5IGNvcGlsb3RraXQ6IENvcGlsb3RLaXRDb3JlO1xuXG4gIC8vIFN0YXRlIHNpZ25hbHNcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyVG9vbENhbGxzOiBSZXR1cm5UeXBlPFxuICAgIHR5cGVvZiBzaWduYWw8VG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXT5cbiAgPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudFJlbmRlclRvb2xDYWxsczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+XG4gID47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWVVcmw6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvcGVydGllczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZ2VudHM6IFJldHVyblR5cGU8XG4gICAgdHlwZW9mIHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50Pj5cbiAgPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvbnRlbmRUb29sczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPEFuZ3VsYXJGcm9udGVuZFRvb2w8YW55PltdPlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9odW1hbkluVGhlTG9vcDogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W10+XG4gID47XG5cbiAgLy8gUnVudGltZSBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHNpZ25hbFxuICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lU3RhdGVWZXJzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8bnVtYmVyPj47XG5cbiAgLy8gQ29tcHV0ZWQgc2lnbmFscyBmb3IgcHJvY2Vzc2VkIHZhbHVlc1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxUb29sczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2YgY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgRnJvbnRlbmRUb29sPGFueT4+PlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxSZW5kZXJUb29sQ2FsbHM6IFJldHVyblR5cGU8XG4gICAgdHlwZW9mIGNvbXB1dGVkPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+XG4gID47XG5cbiAgLy8gUHVibGljIHJlYWRvbmx5IHNpZ25hbHMgLSB3aWxsIGJlIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yXG4gIHJlYWRvbmx5IHJlbmRlclRvb2xDYWxsczogYW55O1xuICByZWFkb25seSBjdXJyZW50UmVuZGVyVG9vbENhbGxzOiBhbnk7XG4gIHJlYWRvbmx5IHJ1bnRpbWVVcmw6IGFueTtcbiAgcmVhZG9ubHkgaGVhZGVyczogYW55O1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBhbnk7XG4gIHJlYWRvbmx5IGFnZW50czogYW55O1xuICByZWFkb25seSBmcm9udGVuZFRvb2xzOiBhbnk7XG4gIHJlYWRvbmx5IGh1bWFuSW5UaGVMb29wOiBhbnk7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGF0ZVZlcnNpb246IGFueTtcblxuICAvLyBPYnNlcnZhYmxlIEFQSXMgZm9yIFJ4SlMgdXNlcnMgLSB3aWxsIGJlIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yXG4gIHJlYWRvbmx5IHJlbmRlclRvb2xDYWxscyQ6IGFueTtcbiAgcmVhZG9ubHkgY3VycmVudFJlbmRlclRvb2xDYWxscyQ6IGFueTtcbiAgcmVhZG9ubHkgcnVudGltZVVybCQ6IGFueTtcbiAgcmVhZG9ubHkgaGVhZGVycyQ6IGFueTtcbiAgcmVhZG9ubHkgcHJvcGVydGllcyQ6IGFueTtcbiAgcmVhZG9ubHkgYWdlbnRzJDogYW55O1xuICByZWFkb25seSBmcm9udGVuZFRvb2xzJDogYW55O1xuICByZWFkb25seSBodW1hbkluVGhlTG9vcCQ6IGFueTtcblxuICAvLyBDb250ZXh0IHZhbHVlIGFzIGNvbXB1dGVkIHNpZ25hbCAtIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3JcbiAgcmVhZG9ubHkgY29udGV4dDogYW55O1xuICByZWFkb25seSBjb250ZXh0JDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9SVU5USU1FX1VSTCkgcnVudGltZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9IRUFERVJTKSBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9QUk9QRVJUSUVTKSBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBASW5qZWN0KENPUElMT1RLSVRfQUdFTlRTKSBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+LFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9SRU5ERVJfVE9PTF9DQUxMUylcbiAgICByZW5kZXJUb29sQ2FsbHM6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10sXG4gICAgQEluamVjdChDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTKVxuICAgIGZyb250ZW5kVG9vbHM6IEFuZ3VsYXJGcm9udGVuZFRvb2w8YW55PltdLFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9IVU1BTl9JTl9USEVfTE9PUClcbiAgICBodW1hbkluVGhlTG9vcDogQW5ndWxhckh1bWFuSW5UaGVMb29wPGFueT5bXVxuICApIHtcbiAgICAvLyBTdG9yZSBpbml0aWFsIHZhbHVlcyBmb3Igc3RhYmlsaXR5IGNoZWNraW5nXG4gICAgdGhpcy5pbml0aWFsRnJvbnRlbmRUb29scyA9IGZyb250ZW5kVG9vbHM7XG4gICAgdGhpcy5pbml0aWFsSHVtYW5JblRoZUxvb3AgPSBodW1hbkluVGhlTG9vcDtcbiAgICB0aGlzLmluaXRpYWxSZW5kZXJUb29sQ2FsbHMgPSByZW5kZXJUb29sQ2FsbHM7XG5cbiAgICAvLyBQcm9jZXNzIHRvb2xzIGFuZCBodW1hbkluVGhlTG9vcFxuICAgIGNvbnN0IHsgYWxsVG9vbHMsIGFsbFJlbmRlclRvb2xDYWxscyB9ID0gdGhpcy5wcm9jZXNzVG9vbHMoXG4gICAgICBmcm9udGVuZFRvb2xzLFxuICAgICAgaHVtYW5JblRoZUxvb3AsXG4gICAgICByZW5kZXJUb29sQ2FsbHNcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3JlIGluc3RhbmNlIHdpdGggcHJvY2Vzc2VkIHRvb2xzXG4gICAgdGhpcy5jb3BpbG90a2l0ID0gbmV3IENvcGlsb3RLaXRDb3JlKHtcbiAgICAgIHJ1bnRpbWVVcmw6IHVuZGVmaW5lZCwgLy8gUHJldmVudCBzZXJ2ZXItc2lkZSBmZXRjaGluZ1xuICAgICAgaGVhZGVycyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBhZ2VudHMsXG4gICAgICB0b29sczogYWxsVG9vbHMsXG4gICAgfSBhcyBDb3BpbG90S2l0Q29yZUNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHN0YXRlIHNpZ25hbHNcbiAgICB0aGlzLl9yZW5kZXJUb29sQ2FsbHMgPVxuICAgICAgc2lnbmFsPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+KGFsbFJlbmRlclRvb2xDYWxscyk7XG4gICAgdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscyA9XG4gICAgICBzaWduYWw8VG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXT4oYWxsUmVuZGVyVG9vbENhbGxzKTtcbiAgICB0aGlzLl9ydW50aW1lVXJsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4ocnVudGltZVVybCk7XG4gICAgdGhpcy5faGVhZGVycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihoZWFkZXJzKTtcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9hZ2VudHMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD4+KGFnZW50cyk7XG4gICAgdGhpcy5fZnJvbnRlbmRUb29scyA9IHNpZ25hbDxBbmd1bGFyRnJvbnRlbmRUb29sPGFueT5bXT4oZnJvbnRlbmRUb29scyk7XG4gICAgdGhpcy5faHVtYW5JblRoZUxvb3AgPSBzaWduYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPGFueT5bXT4oaHVtYW5JblRoZUxvb3ApO1xuICAgIHRoaXMuX3J1bnRpbWVTdGF0ZVZlcnNpb24gPSBzaWduYWw8bnVtYmVyPigwKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29tcHV0ZWQgc2lnbmFscyBmb3IgcHJvY2Vzc2VkIHZhbHVlc1xuICAgIHRoaXMuX2FsbFRvb2xzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kVG9vbDxhbnk+PiA9IHt9O1xuXG4gICAgICAvLyBBZGQgZnJvbnRlbmQgdG9vbHNcbiAgICAgIHRoaXMuX2Zyb250ZW5kVG9vbHMoKS5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAgIHRvb2xzW3Rvb2wubmFtZV0gPSB0b29sIGFzIEZyb250ZW5kVG9vbDxhbnk+O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb2Nlc3MgaHVtYW4taW4tdGhlLWxvb3AgdG9vbHNcbiAgICAgIHRoaXMuX2h1bWFuSW5UaGVMb29wKCkuZm9yRWFjaCgodG9vbCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9udGVuZFRvb2w6IEZyb250ZW5kVG9vbDxhbnk+ID0ge1xuICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICAgICAgZm9sbG93VXA6IHRvb2wuZm9sbG93VXAsXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBgSHVtYW4taW4tdGhlLWxvb3AgdG9vbCAnJHt0b29sLm5hbWV9JyBjYWxsZWQgYnV0IG5vIGludGVyYWN0aXZlIGhhbmRsZXIgaXMgc2V0IHVwLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRvb2xzW3Rvb2wubmFtZV0gPSBmcm9udGVuZFRvb2w7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYWxsUmVuZGVyVG9vbENhbGxzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgY29tYmluZWQ6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10gPSBbLi4udGhpcy5fcmVuZGVyVG9vbENhbGxzKCldO1xuXG4gICAgICAvLyBBZGQgcmVuZGVyIGNvbXBvbmVudHMgZnJvbSBmcm9udGVuZCB0b29sc1xuICAgICAgdGhpcy5fZnJvbnRlbmRUb29scygpLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgICAgaWYgKHRvb2wucmVuZGVyICYmIHRvb2wucGFyYW1ldGVycykge1xuICAgICAgICAgIGNvbWJpbmVkLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgICAgYXJnczogdG9vbC5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcmVuZGVyOiB0b29sLnJlbmRlcixcbiAgICAgICAgICAgIC4uLih0b29sLmFnZW50SWQgJiYgeyBhZ2VudElkOiB0b29sLmFnZW50SWQgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgcmVuZGVyIGNvbXBvbmVudHMgZnJvbSBodW1hbi1pbi10aGUtbG9vcCB0b29sc1xuICAgICAgdGhpcy5faHVtYW5JblRoZUxvb3AoKS5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAgIGlmICh0b29sLnJlbmRlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBjb21iaW5lZC5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICAgIHJlbmRlcjogdG9vbC5yZW5kZXIsXG4gICAgICAgICAgICAuLi4odG9vbC5hZ2VudElkICYmIHsgYWdlbnRJZDogdG9vbC5hZ2VudElkIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbWJpbmVkO1xuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwdWJsaWMgcmVhZG9ubHkgc2lnbmFsc1xuICAgIHRoaXMucmVuZGVyVG9vbENhbGxzID0gdGhpcy5fYWxsUmVuZGVyVG9vbENhbGxzO1xuICAgIHRoaXMuY3VycmVudFJlbmRlclRvb2xDYWxscyA9IHRoaXMuX2N1cnJlbnRSZW5kZXJUb29sQ2FsbHMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucnVudGltZVVybCA9IHRoaXMuX3J1bnRpbWVVcmwuYXNSZWFkb25seSgpO1xuICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuX2hlYWRlcnMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3Byb3BlcnRpZXMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMuYWdlbnRzID0gdGhpcy5fYWdlbnRzLmFzUmVhZG9ubHkoKTtcbiAgICB0aGlzLmZyb250ZW5kVG9vbHMgPSB0aGlzLl9mcm9udGVuZFRvb2xzLmFzUmVhZG9ubHkoKTtcbiAgICB0aGlzLmh1bWFuSW5UaGVMb29wID0gdGhpcy5faHVtYW5JblRoZUxvb3AuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucnVudGltZVN0YXRlVmVyc2lvbiA9IHRoaXMuX3J1bnRpbWVTdGF0ZVZlcnNpb24uYXNSZWFkb25seSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBPYnNlcnZhYmxlIEFQSXNcbiAgICB0aGlzLnJlbmRlclRvb2xDYWxscyQgPSB0b09ic2VydmFibGUodGhpcy5yZW5kZXJUb29sQ2FsbHMpO1xuICAgIHRoaXMuY3VycmVudFJlbmRlclRvb2xDYWxscyQgPSB0b09ic2VydmFibGUodGhpcy5jdXJyZW50UmVuZGVyVG9vbENhbGxzKTtcbiAgICB0aGlzLnJ1bnRpbWVVcmwkID0gdG9PYnNlcnZhYmxlKHRoaXMucnVudGltZVVybCk7XG4gICAgdGhpcy5oZWFkZXJzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmhlYWRlcnMpO1xuICAgIHRoaXMucHJvcGVydGllcyQgPSB0b09ic2VydmFibGUodGhpcy5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLmFnZW50cyQgPSB0b09ic2VydmFibGUodGhpcy5hZ2VudHMpO1xuICAgIHRoaXMuZnJvbnRlbmRUb29scyQgPSB0b09ic2VydmFibGUodGhpcy5mcm9udGVuZFRvb2xzKTtcbiAgICB0aGlzLmh1bWFuSW5UaGVMb29wJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmh1bWFuSW5UaGVMb29wKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udGV4dCB2YWx1ZSBhcyBjb21wdXRlZCBzaWduYWxcbiAgICB0aGlzLmNvbnRleHQgPSBjb21wdXRlZDxDb3BpbG90S2l0Q29udGV4dFZhbHVlPigoKSA9PiB7XG4gICAgICAvLyBUb3VjaCB0aGUgcnVudGltZSBzdGF0ZSB2ZXJzaW9uIHRvIGVuc3VyZSB0aGlzIGNvbXB1dGVkIHVwZGF0ZXNcbiAgICAgIC8vIHdoZW4gcnVudGltZSBldmVudHMgb2NjdXIgKGxvYWRlZC9lcnJvcilcbiAgICAgIHRoaXMucnVudGltZVN0YXRlVmVyc2lvbigpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb3BpbG90a2l0OiB0aGlzLmNvcGlsb3RraXQsXG4gICAgICAgIHJlbmRlclRvb2xDYWxsczogdGhpcy5yZW5kZXJUb29sQ2FsbHMoKSxcbiAgICAgICAgY3VycmVudFJlbmRlclRvb2xDYWxsczogdGhpcy5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCksXG4gICAgICAgIHNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHM6ICh2KSA9PiB0aGlzLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHModiksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZXh0JCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNvbnRleHQpO1xuXG4gICAgLy8gRWZmZWN0cyBtdXN0IGJlIGNyZWF0ZWQgaW4gaW5qZWN0aW9uIGNvbnRleHQgKGNvbnN0cnVjdG9yKVxuICAgIHRoaXMuc2V0dXBSdW50aW1lU3luY0VmZmVjdHMoKTtcbiAgICB0aGlzLnNldHVwU3RhYmlsaXR5V2FybmluZ3MoKTtcbiAgICB0aGlzLnNldHVwRXZlbnRTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGZyb250ZW5kIHRvb2xzIGFuZCBodW1hbi1pbi10aGUtbG9vcCB0b29sc1xuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVG9vbHMoXG4gICAgZnJvbnRlbmRUb29sczogQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W10sXG4gICAgaHVtYW5JblRoZUxvb3A6IEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W10sXG4gICAgcmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdXG4gICk6IHtcbiAgICBhbGxUb29sczogUmVjb3JkPHN0cmluZywgRnJvbnRlbmRUb29sPGFueT4+O1xuICAgIGFsbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXTtcbiAgfSB7XG4gICAgY29uc3QgYWxsVG9vbHM6IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kVG9vbDxhbnk+PiA9IHt9O1xuICAgIGNvbnN0IGFsbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXSA9IFsuLi5yZW5kZXJUb29sQ2FsbHNdO1xuXG4gICAgLy8gQWRkIGZyb250ZW5kIHRvb2xzXG4gICAgZnJvbnRlbmRUb29scy5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICBhbGxUb29sc1t0b29sLm5hbWVdID0gdG9vbCBhcyBGcm9udGVuZFRvb2w8YW55PjtcblxuICAgICAgLy8gQWRkIHJlbmRlciBjb21wb25lbnQgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0b29sLnJlbmRlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWxsUmVuZGVyVG9vbENhbGxzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICBhcmdzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICAgICAgcmVuZGVyOiB0b29sLnJlbmRlcixcbiAgICAgICAgICAuLi4odG9vbC5hZ2VudElkICYmIHsgYWdlbnRJZDogdG9vbC5hZ2VudElkIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByb2Nlc3MgaHVtYW4taW4tdGhlLWxvb3AgdG9vbHNcbiAgICBodW1hbkluVGhlTG9vcC5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBmcm9udGVuZCB0b29sIHdpdGggcGxhY2Vob2xkZXIgaGFuZGxlclxuICAgICAgY29uc3QgZnJvbnRlbmRUb29sOiBGcm9udGVuZFRvb2w8YW55PiA9IHtcbiAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgcGFyYW1ldGVyczogdG9vbC5wYXJhbWV0ZXJzLFxuICAgICAgICBmb2xsb3dVcDogdG9vbC5mb2xsb3dVcCxcbiAgICAgICAgLi4uKHRvb2wuYWdlbnRJZCAmJiB7IGFnZW50SWQ6IHRvb2wuYWdlbnRJZCB9KSxcbiAgICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFBsYWNlaG9sZGVyIGhhbmRsZXIgLSBhY3R1YWwgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSByZW5kZXIgY29tcG9uZW50XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEh1bWFuLWluLXRoZS1sb29wIHRvb2wgJyR7dG9vbC5uYW1lfScgY2FsbGVkIGJ1dCBubyBpbnRlcmFjdGl2ZSBoYW5kbGVyIGlzIHNldCB1cC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGFsbFRvb2xzW3Rvb2wubmFtZV0gPSBmcm9udGVuZFRvb2w7XG5cbiAgICAgIC8vIEFkZCB0aGUgcmVuZGVyIGNvbXBvbmVudFxuICAgICAgaWYgKHRvb2wucmVuZGVyICYmIHRvb2wucGFyYW1ldGVycykge1xuICAgICAgICBhbGxSZW5kZXJUb29sQ2FsbHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICByZW5kZXI6IHRvb2wucmVuZGVyLFxuICAgICAgICAgIC4uLih0b29sLmFnZW50SWQgJiYgeyBhZ2VudElkOiB0b29sLmFnZW50SWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYWxsVG9vbHMsIGFsbFJlbmRlclRvb2xDYWxscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHN0YWJpbGl0eSB3YXJuaW5nIGVmZmVjdHNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBTdGFiaWxpdHlXYXJuaW5ncygpOiB2b2lkIHtcbiAgICAvLyBXYXJuIGlmIGZyb250ZW5kVG9vbHMgY2hhbmdlc1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZnJvbnRlbmRUb29scygpO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50ICE9PSB0aGlzLmluaXRpYWxGcm9udGVuZFRvb2xzICYmXG4gICAgICAgIHRoaXMuaW5pdGlhbEZyb250ZW5kVG9vbHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiZnJvbnRlbmRUb29scyBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2FybiBpZiBodW1hbkluVGhlTG9vcCBjaGFuZ2VzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9odW1hbkluVGhlTG9vcCgpO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50ICE9PSB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcCAmJlxuICAgICAgICB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcC5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJodW1hbkluVGhlTG9vcCBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIGh1bWFuLWluLXRoZS1sb29wIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2FybiBpZiByZW5kZXJUb29sQ2FsbHMgY2hhbmdlc1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVuZGVyVG9vbENhbGxzKCk7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnQgIT09IHRoaXMuaW5pdGlhbFJlbmRlclRvb2xDYWxscyAmJlxuICAgICAgICB0aGlzLmluaXRpYWxSZW5kZXJUb29sQ2FsbHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwicmVuZGVyVG9vbENhbGxzIG11c3QgYmUgYSBzdGFibGUgb2JqZWN0LiBUbyBhZGQvcmVtb3ZlIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGVmZmVjdHMgdG8gc3luYyBydW50aW1lIGNvbmZpZ3VyYXRpb24gd2l0aCBDb3BpbG90S2l0Q29yZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFJ1bnRpbWVTeW5jRWZmZWN0cygpOiB2b2lkIHtcbiAgICAvLyBTeW5jIHJ1bnRpbWUgVVJMXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucnVudGltZVVybCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY29waWxvdGtpdC5zZXRSdW50aW1lVXJsKHVybCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU3luYyBoZWFkZXJzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnMoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNvcGlsb3RraXQuc2V0SGVhZGVycyhoZWFkZXJzKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTeW5jIHByb3BlcnRpZXNcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY29waWxvdGtpdC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpKTtcbiAgICB9KTtcblxuICAgIC8vIFN5bmMgYWdlbnRzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IHRoaXMuYWdlbnRzKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jb3BpbG90a2l0LnNldEFnZW50cyhhZ2VudHMpKTtcbiAgICB9KTtcblxuICAgIC8vIFN5bmMgdG9vbHMgLSBjb21wdXRlZCBmcm9tIGZyb250ZW5kIHRvb2xzIGFuZCBodW1hbi1pbi10aGUtbG9vcFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB0b29scyA9IHRoaXMuX2FsbFRvb2xzKCk7XG4gICAgICAvLyBVcGRhdGUgY29waWxvdGtpdC50b29scyBkaXJlY3RseSBzaW5jZSB0aGVyZSdzIG5vIHNldFRvb2xzIG1ldGhvZFxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb3BpbG90a2l0LnRvb2xzID0gdG9vbHM7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gQ29waWxvdEtpdCBydW50aW1lIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5jb3BpbG90a2l0LnN1YnNjcmliZSh7XG4gICAgICBvblJ1bnRpbWVMb2FkZWQ6ICgpID0+IHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHZlcnNpb24gdG8gbm90aWZ5IGFsbCBjb25zdW1lcnMgdGhhdCBydW50aW1lIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgcmUtZXZhbHVhdGlvbiBvZiBjb21wdXRlZCBzaWduYWxzIHRoYXQgZGVwZW5kIG9uIHJ1bnRpbWUgc3RhdGVcbiAgICAgICAgdGhpcy5ub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgICBvblJ1bnRpbWVMb2FkRXJyb3I6ICgpID0+IHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHZlcnNpb24gdG8gbm90aWZ5IGFsbCBjb25zdW1lcnMgdGhhdCBydW50aW1lIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgcmUtZXZhbHVhdGlvbiBvZiBjb21wdXRlZCBzaWduYWxzIHRoYXQgZGVwZW5kIG9uIHJ1bnRpbWUgc3RhdGVcbiAgICAgICAgdGhpcy5ub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSb290IHNlcnZpY2UgbGl2ZXMgZm9yIGFwcCBsaWZldGltZTsgdW5zdWJzY3JpYmUgbm90IG5lZWRlZC5cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgY29uc3VtZXJzIHRoYXQgdGhlIHJ1bnRpbWUgc3RhdGUgaGFzIGNoYW5nZWQuXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byBSZWFjdCdzIGZvcmNlVXBkYXRlIC0gaXQgdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvblxuICAgKiBmb3IgYW55IGNvbXB1dGVkIHNpZ25hbHMgb3IgZWZmZWN0cyB0aGF0IGRlcGVuZCBvbiBydW50aW1lIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcnVudGltZVN0YXRlVmVyc2lvbi51cGRhdGUoKHZlcnNpb24pID0+IHZlcnNpb24gKyAxKTtcbiAgfVxuXG4gIC8vIFB1YmxpYyBtdXRhdGlvbiBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcnVudGltZSBVUkxcbiAgICovXG4gIHNldFJ1bnRpbWVVcmwodXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcnVudGltZVVybC5zZXQodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcmVxdWVzdCBoZWFkZXJzXG4gICAqL1xuICBzZXRIZWFkZXJzKGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLl9oZWFkZXJzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcnVudGltZSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5fcHJvcGVydGllcy5zZXQocHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFnZW50cyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBzZXRBZ2VudHMoYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50Pik6IHZvaWQge1xuICAgIHRoaXMuX2FnZW50cy5zZXQoYWdlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYWdlbnQgYnkgSURcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSUQgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgVGhlIGFnZW50IG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFnZW50KGFnZW50SWQ6IHN0cmluZyk6IEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvcGlsb3RraXQuZ2V0QWdlbnQoYWdlbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJlbmRlciB0b29sIGNhbGxzICh3YXJucyBpZiBvYmplY3QgcmVmZXJlbmNlIGNoYW5nZXMpXG4gICAqL1xuICBzZXRSZW5kZXJUb29sQ2FsbHMocmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdKTogdm9pZCB7XG4gICAgaWYgKHJlbmRlclRvb2xDYWxscyAhPT0gdGhpcy5pbml0aWFsUmVuZGVyVG9vbENhbGxzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcInJlbmRlclRvb2xDYWxscyBtdXN0IGJlIGEgc3RhYmxlIG9iamVjdC4gVG8gYWRkL3JlbW92ZSB0b29scyBkeW5hbWljYWxseSwgdXNlIGR5bmFtaWMgdG9vbCByZWdpc3RyYXRpb24uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlclRvb2xDYWxscy5zZXQocmVuZGVyVG9vbENhbGxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZnJvbnRlbmQgdG9vbHMgYXJyYXlcbiAgICovXG4gIHNldEZyb250ZW5kVG9vbHMoZnJvbnRlbmRUb29sczogQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W10pOiB2b2lkIHtcbiAgICBpZiAoZnJvbnRlbmRUb29scyAhPT0gdGhpcy5pbml0aWFsRnJvbnRlbmRUb29scykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJmcm9udGVuZFRvb2xzIG11c3QgYmUgYSBzdGFibGUgYXJyYXkuIFRvIGFkZC9yZW1vdmUgdG9vbHMgZHluYW1pY2FsbHksIHVzZSBkeW5hbWljIHRvb2wgcmVnaXN0cmF0aW9uLlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9mcm9udGVuZFRvb2xzLnNldChmcm9udGVuZFRvb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgaHVtYW4taW4tdGhlLWxvb3AgYXJyYXlcbiAgICovXG4gIHNldEh1bWFuSW5UaGVMb29wKGh1bWFuSW5UaGVMb29wOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8YW55PltdKTogdm9pZCB7XG4gICAgaWYgKGh1bWFuSW5UaGVMb29wICE9PSB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJodW1hbkluVGhlTG9vcCBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIGh1bWFuLWluLXRoZS1sb29wIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5faHVtYW5JblRoZUxvb3Auc2V0KGh1bWFuSW5UaGVMb29wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY3VycmVudCByZW5kZXIgdG9vbCBjYWxsc1xuICAgKi9cbiAgc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyhyZW5kZXJUb29sQ2FsbHM6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10pOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzLnNldChyZW5kZXJUb29sQ2FsbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdG9vbCByZW5kZXJcbiAgICovXG4gIHJlZ2lzdGVyVG9vbFJlbmRlcihuYW1lOiBzdHJpbmcsIHJlbmRlcjogVG9vbENhbGxSZW5kZXI8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscygpO1xuICAgIGlmIChjdXJyZW50LmZpbmQoKHIpID0+IHIubmFtZSA9PT0gbmFtZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVG9vbCByZW5kZXIgZm9yICcke25hbWV9JyBpcyBiZWluZyBvdmVyd3JpdHRlbmApO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzLnNldChbXG4gICAgICAuLi5jdXJyZW50LmZpbHRlcigocikgPT4gci5uYW1lICE9PSBuYW1lKSxcbiAgICAgIHJlbmRlcixcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIGEgdG9vbCByZW5kZXJcbiAgICovXG4gIHVucmVnaXN0ZXJUb29sUmVuZGVyKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSBjdXJyZW50LmZpbHRlcigocikgPT4gci5uYW1lICE9PSBuYW1lKTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscy5zZXQoZmlsdGVyZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyB0b29sIHJlbmRlclxuICAgKi9cbiAgZ2V0VG9vbFJlbmRlcihuYW1lOiBzdHJpbmcpOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKS5maW5kKChyKSA9PiByLm5hbWUgPT09IG5hbWUpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InjectionToken } from "@angular/core";
|
|
2
|
+
// Re-export ToolCallStatus from core
|
|
3
|
+
export { ToolCallStatus } from "@copilotkitnext/core";
|
|
4
|
+
// Injection tokens for dependency injection
|
|
5
|
+
export const COPILOTKIT_RUNTIME_URL = new InjectionToken("COPILOTKIT_RUNTIME_URL");
|
|
6
|
+
export const COPILOTKIT_HEADERS = new InjectionToken("COPILOTKIT_HEADERS", { factory: () => ({}) });
|
|
7
|
+
export const COPILOTKIT_PROPERTIES = new InjectionToken("COPILOTKIT_PROPERTIES", { factory: () => ({}) });
|
|
8
|
+
export const COPILOTKIT_AGENTS = new InjectionToken("COPILOTKIT_AGENTS", { factory: () => ({}) });
|
|
9
|
+
export const COPILOTKIT_RENDER_TOOL_CALLS = new InjectionToken("COPILOTKIT_RENDER_TOOL_CALLS", { factory: () => [] });
|
|
10
|
+
export const COPILOTKIT_FRONTEND_TOOLS = new InjectionToken("COPILOTKIT_FRONTEND_TOOLS", { factory: () => [] });
|
|
11
|
+
export const COPILOTKIT_HUMAN_IN_THE_LOOP = new InjectionToken("COPILOTKIT_HUMAN_IN_THE_LOOP", { factory: () => [] });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2NvcGlsb3RraXQudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBNkIsTUFBTSxlQUFlLENBQUM7QUFrQjFFLHFDQUFxQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUF3RHRELDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FDbEQsb0JBQW9CLEVBQ3BCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUVyRCx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FFakQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBRTVELDhCQUE4QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxjQUFjLENBRXpELDJCQUEyQixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBRTVELDhCQUE4QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgVGVtcGxhdGVSZWYsIFR5cGUsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRDb3JlLCBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuaW1wb3J0IHsgQWJzdHJhY3RBZ2VudCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJGcm9udGVuZFRvb2wgfSBmcm9tIFwiLi4vdHlwZXMvZnJvbnRlbmQtdG9vbFwiO1xuaW1wb3J0IHR5cGUgeyBBbmd1bGFySHVtYW5JblRoZUxvb3AgfSBmcm9tIFwiLi4vdHlwZXMvaHVtYW4taW4tdGhlLWxvb3BcIjtcblxuLy8gUmUtZXhwb3J0IGNvbW1vbmx5IHVzZWQgdHlwZXNcbmV4cG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5cbi8vIFJlLWV4cG9ydCB0b29sIHR5cGVzIGZyb20gdGhlaXIgb3duIGZpbGVzXG5leHBvcnQgdHlwZSB7IEFuZ3VsYXJGcm9udGVuZFRvb2wgfSBmcm9tIFwiLi4vdHlwZXMvZnJvbnRlbmQtdG9vbFwiO1xuZXhwb3J0IHR5cGUge1xuICBBbmd1bGFySHVtYW5JblRoZUxvb3AsXG4gIEh1bWFuSW5UaGVMb29wUHJvcHMsXG59IGZyb20gXCIuLi90eXBlcy9odW1hbi1pbi10aGUtbG9vcFwiO1xuXG4vLyBSZS1leHBvcnQgVG9vbENhbGxTdGF0dXMgZnJvbSBjb3JlXG5leHBvcnQgeyBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuXG4vLyBQcm9wcyBwYXNzZWQgdG8gdG9vbCByZW5kZXIgY29tcG9uZW50cyAtIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWF0Y2hpbmcgUmVhY3RcbmV4cG9ydCB0eXBlIFRvb2xDYWxsUHJvcHM8VCA9IHVua25vd24+ID1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgYXJnczogUGFydGlhbDxUPjtcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcztcbiAgICAgIHJlc3VsdDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgYXJnczogVDtcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nO1xuICAgICAgcmVzdWx0OiB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBhcmdzOiBUO1xuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZTtcbiAgICAgIHJlc3VsdDogc3RyaW5nO1xuICAgIH07XG5cbi8vIEFuZ3VsYXItc3BlY2lmaWMgdG9vbCBjYWxsIHJlbmRlciBkZWZpbml0aW9uIHdpdGggcHJvcGVyIHR5cGluZ1xuZXhwb3J0IGludGVyZmFjZSBBbmd1bGFyVG9vbENhbGxSZW5kZXI8VCA9IHVua25vd24+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhcmdzOiB6LlpvZFNjaGVtYTxUPjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFnZW50IElEIHRvIGNvbnN0cmFpbiB0aGlzIHRvb2wgcmVuZGVyIHRvIGEgc3BlY2lmaWMgYWdlbnQuXG4gICAqIElmIHNwZWNpZmllZCwgdGhpcyByZW5kZXIgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYWdlbnQuXG4gICAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xuICByZW5kZXI6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPFRvb2xDYWxsUHJvcHM8VD4+O1xufVxuXG4vLyBUeXBlIGFsaWFzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgVG9vbENhbGxSZW5kZXI8VCA9IHVua25vd24+ID0gQW5ndWxhclRvb2xDYWxsUmVuZGVyPFQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RLaXRDb250ZXh0VmFsdWUge1xuICBjb3BpbG90a2l0OiBDb3BpbG90S2l0Q29yZTtcbiAgcmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xuICBjdXJyZW50UmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xuICBzZXRDdXJyZW50UmVuZGVyVG9vbENhbGxzOiAodjogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3BpbG90S2l0UnVudGltZUlucHV0cyB7XG4gIHJ1bnRpbWVVcmw/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFnZW50cz86IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+O1xuICByZW5kZXJUb29sQ2FsbHM/OiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xufVxuXG4vLyBJbmplY3Rpb24gdG9rZW5zIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuZXhwb3J0IGNvbnN0IENPUElMT1RLSVRfUlVOVElNRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgXCJDT1BJTE9US0lUX1JVTlRJTUVfVVJMXCJcbik7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0hFQURFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gIFwiQ09QSUxPVEtJVF9IRUFERVJTXCIsXG4gIHsgZmFjdG9yeTogKCkgPT4gKHt9KSB9XG4pO1xuXG5leHBvcnQgY29uc3QgQ09QSUxPVEtJVF9QUk9QRVJUSUVTID0gbmV3IEluamVjdGlvblRva2VuPFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuPihcIkNPUElMT1RLSVRfUFJPUEVSVElFU1wiLCB7IGZhY3Rvcnk6ICgpID0+ICh7fSkgfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0FHRU5UUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgUmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD5cbj4oXCJDT1BJTE9US0lUX0FHRU5UU1wiLCB7IGZhY3Rvcnk6ICgpID0+ICh7fSkgfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX1JFTkRFUl9UT09MX0NBTExTID0gbmV3IEluamVjdGlvblRva2VuPFxuICBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdXG4+KFwiQ09QSUxPVEtJVF9SRU5ERVJfVE9PTF9DQUxMU1wiLCB7IGZhY3Rvcnk6ICgpID0+IFtdIH0pO1xuXG5leHBvcnQgY29uc3QgQ09QSUxPVEtJVF9GUk9OVEVORF9UT09MUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W11cbj4oXCJDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTXCIsIHsgZmFjdG9yeTogKCkgPT4gW10gfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0hVTUFOX0lOX1RIRV9MT09QID0gbmV3IEluamVjdGlvblRva2VuPFxuICBBbmd1bGFySHVtYW5JblRoZUxvb3A8YW55PltdXG4+KFwiQ09QSUxPVEtJVF9IVU1BTl9JTl9USEVfTE9PUFwiLCB7IGZhY3Rvcnk6ICgpID0+IFtdIH0pO1xuXG4vLyBBZ2VudC1yZWxhdGVkIHR5cGVzXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50V2F0Y2hSZXN1bHQge1xuICBhZ2VudDogU2lnbmFsPEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQ+O1xuICBtZXNzYWdlczogU2lnbmFsPE1lc3NhZ2VbXT47XG4gIGlzUnVubmluZzogU2lnbmFsPGJvb2xlYW4+O1xuICBhZ2VudCQ6IE9ic2VydmFibGU8QWJzdHJhY3RBZ2VudCB8IHVuZGVmaW5lZD47XG4gIG1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxNZXNzYWdlW10+O1xuICBpc1J1bm5pbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICB1bnN1YnNjcmliZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFN1YnNjcmlwdGlvbkNhbGxiYWNrcyB7XG4gIG9uTWVzc2FnZXNDaGFuZ2VkPzogKHBhcmFtczogYW55KSA9PiB2b2lkO1xuICBvblN0YXRlQ2hhbmdlZD86IChwYXJhbXM6IGFueSkgPT4gdm9pZDtcbiAgb25SdW5Jbml0aWFsaXplZD86IChwYXJhbXM6IGFueSkgPT4gdm9pZDtcbiAgb25SdW5GaW5hbGl6ZWQ/OiAocGFyYW1zOiBhbnkpID0+IHZvaWQ7XG4gIG9uUnVuRmFpbGVkPzogKHBhcmFtczogYW55KSA9PiB2b2lkO1xufVxuXG4vLyBIdW1hbi1pbi10aGUtbG9vcCBzdGF0ZSByZXN1bHRcbmV4cG9ydCBpbnRlcmZhY2UgSHVtYW5JblRoZUxvb3BTdGF0ZSB7XG4gIHN0YXR1czogU2lnbmFsPFRvb2xDYWxsU3RhdHVzPjtcbiAgdG9vbElkOiBzdHJpbmc7XG4gIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG59XG4iXX0=
|