@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.
- package/README.md +3 -3
- package/dist/README.md +3 -3
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/package.json +21 -18
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -38
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/ng-package.json +0 -19
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,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=
|