@copilotkitnext/angular 0.0.2 → 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.
Files changed (168) hide show
  1. package/README.md +3 -3
  2. package/dist/README.md +3 -3
  3. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
  4. package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
  5. package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  7. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  8. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  9. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  11. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  12. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  13. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  14. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  15. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  16. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  17. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  18. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  19. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  20. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  21. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  22. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  23. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  24. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  25. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  26. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  29. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  30. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  31. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  32. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  37. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  38. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  39. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  40. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  41. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  42. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  43. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  44. package/dist/esm2022/core/copilotkit.service.mjs +430 -0
  45. package/dist/esm2022/core/copilotkit.types.mjs +12 -0
  46. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  47. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  48. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  49. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  50. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
  52. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  53. package/dist/esm2022/index.mjs +70 -0
  54. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  55. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  56. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  57. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  58. package/dist/esm2022/lib/utils.mjs +10 -0
  59. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  60. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  61. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  62. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  63. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  64. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  65. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  66. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  67. package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
  68. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
  69. package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
  70. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  71. package/package.json +21 -18
  72. package/vitest.config.mts +32 -21
  73. package/.turbo/turbo-build.log +0 -38
  74. package/.turbo/turbo-check-types.log +0 -0
  75. package/.turbo/turbo-test.log +0 -71
  76. package/ng-package.json +0 -19
  77. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  78. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  79. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  80. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  81. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  82. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  83. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  84. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  85. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  86. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  87. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  88. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  89. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  90. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  91. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  92. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  93. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  94. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  95. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  96. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  97. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  98. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  99. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  100. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  101. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  102. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  103. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  104. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  105. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  106. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  107. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  108. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  109. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  110. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  111. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  112. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  113. package/src/components/chat/copilot-chat.component.ts +0 -232
  114. package/src/components/copilotkit-tool-render.component.ts +0 -169
  115. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  116. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  117. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  118. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  119. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  120. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  121. package/src/core/copilotkit.providers.ts +0 -59
  122. package/src/core/copilotkit.service.ts +0 -542
  123. package/src/core/copilotkit.types.ts +0 -132
  124. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  125. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  126. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  127. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  128. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  129. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  130. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  131. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  132. package/src/directives/copilotkit-agent.directive.ts +0 -225
  133. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  134. package/src/directives/copilotkit-config.directive.ts +0 -81
  135. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  136. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  137. package/src/directives/stick-to-bottom.directive.ts +0 -204
  138. package/src/index.ts +0 -105
  139. package/src/lib/directives/tooltip.directive.ts +0 -292
  140. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  141. package/src/lib/slots/copilot-slot.component.ts +0 -135
  142. package/src/lib/slots/index.ts +0 -3
  143. package/src/lib/slots/slot.types.ts +0 -64
  144. package/src/lib/slots/slot.utils.ts +0 -289
  145. package/src/lib/utils.ts +0 -10
  146. package/src/public-api.ts +0 -1
  147. package/src/services/resize-observer.service.ts +0 -181
  148. package/src/services/scroll-position.service.ts +0 -169
  149. package/src/styles/globals.css +0 -266
  150. package/src/styles/index.css +0 -3
  151. package/src/test-setup.ts +0 -15
  152. package/src/testing/index.ts +0 -3
  153. package/src/testing/testing.utils.ts +0 -248
  154. package/src/types/frontend-tool.ts +0 -44
  155. package/src/types/human-in-the-loop.ts +0 -52
  156. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  157. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  158. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  159. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  160. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  161. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  162. package/src/utils/agent-context.utils.ts +0 -133
  163. package/src/utils/agent.utils.ts +0 -239
  164. package/src/utils/chat-config.utils.ts +0 -221
  165. package/src/utils/copilotkit.utils.ts +0 -20
  166. package/src/utils/frontend-tool.utils.ts +0 -266
  167. package/src/utils/human-in-the-loop.utils.ts +0 -359
  168. package/tsconfig.spec.json +0 -12
