@noodleseed/assistant 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @noodleseed/assistant
2
+
3
+ Customer-branded embedded assistant surfaces for Noodle Seed deployments.
4
+
5
+ The package exports the canonical `<noodle-assistant>` Web Component, a React wrapper from
6
+ `@noodleseed/assistant/react`, and the backend-only `createAssistantSession` helper from
7
+ `@noodleseed/assistant/server`. Light, dark, and automatic themes work without configuration; the component
8
+ inherits the deployed MCP server's brand kit while slots, methods, events, and semantic CSS variables let a
9
+ SaaS developer integrate it without depending on internal DOM selectors.
10
+
11
+ Never pass an embed client secret, model key, MCP token, or raw application session into the browser
12
+ component. Exchange the already-authenticated user from the customer backend and return only the short-lived
13
+ assistant session.
14
+
15
+ ## Quick start
16
+
17
+ Install the package in the customer web application:
18
+
19
+ ```bash
20
+ pnpm add @noodleseed/assistant
21
+ ```
22
+
23
+ Create an embed client after deploying an assistant-enabled server:
24
+
25
+ ```bash
26
+ noodle assistant clients create --name web --org acme --app support --env prod
27
+ ```
28
+
29
+ The command saves `{ clientId, clientSecret }` to a mode-`0600` file and prints its path, never the secret.
30
+ Load that file only in your backend. A framework route can exchange the current signed-in user like this:
31
+
32
+ ```ts
33
+ import { createAssistantSession } from '@noodleseed/assistant/server';
34
+
35
+ export async function POST(request: Request) {
36
+ const user = await requireCurrentUser(request);
37
+ const { context } = await request.json();
38
+ const session = await createAssistantSession({
39
+ serviceUrl: process.env.NOODLE_SERVICE_URL!,
40
+ clientId: process.env.NOODLE_ASSISTANT_CLIENT_ID!,
41
+ clientSecret: process.env.NOODLE_ASSISTANT_CLIENT_SECRET!,
42
+ origin: process.env.PUBLIC_APP_ORIGIN!,
43
+ user: { id: user.id, email: user.email, roles: user.roles },
44
+ context,
45
+ });
46
+ return Response.json(session);
47
+ }
48
+ ```
49
+
50
+ Then add the framework-neutral element:
51
+
52
+ ```ts
53
+ import '@noodleseed/assistant';
54
+ ```
55
+
56
+ ```html
57
+ <noodle-assistant session-endpoint="/api/assistant/session" theme="auto"></noodle-assistant>
58
+ ```
59
+
60
+ Or use React:
61
+
62
+ ```tsx
63
+ import { NoodleAssistant } from '@noodleseed/assistant/react';
64
+
65
+ <NoodleAssistant sessionEndpoint="/api/assistant/session" theme="auto" />;
66
+ ```
67
+
68
+ The MCP server's top-level `branding` block provides the shared identity and theme for widgets and the
69
+ assistant. Set semantic CSS variables only for application-level integration overrides:
70
+
71
+ ```css
72
+ noodle-assistant {
73
+ --ns-assistant-accent: var(--app-primary);
74
+ --ns-assistant-font-family: var(--app-font);
75
+ --ns-assistant-panel-width: 440px;
76
+ }
77
+ ```
78
+
79
+ Server branding controls customer name, themed logo/mark/avatar assets, semantic light/dark colors, density,
80
+ radius, typography, and automatic theme. `embeddedAssistant(...)` controls floating/inline/drawer layout,
81
+ position and dimensions, mobile and launcher/header/avatar/timestamp behavior, visible labels, suggested
82
+ prompts, privacy/terms links, locale, and text direction.
83
+ Named slots cover launcher/header/composer/footer extensions. Public methods include `open`, `close`,
84
+ `toggle`, `focusComposer`, `sendMessage`, `updateContext`, `confirmTool`, and `resetSession`; lifecycle,
85
+ message, tool-proposal, completion, context, and error events support application integration.
@@ -0,0 +1,172 @@
1
+ export type AssistantThemeMode = 'auto' | 'light' | 'dark';
2
+ export type AssistantLayoutMode = 'floating' | 'inline' | 'drawer';
3
+ export type AssistantPosition = 'bottom-left' | 'bottom-right';
4
+ export interface AssistantThemeTokens {
5
+ readonly page: string;
6
+ readonly panel: string;
7
+ readonly elevated: string;
8
+ readonly input: string;
9
+ readonly hover: string;
10
+ readonly selected: string;
11
+ readonly text: string;
12
+ readonly mutedText: string;
13
+ readonly accent: string;
14
+ readonly accentText: string;
15
+ readonly link: string;
16
+ readonly divider: string;
17
+ readonly focus: string;
18
+ readonly success: string;
19
+ readonly warning: string;
20
+ readonly danger: string;
21
+ readonly overlay: string;
22
+ readonly code: string;
23
+ readonly widgetFrame: string;
24
+ readonly fontFamily: string;
25
+ readonly monoFontFamily: string;
26
+ readonly baseFontSize: number;
27
+ readonly messageFontSize: number;
28
+ readonly lineHeight: number;
29
+ readonly panelRadius: number;
30
+ readonly cardRadius: number;
31
+ readonly inputRadius: number;
32
+ readonly buttonRadius: number;
33
+ readonly launcherRadius: number;
34
+ readonly spacing: number;
35
+ readonly shadow: string;
36
+ readonly backdropBlur: number;
37
+ readonly motionScale: number;
38
+ }
39
+ export interface AssistantConfiguration {
40
+ readonly branding?: {
41
+ readonly name?: string;
42
+ readonly accent?: string;
43
+ readonly surface?: string;
44
+ readonly surfaceDark?: string;
45
+ readonly logo?: AssistantBrandAsset;
46
+ readonly mark?: AssistantBrandAsset;
47
+ readonly avatar?: AssistantBrandAsset;
48
+ readonly theme?: {
49
+ readonly light?: BrandThemeOverrides;
50
+ readonly dark?: BrandThemeOverrides;
51
+ };
52
+ readonly radius?: 'none' | 'sm' | 'md' | 'lg';
53
+ readonly density?: 'compact' | 'comfortable';
54
+ readonly typography?: 'system' | 'serif' | 'mono';
55
+ readonly colorScheme?: AssistantThemeMode;
56
+ };
57
+ readonly assistant?: AssistantUiConfiguration;
58
+ }
59
+ interface AssistantBrandAsset {
60
+ readonly uri: string;
61
+ readonly darkUri?: string;
62
+ readonly alt: string;
63
+ }
64
+ interface BrandThemeOverrides {
65
+ readonly surface?: string;
66
+ readonly surfaceRaised?: string;
67
+ readonly surfaceMuted?: string;
68
+ readonly text?: string;
69
+ readonly textMuted?: string;
70
+ readonly accent?: string;
71
+ readonly accentText?: string;
72
+ readonly link?: string;
73
+ readonly border?: string;
74
+ readonly borderStrong?: string;
75
+ readonly focus?: string;
76
+ readonly success?: string;
77
+ readonly warning?: string;
78
+ readonly danger?: string;
79
+ readonly code?: string;
80
+ }
81
+ interface AssistantUiConfiguration {
82
+ readonly layout?: {
83
+ readonly mode?: AssistantLayoutMode;
84
+ readonly position?: AssistantPosition;
85
+ readonly panelWidth?: number;
86
+ readonly panelMinHeight?: number;
87
+ readonly panelMaxHeight?: number;
88
+ readonly zIndex?: number;
89
+ readonly density?: 'compact' | 'comfortable';
90
+ readonly mobileFullscreen?: boolean;
91
+ };
92
+ readonly behavior?: {
93
+ readonly startOpen?: boolean;
94
+ readonly closeOnEscape?: boolean;
95
+ readonly closeOnOutsideClick?: boolean;
96
+ readonly showLauncher?: boolean;
97
+ readonly showHeader?: boolean;
98
+ readonly showAvatars?: boolean;
99
+ readonly showTimestamps?: boolean;
100
+ };
101
+ readonly labels?: Partial<AssistantLabels>;
102
+ readonly suggestedPrompts?: readonly string[];
103
+ readonly privacyUrl?: string;
104
+ readonly termsUrl?: string;
105
+ readonly locale?: string;
106
+ readonly direction?: 'ltr' | 'rtl' | 'auto';
107
+ }
108
+ export interface AssistantLabels {
109
+ readonly welcomeHeading: string;
110
+ readonly welcomeMessage: string;
111
+ readonly composerPlaceholder: string;
112
+ readonly send: string;
113
+ readonly stop: string;
114
+ readonly close: string;
115
+ readonly open: string;
116
+ readonly confirm: string;
117
+ readonly cancel: string;
118
+ readonly retry: string;
119
+ readonly unavailable: string;
120
+ readonly sessionExpired: string;
121
+ }
122
+ export interface ResolvedAssistantAppearance {
123
+ readonly brand: {
124
+ readonly name: string;
125
+ readonly logo: {
126
+ readonly light?: string;
127
+ readonly dark?: string;
128
+ };
129
+ readonly avatar: {
130
+ readonly light?: string;
131
+ readonly dark?: string;
132
+ };
133
+ readonly mark: {
134
+ readonly light?: string;
135
+ readonly dark?: string;
136
+ };
137
+ };
138
+ readonly theme: {
139
+ readonly defaultMode: AssistantThemeMode;
140
+ readonly light: AssistantThemeTokens;
141
+ readonly dark: AssistantThemeTokens;
142
+ };
143
+ readonly layout: {
144
+ readonly mode: AssistantLayoutMode;
145
+ readonly position: AssistantPosition;
146
+ readonly panelWidth: number;
147
+ readonly panelMinHeight: number;
148
+ readonly panelMaxHeight: number;
149
+ readonly zIndex: number;
150
+ readonly density: 'compact' | 'comfortable';
151
+ readonly mobileFullscreen: boolean;
152
+ };
153
+ readonly behavior: {
154
+ readonly startOpen: boolean;
155
+ readonly closeOnEscape: boolean;
156
+ readonly closeOnOutsideClick: boolean;
157
+ readonly showLauncher: boolean;
158
+ readonly showHeader: boolean;
159
+ readonly showAvatars: boolean;
160
+ readonly showTimestamps: boolean;
161
+ };
162
+ readonly labels: AssistantLabels;
163
+ readonly suggestedPrompts: readonly string[];
164
+ readonly privacyUrl?: string;
165
+ readonly termsUrl?: string;
166
+ readonly locale: string;
167
+ readonly direction: 'ltr' | 'rtl' | 'auto';
168
+ }
169
+ export declare const DEFAULT_APPEARANCE: ResolvedAssistantAppearance;
170
+ export declare function resolveAppearance(input?: AssistantConfiguration): ResolvedAssistantAppearance;
171
+ export {};
172
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ const common = {
2
+ fontFamily: 'inherit',
3
+ monoFontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
4
+ baseFontSize: 15,
5
+ messageFontSize: 15,
6
+ lineHeight: 1.5,
7
+ panelRadius: 20,
8
+ cardRadius: 14,
9
+ inputRadius: 14,
10
+ buttonRadius: 12,
11
+ launcherRadius: 999,
12
+ spacing: 12,
13
+ backdropBlur: 18,
14
+ motionScale: 1,
15
+ };
16
+ export const DEFAULT_APPEARANCE = {
17
+ brand: { name: 'Assistant', logo: {}, avatar: {}, mark: {} },
18
+ theme: {
19
+ defaultMode: 'auto',
20
+ light: {
21
+ ...common,
22
+ page: '#F7F7F8',
23
+ panel: '#FFFFFF',
24
+ elevated: '#FFFFFF',
25
+ input: '#F1F1F3',
26
+ hover: '#ECECEF',
27
+ selected: '#E4E2FF',
28
+ text: '#18181B',
29
+ mutedText: '#71717A',
30
+ accent: '#5B4CF0',
31
+ accentText: '#FFFFFF',
32
+ link: '#4A3BD5',
33
+ divider: '#E4E4E7',
34
+ focus: '#5B4CF0',
35
+ success: '#16835D',
36
+ warning: '#A45B00',
37
+ danger: '#C92A45',
38
+ overlay: '#18181B66',
39
+ code: '#F1F1F3',
40
+ widgetFrame: '#E4E4E7',
41
+ shadow: '0 24px 80px rgba(24, 24, 27, 0.18)',
42
+ },
43
+ dark: {
44
+ ...common,
45
+ page: '#111113',
46
+ panel: '#19191D',
47
+ elevated: '#222228',
48
+ input: '#26262C',
49
+ hover: '#303038',
50
+ selected: '#37315F',
51
+ text: '#FAFAFA',
52
+ mutedText: '#A1A1AA',
53
+ accent: '#A99FFF',
54
+ accentText: '#17131F',
55
+ link: '#B9B1FF',
56
+ divider: '#34343B',
57
+ focus: '#B9B1FF',
58
+ success: '#58C69A',
59
+ warning: '#F2B45F',
60
+ danger: '#FF8094',
61
+ overlay: '#00000099',
62
+ code: '#26262C',
63
+ widgetFrame: '#34343B',
64
+ shadow: '0 24px 90px rgba(0, 0, 0, 0.55)',
65
+ },
66
+ },
67
+ layout: {
68
+ mode: 'floating',
69
+ position: 'bottom-right',
70
+ panelWidth: 400,
71
+ panelMinHeight: 420,
72
+ panelMaxHeight: 720,
73
+ zIndex: 2147483000,
74
+ density: 'comfortable',
75
+ mobileFullscreen: true,
76
+ },
77
+ behavior: {
78
+ startOpen: false,
79
+ closeOnEscape: true,
80
+ closeOnOutsideClick: false,
81
+ showLauncher: true,
82
+ showHeader: true,
83
+ showAvatars: true,
84
+ showTimestamps: false,
85
+ },
86
+ labels: {
87
+ welcomeHeading: 'How can I help?',
88
+ welcomeMessage: '',
89
+ composerPlaceholder: 'Ask a question…',
90
+ send: 'Send',
91
+ stop: 'Stop',
92
+ close: 'Close assistant',
93
+ open: 'Open assistant',
94
+ confirm: 'Confirm',
95
+ cancel: 'Cancel',
96
+ retry: 'Try again',
97
+ unavailable: 'The assistant is temporarily unavailable.',
98
+ sessionExpired: 'Your assistant session expired. Reopen it to continue.',
99
+ },
100
+ suggestedPrompts: [],
101
+ locale: 'en',
102
+ direction: 'auto',
103
+ };
104
+ export function resolveAppearance(input = {}) {
105
+ const branding = input.branding;
106
+ const assistant = input.assistant;
107
+ return {
108
+ brand: {
109
+ ...DEFAULT_APPEARANCE.brand,
110
+ ...(branding?.name ? { name: branding.name } : {}),
111
+ logo: themedAsset(branding?.logo),
112
+ avatar: themedAsset(branding?.avatar),
113
+ mark: themedAsset(branding?.mark),
114
+ },
115
+ theme: {
116
+ defaultMode: branding?.colorScheme ?? DEFAULT_APPEARANCE.theme.defaultMode,
117
+ light: resolveTheme('light', branding),
118
+ dark: resolveTheme('dark', branding),
119
+ },
120
+ layout: {
121
+ ...DEFAULT_APPEARANCE.layout,
122
+ ...(branding?.density ? { density: branding.density } : {}),
123
+ ...assistant?.layout,
124
+ },
125
+ behavior: { ...DEFAULT_APPEARANCE.behavior, ...assistant?.behavior },
126
+ labels: { ...DEFAULT_APPEARANCE.labels, ...assistant?.labels },
127
+ suggestedPrompts: assistant?.suggestedPrompts ?? DEFAULT_APPEARANCE.suggestedPrompts,
128
+ ...(assistant?.privacyUrl ? { privacyUrl: assistant.privacyUrl } : {}),
129
+ ...(assistant?.termsUrl ? { termsUrl: assistant.termsUrl } : {}),
130
+ locale: assistant?.locale ?? DEFAULT_APPEARANCE.locale,
131
+ direction: assistant?.direction ?? DEFAULT_APPEARANCE.direction,
132
+ };
133
+ }
134
+ function themedAsset(asset) {
135
+ return asset ? { light: asset.uri, dark: asset.darkUri ?? asset.uri } : {};
136
+ }
137
+ function resolveTheme(mode, branding) {
138
+ const defaults = DEFAULT_APPEARANCE.theme[mode];
139
+ const surface = mode === 'light' ? branding?.surface : branding?.surfaceDark;
140
+ const portable = branding?.theme?.[mode];
141
+ const radius = branding?.radius ? radiusValue(branding.radius) : undefined;
142
+ return {
143
+ ...defaults,
144
+ ...(branding?.accent ? { accent: branding.accent } : {}),
145
+ ...(surface ? { page: surface, panel: surface } : {}),
146
+ ...mapPortableTheme(portable),
147
+ ...(radius === undefined
148
+ ? {}
149
+ : {
150
+ panelRadius: radius,
151
+ cardRadius: radius,
152
+ inputRadius: Math.max(0, radius - 2),
153
+ buttonRadius: Math.max(0, radius - 2),
154
+ }),
155
+ ...(branding?.typography === 'serif'
156
+ ? { fontFamily: 'ui-serif, Georgia, serif' }
157
+ : branding?.typography === 'mono'
158
+ ? { fontFamily: defaults.monoFontFamily }
159
+ : {}),
160
+ };
161
+ }
162
+ function mapPortableTheme(input) {
163
+ if (!input)
164
+ return {};
165
+ return {
166
+ ...(input.surface ? { page: input.surface, panel: input.surface } : {}),
167
+ ...(input.surfaceRaised ? { elevated: input.surfaceRaised } : {}),
168
+ ...(input.surfaceMuted
169
+ ? { input: input.surfaceMuted, hover: input.surfaceMuted, selected: input.surfaceMuted }
170
+ : {}),
171
+ ...(input.text ? { text: input.text } : {}),
172
+ ...(input.textMuted ? { mutedText: input.textMuted } : {}),
173
+ ...(input.accent ? { accent: input.accent } : {}),
174
+ ...(input.accentText ? { accentText: input.accentText } : {}),
175
+ ...(input.link ? { link: input.link } : {}),
176
+ ...(input.border ? { divider: input.border, widgetFrame: input.border } : {}),
177
+ ...(input.focus ? { focus: input.focus } : {}),
178
+ ...(input.success ? { success: input.success } : {}),
179
+ ...(input.warning ? { warning: input.warning } : {}),
180
+ ...(input.danger ? { danger: input.danger } : {}),
181
+ ...(input.code ? { code: input.code } : {}),
182
+ };
183
+ }
184
+ function radiusValue(radius) {
185
+ if (radius === 'none')
186
+ return 0;
187
+ if (radius === 'sm')
188
+ return 8;
189
+ if (radius === 'lg')
190
+ return 18;
191
+ return 14;
192
+ }
193
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const ASSISTANT_TAG_NAME = "noodle-assistant";
2
+ declare const HTMLElementBase: typeof HTMLElement;
3
+ export declare class NoodleAssistantElement extends HTMLElementBase {
4
+ #private;
5
+ static readonly observedAttributes: string[];
6
+ sessionEndpoint: string;
7
+ connectedCallback(): void;
8
+ disconnectedCallback(): void;
9
+ attributeChangedCallback(name: string): void;
10
+ open(): void;
11
+ close(): void;
12
+ toggle(): void;
13
+ focusComposer(): void;
14
+ resetSession(): void;
15
+ updateContext(context: Readonly<Record<string, string | number | boolean | null>>): void;
16
+ sendMessage(text: string): Promise<void>;
17
+ confirmTool(id: string): Promise<void>;
18
+ }
19
+ export declare function registerNoodleAssistant(): void;
20
+ export {};
21
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,QAAA,MAAM,eAAe,EAAE,OAAO,WACyC,CAAC;AASxE,qBAAa,sBAAuB,SAAQ,eAAe;;IACzD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,WAAqB;IAMvD,eAAe,SAAM;IAErB,iBAAiB,IAAI,IAAI;IAYzB,oBAAoB,IAAI,IAAI;IAM5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5C,IAAI,IAAI,IAAI;IAKZ,KAAK,IAAI,IAAI;IAKb,MAAM,IAAI,IAAI;IAId,aAAa,IAAI,IAAI;IAIrB,YAAY,IAAI,IAAI;IAMpB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI;IAKlF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BxC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0P7C;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C"}
@@ -0,0 +1,393 @@
1
+ import { resolveAppearance, } from './appearance.js';
2
+ export const ASSISTANT_TAG_NAME = 'noodle-assistant';
3
+ const HTMLElementBase = globalThis.HTMLElement ?? class {
4
+ };
5
+ export class NoodleAssistantElement extends HTMLElementBase {
6
+ static observedAttributes = ['open', 'theme'];
7
+ #appearance = resolveAppearance();
8
+ #session;
9
+ #messages;
10
+ #media;
11
+ #context;
12
+ sessionEndpoint = '';
13
+ connectedCallback() {
14
+ if (!this.shadowRoot)
15
+ this.attachShadow({ mode: 'open' });
16
+ if (!this.sessionEndpoint)
17
+ this.sessionEndpoint = this.getAttribute('session-endpoint') ?? '';
18
+ this.#media = globalThis.matchMedia?.('(prefers-color-scheme: dark)');
19
+ this.#media?.addEventListener('change', this.#handleSystemTheme);
20
+ document.addEventListener('keydown', this.#handleDocumentKeydown);
21
+ document.addEventListener('pointerdown', this.#handleDocumentPointerDown);
22
+ if (this.#appearance.behavior.startOpen)
23
+ this.setAttribute('open', '');
24
+ this.#render();
25
+ this.dispatchEvent(new CustomEvent('assistant-ready'));
26
+ }
27
+ disconnectedCallback() {
28
+ this.#media?.removeEventListener('change', this.#handleSystemTheme);
29
+ document.removeEventListener('keydown', this.#handleDocumentKeydown);
30
+ document.removeEventListener('pointerdown', this.#handleDocumentPointerDown);
31
+ }
32
+ attributeChangedCallback(name) {
33
+ if (name === 'theme')
34
+ this.#applyTheme();
35
+ }
36
+ open() {
37
+ this.setAttribute('open', '');
38
+ this.dispatchEvent(new CustomEvent('assistant-open'));
39
+ }
40
+ close() {
41
+ this.removeAttribute('open');
42
+ this.dispatchEvent(new CustomEvent('assistant-close'));
43
+ }
44
+ toggle() {
45
+ this.hasAttribute('open') ? this.close() : this.open();
46
+ }
47
+ focusComposer() {
48
+ this.shadowRoot?.querySelector('textarea')?.focus();
49
+ }
50
+ resetSession() {
51
+ this.#session = undefined;
52
+ this.#messages?.replaceChildren();
53
+ this.dispatchEvent(new CustomEvent('assistant-session-reset'));
54
+ }
55
+ updateContext(context) {
56
+ this.#context = { ...context };
57
+ this.dispatchEvent(new CustomEvent('assistant-context-changed', { detail: { context } }));
58
+ }
59
+ async sendMessage(text) {
60
+ const message = text.trim();
61
+ if (!message)
62
+ return;
63
+ if (!this.#session)
64
+ this.#session = await this.#createSession();
65
+ this.#appendMessage('user', message);
66
+ this.dispatchEvent(new CustomEvent('assistant-message-started'));
67
+ const response = await fetch(this.#session.gatewayUrl ?? '/v1/assistant/turns', {
68
+ method: 'POST',
69
+ headers: {
70
+ Authorization: `Bearer ${this.#session.token}`,
71
+ 'Content-Type': 'application/json',
72
+ Accept: 'text/event-stream',
73
+ },
74
+ body: JSON.stringify({ message }),
75
+ });
76
+ if (!response.ok)
77
+ throw new Error(`Assistant turn failed (${response.status})`);
78
+ const events = parseSse(await response.text());
79
+ const content = events
80
+ .filter((event) => event.event === 'content')
81
+ .map((event) => String(event.data.delta ?? ''))
82
+ .join('');
83
+ if (content)
84
+ this.#appendMessage('assistant', content);
85
+ for (const event of events) {
86
+ if (event.event === 'tool_proposed') {
87
+ this.#appendToolProposal(String(event.data.id ?? ''), String(event.data.tool ?? 'Action'));
88
+ }
89
+ }
90
+ this.dispatchEvent(new CustomEvent('assistant-message-completed'));
91
+ }
92
+ async confirmTool(id) {
93
+ if (!this.#session)
94
+ throw new Error('assistant session is not active');
95
+ const url = (this.#session.gatewayUrl ?? '/v1/assistant/turns').replace(/\/turns$/, '/tool-confirmations');
96
+ const response = await fetch(url, {
97
+ method: 'POST',
98
+ headers: {
99
+ Authorization: `Bearer ${this.#session.token}`,
100
+ 'Content-Type': 'application/json',
101
+ Accept: 'text/event-stream',
102
+ },
103
+ body: JSON.stringify({ id }),
104
+ });
105
+ if (!response.ok)
106
+ throw new Error(`Assistant confirmation failed (${response.status})`);
107
+ const event = parseSse(await response.text()).find((candidate) => candidate.event === 'tool_completed');
108
+ if (event)
109
+ this.#appendMessage('assistant', JSON.stringify(event.data.result ?? {}));
110
+ this.dispatchEvent(new CustomEvent('assistant-tool-completed', { detail: { id } }));
111
+ }
112
+ #handleSystemTheme = () => this.#applyTheme();
113
+ #handleDocumentKeydown = (event) => {
114
+ if (event.key === 'Escape' &&
115
+ this.hasAttribute('open') &&
116
+ this.#appearance.behavior.closeOnEscape) {
117
+ this.close();
118
+ }
119
+ };
120
+ #handleDocumentPointerDown = (event) => {
121
+ if (this.hasAttribute('open') &&
122
+ this.#appearance.behavior.closeOnOutsideClick &&
123
+ !event.composedPath().includes(this)) {
124
+ this.close();
125
+ }
126
+ };
127
+ async #createSession() {
128
+ if (!this.sessionEndpoint)
129
+ throw new Error('sessionEndpoint is required');
130
+ const response = await fetch(this.sessionEndpoint, {
131
+ method: 'POST',
132
+ headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
133
+ body: JSON.stringify(this.#context ? { context: this.#context } : {}),
134
+ credentials: 'same-origin',
135
+ });
136
+ if (!response.ok)
137
+ throw new Error(`Assistant session failed (${response.status})`);
138
+ const session = (await response.json());
139
+ if (session.configuration) {
140
+ this.#appearance = resolveAppearance(session.configuration);
141
+ this.#render();
142
+ }
143
+ this.dispatchEvent(new CustomEvent('assistant-session-started', { detail: { expiresAt: session.expiresAt } }));
144
+ return session;
145
+ }
146
+ #appendMessage(role, text) {
147
+ if (!this.#messages)
148
+ return;
149
+ const message = document.createElement('div');
150
+ message.className = `message ${role}`;
151
+ if (role === 'assistant' &&
152
+ this.#appearance.behavior.showAvatars &&
153
+ this.#appearance.brand.avatar[this.#resolvedMode()]) {
154
+ const avatar = document.createElement('img');
155
+ avatar.className = 'avatar';
156
+ avatar.src = this.#appearance.brand.avatar[this.#resolvedMode()] ?? '';
157
+ avatar.alt = '';
158
+ message.append(avatar);
159
+ }
160
+ const body = document.createElement('span');
161
+ body.textContent = text;
162
+ message.append(body);
163
+ if (this.#appearance.behavior.showTimestamps) {
164
+ const timestamp = document.createElement('time');
165
+ timestamp.dateTime = new Date().toISOString();
166
+ timestamp.textContent = new Intl.DateTimeFormat(this.#appearance.locale, {
167
+ hour: 'numeric',
168
+ minute: '2-digit',
169
+ }).format(new Date());
170
+ message.append(timestamp);
171
+ }
172
+ this.#messages.append(message);
173
+ }
174
+ #appendToolProposal(id, tool) {
175
+ if (!this.#messages || !id)
176
+ return;
177
+ const card = document.createElement('section');
178
+ card.className = 'tool-proposal';
179
+ const label = document.createElement('strong');
180
+ label.textContent = tool;
181
+ const confirm = document.createElement('button');
182
+ confirm.type = 'button';
183
+ confirm.textContent = this.#appearance.labels.confirm;
184
+ confirm.addEventListener('click', () => {
185
+ confirm.disabled = true;
186
+ void this.confirmTool(id).catch(() => {
187
+ confirm.disabled = false;
188
+ this.dispatchEvent(new CustomEvent('assistant-error', { detail: { code: 'confirmation_failed' } }));
189
+ });
190
+ });
191
+ const cancel = document.createElement('button');
192
+ cancel.type = 'button';
193
+ cancel.textContent = this.#appearance.labels.cancel;
194
+ cancel.addEventListener('click', () => card.remove());
195
+ card.append(label, confirm, cancel);
196
+ this.#messages.append(card);
197
+ this.dispatchEvent(new CustomEvent('assistant-tool-proposed', { detail: { id, tool } }));
198
+ }
199
+ #resolvedMode() {
200
+ const configured = this.getAttribute('theme') ??
201
+ this.#appearance.theme.defaultMode;
202
+ return configured === 'auto' ? (this.#media?.matches ? 'dark' : 'light') : configured;
203
+ }
204
+ #applyTheme() {
205
+ const mode = this.#resolvedMode();
206
+ this.setAttribute('data-theme', mode);
207
+ const tokens = this.#appearance.theme[mode];
208
+ for (const [name, value] of Object.entries(tokens)) {
209
+ this.style.setProperty(`--ns-assistant-default-${camelToKebab(name)}`, tokenValue(name, value));
210
+ }
211
+ this.style.setProperty('--ns-assistant-default-panel-width', `${this.#appearance.layout.panelWidth}px`);
212
+ this.style.setProperty('--ns-assistant-default-min-height', `${this.#appearance.layout.panelMinHeight}px`);
213
+ this.style.setProperty('--ns-assistant-default-max-height', `${this.#appearance.layout.panelMaxHeight}px`);
214
+ this.style.setProperty('--ns-assistant-default-z-index', String(this.#appearance.layout.zIndex));
215
+ const logo = this.shadowRoot?.querySelector('.brand-logo');
216
+ const logoUrl = this.#appearance.brand.logo[mode];
217
+ if (logo) {
218
+ logo.hidden = !logoUrl;
219
+ if (logoUrl)
220
+ logo.src = logoUrl;
221
+ }
222
+ }
223
+ #render() {
224
+ if (!this.shadowRoot)
225
+ return;
226
+ const appearance = this.#appearance;
227
+ this.setAttribute('role', 'complementary');
228
+ this.setAttribute('aria-label', appearance.brand.name);
229
+ this.setAttribute('lang', appearance.locale);
230
+ this.setAttribute('dir', appearance.direction);
231
+ this.dataset.mode = appearance.layout.mode;
232
+ this.dataset.position = appearance.layout.position;
233
+ this.dataset.density = appearance.layout.density;
234
+ this.toggleAttribute('mobile-fullscreen', appearance.layout.mobileFullscreen);
235
+ this.shadowRoot.innerHTML = `${styles}
236
+ <button class="launcher" type="button" aria-label="${escapeAttribute(appearance.labels.open)}"><slot name="launcher-icon">✦</slot></button>
237
+ <section class="panel" aria-label="${escapeAttribute(appearance.brand.name)}">
238
+ <header><slot name="header-leading"></slot><img class="brand-logo" alt=""><strong></strong><slot name="header-actions"></slot><button class="close" type="button" aria-label="${escapeAttribute(appearance.labels.close)}">×</button></header>
239
+ <div class="welcome"><slot name="empty-state"><h2></h2><p></p></slot></div>
240
+ <div class="suggested-prompts"></div>
241
+ <div class="messages" aria-live="polite"></div>
242
+ <form><slot name="composer-leading"></slot><textarea rows="1"></textarea><button class="send" type="submit"></button><slot name="composer-trailing"></slot></form>
243
+ <nav class="legal" aria-label="Legal"></nav>
244
+ <slot name="conversation-footer"></slot>
245
+ </section>`;
246
+ queryRequired(this.shadowRoot, 'strong').textContent = appearance.brand.name;
247
+ const launcherIcon = appearance.brand.mark[this.#resolvedMode()];
248
+ if (launcherIcon) {
249
+ const launcherSlot = queryRequired(this.shadowRoot, 'slot[name="launcher-icon"]');
250
+ const icon = document.createElement('img');
251
+ icon.src = launcherIcon;
252
+ icon.alt = '';
253
+ launcherSlot.replaceChildren(icon);
254
+ }
255
+ const logo = queryRequired(this.shadowRoot, '.brand-logo');
256
+ const logoUrl = appearance.brand.logo[this.#resolvedMode()];
257
+ if (logoUrl) {
258
+ logo.src = logoUrl;
259
+ logo.alt = appearance.brand.name;
260
+ }
261
+ else {
262
+ logo.hidden = true;
263
+ }
264
+ queryRequired(this.shadowRoot, 'h2').textContent =
265
+ appearance.labels.welcomeHeading;
266
+ queryRequired(this.shadowRoot, 'p').textContent = appearance.labels.welcomeMessage;
267
+ const textarea = queryRequired(this.shadowRoot, 'textarea');
268
+ textarea.placeholder = appearance.labels.composerPlaceholder;
269
+ textarea.setAttribute('aria-label', appearance.labels.composerPlaceholder);
270
+ queryRequired(this.shadowRoot, '.send').textContent = appearance.labels.send;
271
+ const prompts = queryRequired(this.shadowRoot, '.suggested-prompts');
272
+ for (const prompt of appearance.suggestedPrompts) {
273
+ const button = document.createElement('button');
274
+ button.type = 'button';
275
+ button.textContent = prompt;
276
+ button.addEventListener('click', () => void this.sendMessage(prompt));
277
+ prompts.append(button);
278
+ }
279
+ if (!appearance.behavior.showLauncher)
280
+ queryRequired(this.shadowRoot, '.launcher').hidden = true;
281
+ if (!appearance.behavior.showHeader)
282
+ queryRequired(this.shadowRoot, 'header').hidden = true;
283
+ const legal = queryRequired(this.shadowRoot, '.legal');
284
+ for (const [label, href] of [
285
+ ['Privacy', appearance.privacyUrl],
286
+ ['Terms', appearance.termsUrl],
287
+ ]) {
288
+ if (!href)
289
+ continue;
290
+ const link = document.createElement('a');
291
+ link.href = href;
292
+ link.target = '_blank';
293
+ link.rel = 'noopener noreferrer';
294
+ link.textContent = label;
295
+ legal.append(link);
296
+ }
297
+ this.#messages = this.shadowRoot.querySelector('.messages') ?? undefined;
298
+ this.shadowRoot.querySelector('.launcher')?.addEventListener('click', () => this.open());
299
+ this.shadowRoot.querySelector('.close')?.addEventListener('click', () => this.close());
300
+ this.shadowRoot.querySelector('form')?.addEventListener('submit', (event) => {
301
+ event.preventDefault();
302
+ const value = textarea.value;
303
+ textarea.value = '';
304
+ void this.sendMessage(value).catch(() => {
305
+ this.dispatchEvent(new CustomEvent('assistant-error', { detail: { code: 'turn_failed' } }));
306
+ });
307
+ });
308
+ this.#applyTheme();
309
+ }
310
+ }
311
+ export function registerNoodleAssistant() {
312
+ if (globalThis.customElements && !customElements.get(ASSISTANT_TAG_NAME)) {
313
+ customElements.define(ASSISTANT_TAG_NAME, NoodleAssistantElement);
314
+ }
315
+ }
316
+ function camelToKebab(value) {
317
+ return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
318
+ }
319
+ function tokenValue(name, value) {
320
+ if (typeof value !== 'number')
321
+ return value;
322
+ if (name === 'lineHeight' || name === 'motionScale')
323
+ return String(value);
324
+ return `${value}px`;
325
+ }
326
+ function escapeAttribute(value) {
327
+ return value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;');
328
+ }
329
+ function queryRequired(root, selector) {
330
+ const element = root.querySelector(selector);
331
+ if (!element)
332
+ throw new Error(`assistant renderer is missing ${selector}`);
333
+ return element;
334
+ }
335
+ const styles = `<style>
336
+ :host { color-scheme: light dark; font-family: var(--ns-assistant-font-family, var(--ns-assistant-default-font-family)); font-size: var(--ns-assistant-base-font-size, var(--ns-assistant-default-base-font-size)); line-height: var(--ns-assistant-line-height, var(--ns-assistant-default-line-height)); z-index: var(--ns-assistant-z-index, var(--ns-assistant-default-z-index)); }
337
+ :host([data-mode="floating"]) { position: fixed; bottom: 24px; right: 24px; }
338
+ :host([data-mode="floating"][data-position="bottom-left"]) { right: auto; left: 24px; }
339
+ .launcher { width: 54px; height: 54px; border: 0; border-radius: var(--ns-assistant-launcher-radius, var(--ns-assistant-default-launcher-radius)); color: var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text)); background: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); box-shadow: var(--ns-assistant-shadow, var(--ns-assistant-default-shadow)); cursor: pointer; }
340
+ .launcher img { width: 24px; height: 24px; object-fit: contain; }
341
+ .panel { display: none; width: min(var(--ns-assistant-panel-width, var(--ns-assistant-default-panel-width)), calc(100vw - 32px)); min-height: var(--ns-assistant-min-height, var(--ns-assistant-default-min-height)); max-height: min(var(--ns-assistant-max-height, var(--ns-assistant-default-max-height)), calc(100vh - 32px)); overflow: hidden; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: var(--ns-assistant-panel, var(--ns-assistant-default-panel)); border-radius: var(--ns-assistant-panel-radius, var(--ns-assistant-default-panel-radius)); box-shadow: var(--ns-assistant-shadow, var(--ns-assistant-default-shadow)); }
342
+ :host([open]) .panel { display: grid; grid-template-rows: auto auto 1fr auto; }
343
+ :host([open]) .launcher { display: none; }
344
+ header { display: flex; gap: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); align-items: center; padding: calc(var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)) * 1.2); border-bottom: 1px solid var(--ns-assistant-divider, var(--ns-assistant-default-divider)); }
345
+ header strong { flex: 1; }
346
+ .brand-logo { display: block; max-width: 120px; max-height: 28px; object-fit: contain; }
347
+ button { font: inherit; }
348
+ .close, .send { border: 0; border-radius: var(--ns-assistant-button-radius, var(--ns-assistant-default-button-radius)); cursor: pointer; }
349
+ .close { color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); background: transparent; font-size: 24px; }
350
+ .welcome { padding: calc(var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)) * 1.5); }
351
+ .welcome h2 { margin: 0; font-size: 1.25em; }
352
+ .welcome p { margin: 6px 0 0; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); }
353
+ .suggested-prompts { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); }
354
+ .suggested-prompts:empty { display: none; }
355
+ .suggested-prompts button { padding: 7px 10px; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: transparent; border: 1px solid var(--ns-assistant-divider, var(--ns-assistant-default-divider)); border-radius: 999px; cursor: pointer; }
356
+ .messages { min-height: 120px; padding: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); overflow: auto; }
357
+ .message { width: fit-content; max-width: 84%; margin: 8px 0; padding: 10px 12px; border-radius: var(--ns-assistant-card-radius, var(--ns-assistant-default-card-radius)); background: var(--ns-assistant-elevated, var(--ns-assistant-default-elevated)); white-space: pre-wrap; }
358
+ .message .avatar { float: left; width: 24px; height: 24px; margin-right: 8px; border-radius: 50%; object-fit: cover; }
359
+ .message time { display: block; margin-top: 4px; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); font-size: .75em; }
360
+ .message.user { margin-left: auto; color: var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text)); background: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); }
361
+ .tool-proposal { display: grid; grid-template-columns: 1fr auto auto; gap: 8px; align-items: center; margin: 10px 0; padding: 12px; border-radius: var(--ns-assistant-card-radius, var(--ns-assistant-default-card-radius)); background: var(--ns-assistant-elevated, var(--ns-assistant-default-elevated)); }
362
+ .tool-proposal button { padding: 8px 10px; border: 0; border-radius: var(--ns-assistant-button-radius, var(--ns-assistant-default-button-radius)); color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: var(--ns-assistant-input, var(--ns-assistant-default-input)); cursor: pointer; }
363
+ .tool-proposal button:first-of-type { color: var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text)); background: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); }
364
+ form { display: flex; gap: 8px; align-items: end; padding: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); border-top: 1px solid var(--ns-assistant-divider, var(--ns-assistant-default-divider)); }
365
+ textarea { flex: 1; resize: none; padding: 10px 12px; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: var(--ns-assistant-input, var(--ns-assistant-default-input)); border: 0; border-radius: var(--ns-assistant-input-radius, var(--ns-assistant-default-input-radius)); font: inherit; }
366
+ textarea:focus-visible, button:focus-visible { outline: 3px solid var(--ns-assistant-focus, var(--ns-assistant-default-focus)); outline-offset: 2px; }
367
+ .send { padding: 10px 14px; color: var(--ns-assistant-accent-text, var(--ns-assistant-default-accent-text)); background: var(--ns-assistant-accent, var(--ns-assistant-default-accent)); }
368
+ .legal { display: flex; gap: 12px; justify-content: center; padding: 0 12px 10px; font-size: .8em; }
369
+ .legal:empty { display: none; }
370
+ .legal a { color: var(--ns-assistant-link, var(--ns-assistant-default-link)); }
371
+ :host([data-density="compact"]) .welcome { padding: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); }
372
+ @media (max-width: 640px) { :host([mobile-fullscreen][open]) { inset: 0; } :host([mobile-fullscreen][open]) .panel { width: 100vw; min-height: 100vh; max-height: 100vh; border-radius: 0; } }
373
+ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; } }
374
+ @media (max-width: 560px) { :host([data-mode="floating"]) { inset: auto 12px 12px; } :host([open]) .panel { width: calc(100vw - 24px); max-height: calc(100vh - 24px); } }
375
+ </style>`;
376
+ function parseSse(body) {
377
+ return body
378
+ .split(/\n\n+/)
379
+ .map((frame) => {
380
+ const event = /^event: (.+)$/m.exec(frame)?.[1];
381
+ const data = /^data: (.+)$/m.exec(frame)?.[1];
382
+ if (!event || !data)
383
+ return undefined;
384
+ try {
385
+ return { event, data: JSON.parse(data) };
386
+ }
387
+ catch {
388
+ return undefined;
389
+ }
390
+ })
391
+ .filter((event) => event !== undefined);
392
+ }
393
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AACrD,MAAM,eAAe,GACnB,UAAU,CAAC,WAAW,IAAK;CAA0C,CAAC;AASxE,MAAM,OAAO,sBAAuB,SAAQ,eAAe;IACzD,MAAM,CAAU,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,WAAW,GAAG,iBAAiB,EAAE,CAAC;IAClC,QAAQ,CAA8B;IACtC,SAAS,CAA0B;IACnC,MAAM,CAA6B;IACnC,QAAQ,CAAyE;IACjF,eAAe,GAAG,EAAE,CAAC;IAErB,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC9F,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,8BAA8B,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAClE,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrE,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC/E,CAAC;IAED,wBAAwB,CAAC,IAAY;QACnC,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,aAAa;QACX,IAAI,CAAC,UAAU,EAAE,aAAa,CAAsB,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;IAED,YAAY;QACV,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,aAAa,CAAC,OAAmE;QAC/E,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,qBAAqB,EAAE;YAC9E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAC9C,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,mBAAmB;aAC5B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM;aACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;aAC5C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;aAC9C,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,IAAI,OAAO;YAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;gBACpC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,qBAAqB,CAAC,CAAC,OAAO,CACrE,UAAU,EACV,qBAAqB,CACtB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAC9C,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,mBAAmB;aAC5B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAChD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,gBAAgB,CACpD,CAAC;QACF,IAAI,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,kBAAkB,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAEpD,sBAAsB,GAAG,CAAC,KAAoB,EAAQ,EAAE;QACtD,IACE,KAAK,CAAC,GAAG,KAAK,QAAQ;YACtB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,EACvC,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,0BAA0B,GAAG,CAAC,KAAmB,EAAQ,EAAE;QACzD,IACE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,mBAAmB;YAC7C,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpC,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC3E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,WAAW,EAAE,aAAa;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;QAC3D,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAC3F,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,IAA0B,EAAE,IAAY;QACrD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,WAAW,IAAI,EAAE,CAAC;QACtC,IACE,IAAI,KAAK,WAAW;YACpB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW;YACrC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EACnD,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC5B,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACjD,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACvE,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,mBAAmB,CAAC,EAAU,EAAE,IAAY;QAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;QACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;QACtD,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxB,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACnC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAChF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,aAAa;QACX,MAAM,UAAU,GACb,IAAI,CAAC,YAAY,CAAC,OAAO,CAA+B;YACzD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;QACrC,OAAO,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACxF,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,0BAA0B,YAAY,CAAC,IAAI,CAAC,EAAE,EAC9C,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CACxB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,oCAAoC,EACpC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,IAAI,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,mCAAmC,EACnC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,IAAI,CAC9C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,mCAAmC,EACnC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,IAAI,CAC9C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,gCAAgC,EAChC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CACvC,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAmB,aAAa,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,OAAO;gBAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,MAAM;2DACkB,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;2CACvD,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;wLACuG,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;iBAO/M,CAAC;QACd,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1F,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACjE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,aAAa,CAChC,IAAI,CAAC,UAAU,EACf,4BAA4B,CAC7B,CAAC;YACF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;YACxB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;YACd,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAmB,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW;YAC3D,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;QACnC,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;QAChG,MAAM,QAAQ,GAAG,aAAa,CAAsB,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACjF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAC7D,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC3E,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1F,MAAM,OAAO,GAAG,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAClF,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;YACvB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;YAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY;YACnC,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU;YACjC,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;QACtE,MAAM,KAAK,GAAG,aAAa,CAAc,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI;YAC1B,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC;YAClC,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;SACtB,EAAE,CAAC;YACX,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1E,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;;AAGH,MAAM,UAAU,uBAAuB;IACrC,IAAI,UAAU,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzE,cAAc,CAAC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAuD;IACvF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,aAAa,CAAoB,IAAgB,EAAE,QAAgB;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAI,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC3E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAwCN,CAAC;AAEV,SAAS,QAAQ,CAAC,IAAY;IAI5B,OAAO,IAAI;SACR,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsC,EAAE,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CACL,CAAC,KAAK,EAAuE,EAAE,CAC7E,KAAK,KAAK,SAAS,CACtB,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ASSISTANT_TAG_NAME, NoodleAssistantElement, registerNoodleAssistant, } from './element.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { ASSISTANT_TAG_NAME, NoodleAssistantElement, registerNoodleAssistant, } from './element.js';
2
+ import { registerNoodleAssistant } from './element.js';
3
+ registerNoodleAssistant();
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { AssistantThemeMode } from './appearance.js';
2
+ import { type NoodleAssistantElement } from './element.js';
3
+ export interface NoodleAssistantProps {
4
+ readonly sessionEndpoint: string;
5
+ readonly theme?: AssistantThemeMode;
6
+ readonly open?: boolean;
7
+ readonly className?: string;
8
+ readonly onReady?: () => void;
9
+ readonly onError?: (error: {
10
+ readonly code: string;
11
+ }) => void;
12
+ }
13
+ export declare const NoodleAssistant: import("react").ForwardRefExoticComponent<NoodleAssistantProps & import("react").RefAttributes<NoodleAssistantElement>>;
14
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,KAAK,sBAAsB,EAA2B,MAAM,cAAc,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/D;AAED,eAAO,MAAM,eAAe,yHA2B3B,CAAC"}
package/dist/react.js ADDED
@@ -0,0 +1,29 @@
1
+ import { createElement, forwardRef, useEffect, useImperativeHandle, useRef, } from 'react';
2
+ import { registerNoodleAssistant } from './element.js';
3
+ export const NoodleAssistant = forwardRef(function NoodleAssistant(props, forwardedRef) {
4
+ const ref = useRef(null);
5
+ useImperativeHandle(forwardedRef, () => ref.current, []);
6
+ useEffect(() => {
7
+ registerNoodleAssistant();
8
+ const element = ref.current;
9
+ if (!element)
10
+ return;
11
+ element.sessionEndpoint = props.sessionEndpoint;
12
+ const ready = () => props.onReady?.();
13
+ const error = (event) => props.onError?.(event.detail);
14
+ element.addEventListener('assistant-ready', ready);
15
+ element.addEventListener('assistant-error', error);
16
+ return () => {
17
+ element.removeEventListener('assistant-ready', ready);
18
+ element.removeEventListener('assistant-error', error);
19
+ };
20
+ }, [props.onError, props.onReady, props.sessionEndpoint]);
21
+ return createElement('noodle-assistant', {
22
+ ref,
23
+ class: props.className,
24
+ 'session-endpoint': props.sessionEndpoint,
25
+ ...(props.theme ? { theme: props.theme } : {}),
26
+ ...(props.open ? { open: '' } : {}),
27
+ });
28
+ });
29
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,EAEV,SAAS,EACT,mBAAmB,EACnB,MAAM,GACP,MAAM,OAAO,CAAC;AAEf,OAAO,EAA+B,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAWpF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CACvC,SAAS,eAAe,CAAC,KAAK,EAAE,YAAY;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IACjD,mBAAmB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAiC,EAAE,EAAE,CAAC,CAAC;IACnF,SAAS,CAAC,GAAG,EAAE;QACb,uBAAuB,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE,CAC7B,KAAK,CAAC,OAAO,EAAE,CAAE,KAAgD,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1D,OAAO,aAAa,CAAC,kBAAkB,EAAE;QACvC,GAAG;QACH,KAAK,EAAE,KAAK,CAAC,SAAS;QACtB,kBAAkB,EAAE,KAAK,CAAC,eAAe;QACzC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC,CAAC;AACL,CAAC,CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface CreateAssistantSessionInput {
2
+ readonly serviceUrl: string;
3
+ readonly clientId: string;
4
+ readonly clientSecret: string;
5
+ /** Browser origin to bind into the short-lived assistant session. */
6
+ readonly origin: string;
7
+ readonly user: {
8
+ readonly id: string;
9
+ readonly email?: string;
10
+ readonly name?: string;
11
+ readonly tenant?: string;
12
+ readonly roles?: readonly string[];
13
+ };
14
+ readonly context?: Readonly<Record<string, string | number | boolean | null>>;
15
+ }
16
+ export interface AssistantSession {
17
+ readonly token: string;
18
+ readonly expiresAt: string;
19
+ readonly gatewayUrl?: string;
20
+ }
21
+ export declare function createAssistantSession(input: CreateAssistantSessionInput, dependencies?: {
22
+ readonly fetch?: typeof fetch;
23
+ }): Promise<AssistantSession>;
24
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,EAClC,YAAY,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACnD,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
package/dist/server.js ADDED
@@ -0,0 +1,22 @@
1
+ export async function createAssistantSession(input, dependencies = {}) {
2
+ const request = dependencies.fetch ?? fetch;
3
+ const serviceUrl = input.serviceUrl.replace(/\/$/, '');
4
+ const credentials = Buffer.from(`${input.clientId}:${input.clientSecret}`, 'utf8').toString('base64');
5
+ const response = await request(`${serviceUrl}/v1/assistant/sessions`, {
6
+ method: 'POST',
7
+ headers: {
8
+ Authorization: `Basic ${credentials}`,
9
+ Accept: 'application/json',
10
+ 'Content-Type': 'application/json',
11
+ },
12
+ body: JSON.stringify({
13
+ origin: input.origin,
14
+ user: input.user,
15
+ ...(input.context ? { context: input.context } : {}),
16
+ }),
17
+ });
18
+ if (!response.ok)
19
+ throw new Error(`Assistant session exchange failed (${response.status})`);
20
+ return (await response.json());
21
+ }
22
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAkC,EAClC,eAAkD,EAAE;IAEpD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,KAAK,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CACzF,QAAQ,CACT,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,UAAU,wBAAwB,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,WAAW,EAAE;YACrC,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5F,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;AACrD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@noodleseed/assistant",
3
+ "version": "1.0.0",
4
+ "description": "Customer-branded embedded assistant Web Component, React wrapper, and server session helper for Noodle Seed.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/NoodleSeed-com/noodle-borg.git",
9
+ "directory": "packages/assistant"
10
+ },
11
+ "type": "module",
12
+ "engines": {
13
+ "node": ">=24"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./react": {
23
+ "types": "./dist/react.d.ts",
24
+ "import": "./dist/react.js"
25
+ },
26
+ "./server": {
27
+ "types": "./dist/server.d.ts",
28
+ "import": "./dist/server.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc -p tsconfig.json",
39
+ "typecheck": "tsc -p tsconfig.json --noEmit"
40
+ },
41
+ "peerDependencies": {
42
+ "react": ">=18.2.0 <20"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "react": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^24.13.1",
51
+ "@types/react": "^19.2.17",
52
+ "@types/react-dom": "^19.2.3",
53
+ "react": "^19.2.7",
54
+ "react-dom": "^19.2.7"
55
+ }
56
+ }