@copilotkitnext/angular 0.0.0-max-changeset-20260109174803

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.
Files changed (118) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +530 -0
  3. package/dist/LICENSE +10 -0
  4. package/dist/README.md +530 -0
  5. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  6. package/dist/esm2022/index.mjs +2 -0
  7. package/dist/esm2022/lib/agent-context.mjs +25 -0
  8. package/dist/esm2022/lib/agent.mjs +73 -0
  9. package/dist/esm2022/lib/chat-config.mjs +35 -0
  10. package/dist/esm2022/lib/chat-state.mjs +18 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.mjs +415 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +98 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +308 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  37. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  38. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  39. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  40. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  41. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  42. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  43. package/dist/esm2022/lib/config.mjs +9 -0
  44. package/dist/esm2022/lib/copilotkit.mjs +115 -0
  45. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  46. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  47. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  48. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  49. package/dist/esm2022/lib/render-tool-calls.mjs +138 -0
  50. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  51. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  52. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  53. package/dist/esm2022/lib/slots/index.mjs +4 -0
  54. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  55. package/dist/esm2022/lib/slots/slot.utils.mjs +235 -0
  56. package/dist/esm2022/lib/tools.mjs +31 -0
  57. package/dist/esm2022/lib/utils.mjs +10 -0
  58. package/dist/esm2022/public-api.mjs +48 -0
  59. package/dist/fesm2022/copilotkitnext-angular.mjs +6310 -0
  60. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -0
  61. package/dist/index.d.ts +1 -0
  62. package/dist/lib/agent-context.d.ts +12 -0
  63. package/dist/lib/agent.d.ts +68 -0
  64. package/dist/lib/chat-config.d.ts +23 -0
  65. package/dist/lib/chat-state.d.ts +10 -0
  66. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  67. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  68. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  69. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +208 -0
  70. package/dist/lib/components/chat/copilot-chat-assistant-message.types.d.ts +31 -0
  71. package/dist/lib/components/chat/copilot-chat-audio-recorder.d.ts +40 -0
  72. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  73. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  74. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  75. package/dist/lib/components/chat/copilot-chat-input.types.d.ts +129 -0
  76. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  77. package/dist/lib/components/chat/copilot-chat-message-view.d.ts +430 -0
  78. package/dist/lib/components/chat/copilot-chat-message-view.types.d.ts +24 -0
  79. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  80. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +70 -0
  81. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  82. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  83. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +35 -0
  84. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  85. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  86. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  87. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +71 -0
  88. package/dist/lib/components/chat/copilot-chat-user-message.types.d.ts +27 -0
  89. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  90. package/dist/lib/components/chat/copilot-chat-view-feather.d.ts +15 -0
  91. package/dist/lib/components/chat/copilot-chat-view-handlers.d.ts +11 -0
  92. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  93. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  94. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +129 -0
  95. package/dist/lib/components/chat/copilot-chat-view.d.ts +284 -0
  96. package/dist/lib/components/chat/copilot-chat-view.types.d.ts +42 -0
  97. package/dist/lib/components/chat/copilot-chat.d.ts +82 -0
  98. package/dist/lib/config.d.ts +16 -0
  99. package/dist/lib/copilotkit.d.ts +29 -0
  100. package/dist/lib/directives/copilotkit-agent-context.d.ts +68 -0
  101. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  102. package/dist/lib/directives/tooltip.d.ts +33 -0
  103. package/dist/lib/human-in-the-loop.d.ts +13 -0
  104. package/dist/lib/render-tool-calls.d.ts +90 -0
  105. package/dist/lib/resize-observer.d.ts +44 -0
  106. package/dist/lib/scroll-position.d.ts +50 -0
  107. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  108. package/dist/lib/slots/index.d.ts +3 -0
  109. package/dist/lib/slots/slot.types.d.ts +55 -0
  110. package/dist/lib/slots/slot.utils.d.ts +110 -0
  111. package/dist/lib/tools.d.ts +65 -0
  112. package/dist/lib/utils.d.ts +6 -0
  113. package/dist/public-api.d.ts +47 -0
  114. package/dist/styles.css +1882 -0
  115. package/eslint.config.mjs +20 -0
  116. package/package.json +101 -0
  117. package/tsconfig.json +33 -0
  118. package/vitest.config.mts +45 -0