@@ -0,0 +1,124 @@
1
+ import { Injectable, ElementRef } from '@angular/core';
2
+ import { Subject, BehaviorSubject, fromEvent, merge, animationFrameScheduler } from 'rxjs';
3
+ import { takeUntil, debounceTime, throttleTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/scrolling";
6
+ export class ScrollPositionService {
7
+ scrollDispatcher;
8
+ viewportRuler;
9
+ ngZone;
10
+ destroy$ = new Subject();
11
+ scrollStateSubject = new BehaviorSubject({
12
+ isAtBottom: true,
13
+ scrollTop: 0,
14
+ scrollHeight: 0,
15
+ clientHeight: 0
16
+ });
17
+ scrollState$ = this.scrollStateSubject.asObservable();
18
+ constructor(scrollDispatcher, viewportRuler, ngZone) {
19
+ this.scrollDispatcher = scrollDispatcher;
20
+ this.viewportRuler = viewportRuler;
21
+ this.ngZone = ngZone;
22
+ }
23
+ /**
24
+ * Monitor scroll position of an element
25
+ * @param element The element to monitor
26
+ * @param threshold Pixels from bottom to consider "at bottom" (default 10)
27
+ */
28
+ monitorScrollPosition(element, threshold = 10) {
29
+ const el = element instanceof ElementRef ? element.nativeElement : element;
30
+ // Create scroll observable
31
+ const scroll$ = merge(fromEvent(el, 'scroll'), this.viewportRuler.change(150) // Monitor viewport changes
32
+ ).pipe(startWith(null), // Emit initial state
33
+ throttleTime(16, animationFrameScheduler, { trailing: true }), // ~60fps
34
+ map(() => this.getScrollState(el, threshold)), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom &&
35
+ a.scrollTop === b.scrollTop &&
36
+ a.scrollHeight === b.scrollHeight), takeUntil(this.destroy$));
37
+ // Subscribe and update subject
38
+ scroll$.subscribe(state => {
39
+ this.scrollStateSubject.next(state);
40
+ });
41
+ return scroll$;
42
+ }
43
+ /**
44
+ * Scroll element to bottom with smooth animation
45
+ * @param element The element to scroll
46
+ * @param smooth Whether to use smooth scrolling
47
+ */
48
+ scrollToBottom(element, smooth = true) {
49
+ const el = element instanceof ElementRef ? element.nativeElement : element;
50
+ this.ngZone.runOutsideAngular(() => {
51
+ if (smooth && 'scrollBehavior' in document.documentElement.style) {
52
+ el.scrollTo({
53
+ top: el.scrollHeight,
54
+ behavior: 'smooth'
55
+ });
56
+ }
57
+ else {
58
+ el.scrollTop = el.scrollHeight;
59
+ }
60
+ });
61
+ }
62
+ /**
63
+ * Check if element is at bottom
64
+ * @param element The element to check
65
+ * @param threshold Pixels from bottom to consider "at bottom"
66
+ */
67
+ isAtBottom(element, threshold = 10) {
68
+ const el = element instanceof ElementRef ? element.nativeElement : element;
69
+ return this.getScrollState(el, threshold).isAtBottom;
70
+ }
71
+ /**
72
+ * Get current scroll state of element
73
+ */
74
+ getScrollState(element, threshold) {
75
+ const scrollTop = element.scrollTop;
76
+ const scrollHeight = element.scrollHeight;
77
+ const clientHeight = element.clientHeight;
78
+ const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
79
+ const isAtBottom = distanceFromBottom <= threshold;
80
+ return {
81
+ isAtBottom,
82
+ scrollTop,
83
+ scrollHeight,
84
+ clientHeight
85
+ };
86
+ }
87
+ /**
88
+ * Create a ResizeObserver for element size changes
89
+ * @param element The element to observe
90
+ * @param debounceMs Debounce time in milliseconds
91
+ */
92
+ observeResize(element, debounceMs = 250) {
93
+ const el = element instanceof ElementRef ? element.nativeElement : element;
94
+ const resize$ = new Subject();
95
+ const resizeObserver = new ResizeObserver((entries) => {
96
+ const entry = entries[0];
97
+ if (entry) {
98
+ this.ngZone.run(() => {
99
+ resize$.next(entry);
100
+ });
101
+ }
102
+ });
103
+ resizeObserver.observe(el);
104
+ // Cleanup on destroy
105
+ this.destroy$.subscribe(() => {
106
+ resizeObserver.disconnect();
107
+ });
108
+ return resize$.pipe(debounceTime(debounceMs), takeUntil(this.destroy$));
109
+ }
110
+ ngOnDestroy() {
111
+ this.destroy$.next();
112
+ this.destroy$.complete();
113
+ this.scrollStateSubject.complete();
114
+ }
115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollPositionService, deps: [{ token: i1.ScrollDispatcher }, { token: i1.ViewportRuler }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
116
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollPositionService, providedIn: 'root' });
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScrollPositionService, decorators: [{
119
+ type: Injectable,
120
+ args: [{
121
+ providedIn: 'root'
122
+ }]
123
+ }], ctorParameters: () => [{ type: i1.ScrollDispatcher }, { type: i1.ViewportRuler }, { type: i0.NgZone }] });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXBvc2l0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvc2Nyb2xsLXBvc2l0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBRUgsU0FBUyxFQUNWLE1BQU0sZ0JBQWdCLENBQUM7OztBQVl4QixNQUFNLE9BQU8scUJBQXFCO0lBWXRCO0lBQ0E7SUFDQTtJQWJGLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLGtCQUFrQixHQUFHLElBQUksZUFBZSxDQUFjO1FBQzVELFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLENBQUM7UUFDZixZQUFZLEVBQUUsQ0FBQztLQUNoQixDQUFDLENBQUM7SUFFSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRTdELFlBQ1UsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLE1BQWM7UUFGZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FDbkIsT0FBOEMsRUFDOUMsWUFBb0IsRUFBRTtRQUV0QixNQUFNLEVBQUUsR0FBRyxPQUFPLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFD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TUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2Nyb2xsRGlzcGF0Y2hlciwgVmlld3BvcnRSdWxlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgXG4gIHRha2VVbnRpbCwgXG4gIGRlYm91bmNlVGltZSwgXG4gIHRocm90dGxlVGltZSwgXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIG9ic2VydmVPbixcbiAgc3RhcnRXaXRoXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxTdGF0ZSB7XG4gIGlzQXRCb3R0b206IGJvb2xlYW47XG4gIHNjcm9sbFRvcDogbnVtYmVyO1xuICBzY3JvbGxIZWlnaHQ6IG51bWJlcjtcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbFBvc2l0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHNjcm9sbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Nyb2xsU3RhdGU+KHtcbiAgICBpc0F0Qm90dG9tOiB0cnVlLFxuICAgIHNjcm9sbFRvcDogMCxcbiAgICBzY3JvbGxIZWlnaHQ6IDAsXG4gICAgY2xpZW50SGVpZ2h0OiAwXG4gIH0pO1xuICBcbiAgcHVibGljIHNjcm9sbFN0YXRlJCA9IHRoaXMuc2Nyb2xsU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyLFxuICAgIHByaXZhdGUgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge31cbiAgXG4gIC8qKlxuICAgKiBNb25pdG9yIHNjcm9sbCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIG1vbml0b3JcbiAgICogQHBhcmFtIHRocmVzaG9sZCBQaXhlbHMgZnJvbSBib3R0b20gdG8gY29uc2lkZXIgXCJhdCBib3R0b21cIiAoZGVmYXVsdCAxMClcbiAgICovXG4gIG1vbml0b3JTY3JvbGxQb3NpdGlvbihcbiAgICBlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50LFxuICAgIHRocmVzaG9sZDogbnVtYmVyID0gMTBcbiAgKTogT2JzZXJ2YWJsZTxTY3JvbGxTdGF0ZT4ge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBlbGVtZW50O1xuICAgIFxuICAgIC8vIENyZWF0ZSBzY3JvbGwgb2JzZXJ2YWJsZVxuICAgIGNvbnN0IHNjcm9sbCQgPSBtZXJnZShcbiAgICAgIGZyb21FdmVudChlbCwgJ3Njcm9sbCcpLFxuICAgICAgdGhpcy52aWV3cG9ydFJ1bGVyLmNoYW5nZSgxNTApIC8vIE1vbml0b3Igdmlld3BvcnQgY2hhbmdlc1xuICAgICkucGlwZShcbiAgICAgIHN0YXJ0V2l0aChudWxsKSwgLy8gRW1pdCBpbml0aWFsIHN0YXRlXG4gICAgICB0aHJvdHRsZVRpbWUoMTYsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB+NjBmcHNcbiAgICAgIG1hcCgoKSA9PiB0aGlzLmdldFNjcm9sbFN0YXRlKGVsLCB0aHJlc2hvbGQpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBcbiAgICAgICAgYS5pc0F0Qm90dG9tID09PSBiLmlzQXRCb3R0b20gJiYgXG4gICAgICAgIGEuc2Nyb2xsVG9wID09PSBiLnNjcm9sbFRvcCAmJlxuICAgICAgICBhLnNjcm9sbEhlaWdodCA9PT0gYi5zY3JvbGxIZWlnaHRcbiAgICAgICksXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICApO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSBhbmQgdXBkYXRlIHN1YmplY3RcbiAgICBzY3JvbGwkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbFN0YXRlU3ViamVjdC5uZXh0KHN0YXRlKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gc2Nyb2xsJDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNjcm9sbCBlbGVtZW50IHRvIGJvdHRvbSB3aXRoIHNtb290aCBhbmltYXRpb25cbiAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gc2Nyb2xsXG4gICAqIEBwYXJhbSBzbW9vdGggV2hldGhlciB0byB1c2Ugc21vb3RoIHNjcm9sbGluZ1xuICAgKi9cbiAgc2Nyb2xsVG9Cb3R0b20oXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICBzbW9vdGg6IGJvb2xlYW4gPSB0cnVlXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBlbGVtZW50O1xuICAgIFxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmIChzbW9vdGggJiYgJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgZWwuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogZWwuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgaXMgYXQgYm90dG9tXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgUGl4ZWxzIGZyb20gYm90dG9tIHRvIGNvbnNpZGVyIFwiYXQgYm90dG9tXCJcbiAgICovXG4gIGlzQXRCb3R0b20oXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICB0aHJlc2hvbGQ6IG51bWJlciA9IDEwXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBlbGVtZW50O1xuICAgIHJldHVybiB0aGlzLmdldFNjcm9sbFN0YXRlKGVsLCB0aHJlc2hvbGQpLmlzQXRCb3R0b207XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzY3JvbGwgc3RhdGUgb2YgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIGdldFNjcm9sbFN0YXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0aHJlc2hvbGQ6IG51bWJlcik6IFNjcm9sbFN0YXRlIHtcbiAgICBjb25zdCBzY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSBlbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICBjb25zdCBjbGllbnRIZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IGRpc3RhbmNlRnJvbUJvdHRvbSA8PSB0aHJlc2hvbGQ7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXRCb3R0b20sXG4gICAgICBzY3JvbGxUb3AsXG4gICAgICBzY3JvbGxIZWlnaHQsXG4gICAgICBjbGllbnRIZWlnaHRcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogQ3JlYXRlIGEgUmVzaXplT2JzZXJ2ZXIgZm9yIGVsZW1lbnQgc2l6ZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIG9ic2VydmVcbiAgICogQHBhcmFtIGRlYm91bmNlTXMgRGVib3VuY2UgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIG9ic2VydmVSZXNpemUoXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICBkZWJvdW5jZU1zOiBudW1iZXIgPSAyNTBcbiAgKTogT2JzZXJ2YWJsZTxSZXNpemVPYnNlcnZlckVudHJ5PiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IGVsZW1lbnQubmF0aXZlRWxlbWVudCA6IGVsZW1lbnQ7XG4gICAgY29uc3QgcmVzaXplJCA9IG5ldyBTdWJqZWN0PFJlc2l6ZU9ic2VydmVyRW50cnk+KCk7XG4gICAgXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHJlc2l6ZSQubmV4dChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgIFxuICAgIC8vIENsZWFudXAgb24gZGVzdHJveVxuICAgIHRoaXMuZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzaXplJC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgKTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc2Nyb2xsU3RhdGVTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtdG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9mcm9udGVuZC10b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBUZW1wbGF0ZVJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8qKlxuICogQW5ndWxhci1zcGVjaWZpYyBmcm9udGVuZCB0b29sIGRlZmluaXRpb24uXG4gKiBQcm92aWRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyBvbiB0aGUgZnJvbnRlbmQgd2hlbiB0aGUgdG9vbCBpcyBjYWxsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5ndWxhckZyb250ZW5kVG9vbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0b29sIC0gbXVzdCBiZSB1bmlxdWVcbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSB0b29sIGRvZXNcbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIFpvZCBzY2hlbWEgZGVmaW5pbmcgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB0b29sXG4gICAqL1xuICBwYXJhbWV0ZXJzPzogei5ab2RTY2hlbWE8VD47XG4gIFxuICAvKipcbiAgICogSGFuZGxlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHdoZW4gdGhlIHRvb2wgaXMgY2FsbGVkXG4gICAqL1xuICBoYW5kbGVyPzogKGFyZ3M6IFQpID0+IFByb21pc2U8YW55PjtcbiAgXG4gIC8qKlxuICAgKiBPcHRpb25hbCBBbmd1bGFyIGNvbXBvbmVudCBvciB0ZW1wbGF0ZSB0byByZW5kZXIgd2hlbiB0aGUgdG9vbCBpcyBjYWxsZWRcbiAgICovXG4gIHJlbmRlcj86IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPGFueT47XG4gIFxuICAvKipcbiAgICogV2hldGhlciB0aGUgYWdlbnQgc2hvdWxkIGZvbGxvdyB1cCBhZnRlciB0aGlzIHRvb2wgY29tcGxldGVzLlxuICAgKiBEZWZhdWx0cyB0byB0cnVlIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICBmb2xsb3dVcD86IGJvb2xlYW47XG4gIFxuICAvKipcbiAgICogT3B0aW9uYWwgYWdlbnQgSUQgdG8gY29uc3RyYWluIHRoaXMgdG9vbCB0byBhIHNwZWNpZmljIGFnZW50XG4gICAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xufSJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZXMvaHVtYW4taW4tdGhlLWxvb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUsIFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEFuZ3VsYXJGcm9udGVuZFRvb2wgfSBmcm9tIFwiLi9mcm9udGVuZC10b29sXCI7XG5pbXBvcnQgeyBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuXG4vKipcbiAqIFByb3BzIHBhc3NlZCB0byBodW1hbi1pbi10aGUtbG9vcCByZW5kZXIgY29tcG9uZW50cyAtIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWF0Y2hpbmcgUmVhY3RcbiAqL1xuZXhwb3J0IHR5cGUgSHVtYW5JblRoZUxvb3BQcm9wczxUID0gdW5rbm93bj4gPVxuICB8IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBhcmdzOiBQYXJ0aWFsPFQ+O1xuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzO1xuICAgICAgcmVzdWx0OiB1bmRlZmluZWQ7XG4gICAgICByZXNwb25kOiB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBhcmdzOiBUO1xuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5FeGVjdXRpbmc7XG4gICAgICByZXN1bHQ6IHVuZGVmaW5lZDtcbiAgICAgIHJlc3BvbmQ6IChyZXN1bHQ6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBhcmdzOiBUO1xuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZTtcbiAgICAgIHJlc3VsdDogc3RyaW5nO1xuICAgICAgcmVzcG9uZDogdW5kZWZpbmVkO1xuICAgIH07XG5cbi8qKlxuICogQW5ndWxhciBodW1hbi1pbi10aGUtbG9vcCB0b29sIGRlZmluaXRpb24uXG4gKiBTaW1pbGFyIHRvIGZyb250ZW5kIHRvb2xzIGJ1dCBkZXNpZ25lZCBmb3IgaW50ZXJhY3RpdmUgdXNlciBpbnB1dCBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5ndWxhckh1bWFuSW5UaGVMb29wPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IGV4dGVuZHMgT21pdDxBbmd1bGFyRnJvbnRlbmRUb29sPFQ+LCBcImhhbmRsZXJcIiB8IFwicmVuZGVyXCI+IHtcbiAgLyoqXG4gICAqIEFuZ3VsYXIgY29tcG9uZW50IG9yIHRlbXBsYXRlIHRvIHJlbmRlciBmb3IgdXNlciBpbnRlcmFjdGlvbi5cbiAgICogUmVxdWlyZWQgZm9yIGh1bWFuLWluLXRoZS1sb29wIHRvb2xzLlxuICAgKi9cbiAgcmVuZGVyOiBUeXBlPEh1bWFuSW5UaGVMb29wUHJvcHM8VD4+IHwgVGVtcGxhdGVSZWY8SHVtYW5JblRoZUxvb3BQcm9wczxUPj47XG5cbiAgLyoqXG4gICAqIFBhcmFtZXRlcnMgc2NoZW1hIGlzIHJlcXVpcmVkIGZvciBodW1hbi1pbi10aGUtbG9vcCB0b29sc1xuICAgKi9cbiAgcGFyYW1ldGVyczogei5ab2RUeXBlPFQ+O1xufVxuIl19
@@ -0,0 +1,114 @@
1
+ import { DestroyRef, inject } from '@angular/core';
2
+ import { CopilotKitService } from '../core/copilotkit.service';
3
+ /**
4
+ * Programmatically adds an agent context to CopilotKit and returns a cleanup function.
5
+ *
6
+ * @param context - The context to add
7
+ * @returns A cleanup function that removes the context
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * export class MyComponent implements OnInit {
12
+ * private copilotkit = injectCopilotKit();
13
+ *
14
+ * ngOnInit() {
15
+ * const cleanup = addAgentContext(this.copilotkit, {
16
+ * description: 'User preferences',
17
+ * value: this.userSettings
18
+ * });
19
+ *
20
+ * // Store cleanup for later or register with DestroyRef
21
+ * this.cleanupFns.push(cleanup);
22
+ * }
23
+ * }
24
+ * ```
25
+ */
26
+ export function addAgentContext(copilotkit, context) {
27
+ const contextId = copilotkit.copilotkit.addContext(context);
28
+ return () => {
29
+ copilotkit.copilotkit.removeContext(contextId);
30
+ };
31
+ }
32
+ /**
33
+ * Registers an agent context with CopilotKit and automatically removes it when the component/service is destroyed.
34
+ * Must be called within an injection context.
35
+ *
36
+ * @param context - The context to add
37
+ * @returns The context ID
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * export class MyComponent implements OnInit {
42
+ * ngOnInit() {
43
+ * // Automatically cleaned up on component destroy
44
+ * registerAgentContext({
45
+ * description: 'Component state',
46
+ * value: this.state
47
+ * });
48
+ * }
49
+ * }
50
+ * ```
51
+ */
52
+ export function registerAgentContext(context) {
53
+ const copilotkit = inject(CopilotKitService);
54
+ const destroyRef = inject(DestroyRef);
55
+ const contextId = copilotkit.copilotkit.addContext(context);
56
+ // Register cleanup with Angular's DestroyRef
57
+ destroyRef.onDestroy(() => {
58
+ copilotkit.copilotkit.removeContext(contextId);
59
+ });
60
+ return contextId;
61
+ }
62
+ /**
63
+ * Creates a reactive context that updates whenever the value changes.
64
+ * Uses Angular signals for reactivity.
65
+ *
66
+ * @param description - Static or signal-based description
67
+ * @param value - Signal that provides the context value
68
+ * @returns Object with update and destroy methods
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * export class MyComponent {
73
+ * private userSettings = signal({ theme: 'dark' });
74
+ *
75
+ * ngOnInit() {
76
+ * const context = createReactiveContext(
77
+ * 'User settings',
78
+ * computed(() => this.userSettings())
79
+ * );
80
+ *
81
+ * // Updates automatically when userSettings signal changes
82
+ * }
83
+ * }
84
+ * ```
85
+ */
86
+ export function createReactiveContext(description, value) {
87
+ const copilotkit = inject(CopilotKitService);
88
+ let currentContextId;
89
+ const update = () => {
90
+ // Remove old context if it exists
91
+ if (currentContextId) {
92
+ copilotkit.copilotkit.removeContext(currentContextId);
93
+ }
94
+ // Add new context
95
+ const desc = typeof description === 'function' ? description() : description;
96
+ currentContextId = copilotkit.copilotkit.addContext({
97
+ description: desc,
98
+ value: value()
99
+ });
100
+ };
101
+ const destroy = () => {
102
+ if (currentContextId) {
103
+ copilotkit.copilotkit.removeContext(currentContextId);
104
+ currentContextId = undefined;
105
+ }
106
+ };
107
+ // Initial setup
108
+ update();
109
+ // Register cleanup
110
+ const destroyRef = inject(DestroyRef);
111
+ destroyRef.onDestroy(destroy);
112
+ return { update, destroy };
113
+ }
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtY29udGV4dC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9hZ2VudC1jb250ZXh0LnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRy9EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsVUFBNkIsRUFDN0IsT0FBZ0I7SUFFaEIsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFNUQsT0FBTyxHQUFHLEVBQUU7UUFDVixVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBZ0I7SUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTVELDZDQUE2QztJQUM3QyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUN4QixVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFdBQW9DLEVBQ3BDLEtBQWdCO0lBRWhCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLElBQUksZ0JBQW9DLENBQUM7SUFFekMsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO1FBQ2xCLGtDQUFrQztRQUNsQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLE9BQU8sV0FBVyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUM3RSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxXQUFXLEVBQUUsSUFBSTtZQUNqQixLQUFLLEVBQUUsS0FBSyxFQUFFO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ25CLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RELGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsZ0JBQWdCO0lBQ2hCLE1BQU0sRUFBRSxDQUFDO0lBRVQsbUJBQW1CO0lBQ25CLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29waWxvdEtpdFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2NvcGlsb3RraXQuc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnQGFnLXVpL2NsaWVudCc7XG5cbi8qKlxuICogUHJvZ3JhbW1hdGljYWxseSBhZGRzIGFuIGFnZW50IGNvbnRleHQgdG8gQ29waWxvdEtpdCBhbmQgcmV0dXJucyBhIGNsZWFudXAgZnVuY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgdG8gYWRkXG4gKiBAcmV0dXJucyBBIGNsZWFudXAgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBjb250ZXh0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICogICBwcml2YXRlIGNvcGlsb3RraXQgPSBpbmplY3RDb3BpbG90S2l0KCk7XG4gKiAgIFxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICBjb25zdCBjbGVhbnVwID0gYWRkQWdlbnRDb250ZXh0KHRoaXMuY29waWxvdGtpdCwge1xuICogICAgICAgZGVzY3JpcHRpb246ICdVc2VyIHByZWZlcmVuY2VzJyxcbiAqICAgICAgIHZhbHVlOiB0aGlzLnVzZXJTZXR0aW5nc1xuICogICAgIH0pO1xuICogICAgIFxuICogICAgIC8vIFN0b3JlIGNsZWFudXAgZm9yIGxhdGVyIG9yIHJlZ2lzdGVyIHdpdGggRGVzdHJveVJlZlxuICogICAgIHRoaXMuY2xlYW51cEZucy5wdXNoKGNsZWFudXApO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFnZW50Q29udGV4dChcbiAgY29waWxvdGtpdDogQ29waWxvdEtpdFNlcnZpY2UsXG4gIGNvbnRleHQ6IENvbnRleHRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCBjb250ZXh0SWQgPSBjb3BpbG90a2l0LmNvcGlsb3RraXQuYWRkQ29udGV4dChjb250ZXh0KTtcbiAgXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29waWxvdGtpdC5jb3BpbG90a2l0LnJlbW92ZUNvbnRleHQoY29udGV4dElkKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gYWdlbnQgY29udGV4dCB3aXRoIENvcGlsb3RLaXQgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBpdCB3aGVuIHRoZSBjb21wb25lbnQvc2VydmljZSBpcyBkZXN0cm95ZWQuXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgdG8gYWRkXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBJRFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgLy8gQXV0b21hdGljYWxseSBjbGVhbmVkIHVwIG9uIGNvbXBvbmVudCBkZXN0cm95XG4gKiAgICAgcmVnaXN0ZXJBZ2VudENvbnRleHQoe1xuICogICAgICAgZGVzY3JpcHRpb246ICdDb21wb25lbnQgc3RhdGUnLFxuICogICAgICAgdmFsdWU6IHRoaXMuc3RhdGVcbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFnZW50Q29udGV4dChjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgY29waWxvdGtpdCA9IGluamVjdChDb3BpbG90S2l0U2VydmljZSk7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIFxuICBjb25zdCBjb250ZXh0SWQgPSBjb3BpbG90a2l0LmNvcGlsb3RraXQuYWRkQ29udGV4dChjb250ZXh0KTtcbiAgXG4gIC8vIFJlZ2lzdGVyIGNsZWFudXAgd2l0aCBBbmd1bGFyJ3MgRGVzdHJveVJlZlxuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgY29waWxvdGtpdC5jb3BpbG90a2l0LnJlbW92ZUNvbnRleHQoY29udGV4dElkKTtcbiAgfSk7XG4gIFxuICByZXR1cm4gY29udGV4dElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBjb250ZXh0IHRoYXQgdXBkYXRlcyB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlcy5cbiAqIFVzZXMgQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2aXR5LlxuICogXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBTdGF0aWMgb3Igc2lnbmFsLWJhc2VkIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0gdmFsdWUgLSBTaWduYWwgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCB2YWx1ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdXBkYXRlIGFuZCBkZXN0cm95IG1ldGhvZHNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgdXNlclNldHRpbmdzID0gc2lnbmFsKHsgdGhlbWU6ICdkYXJrJyB9KTtcbiAqICAgXG4gKiAgIG5nT25Jbml0KCkge1xuICogICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVSZWFjdGl2ZUNvbnRleHQoXG4gKiAgICAgICAnVXNlciBzZXR0aW5ncycsXG4gKiAgICAgICBjb21wdXRlZCgoKSA9PiB0aGlzLnVzZXJTZXR0aW5ncygpKVxuICogICAgICk7XG4gKiAgICAgXG4gKiAgICAgLy8gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IHdoZW4gdXNlclNldHRpbmdzIHNpZ25hbCBjaGFuZ2VzXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVDb250ZXh0KFxuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZyksXG4gIHZhbHVlOiAoKSA9PiBhbnlcbik6IHsgdXBkYXRlOiAoKSA9PiB2b2lkOyBkZXN0cm95OiAoKSA9PiB2b2lkIH0ge1xuICBjb25zdCBjb3BpbG90a2l0ID0gaW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKTtcbiAgbGV0IGN1cnJlbnRDb250ZXh0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgXG4gIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBSZW1vdmUgb2xkIGNvbnRleHQgaWYgaXQgZXhpc3RzXG4gICAgaWYgKGN1cnJlbnRDb250ZXh0SWQpIHtcbiAgICAgIGNvcGlsb3RraXQuY29waWxvdGtpdC5yZW1vdmVDb250ZXh0KGN1cnJlbnRDb250ZXh0SWQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbmV3IGNvbnRleHRcbiAgICBjb25zdCBkZXNjID0gdHlwZW9mIGRlc2NyaXB0aW9uID09PSAnZnVuY3Rpb24nID8gZGVzY3JpcHRpb24oKSA6IGRlc2NyaXB0aW9uO1xuICAgIGN1cnJlbnRDb250ZXh0SWQgPSBjb3BpbG90a2l0LmNvcGlsb3RraXQuYWRkQ29udGV4dCh7XG4gICAgICBkZXNjcmlwdGlvbjogZGVzYyxcbiAgICAgIHZhbHVlOiB2YWx1ZSgpXG4gICAgfSk7XG4gIH07XG4gIFxuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmIChjdXJyZW50Q29udGV4dElkKSB7XG4gICAgICBjb3BpbG90a2l0LmNvcGlsb3RraXQucmVtb3ZlQ29udGV4dChjdXJyZW50Q29udGV4dElkKTtcbiAgICAgIGN1cnJlbnRDb250ZXh0SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gSW5pdGlhbCBzZXR1cFxuICB1cGRhdGUoKTtcbiAgXG4gIC8vIFJlZ2lzdGVyIGNsZWFudXBcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koZGVzdHJveSk7XG4gIFxuICByZXR1cm4geyB1cGRhdGUsIGRlc3Ryb3kgfTtcbn0iXX0=
@@ -0,0 +1,204 @@
1
+ import { DestroyRef, inject, signal, computed } from "@angular/core";
2
+ import { toObservable } from "@angular/core/rxjs-interop";
3
+ import { CopilotKitService } from "../core/copilotkit.service";
4
+ import { DEFAULT_AGENT_ID } from "@copilotkitnext/shared";
5
+ /**
6
+ * Watches an agent and provides reactive signals for its state.
7
+ * Must be called within an injection context.
8
+ * Automatically cleans up when the component/service is destroyed.
9
+ *
10
+ * @param config - Optional configuration with agentId
11
+ * @returns Object with agent, messages, and isRunning signals plus observables
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * export class MyComponent {
16
+ * // Automatically tracks agent state
17
+ * agentState = watchAgent({ agentId: 'my-agent' });
18
+ *
19
+ * constructor() {
20
+ * effect(() => {
21
+ * const messages = this.agentState.messages();
22
+ * const isRunning = this.agentState.isRunning();
23
+ * console.log('Messages:', messages.length, 'Running:', isRunning);
24
+ * });
25
+ * }
26
+ * }
27
+ * ```
28
+ */
29
+ export function watchAgent(config) {
30
+ // Use inject() internally to get required services
31
+ const service = inject(CopilotKitService);
32
+ const destroyRef = inject(DestroyRef);
33
+ const effectiveAgentId = config?.agentId ?? DEFAULT_AGENT_ID;
34
+ // Create reactive signals with tick mechanism for reliable updates
35
+ const agentSignal = signal(undefined);
36
+ const tick = signal(0);
37
+ const isRunningSignal = signal(false);
38
+ // Create computed messages signal that reacts to tick changes
39
+ const messages = computed(() => {
40
+ // Access tick to ensure recomputation
41
+ tick();
42
+ const a = agentSignal();
43
+ if (!a)
44
+ return [];
45
+ // Return a shallow clone to ensure change detection
46
+ return a.messages.map((m) => ({ ...m }));
47
+ });
48
+ // Get initial agent
49
+ const updateAgent = () => {
50
+ const agent = service.copilotkit.getAgent(effectiveAgentId);
51
+ agentSignal.set(agent);
52
+ return agent;
53
+ };
54
+ // Initial update
55
+ let currentAgent = updateAgent();
56
+ // Subscribe to agent changes
57
+ let agentSubscription;
58
+ const subscribeToAgent = () => {
59
+ // Unsubscribe from previous agent if any
60
+ agentSubscription?.unsubscribe();
61
+ if (currentAgent) {
62
+ agentSubscription = currentAgent.subscribe({
63
+ onMessagesChanged() {
64
+ // Increment tick to force recomputation of messages computed
65
+ tick.update((v) => v + 1);
66
+ },
67
+ onStateChanged() {
68
+ // Increment tick to force recomputation
69
+ tick.update((v) => v + 1);
70
+ },
71
+ onRunInitialized() {
72
+ isRunningSignal.set(true);
73
+ },
74
+ onRunFinalized() {
75
+ isRunningSignal.set(false);
76
+ },
77
+ onRunFailed() {
78
+ isRunningSignal.set(false);
79
+ },
80
+ });
81
+ }
82
+ };
83
+ // Initial subscription
84
+ subscribeToAgent();
85
+ // Subscribe to CopilotKit changes to detect agent updates
86
+ const coreUnsubscribe = service.copilotkit.subscribe({
87
+ onRuntimeLoaded() {
88
+ // Re-check agent when runtime loads
89
+ currentAgent = updateAgent();
90
+ subscribeToAgent();
91
+ },
92
+ onRuntimeLoadError() {
93
+ // Also re-check agent on runtime load error to ensure consistency
94
+ currentAgent = updateAgent();
95
+ subscribeToAgent();
96
+ },
97
+ });
98
+ // Register cleanup
99
+ const unsubscribe = () => {
100
+ agentSubscription?.unsubscribe();
101
+ coreUnsubscribe(); // subscribe returns a function directly
102
+ };
103
+ destroyRef.onDestroy(unsubscribe);
104
+ // Create observables from signals using toObservable
105
+ const agent$ = toObservable(agentSignal);
106
+ const isRunning$ = toObservable(isRunningSignal);
107
+ const messages$ = toObservable(messages);
108
+ return {
109
+ agent: agentSignal.asReadonly(),
110
+ messages: messages,
111
+ isRunning: isRunningSignal.asReadonly(),
112
+ agent$,
113
+ messages$,
114
+ isRunning$,
115
+ unsubscribe,
116
+ };
117
+ }
118
+ /**
119
+ * Gets an agent by ID without subscribing to changes.
120
+ *
121
+ * @param service - The CopilotKitService instance
122
+ * @param agentId - Optional agent ID (defaults to DEFAULT_AGENT_ID)
123
+ * @returns The agent or undefined if not found
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * export class MyComponent {
128
+ * constructor(private copilotkit: CopilotKitService) {}
129
+ *
130
+ * getCurrentAgent() {
131
+ * return getAgent(this.copilotkit, 'my-agent');
132
+ * }
133
+ * }
134
+ * ```
135
+ */
136
+ export function getAgent(service, agentId) {
137
+ const effectiveAgentId = agentId ?? DEFAULT_AGENT_ID;
138
+ return service.copilotkit.getAgent(effectiveAgentId);
139
+ }
140
+ /**
141
+ * Subscribes to an agent's events with custom callbacks.
142
+ * Returns a cleanup function that should be called to unsubscribe.
143
+ *
144
+ * @param service - The CopilotKitService instance
145
+ * @param agentId - Optional agent ID (defaults to DEFAULT_AGENT_ID)
146
+ * @param callbacks - Event callbacks
147
+ * @returns Cleanup function to unsubscribe
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * export class MyComponent implements OnInit, OnDestroy {
152
+ * private unsubscribe?: () => void;
153
+ *
154
+ * constructor(private copilotkit: CopilotKitService) {}
155
+ *
156
+ * ngOnInit() {
157
+ * this.unsubscribe = subscribeToAgent(this.copilotkit, 'my-agent', {
158
+ * onRunInitialized: () => console.log('Run started'),
159
+ * onRunFinalized: () => console.log('Run completed'),
160
+ * onRunFailed: (error) => console.error('Run failed', error),
161
+ * });
162
+ * }
163
+ *
164
+ * ngOnDestroy() {
165
+ * this.unsubscribe?.();
166
+ * }
167
+ * }
168
+ * ```
169
+ */
170
+ export function subscribeToAgent(service, agentId, callbacks) {
171
+ const effectiveAgentId = agentId ?? DEFAULT_AGENT_ID;
172
+ const agent = service.copilotkit.getAgent(effectiveAgentId);
173
+ if (!agent) {
174
+ // Return no-op cleanup if agent doesn't exist
175
+ return () => { };
176
+ }
177
+ const subscription = agent.subscribe({
178
+ onMessagesChanged: callbacks?.onMessagesChanged,
179
+ onStateChanged: callbacks?.onStateChanged,
180
+ onRunInitialized: callbacks?.onRunInitialized,
181
+ onRunFinalized: callbacks?.onRunFinalized,
182
+ onRunFailed: callbacks?.onRunFailed,
183
+ });
184
+ return () => subscription.unsubscribe();
185
+ }
186
+ /**
187
+ * Registers an agent watcher that automatically cleans up on component destroy.
188
+ * This is an alias for watchAgent with a more explicit name.
189
+ * Must be called within an injection context.
190
+ *
191
+ * @param config - Optional configuration with agentId
192
+ * @returns Object with agent, messages, and isRunning signals plus observables
193
+ *
194
+ * @example
195
+ * ```typescript
196
+ * export class MyComponent {
197
+ * agentState = registerAgentWatcher({ agentId: 'my-agent' });
198
+ * }
199
+ * ```
200
+ */
201
+ export function registerAgentWatcher(config) {
202
+ return watchAgent(config);
203
+ }
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvYWdlbnQudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUE2QjtJQUN0RCxtREFBbUQ7SUFDbkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztJQUU3RCxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUE0QixTQUFTLENBQUMsQ0FBQztJQUNqRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRS9DLDhEQUE4RDtJQUM5RCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzdCLHNDQUFzQztRQUN0QyxJQUFJLEVBQUUsQ0FBQztRQUNQLE1BQU0sQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEIsb0RBQW9EO1FBQ3BELE9BQU8sQ0FBQyxD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VSxRQUFRLENBQ3RCLE9BQTBCLEVBQzFCLE9BQWdCO0lBRWhCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxJQUFJLGdCQUFnQixDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBS0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUEwQixFQUMxQixPQUFnQixFQUNoQixTQUFzQztJQUV0QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLDhDQUE4QztRQUM5QyxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCO1FBQy9DLGNBQWMsRUFBRSxTQUFTLEVBQUUsY0FBYztRQUN6QyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCO1FBQzdDLGNBQWMsRUFBRSxTQUFTLEVBQUUsY0FBYztRQUN6QyxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVc7S0FDcEMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BRXBDO0lBQ0MsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIGluamVjdCwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBBZ2VudFN1YnNjcmlwdGlvbkNhbGxiYWNrcyxcbiAgQWdlbnRXYXRjaFJlc3VsdCxcbn0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC50eXBlc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RBZ2VudCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5pbXBvcnQgeyBERUZBVUxUX0FHRU5UX0lEIH0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9zaGFyZWRcIjtcblxuLyoqXG4gKiBXYXRjaGVzIGFuIGFnZW50IGFuZCBwcm92aWRlcyByZWFjdGl2ZSBzaWduYWxzIGZvciBpdHMgc3RhdGUuXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gKiBBdXRvbWF0aWNhbGx5IGNsZWFucyB1cCB3aGVuIHRoZSBjb21wb25lbnQvc2VydmljZSBpcyBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gd2l0aCBhZ2VudElkXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhZ2VudCwgbWVzc2FnZXMsIGFuZCBpc1J1bm5pbmcgc2lnbmFscyBwbHVzIG9ic2VydmFibGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC8vIEF1dG9tYXRpY2FsbHkgdHJhY2tzIGFnZW50IHN0YXRlXG4gKiAgIGFnZW50U3RhdGUgPSB3YXRjaEFnZW50KHsgYWdlbnRJZDogJ215LWFnZW50JyB9KTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIGVmZmVjdCgoKSA9PiB7XG4gKiAgICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuYWdlbnRTdGF0ZS5tZXNzYWdlcygpO1xuICogICAgICAgY29uc3QgaXNSdW5uaW5nID0gdGhpcy5hZ2VudFN0YXRlLmlzUnVubmluZygpO1xuICogICAgICAgY29uc29sZS5sb2coJ01lc3NhZ2VzOicsIG1lc3NhZ2VzLmxlbmd0aCwgJ1J1bm5pbmc6JywgaXNSdW5uaW5nKTtcbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaEFnZW50KGNvbmZpZz86IHsgYWdlbnRJZD86IHN0cmluZyB9KTogQWdlbnRXYXRjaFJlc3VsdCB7XG4gIC8vIFVzZSBpbmplY3QoKSBpbnRlcm5hbGx5IHRvIGdldCByZXF1aXJlZCBzZXJ2aWNlc1xuICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKTtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgY29uc3QgZWZmZWN0aXZlQWdlbnRJZCA9IGNvbmZpZz8uYWdlbnRJZCA/PyBERUZBVUxUX0FHRU5UX0lEO1xuXG4gIC8vIENyZWF0ZSByZWFjdGl2ZSBzaWduYWxzIHdpdGggdGljayBtZWNoYW5pc20gZm9yIHJlbGlhYmxlIHVwZGF0ZXNcbiAgY29uc3QgYWdlbnRTaWduYWwgPSBzaWduYWw8QWJzdHJhY3RBZ2VudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY29uc3QgdGljayA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBjb25zdCBpc1J1bm5pbmdTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIENyZWF0ZSBjb21wdXRlZCBtZXNzYWdlcyBzaWduYWwgdGhhdCByZWFjdHMgdG8gdGljayBjaGFuZ2VzXG4gIGNvbnN0IG1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIC8vIEFjY2VzcyB0aWNrIHRvIGVuc3VyZSByZWNvbXB1dGF0aW9uXG4gICAgdGljaygpO1xuICAgIGNvbnN0IGEgPSBhZ2VudFNpZ25hbCgpO1xuICAgIGlmICghYSkgcmV0dXJuIFtdO1xuICAgIC8vIFJldHVybiBhIHNoYWxsb3cgY2xvbmUgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICByZXR1cm4gYS5tZXNzYWdlcy5tYXAoKG0pID0+ICh7IC4uLm0gfSkpO1xuICB9KTtcblxuICAvLyBHZXQgaW5pdGlhbCBhZ2VudFxuICBjb25zdCB1cGRhdGVBZ2VudCA9ICgpID0+IHtcbiAgICBjb25zdCBhZ2VudCA9IHNlcnZpY2UuY29waWxvdGtpdC5nZXRBZ2VudChlZmZlY3RpdmVBZ2VudElkKTtcbiAgICBhZ2VudFNpZ25hbC5zZXQoYWdlbnQpO1xuICAgIHJldHVybiBhZ2VudDtcbiAgfTtcblxuICAvLyBJbml0aWFsIHVwZGF0ZVxuICBsZXQgY3VycmVudEFnZW50ID0gdXBkYXRlQWdlbnQoKTtcblxuICAvLyBTdWJzY3JpYmUgdG8gYWdlbnQgY2hhbmdlc1xuICBsZXQgYWdlbnRTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBzdWJzY3JpYmVUb0FnZW50ID0gKCkgPT4ge1xuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgYWdlbnQgaWYgYW55XG4gICAgYWdlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoY3VycmVudEFnZW50KSB7XG4gICAgICBhZ2VudFN1YnNjcmlwdGlvbiA9IGN1cnJlbnRBZ2VudC5zdWJzY3JpYmUoe1xuICAgICAgICBvbk1lc3NhZ2VzQ2hhbmdlZCgpIHtcbiAgICAgICAgICAvLyBJbmNyZW1lbnQgdGljayB0byBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIG1lc3NhZ2VzIGNvbXB1dGVkXG4gICAgICAgICAgdGljay51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TdGF0ZUNoYW5nZWQoKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHRpY2sgdG8gZm9yY2UgcmVjb21wdXRhdGlvblxuICAgICAgICAgIHRpY2sudXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUnVuSW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgICAgaXNSdW5uaW5nU2lnbmFsLnNldCh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SdW5GaW5hbGl6ZWQoKSB7XG4gICAgICAgICAgaXNSdW5uaW5nU2lnbmFsLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUnVuRmFpbGVkKCkge1xuICAgICAgICAgIGlzUnVubmluZ1NpZ25hbC5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEluaXRpYWwgc3Vic2NyaXB0aW9uXG4gIHN1YnNjcmliZVRvQWdlbnQoKTtcblxuICAvLyBTdWJzY3JpYmUgdG8gQ29waWxvdEtpdCBjaGFuZ2VzIHRvIGRldGVjdCBhZ2VudCB1cGRhdGVzXG4gIGNvbnN0IGNvcmVVbnN1YnNjcmliZSA9IHNlcnZpY2UuY29waWxvdGtpdC5zdWJzY3JpYmUoe1xuICAgIG9uUnVudGltZUxvYWRlZCgpIHtcbiAgICAgIC8vIFJlLWNoZWNrIGFnZW50IHdoZW4gcnVudGltZSBsb2Fkc1xuICAgICAgY3VycmVudEFnZW50ID0gdXBkYXRlQWdlbnQoKTtcbiAgICAgIHN1YnNjcmliZVRvQWdlbnQoKTtcbiAgICB9LFxuICAgIG9uUnVudGltZUxvYWRFcnJvcigpIHtcbiAgICAgIC8vIEFsc28gcmUtY2hlY2sgYWdlbnQgb24gcnVudGltZSBsb2FkIGVycm9yIHRvIGVuc3VyZSBjb25zaXN0ZW5jeVxuICAgICAgY3VycmVudEFnZW50ID0gdXBkYXRlQWdlbnQoKTtcbiAgICAgIHN1YnNjcmliZVRvQWdlbnQoKTtcbiAgICB9LFxuICB9KTtcblxuICAvLyBSZWdpc3RlciBjbGVhbnVwXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGFnZW50U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIGNvcmVVbnN1YnNjcmliZSgpOyAvLyBzdWJzY3JpYmUgcmV0dXJucyBhIGZ1bmN0aW9uIGRpcmVjdGx5XG4gIH07XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3kodW5zdWJzY3JpYmUpO1xuXG4gIC8vIENyZWF0ZSBvYnNlcnZhYmxlcyBmcm9tIHNpZ25hbHMgdXNpbmcgdG9PYnNlcnZhYmxlXG4gIGNvbnN0IGFnZW50JCA9IHRvT2JzZXJ2YWJsZShhZ2VudFNpZ25hbCk7XG4gIGNvbnN0IGlzUnVubmluZyQgPSB0b09ic2VydmFibGUoaXNSdW5uaW5nU2lnbmFsKTtcbiAgY29uc3QgbWVzc2FnZXMkID0gdG9PYnNlcnZhYmxlKG1lc3NhZ2VzKTtcblxuICByZXR1cm4ge1xuICAgIGFnZW50OiBhZ2VudFNpZ25hbC5hc1JlYWRvbmx5KCksXG4gICAgbWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgIGlzUnVubmluZzogaXNSdW5uaW5nU2lnbmFsLmFzUmVhZG9ubHkoKSxcbiAgICBhZ2VudCQsXG4gICAgbWVzc2FnZXMkLFxuICAgIGlzUnVubmluZyQsXG4gICAgdW5zdWJzY3JpYmUsXG4gIH07XG59XG5cbi8qKlxuICogR2V0cyBhbiBhZ2VudCBieSBJRCB3aXRob3V0IHN1YnNjcmliaW5nIHRvIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgQ29waWxvdEtpdFNlcnZpY2UgaW5zdGFuY2VcbiAqIEBwYXJhbSBhZ2VudElkIC0gT3B0aW9uYWwgYWdlbnQgSUQgKGRlZmF1bHRzIHRvIERFRkFVTFRfQUdFTlRfSUQpXG4gKiBAcmV0dXJucyBUaGUgYWdlbnQgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlKSB7fVxuICpcbiAqICAgZ2V0Q3VycmVudEFnZW50KCkge1xuICogICAgIHJldHVybiBnZXRBZ2VudCh0aGlzLmNvcGlsb3RraXQsICdteS1hZ2VudCcpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZW50KFxuICBzZXJ2aWNlOiBDb3BpbG90S2l0U2VydmljZSxcbiAgYWdlbnRJZD86IHN0cmluZ1xuKTogQWJzdHJhY3RBZ2VudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVmZmVjdGl2ZUFnZW50SWQgPSBhZ2VudElkID8/IERFRkFVTFRfQUdFTlRfSUQ7XG4gIHJldHVybiBzZXJ2aWNlLmNvcGlsb3RraXQuZ2V0QWdlbnQoZWZmZWN0aXZlQWdlbnRJZCk7XG59XG5cbi8vIFJlLWV4cG9ydCB0aGUgdHlwZSBmb3IgY29udmVuaWVuY2UgKHRoZSBhY3R1YWwgdHlwZSBpcyBpbiBjb3BpbG90a2l0LnR5cGVzKVxuZXhwb3J0IHR5cGUgeyBBZ2VudFdhdGNoUmVzdWx0IH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC50eXBlc1wiO1xuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gYW4gYWdlbnQncyBldmVudHMgd2l0aCBjdXN0b20gY2FsbGJhY2tzLlxuICogUmV0dXJucyBhIGNsZWFudXAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIHVuc3Vic2NyaWJlLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gYWdlbnRJZCAtIE9wdGlvbmFsIGFnZW50IElEIChkZWZhdWx0cyB0byBERUZBVUxUX0FHRU5UX0lEKVxuICogQHBhcmFtIGNhbGxiYWNrcyAtIEV2ZW50IGNhbGxiYWNrc1xuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byB1bnN1YnNjcmliZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gKiAgIHByaXZhdGUgdW5zdWJzY3JpYmU/OiAoKSA9PiB2b2lkO1xuICpcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb3BpbG90a2l0OiBDb3BpbG90S2l0U2VydmljZSkge31cbiAqXG4gKiAgIG5nT25Jbml0KCkge1xuICogICAgIHRoaXMudW5zdWJzY3JpYmUgPSBzdWJzY3JpYmVUb0FnZW50KHRoaXMuY29waWxvdGtpdCwgJ215LWFnZW50Jywge1xuICogICAgICAgb25SdW5Jbml0aWFsaXplZDogKCkgPT4gY29uc29sZS5sb2coJ1J1biBzdGFydGVkJyksXG4gKiAgICAgICBvblJ1bkZpbmFsaXplZDogKCkgPT4gY29uc29sZS5sb2coJ1J1biBjb21wbGV0ZWQnKSxcbiAqICAgICAgIG9uUnVuRmFpbGVkOiAoZXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoJ1J1biBmYWlsZWQnLCBlcnJvciksXG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIHRoaXMudW5zdWJzY3JpYmU/LigpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZVRvQWdlbnQoXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICBhZ2VudElkPzogc3RyaW5nLFxuICBjYWxsYmFja3M/OiBBZ2VudFN1YnNjcmlwdGlvbkNhbGxiYWNrc1xuKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IGVmZmVjdGl2ZUFnZW50SWQgPSBhZ2VudElkID8/IERFRkFVTFRfQUdFTlRfSUQ7XG4gIGNvbnN0IGFnZW50ID0gc2VydmljZS5jb3BpbG90a2l0LmdldEFnZW50KGVmZmVjdGl2ZUFnZW50SWQpO1xuXG4gIGlmICghYWdlbnQpIHtcbiAgICAvLyBSZXR1cm4gbm8tb3AgY2xlYW51cCBpZiBhZ2VudCBkb2Vzbid0IGV4aXN0XG4gICAgcmV0dXJuICgpID0+IHt9O1xuICB9XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYWdlbnQuc3Vic2NyaWJlKHtcbiAgICBvbk1lc3NhZ2VzQ2hhbmdlZDogY2FsbGJhY2tzPy5vbk1lc3NhZ2VzQ2hhbmdlZCxcbiAgICBvblN0YXRlQ2hhbmdlZDogY2FsbGJhY2tzPy5vblN0YXRlQ2hhbmdlZCxcbiAgICBvblJ1bkluaXRpYWxpemVkOiBjYWxsYmFja3M/Lm9uUnVuSW5pdGlhbGl6ZWQsXG4gICAgb25SdW5GaW5hbGl6ZWQ6IGNhbGxiYWNrcz8ub25SdW5GaW5hbGl6ZWQsXG4gICAgb25SdW5GYWlsZWQ6IGNhbGxiYWNrcz8ub25SdW5GYWlsZWQsXG4gIH0pO1xuXG4gIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gYWdlbnQgd2F0Y2hlciB0aGF0IGF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICogVGhpcyBpcyBhbiBhbGlhcyBmb3Igd2F0Y2hBZ2VudCB3aXRoIGEgbW9yZSBleHBsaWNpdCBuYW1lLlxuICogTXVzdCBiZSBjYWxsZWQgd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHdpdGggYWdlbnRJZFxuICogQHJldHVybnMgT2JqZWN0IHdpdGggYWdlbnQsIG1lc3NhZ2VzLCBhbmQgaXNSdW5uaW5nIHNpZ25hbHMgcGx1cyBvYnNlcnZhYmxlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBhZ2VudFN0YXRlID0gcmVnaXN0ZXJBZ2VudFdhdGNoZXIoeyBhZ2VudElkOiAnbXktYWdlbnQnIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFnZW50V2F0Y2hlcihjb25maWc/OiB7XG4gIGFnZW50SWQ/OiBzdHJpbmc7XG59KTogQWdlbnRXYXRjaFJlc3VsdCB7XG4gIHJldHVybiB3YXRjaEFnZW50KGNvbmZpZyk7XG59XG4iXX0=