@@ -0,0 +1,167 @@
1
+ import { Component, input, ChangeDetectionStrategy, ViewEncapsulation, signal, effect, ChangeDetectorRef, Injector, computed, inject, } from "@angular/core";
2
+ import { CommonModule } from "@angular/common";
3
+ import { CopilotChatView } from "./copilot-chat-view";
4
+ import { DEFAULT_AGENT_ID, randomUUID } from "@copilotkitnext/shared";
5
+ import { injectAgentStore } from "../../agent";
6
+ import { ChatState } from "../../chat-state";
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * CopilotChat component - Angular equivalent of React's <CopilotChat>
10
+ * Provides a complete chat interface that wires an agent to the chat view
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <copilot-chat [agentId]="'default'" [threadId]="'abc123'"></copilot-chat>
15
+ * ```
16
+ */
17
+ export class CopilotChat {
18
+ inputValue = signal("");
19
+ agentId = input();
20
+ threadId = input();
21
+ inputComponent = input();
22
+ resolvedAgentId = computed(() => this.agentId() ?? DEFAULT_AGENT_ID);
23
+ agentStore = injectAgentStore(this.resolvedAgentId);
24
+ // readonly chatConfig = injectChatConfig();
25
+ cdr = inject(ChangeDetectorRef);
26
+ injector = inject(Injector);
27
+ messages = computed(() => this.agentStore()?.messages());
28
+ isRunning = computed(() => this.agentStore()?.isRunning());
29
+ showCursor = signal(false);
30
+ generatedThreadId = randomUUID();
31
+ hasConnectedOnce = false;
32
+ constructor() {
33
+ // Connect once when agent becomes available
34
+ // Connect once when agent becomes available
35
+ effect(() => {
36
+ const a = this.agentStore()?.agent;
37
+ if (!a)
38
+ return;
39
+ // Apply thread id when agent is available
40
+ a.threadId = this.threadId() || this.generatedThreadId;
41
+ if (!this.hasConnectedOnce) {
42
+ this.hasConnectedOnce = true;
43
+ if ("isCopilotKitAgent" in a) {
44
+ this.connectToAgent(a);
45
+ }
46
+ else {
47
+ // Non-CopilotKit agent: nothing to connect; keep default cursor state
48
+ }
49
+ }
50
+ }, { allowSignalWrites: true });
51
+ // Keep agent threadId in sync with input
52
+ effect(() => {
53
+ const a = this.agentStore()?.agent;
54
+ if (a) {
55
+ a.threadId = this.threadId() || this.generatedThreadId;
56
+ }
57
+ });
58
+ }
59
+ async connectToAgent(agent) {
60
+ if (!agent)
61
+ return;
62
+ this.showCursor.set(true);
63
+ this.cdr.markForCheck();
64
+ try {
65
+ await agent.runAgent({ forwardedProps: { __copilotkitConnect: true } }, {
66
+ onTextMessageStartEvent: () => {
67
+ this.showCursor.set(false);
68
+ this.cdr.detectChanges();
69
+ },
70
+ onToolCallStartEvent: () => {
71
+ this.showCursor.set(false);
72
+ this.cdr.detectChanges();
73
+ },
74
+ });
75
+ this.showCursor.set(false);
76
+ this.cdr.markForCheck();
77
+ }
78
+ catch (error) {
79
+ console.error("Failed to connect to agent:", error);
80
+ this.showCursor.set(false);
81
+ this.cdr.markForCheck();
82
+ }
83
+ }
84
+ async submitInput(value) {
85
+ const agent = this.agentStore()?.agent;
86
+ if (!agent || !value.trim())
87
+ return;
88
+ // Add user message
89
+ const userMessage = {
90
+ id: randomUUID(),
91
+ role: "user",
92
+ content: value,
93
+ };
94
+ agent.addMessage(userMessage);
95
+ // Clear the input
96
+ this.inputValue.set("");
97
+ // Show cursor while processing
98
+ this.showCursor.set(true);
99
+ this.cdr.markForCheck();
100
+ // Run the agent with named subscriber callbacks
101
+ try {
102
+ await agent.runAgent({}, {
103
+ onTextMessageStartEvent: () => {
104
+ this.showCursor.set(false);
105
+ this.cdr.detectChanges();
106
+ },
107
+ onToolCallStartEvent: () => {
108
+ this.showCursor.set(false);
109
+ this.cdr.detectChanges();
110
+ },
111
+ });
112
+ }
113
+ catch (error) {
114
+ console.error("Agent run error:", error);
115
+ }
116
+ finally {
117
+ this.showCursor.set(false);
118
+ this.cdr.markForCheck();
119
+ }
120
+ }
121
+ changeInput(value) {
122
+ this.inputValue.set(value);
123
+ }
124
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotChat, deps: [], target: i0.ɵɵFactoryTarget.Component });
125
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CopilotChat, isStandalone: true, selector: "copilot-chat", inputs: { agentId: { classPropertyName: "agentId", publicName: "agentId", isSignal: true, isRequired: false, transformFunction: null }, threadId: { classPropertyName: "threadId", publicName: "threadId", isSignal: true, isRequired: false, transformFunction: null }, inputComponent: { classPropertyName: "inputComponent", publicName: "inputComponent", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
126
+ {
127
+ provide: ChatState,
128
+ useExisting: CopilotChat,
129
+ },
130
+ ], ngImport: i0, template: `
131
+ <copilot-chat-view
132
+ [messages]="messages() ?? []"
133
+ [autoScroll]="true"
134
+ [messageViewClass]="'w-full'"
135
+ [showCursor]="showCursor()"
136
+ [inputComponent]="inputComponent()"
137
+ >
138
+ </copilot-chat-view>
139
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CopilotChatView, selector: "copilot-chat-view", inputs: ["messages", "autoScroll", "showCursor", "messageViewComponent", "messageViewTemplate", "messageViewClass", "scrollViewComponent", "scrollViewTemplate", "scrollViewClass", "scrollToBottomButtonComponent", "scrollToBottomButtonTemplate", "scrollToBottomButtonClass", "inputComponent", "inputTemplate", "inputContainerComponent", "inputContainerTemplate", "inputContainerClass", "featherComponent", "featherTemplate", "featherClass", "disclaimerComponent", "disclaimerTemplate", "disclaimerClass", "disclaimerText"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
140
+ }
141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotChat, decorators: [{
142
+ type: Component,
143
+ args: [{
144
+ selector: "copilot-chat",
145
+ standalone: true,
146
+ imports: [CommonModule, CopilotChatView],
147
+ changeDetection: ChangeDetectionStrategy.OnPush,
148
+ encapsulation: ViewEncapsulation.None,
149
+ template: `
150
+ <copilot-chat-view
151
+ [messages]="messages() ?? []"
152
+ [autoScroll]="true"
153
+ [messageViewClass]="'w-full'"
154
+ [showCursor]="showCursor()"
155
+ [inputComponent]="inputComponent()"
156
+ >
157
+ </copilot-chat-view>
158
+ `,
159
+ providers: [
160
+ {
161
+ provide: ChatState,
162
+ useExisting: CopilotChat,
163
+ },
164
+ ],
165
+ }]
166
+ }], ctorParameters: () => [] });
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsUUFBUSxFQUVSLFFBQVEsRUFDUixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFN0M7Ozs7Ozs7O0dBUUc7QUF3QkgsTUFBTSxPQUFPLFdBQVc7SUFDYixVQUFVLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDdEMsUUFBUSxHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUN2QyxjQUFjLEdBQUcsS0FBSyxFQUF5QixDQUFDO0lBQ3hDLGVBQWUsR0FBRyxRQUFRLENBQ3pDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxnQkFBZ0IsQ0FDekMsQ0FBQztJQUNPLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0QsNENBQTRDO0lBQ25DLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxRQUFRLEdBQUcsTUFB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LEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQzt3R0EzSFUsV0FBVzs0RkFBWCxXQUFXLHlkQVBYO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLFdBQVcsRUFBRSxXQUFXO2FBQ3pCO1NBQ0YsMEJBZlM7Ozs7Ozs7OztHQVNULDJEQVpTLFlBQVksK0JBQUUsZUFBZTs7NEZBb0I1QixXQUFXO2tCQXZCdkIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUM7b0JBQ3hDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7R0FTVDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLFNBQVM7NEJBQ2xCLFdBQVcsYUFBYTt5QkFDekI7cUJBQ0Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIHNpZ25hbCxcbiAgZWZmZWN0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSW5qZWN0b3IsXG4gIFR5cGUsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXcgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlld1wiO1xuXG5pbXBvcnQgeyBERUZBVUxUX0FHRU5UX0lELCByYW5kb21VVUlEIH0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9zaGFyZWRcIjtcbmltcG9ydCB7IE1lc3NhZ2UsIEFic3RyYWN0QWdlbnQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuaW1wb3J0IHsgaW5qZWN0QWdlbnRTdG9yZSB9IGZyb20gXCIuLi8uLi9hZ2VudFwiO1xuaW1wb3J0IHsgQ2hhdFN0YXRlIH0gZnJvbSBcIi4uLy4uL2NoYXQtc3RhdGVcIjtcblxuLyoqXG4gKiBDb3BpbG90Q2hhdCBjb21wb25lbnQgLSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3QncyA8Q29waWxvdENoYXQ+XG4gKiBQcm92aWRlcyBhIGNvbXBsZXRlIGNoYXQgaW50ZXJmYWNlIHRoYXQgd2lyZXMgYW4gYWdlbnQgdG8gdGhlIGNoYXQgdmlld1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8Y29waWxvdC1jaGF0IFthZ2VudElkXT1cIidkZWZhdWx0J1wiIFt0aHJlYWRJZF09XCInYWJjMTIzJ1wiPjwvY29waWxvdC1jaGF0PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb3BpbG90LWNoYXRcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ29waWxvdENoYXRWaWV3XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGNvcGlsb3QtY2hhdC12aWV3XG4gICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXMoKSA/PyBbXVwiXG4gICAgICBbYXV0b1Njcm9sbF09XCJ0cnVlXCJcbiAgICAgIFttZXNzYWdlVmlld0NsYXNzXT1cIid3LWZ1bGwnXCJcbiAgICAgIFtzaG93Q3Vyc29yXT1cInNob3dDdXJzb3IoKVwiXG4gICAgICBbaW5wdXRDb21wb25lbnRdPVwiaW5wdXRDb21wb25lbnQoKVwiXG4gICAgPlxuICAgIDwvY29waWxvdC1jaGF0LXZpZXc+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENoYXRTdGF0ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBDb3BpbG90Q2hhdCxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdCBpbXBsZW1lbnRzIENoYXRTdGF0ZSB7XG4gIHJlYWRvbmx5IGlucHV0VmFsdWUgPSBzaWduYWw8c3RyaW5nPihcIlwiKTtcbiAgcmVhZG9ubHkgYWdlbnRJZCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgdGhyZWFkSWQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGlucHV0Q29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkQWdlbnRJZCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuYWdlbnRJZCgpID8/IERFRkFVTFRfQUdFTlRfSURcbiAgKTtcbiAgcmVhZG9ubHkgYWdlbnRTdG9yZSA9IGluamVjdEFnZW50U3RvcmUodGhpcy5yZXNvbHZlZEFnZW50SWQpO1xuICAvLyByZWFkb25seSBjaGF0Q29uZmlnID0gaW5qZWN0Q2hhdENvbmZpZygpO1xuICByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hZ2VudFN0b3JlKCk/Lm1lc3NhZ2VzKCkpO1xuICBwcm90ZWN0ZWQgaXNSdW5uaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hZ2VudFN0b3JlKCk/LmlzUnVubmluZygpKTtcbiAgcHJvdGVjdGVkIHNob3dDdXJzb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgZ2VuZXJhdGVkVGhyZWFkSWQ6IHN0cmluZyA9IHJhbmRvbVVVSUQoKTtcbiAgcHJpdmF0ZSBoYXNDb25uZWN0ZWRPbmNlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQ29ubmVjdCBvbmNlIHdoZW4gYWdlbnQgYmVjb21lcyBhdmFpbGFibGVcbiAgICAvLyBDb25uZWN0IG9uY2Ugd2hlbiBhZ2VudCBiZWNvbWVzIGF2YWlsYWJsZVxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuYWdlbnRTdG9yZSgpPy5hZ2VudDtcbiAgICAgICAgaWYgKCFhKSByZXR1cm47XG4gICAgICAgIC8vIEFwcGx5IHRocmVhZCBpZCB3aGVuIGFnZW50IGlzIGF2YWlsYWJsZVxuICAgICAgICBhLnRocmVhZElkID0gdGhpcy50aHJlYWRJZCgpIHx8IHRoaXMuZ2VuZXJhdGVkVGhyZWFkSWQ7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb25uZWN0ZWRPbmNlKSB7XG4gICAgICAgICAgdGhpcy5oYXNDb25uZWN0ZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoXCJpc0NvcGlsb3RLaXRBZ2VudFwiIGluIChhIGFzIGFueSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFRvQWdlbnQoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vbi1Db3BpbG90S2l0IGFnZW50OiBub3RoaW5nIHRvIGNvbm5lY3Q7IGtlZXAgZGVmYXVsdCBjdXJzb3Igc3RhdGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLy8gS2VlcCBhZ2VudCB0aHJlYWRJZCBpbiBzeW5jIHdpdGggaW5wdXRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYWdlbnRTdG9yZSgpPy5hZ2VudDtcbiAgICAgIGlmIChhKSB7XG4gICAgICAgIGEudGhyZWFkSWQgPSB0aGlzLnRocmVhZElkKCkgfHwgdGhpcy5nZW5lcmF0ZWRUaHJlYWRJZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvQWdlbnQoYWdlbnQ6IEFic3RyYWN0QWdlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWFnZW50KSByZXR1cm47XG5cbiAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KHRydWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFnZW50LnJ1bkFnZW50KFxuICAgICAgICB7IGZvcndhcmRlZFByb3BzOiB7IF9fY29waWxvdGtpdENvbm5lY3Q6IHRydWUgfSB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25UZXh0TWVzc2FnZVN0YXJ0RXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub29sQ2FsbFN0YXJ0RXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNvbm5lY3QgdG8gYWdlbnQ6XCIsIGVycm9yKTtcbiAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0SW5wdXQodmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFnZW50ID0gdGhpcy5hZ2VudFN0b3JlKCk/LmFnZW50O1xuICAgIGlmICghYWdlbnQgfHwgIXZhbHVlLnRyaW0oKSkgcmV0dXJuO1xuXG4gICAgLy8gQWRkIHVzZXIgbWVzc2FnZVxuICAgIGNvbnN0IHVzZXJNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgaWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgY29udGVudDogdmFsdWUsXG4gICAgfTtcbiAgICBhZ2VudC5hZGRNZXNzYWdlKHVzZXJNZXNzYWdlKTtcblxuICAgIC8vIENsZWFyIHRoZSBpbnB1dFxuICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoXCJcIik7XG5cbiAgICAvLyBTaG93IGN1cnNvciB3aGlsZSBwcm9jZXNzaW5nXG4gICAgdGhpcy5zaG93Q3Vyc29yLnNldCh0cnVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIFJ1biB0aGUgYWdlbnQgd2l0aCBuYW1lZCBzdWJzY3JpYmVyIGNhbGxiYWNrc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZ2VudC5ydW5BZ2VudChcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBvblRleHRNZXNzYWdlU3RhcnRFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q3Vyc29yLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRvb2xDYWxsU3RhcnRFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q3Vyc29yLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkFnZW50IHJ1biBlcnJvcjpcIiwgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUlucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWUuc2V0KHZhbHVlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,9 @@
1
+ import { inject, InjectionToken } from "@angular/core";
2
+ export const COPILOT_KIT_CONFIG = new InjectionToken("COPILOT_KIT_CONFIG");
3
+ export function injectCopilotKitConfig() {
4
+ return inject(COPILOT_KIT_CONFIG);
5
+ }
6
+ export function provideCopilotKit(config) {
7
+ return { provide: COPILOT_KIT_CONFIG, useValue: config };
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFvQmpFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUNsRCxvQkFBb0IsQ0FDckIsQ0FBQztBQUVGLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXdCO0lBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuLCBQcm92aWRlciB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7XG4gIENsaWVudFRvb2wsXG4gIEZyb250ZW5kVG9vbENvbmZpZyxcbiAgSHVtYW5JblRoZUxvb3BDb25maWcsXG4gIFJlbmRlclRvb2xDYWxsQ29uZmlnLFxufSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RLaXRDb25maWcge1xuICBydW50aW1lVXJsPzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBhZ2VudHM/OiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50PjtcbiAgdG9vbHM/OiBDbGllbnRUb29sW107XG4gIHJlbmRlclRvb2xDYWxscz86IFJlbmRlclRvb2xDYWxsQ29uZmlnW107XG4gIGZyb250ZW5kVG9vbHM/OiBGcm9udGVuZFRvb2xDb25maWdbXTtcbiAgaHVtYW5JblRoZUxvb3A/OiBIdW1hbkluVGhlTG9vcENvbmZpZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ09QSUxPVF9LSVRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPENvcGlsb3RLaXRDb25maWc+KFxuICBcIkNPUElMT1RfS0lUX0NPTkZJR1wiXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29waWxvdEtpdENvbmZpZygpOiBDb3BpbG90S2l0Q29uZmlnIHtcbiAgcmV0dXJuIGluamVjdChDT1BJTE9UX0tJVF9DT05GSUcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUNvcGlsb3RLaXQoY29uZmlnOiBDb3BpbG90S2l0Q29uZmlnKTogUHJvdmlkZXIge1xuICByZXR1cm4geyBwcm92aWRlOiBDT1BJTE9UX0tJVF9DT05GSUcsIHVzZVZhbHVlOiBjb25maWcgfTtcbn1cbiJdfQ==
@@ -0,0 +1,115 @@
1
+ import { CopilotKitCore } from "@copilotkitnext/core";
2
+ import { Injectable, Injector, runInInjectionContext, signal, inject } from "@angular/core";
3
+ import { injectCopilotKitConfig } from "./config";
4
+ import { HumanInTheLoop } from "./human-in-the-loop";
5
+ import * as i0 from "@angular/core";
6
+ export class CopilotKit {
7
+ #config = injectCopilotKitConfig();
8
+ #hitl = inject(HumanInTheLoop);
9
+ #rootInjector = inject(Injector);
10
+ #agents = signal(this.#config.agents ?? {});
11
+ agents = this.#agents.asReadonly();
12
+ core = new CopilotKitCore({
13
+ runtimeUrl: this.#config.runtimeUrl,
14
+ headers: this.#config.headers,
15
+ properties: this.#config.properties,
16
+ agents__unsafe_dev_only: this.#config.agents,
17
+ tools: this.#config.tools,
18
+ });
19
+ #toolCallRenderConfigs = signal([]);
20
+ #clientToolCallRenderConfigs = signal([]);
21
+ #humanInTheLoopToolRenderConfigs = signal([]);
22
+ toolCallRenderConfigs = this.#toolCallRenderConfigs.asReadonly();
23
+ clientToolCallRenderConfigs = this.#clientToolCallRenderConfigs.asReadonly();
24
+ humanInTheLoopToolRenderConfigs = this.#humanInTheLoopToolRenderConfigs.asReadonly();
25
+ constructor() {
26
+ this.#config.renderToolCalls?.forEach((renderConfig) => {
27
+ this.addRenderToolCall(renderConfig);
28
+ });
29
+ this.#config.tools?.forEach((tool) => {
30
+ if (tool.renderer && tool.parameters) {
31
+ this.addRenderToolCall({
32
+ name: tool.name,
33
+ args: tool.parameters,
34
+ component: tool.renderer,
35
+ agentId: tool.agentId,
36
+ });
37
+ }
38
+ });
39
+ this.#config.frontendTools?.forEach((clientTool) => {
40
+ this.addFrontendTool({ ...clientTool, injector: this.#rootInjector });
41
+ });
42
+ this.#config.humanInTheLoop?.forEach((humanInTheLoopTool) => {
43
+ this.addHumanInTheLoop(humanInTheLoopTool);
44
+ });
45
+ this.core.subscribe({
46
+ onAgentsChanged: () => {
47
+ this.#agents.set(this.core.agents);
48
+ },
49
+ });
50
+ }
51
+ #bindClientTool(clientToolWithInjector) {
52
+ const { injector, handler, ...frontendCandidate } = clientToolWithInjector;
53
+ return {
54
+ ...frontendCandidate,
55
+ handler: (args) => runInInjectionContext(injector, () => handler(args)),
56
+ };
57
+ }
58
+ addFrontendTool(clientToolWithInjector) {
59
+ const tool = this.#bindClientTool(clientToolWithInjector);
60
+ this.core.addTool(tool);
61
+ this.#clientToolCallRenderConfigs.update((current) => [...current, clientToolWithInjector]);
62
+ }
63
+ addRenderToolCall(renderConfig) {
64
+ this.#toolCallRenderConfigs.update((current) => [...current, renderConfig]);
65
+ }
66
+ #bindHumanInTheLoopTool(humanInTheLoopTool) {
67
+ return {
68
+ ...humanInTheLoopTool,
69
+ handler: (args, toolCall) => {
70
+ return this.#hitl.onResult(toolCall.id, humanInTheLoopTool.name);
71
+ },
72
+ };
73
+ }
74
+ addHumanInTheLoop(humanInTheLoopTool) {
75
+ this.#humanInTheLoopToolRenderConfigs.update((current) => [...current, humanInTheLoopTool]);
76
+ const tool = this.#bindHumanInTheLoopTool(humanInTheLoopTool);
77
+ this.core.addTool(tool);
78
+ }
79
+ #isSameAgentId(target, agentId) {
80
+ if (agentId) {
81
+ return target.agentId === agentId;
82
+ }
83
+ return true;
84
+ }
85
+ removeTool(toolName, agentId) {
86
+ this.core.removeTool(toolName);
87
+ this.#clientToolCallRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName && this.#isSameAgentId(renderConfig, agentId)));
88
+ this.#humanInTheLoopToolRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName && this.#isSameAgentId(renderConfig, agentId)));
89
+ this.#toolCallRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName && this.#isSameAgentId(renderConfig, agentId)));
90
+ }
91
+ getAgent(agentId) {
92
+ return this.core.getAgent(agentId);
93
+ }
94
+ updateRuntime(options) {
95
+ if (options.runtimeUrl !== undefined) {
96
+ this.core.setRuntimeUrl(options.runtimeUrl);
97
+ }
98
+ if (options.headers !== undefined) {
99
+ this.core.setHeaders(options.headers);
100
+ }
101
+ if (options.properties !== undefined) {
102
+ this.core.setProperties(options.properties);
103
+ }
104
+ if (options.agents !== undefined) {
105
+ this.core.setAgents__unsafe_dev_only(options.agents);
106
+ }
107
+ }
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotKit, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
109
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotKit, providedIn: "root" });
110
+ }
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotKit, decorators: [{
112
+ type: Injectable,
113
+ args: [{ providedIn: "root" }]
114
+ }], ctorParameters: () => [] });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29waWxvdGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUEwQixxQkFBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBR3JELE1BQU0sT0FBTyxVQUFVO0lBQ1osT0FBTyxHQUFHLHNCQUFzQixFQUFFLENBQUM7SUFDbkMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxNQUFNLENBQWdDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRW5DLElBQUksR0FBRyxJQUFJLGNBQWMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1FBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87UUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtRQUNuQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07UUFDNUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztLQUMxQixDQUFDLENBQUM7SUFFTSxzQkFBc0IsR0FBMkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLDRCQUE0QixHQUF5QyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEYsZ0NBQWdDLEdBQTJDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV0RixxQkFBcUIsR0FBbUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2pHLDJCQUEyQixHQUFpQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0csK0JBQStCLEdBQ3RDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUVyRDtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztvQkFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbEIsZUFBZSxFQUFFLEdBQUcsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FDYixzQkFFQztRQUVELE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQztRQUUzRSxPQUFPO1lBQ0wsR0FBRyxpQkFBaUI7WUFDcEIsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hFLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUNiLHNCQUVDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUFrQztRQUNsRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELHVCQUF1QixDQUFDLGtCQUF3QztRQUM5RCxPQUFPO1lBQ0wsR0FBRyxrQkFBa0I7WUFDckIsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlCLENBQUMsa0JBQXdDO1FBQ3hELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRTVGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxjQUFjLENBQWlDLE1BQVMsRUFBRSxPQUFnQjtRQUN4RSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQWdCLEVBQUUsT0FBZ0I7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQy9HLENBQUM7UUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDdkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDL0csQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUMvRyxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUtiO1FBQ0MsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO3dHQWhKVSxVQUFVOzRHQUFWLFVBQVUsY0FERyxNQUFNOzs0RkFDbkIsVUFBVTtrQkFEdEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7IEZyb250ZW5kVG9vbCwgQ29waWxvdEtpdENvcmUgfSBmcm9tIFwiQGNvcGlsb3RraXRuZXh0L2NvcmVcIjtcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBTaWduYWwsIFdyaXRhYmxlU2lnbmFsLCBydW5JbkluamVjdGlvbkNvbnRleHQsIHNpZ25hbCwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZyb250ZW5kVG9vbENvbmZpZywgSHVtYW5JblRoZUxvb3BDb25maWcsIFJlbmRlclRvb2xDYWxsQ29uZmlnIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7IGluamVjdENvcGlsb3RLaXRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IEh1bWFuSW5UaGVMb29wIH0gZnJvbSBcIi4vaHVtYW4taW4tdGhlLWxvb3BcIjtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RLaXQge1xuICByZWFkb25seSAjY29uZmlnID0gaW5qZWN0Q29waWxvdEtpdENvbmZpZygpO1xuICByZWFkb25seSAjaGl0bCA9IGluamVjdChIdW1hbkluVGhlTG9vcCk7XG4gIHJlYWRvbmx5ICNyb290SW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICByZWFkb25seSAjYWdlbnRzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+Pih0aGlzLiNjb25maWcuYWdlbnRzID8/IHt9KTtcbiAgcmVhZG9ubHkgYWdlbnRzID0gdGhpcy4jYWdlbnRzLmFzUmVhZG9ubHkoKTtcblxuICByZWFkb25seSBjb3JlID0gbmV3IENvcGlsb3RLaXRDb3JlKHtcbiAgICBydW50aW1lVXJsOiB0aGlzLiNjb25maWcucnVudGltZVVybCxcbiAgICBoZWFkZXJzOiB0aGlzLiNjb25maWcuaGVhZGVycyxcbiAgICBwcm9wZXJ0aWVzOiB0aGlzLiNjb25maWcucHJvcGVydGllcyxcbiAgICBhZ2VudHNfX3Vuc2FmZV9kZXZfb25seTogdGhpcy4jY29uZmlnLmFnZW50cyxcbiAgICB0b29sczogdGhpcy4jY29uZmlnLnRvb2xzLFxuICB9KTtcblxuICByZWFkb25seSAjdG9vbENhbGxSZW5kZXJDb25maWdzOiBXcml0YWJsZVNpZ25hbDxSZW5kZXJUb29sQ2FsbENvbmZpZ1tdPiA9IHNpZ25hbChbXSk7XG4gIHJlYWRvbmx5ICNjbGllbnRUb29sQ2FsbFJlbmRlckNvbmZpZ3M6IFdyaXRhYmxlU2lnbmFsPEZyb250ZW5kVG9vbENvbmZpZ1tdPiA9IHNpZ25hbChbXSk7XG4gIHJlYWRvbmx5ICNodW1hbkluVGhlTG9vcFRvb2xSZW5kZXJDb25maWdzOiBXcml0YWJsZVNpZ25hbDxIdW1hbkluVGhlTG9vcENvbmZpZ1tdPiA9IHNpZ25hbChbXSk7XG5cbiAgcmVhZG9ubHkgdG9vbENhbGxSZW5kZXJDb25maWdzOiBTaWduYWw8UmVuZGVyVG9vbENhbGxDb25maWdbXT4gPSB0aGlzLiN0b29sQ2FsbFJlbmRlckNvbmZpZ3MuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBjbGllbnRUb29sQ2FsbFJlbmRlckNvbmZpZ3M6IFNpZ25hbDxGcm9udGVuZFRvb2xDb25maWdbXT4gPSB0aGlzLiNjbGllbnRUb29sQ2FsbFJlbmRlckNvbmZpZ3MuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBodW1hbkluVGhlTG9vcFRvb2xSZW5kZXJDb25maWdzOiBTaWduYWw8SHVtYW5JblRoZUxvb3BDb25maWdbXT4gPVxuICAgIHRoaXMuI2h1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3MuYXNSZWFkb25seSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuI2NvbmZpZy5yZW5kZXJUb29sQ2FsbHM/LmZvckVhY2goKHJlbmRlckNvbmZpZykgPT4ge1xuICAgICAgdGhpcy5hZGRSZW5kZXJUb29sQ2FsbChyZW5kZXJDb25maWcpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4jY29uZmlnLnRvb2xzPy5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICBpZiAodG9vbC5yZW5kZXJlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRSZW5kZXJUb29sQ2FsbCh7XG4gICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICBjb21wb25lbnQ6IHRvb2wucmVuZGVyZXIsXG4gICAgICAgICAgYWdlbnRJZDogdG9vbC5hZ2VudElkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuI2NvbmZpZy5mcm9udGVuZFRvb2xzPy5mb3JFYWNoKChjbGllbnRUb29sKSA9PiB7XG4gICAgICB0aGlzLmFkZEZyb250ZW5kVG9vbCh7IC4uLmNsaWVudFRvb2wsIGluamVjdG9yOiB0aGlzLiNyb290SW5qZWN0b3IgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiNjb25maWcuaHVtYW5JblRoZUxvb3A/LmZvckVhY2goKGh1bWFuSW5UaGVMb29wVG9vbCkgPT4ge1xuICAgICAgdGhpcy5hZGRIdW1hbkluVGhlTG9vcChodW1hbkluVGhlTG9vcFRvb2wpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb3JlLnN1YnNjcmliZSh7XG4gICAgICBvbkFnZW50c0NoYW5nZWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy4jYWdlbnRzLnNldCh0aGlzLmNvcmUuYWdlbnRzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAjYmluZENsaWVudFRvb2woXG4gICAgY2xpZW50VG9vbFdpdGhJbmplY3RvcjogRnJvbnRlbmRUb29sQ29uZmlnICYge1xuICAgICAgaW5qZWN0b3I6IEluamVjdG9yO1xuICAgIH0sXG4gICk6IEZyb250ZW5kVG9vbCB7XG4gICAgY29uc3QgeyBpbmplY3RvciwgaGFuZGxlciwgLi4uZnJvbnRlbmRDYW5kaWRhdGUgfSA9IGNsaWVudFRvb2xXaXRoSW5qZWN0b3I7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZnJvbnRlbmRDYW5kaWRhdGUsXG4gICAgICBoYW5kbGVyOiAoYXJncykgPT4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiBoYW5kbGVyKGFyZ3MpKSxcbiAgICB9O1xuICB9XG5cbiAgYWRkRnJvbnRlbmRUb29sKFxuICAgIGNsaWVudFRvb2xXaXRoSW5qZWN0b3I6IEZyb250ZW5kVG9vbENvbmZpZyAmIHtcbiAgICAgIGluamVjdG9yOiBJbmplY3RvcjtcbiAgICB9LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0b29sID0gdGhpcy4jYmluZENsaWVudFRvb2woY2xpZW50VG9vbFdpdGhJbmplY3Rvcik7XG5cbiAgICB0aGlzLmNvcmUuYWRkVG9vbCh0b29sKTtcblxuICAgIHRoaXMuI2NsaWVudFRvb2xDYWxsUmVuZGVyQ29uZmlncy51cGRhdGUoKGN1cnJlbnQpID0+IFsuLi5jdXJyZW50LCBjbGllbnRUb29sV2l0aEluamVjdG9yXSk7XG4gIH1cblxuICBhZGRSZW5kZXJUb29sQ2FsbChyZW5kZXJDb25maWc6IFJlbmRlclRvb2xDYWxsQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy4jdG9vbENhbGxSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT4gWy4uLmN1cnJlbnQsIHJlbmRlckNvbmZpZ10pO1xuICB9XG5cbiAgI2JpbmRIdW1hbkluVGhlTG9vcFRvb2woaHVtYW5JblRoZUxvb3BUb29sOiBIdW1hbkluVGhlTG9vcENvbmZpZyk6IEZyb250ZW5kVG9vbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmh1bWFuSW5UaGVMb29wVG9vbCxcbiAgICAgIGhhbmRsZXI6IChhcmdzLCB0b29sQ2FsbCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGl0bC5vblJlc3VsdCh0b29sQ2FsbC5pZCwgaHVtYW5JblRoZUxvb3BUb29sLm5hbWUpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYWRkSHVtYW5JblRoZUxvb3AoaHVtYW5JblRoZUxvb3BUb29sOiBIdW1hbkluVGhlTG9vcENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuI2h1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3MudXBkYXRlKChjdXJyZW50KSA9PiBbLi4uY3VycmVudCwgaHVtYW5JblRoZUxvb3BUb29sXSk7XG5cbiAgICBjb25zdCB0b29sID0gdGhpcy4jYmluZEh1bWFuSW5UaGVMb29wVG9vbChodW1hbkluVGhlTG9vcFRvb2wpO1xuXG4gICAgdGhpcy5jb3JlLmFkZFRvb2wodG9vbCk7XG4gIH1cblxuICAjaXNTYW1lQWdlbnRJZDxUIGV4dGVuZHMgeyBhZ2VudElkPzogc3RyaW5nIH0+KHRhcmdldDogVCwgYWdlbnRJZD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChhZ2VudElkKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LmFnZW50SWQgPT09IGFnZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW1vdmVUb29sKHRvb2xOYW1lOiBzdHJpbmcsIGFnZW50SWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmUucmVtb3ZlVG9vbCh0b29sTmFtZSk7XG4gICAgdGhpcy4jY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT5cbiAgICAgIGN1cnJlbnQuZmlsdGVyKChyZW5kZXJDb25maWcpID0+IHJlbmRlckNvbmZpZy5uYW1lICE9PSB0b29sTmFtZSAmJiB0aGlzLiNpc1NhbWVBZ2VudElkKHJlbmRlckNvbmZpZywgYWdlbnRJZCkpLFxuICAgICk7XG4gICAgdGhpcy4jaHVtYW5JblRoZUxvb3BUb29sUmVuZGVyQ29uZmlncy51cGRhdGUoKGN1cnJlbnQpID0+XG4gICAgICBjdXJyZW50LmZpbHRlcigocmVuZGVyQ29uZmlnKSA9PiByZW5kZXJDb25maWcubmFtZSAhPT0gdG9vbE5hbWUgJiYgdGhpcy4jaXNTYW1lQWdlbnRJZChyZW5kZXJDb25maWcsIGFnZW50SWQpKSxcbiAgICApO1xuICAgIHRoaXMuI3Rvb2xDYWxsUmVuZGVyQ29uZmlncy51cGRhdGUoKGN1cnJlbnQpID0+XG4gICAgICBjdXJyZW50LmZpbHRlcigocmVuZGVyQ29uZmlnKSA9PiByZW5kZXJDb25maWcubmFtZSAhPT0gdG9vbE5hbWUgJiYgdGhpcy4jaXNTYW1lQWdlbnRJZChyZW5kZXJDb25maWcsIGFnZW50SWQpKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWdlbnQoYWdlbnRJZDogc3RyaW5nKTogQWJzdHJhY3RBZ2VudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRBZ2VudChhZ2VudElkKTtcbiAgfVxuXG4gIHVwZGF0ZVJ1bnRpbWUob3B0aW9uczoge1xuICAgIHJ1bnRpbWVVcmw/OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGFnZW50cz86IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+O1xuICB9KTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMucnVudGltZVVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvcmUuc2V0UnVudGltZVVybChvcHRpb25zLnJ1bnRpbWVVcmwpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29yZS5zZXRIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb3JlLnNldFByb3BlcnRpZXMob3B0aW9ucy5wcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYWdlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29yZS5zZXRBZ2VudHNfX3Vuc2FmZV9kZXZfb25seShvcHRpb25zLmFnZW50cyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,130 @@
1
+ import { Directive, Input, Inject, } from "@angular/core";
2
+ import { CopilotKit } from "../copilotkit";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../copilotkit";
5
+ /**
6
+ * Directive to manage agent context in CopilotKit.
7
+ * Automatically adds context on init, updates on changes, and removes on destroy.
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <!-- With separate inputs -->
12
+ * <div copilotkitAgentContext
13
+ * [description]="'User preferences'"
14
+ * [value]="userSettings">
15
+ * </div>
16
+ *
17
+ * <!-- With context object -->
18
+ * <div [copilotkitAgentContext]="contextObject">
19
+ * </div>
20
+ *
21
+ * <!-- With dynamic values -->
22
+ * <div copilotkitAgentContext
23
+ * description="Form state"
24
+ * [value]="formData$ | async">
25
+ * </div>
26
+ * ```
27
+ */
28
+ export class CopilotKitAgentContext {
29
+ copilotkit;
30
+ contextId;
31
+ constructor(copilotkit) {
32
+ this.copilotkit = copilotkit;
33
+ }
34
+ /**
35
+ * Context object containing both description and value.
36
+ * If provided, this takes precedence over individual inputs.
37
+ */
38
+ context;
39
+ /**
40
+ * Description of the context.
41
+ * Used when context object is not provided.
42
+ */
43
+ description;
44
+ /**
45
+ * Value of the context.
46
+ * Used when context object is not provided.
47
+ */
48
+ value;
49
+ ngOnInit() {
50
+ this.addContext();
51
+ }
52
+ ngOnChanges(changes) {
53
+ // Check if any relevant input has changed
54
+ const hasContextChange = "context" in changes;
55
+ const hasDescriptionChange = "description" in changes;
56
+ const hasValueChange = "value" in changes;
57
+ if (hasContextChange || hasDescriptionChange || hasValueChange) {
58
+ // Skip the first change as ngOnInit handles initial setup
59
+ if (this.contextId) {
60
+ this.updateContext();
61
+ }
62
+ }
63
+ }
64
+ ngOnDestroy() {
65
+ this.removeContext();
66
+ }
67
+ /**
68
+ * Adds the context to CopilotKit
69
+ */
70
+ addContext() {
71
+ const contextToAdd = this.getContext();
72
+ if (contextToAdd) {
73
+ this.contextId = this.copilotkit.core.addContext(contextToAdd);
74
+ }
75
+ }
76
+ /**
77
+ * Updates the context by removing the old one and adding a new one
78
+ */
79
+ updateContext() {
80
+ this.removeContext();
81
+ this.addContext();
82
+ }
83
+ /**
84
+ * Removes the current context from CopilotKit
85
+ */
86
+ removeContext() {
87
+ if (this.contextId) {
88
+ this.copilotkit.core.removeContext(this.contextId);
89
+ this.contextId = undefined;
90
+ }
91
+ }
92
+ /**
93
+ * Gets the context object from inputs
94
+ */
95
+ getContext() {
96
+ // If context object is provided, use it
97
+ if (this.context) {
98
+ return this.context;
99
+ }
100
+ // Otherwise, build from individual inputs
101
+ // Note: null is a valid value, but undefined means not set
102
+ if (this.description !== undefined && this.value !== undefined) {
103
+ return {
104
+ description: this.description,
105
+ value: this.value,
106
+ };
107
+ }
108
+ return null;
109
+ }
110
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotKitAgentContext, deps: [{ token: CopilotKit }], target: i0.ɵɵFactoryTarget.Directive });
111
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: CopilotKitAgentContext, isStandalone: true, selector: "[copilotkitAgentContext]", inputs: { context: ["copilotkitAgentContext", "context"], description: "description", value: "value" }, usesOnChanges: true, ngImport: i0 });
112
+ }
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotKitAgentContext, decorators: [{
114
+ type: Directive,
115
+ args: [{
116
+ selector: "[copilotkitAgentContext]",
117
+ standalone: true,
118
+ }]
119
+ }], ctorParameters: () => [{ type: i1.CopilotKit, decorators: [{
120
+ type: Inject,
121
+ args: [CopilotKit]
122
+ }] }], propDecorators: { context: [{
123
+ type: Input,
124
+ args: ["copilotkitAgentContext"]
125
+ }], description: [{
126
+ type: Input
127
+ }], value: [{
128
+ type: Input
129
+ }] } });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1hZ2VudC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL2NvcGlsb3RraXQtYWdlbnQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFLTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRzNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBS0gsTUFBTSxPQUFPLHNCQUFzQjtJQUdnQjtJQUZ6QyxTQUFTLENBQVU7SUFFM0IsWUFBaUQsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFHLENBQUM7SUFFM0U7OztPQUdHO0lBQzhCLE9BQU8sQ0FBVztJQUVuRDs7O09BR0c7SUFDTSxXQUFXLENBQVU7SUFFOUI7OztPQUdHO0lBQ00sS0FBSyxDQUFPO0lBRXJCLFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQywwQ0FBMEM7UUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLElBQUksT0FBTyxDQUFDO1FBQzlDLE1BQU0sb0JBQW9CLEdBQUcsYUFBYSxJQUFJLE9BQU8sQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDO1FBRTFDLElBQUksZ0JBQWdCLElBQUksb0JBQW9CLElBQUksY0FBYyxFQUFFLENBQUM7WUFDL0QsMERBQTBEO1lBQzFELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVO1FBQ2hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVO1FBQ2hCLHdDQUF3QztRQUN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUVELDBDQUEwQztRQUMxQywyREFBMkQ7UUFDM0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9ELE9BQU87Z0JBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDbEIsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7d0dBN0ZVLHNCQUFzQixrQkFHYixVQUFVOzRGQUhuQixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFJYyxNQUFNOzJCQUFDLFVBQVU7eUNBTUcsT0FBTztzQkFBdkMsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBTXRCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgSW5qZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29waWxvdEtpdCB9IGZyb20gXCIuLi9jb3BpbG90a2l0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0byBtYW5hZ2UgYWdlbnQgY29udGV4dCBpbiBDb3BpbG90S2l0LlxuICogQXV0b21hdGljYWxseSBhZGRzIGNvbnRleHQgb24gaW5pdCwgdXBkYXRlcyBvbiBjaGFuZ2VzLCBhbmQgcmVtb3ZlcyBvbiBkZXN0cm95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIFdpdGggc2VwYXJhdGUgaW5wdXRzIC0tPlxuICogPGRpdiBjb3BpbG90a2l0QWdlbnRDb250ZXh0XG4gKiAgICAgIFtkZXNjcmlwdGlvbl09XCInVXNlciBwcmVmZXJlbmNlcydcIlxuICogICAgICBbdmFsdWVdPVwidXNlclNldHRpbmdzXCI+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8IS0tIFdpdGggY29udGV4dCBvYmplY3QgLS0+XG4gKiA8ZGl2IFtjb3BpbG90a2l0QWdlbnRDb250ZXh0XT1cImNvbnRleHRPYmplY3RcIj5cbiAqIDwvZGl2PlxuICpcbiAqIDwhLS0gV2l0aCBkeW5hbWljIHZhbHVlcyAtLT5cbiAqIDxkaXYgY29waWxvdGtpdEFnZW50Q29udGV4dFxuICogICAgICBkZXNjcmlwdGlvbj1cIkZvcm0gc3RhdGVcIlxuICogICAgICBbdmFsdWVdPVwiZm9ybURhdGEkIHwgYXN5bmNcIj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY29waWxvdGtpdEFnZW50Q29udGV4dF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEFnZW50Q29udGV4dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGNvbnRleHRJZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KENvcGlsb3RLaXQpIHByaXZhdGUgcmVhZG9ubHkgY29waWxvdGtpdDogQ29waWxvdEtpdCkge31cblxuICAvKipcbiAgICogQ29udGV4dCBvYmplY3QgY29udGFpbmluZyBib3RoIGRlc2NyaXB0aW9uIGFuZCB2YWx1ZS5cbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGluZGl2aWR1YWwgaW5wdXRzLlxuICAgKi9cbiAgQElucHV0KFwiY29waWxvdGtpdEFnZW50Q29udGV4dFwiKSBjb250ZXh0PzogQ29udGV4dDtcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIGNvbnRleHQuXG4gICAqIFVzZWQgd2hlbiBjb250ZXh0IG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIGNvbnRleHQuXG4gICAqIFVzZWQgd2hlbiBjb250ZXh0IG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZT86IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENvbnRleHQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiBhbnkgcmVsZXZhbnQgaW5wdXQgaGFzIGNoYW5nZWRcbiAgICBjb25zdCBoYXNDb250ZXh0Q2hhbmdlID0gXCJjb250ZXh0XCIgaW4gY2hhbmdlcztcbiAgICBjb25zdCBoYXNEZXNjcmlwdGlvbkNoYW5nZSA9IFwiZGVzY3JpcHRpb25cIiBpbiBjaGFuZ2VzO1xuICAgIGNvbnN0IGhhc1ZhbHVlQ2hhbmdlID0gXCJ2YWx1ZVwiIGluIGNoYW5nZXM7XG5cbiAgICBpZiAoaGFzQ29udGV4dENoYW5nZSB8fCBoYXNEZXNjcmlwdGlvbkNoYW5nZSB8fCBoYXNWYWx1ZUNoYW5nZSkge1xuICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgY2hhbmdlIGFzIG5nT25Jbml0IGhhbmRsZXMgaW5pdGlhbCBzZXR1cFxuICAgICAgaWYgKHRoaXMuY29udGV4dElkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQ29udGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGNvbnRleHQgdG8gQ29waWxvdEtpdFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHRUb0FkZCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgaWYgKGNvbnRleHRUb0FkZCkge1xuICAgICAgdGhpcy5jb250ZXh0SWQgPSB0aGlzLmNvcGlsb3RraXQuY29yZS5hZGRDb250ZXh0KGNvbnRleHRUb0FkZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbnRleHQgYnkgcmVtb3ZpbmcgdGhlIG9sZCBvbmUgYW5kIGFkZGluZyBhIG5ldyBvbmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUNvbnRleHQoKTtcbiAgICB0aGlzLmFkZENvbnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGNvbnRleHQgZnJvbSBDb3BpbG90S2l0XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUNvbnRleHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dElkKSB7XG4gICAgICB0aGlzLmNvcGlsb3RraXQuY29yZS5yZW1vdmVDb250ZXh0KHRoaXMuY29udGV4dElkKTtcbiAgICAgIHRoaXMuY29udGV4dElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IG9iamVjdCBmcm9tIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHtcbiAgICAvLyBJZiBjb250ZXh0IG9iamVjdCBpcyBwcm92aWRlZCwgdXNlIGl0XG4gICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIGZyb20gaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAvLyBOb3RlOiBudWxsIGlzIGEgdmFsaWQgdmFsdWUsIGJ1dCB1bmRlZmluZWQgbWVhbnMgbm90IHNldFxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=