@noodleseed/assistant 1.1.1 → 1.2.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 +90 -7
- package/dist/chunk-J2YDKISA.js +1113 -0
- package/dist/chunk-J2YDKISA.js.map +1 -0
- package/dist/chunk-WUDHE5BD.js +636 -0
- package/dist/chunk-WUDHE5BD.js.map +1 -0
- package/dist/client-CwvdK4O6.d.cts +165 -0
- package/dist/client-DkAfqcSb.d.ts +165 -0
- package/dist/client.cjs +662 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +2 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -0
- package/dist/index.cjs +1273 -242
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -12
- package/dist/index.d.ts +14 -12
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1273 -242
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -1
- package/dist/react.d.ts +2 -1
- package/dist/react.js +2 -1
- package/dist/react.js.map +1 -1
- package/dist/server.cjs +2 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +6 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/package.json +10 -1
- package/dist/chunk-IM7SAHNE.js +0 -706
- package/dist/chunk-IM7SAHNE.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/appearance.ts","../src/browser-context.ts","../src/input-request-card.ts","../src/interaction-card.ts","../src/element-event-controller.ts","../src/element-styles.ts","../src/element.ts"],"sourcesContent":["export type AssistantThemeMode = 'auto' | 'light' | 'dark';\nexport type AssistantLayoutMode = 'floating' | 'inline' | 'drawer';\nexport type AssistantPosition = 'bottom-left' | 'bottom-right';\n\nexport interface AssistantThemeTokens {\n readonly page: string;\n readonly panel: string;\n readonly elevated: string;\n readonly input: string;\n readonly hover: string;\n readonly selected: string;\n readonly text: string;\n readonly mutedText: string;\n readonly accent: string;\n readonly accentText: string;\n readonly link: string;\n readonly divider: string;\n readonly focus: string;\n readonly success: string;\n readonly warning: string;\n readonly danger: string;\n readonly overlay: string;\n readonly code: string;\n readonly widgetFrame: string;\n readonly fontFamily: string;\n readonly monoFontFamily: string;\n readonly baseFontSize: number;\n readonly messageFontSize: number;\n readonly lineHeight: number;\n readonly panelRadius: number;\n readonly cardRadius: number;\n readonly inputRadius: number;\n readonly buttonRadius: number;\n readonly launcherRadius: number;\n readonly spacing: number;\n readonly shadow: string;\n readonly backdropBlur: number;\n readonly motionScale: number;\n}\n\nexport interface AssistantConfiguration {\n readonly branding?: {\n readonly name?: string;\n readonly accent?: string;\n readonly surface?: string;\n readonly surfaceDark?: string;\n readonly logo?: AssistantBrandAsset;\n readonly mark?: AssistantBrandAsset;\n readonly avatar?: AssistantBrandAsset;\n readonly theme?: {\n readonly light?: BrandThemeOverrides;\n readonly dark?: BrandThemeOverrides;\n };\n readonly radius?: 'none' | 'sm' | 'md' | 'lg';\n readonly density?: 'compact' | 'comfortable';\n readonly typography?: 'system' | 'serif' | 'mono';\n readonly colorScheme?: AssistantThemeMode;\n };\n readonly assistant?: AssistantUiConfiguration;\n}\n\ninterface AssistantBrandAsset {\n readonly uri: string;\n readonly darkUri?: string;\n readonly alt: string;\n}\n\ninterface BrandThemeOverrides {\n readonly surface?: string;\n readonly surfaceRaised?: string;\n readonly surfaceMuted?: string;\n readonly text?: string;\n readonly textMuted?: string;\n readonly accent?: string;\n readonly accentText?: string;\n readonly link?: string;\n readonly border?: string;\n readonly borderStrong?: string;\n readonly focus?: string;\n readonly success?: string;\n readonly warning?: string;\n readonly danger?: string;\n readonly code?: string;\n}\n\ninterface AssistantUiConfiguration {\n readonly layout?: {\n readonly mode?: AssistantLayoutMode;\n readonly position?: AssistantPosition;\n readonly panelWidth?: number;\n readonly panelMinHeight?: number;\n readonly panelMaxHeight?: number;\n readonly zIndex?: number;\n readonly density?: 'compact' | 'comfortable';\n readonly mobileFullscreen?: boolean;\n };\n readonly behavior?: {\n readonly startOpen?: boolean;\n readonly closeOnEscape?: boolean;\n readonly closeOnOutsideClick?: boolean;\n readonly showLauncher?: boolean;\n readonly showHeader?: boolean;\n readonly showAvatars?: boolean;\n readonly showTimestamps?: boolean;\n };\n readonly labels?: Partial<AssistantLabels>;\n readonly suggestedPrompts?: readonly string[];\n readonly privacyUrl?: string;\n readonly termsUrl?: string;\n readonly locale?: string;\n readonly direction?: 'ltr' | 'rtl' | 'auto';\n}\n\nexport interface AssistantLabels {\n readonly welcomeHeading: string;\n readonly welcomeMessage: string;\n readonly composerPlaceholder: string;\n readonly send: string;\n readonly stop: string;\n readonly close: string;\n readonly open: string;\n readonly confirm: string;\n readonly cancel: string;\n readonly retry: string;\n readonly unavailable: string;\n readonly sessionExpired: string;\n}\n\nexport interface ResolvedAssistantAppearance {\n readonly brand: {\n readonly name: string;\n readonly logo: { readonly light?: string; readonly dark?: string };\n readonly avatar: { readonly light?: string; readonly dark?: string };\n readonly mark: { readonly light?: string; readonly dark?: string };\n };\n readonly theme: {\n readonly defaultMode: AssistantThemeMode;\n readonly light: AssistantThemeTokens;\n readonly dark: AssistantThemeTokens;\n };\n readonly layout: {\n readonly mode: AssistantLayoutMode;\n readonly position: AssistantPosition;\n readonly panelWidth: number;\n readonly panelMinHeight: number;\n readonly panelMaxHeight: number;\n readonly zIndex: number;\n readonly density: 'compact' | 'comfortable';\n readonly mobileFullscreen: boolean;\n };\n readonly behavior: {\n readonly startOpen: boolean;\n readonly closeOnEscape: boolean;\n readonly closeOnOutsideClick: boolean;\n readonly showLauncher: boolean;\n readonly showHeader: boolean;\n readonly showAvatars: boolean;\n readonly showTimestamps: boolean;\n };\n readonly labels: AssistantLabels;\n readonly suggestedPrompts: readonly string[];\n readonly privacyUrl?: string;\n readonly termsUrl?: string;\n readonly locale: string;\n readonly direction: 'ltr' | 'rtl' | 'auto';\n}\n\nconst common = {\n fontFamily: 'inherit',\n monoFontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n baseFontSize: 15,\n messageFontSize: 15,\n lineHeight: 1.5,\n panelRadius: 20,\n cardRadius: 14,\n inputRadius: 14,\n buttonRadius: 12,\n launcherRadius: 999,\n spacing: 12,\n backdropBlur: 18,\n motionScale: 1,\n} as const;\n\nexport const DEFAULT_APPEARANCE: ResolvedAssistantAppearance = {\n brand: { name: 'Assistant', logo: {}, avatar: {}, mark: {} },\n theme: {\n defaultMode: 'auto',\n light: {\n ...common,\n page: '#F7F7F8',\n panel: '#FFFFFF',\n elevated: '#FFFFFF',\n input: '#F1F1F3',\n hover: '#ECECEF',\n selected: '#E4E2FF',\n text: '#18181B',\n mutedText: '#71717A',\n accent: '#5B4CF0',\n accentText: '#FFFFFF',\n link: '#4A3BD5',\n divider: '#E4E4E7',\n focus: '#5B4CF0',\n success: '#16835D',\n warning: '#A45B00',\n danger: '#C92A45',\n overlay: '#18181B66',\n code: '#F1F1F3',\n widgetFrame: '#E4E4E7',\n shadow: '0 24px 80px rgba(24, 24, 27, 0.18)',\n },\n dark: {\n ...common,\n page: '#111113',\n panel: '#19191D',\n elevated: '#222228',\n input: '#26262C',\n hover: '#303038',\n selected: '#37315F',\n text: '#FAFAFA',\n mutedText: '#A1A1AA',\n accent: '#A99FFF',\n accentText: '#17131F',\n link: '#B9B1FF',\n divider: '#34343B',\n focus: '#B9B1FF',\n success: '#58C69A',\n warning: '#F2B45F',\n danger: '#FF8094',\n overlay: '#00000099',\n code: '#26262C',\n widgetFrame: '#34343B',\n shadow: '0 24px 90px rgba(0, 0, 0, 0.55)',\n },\n },\n layout: {\n mode: 'floating',\n position: 'bottom-right',\n panelWidth: 400,\n panelMinHeight: 420,\n panelMaxHeight: 720,\n zIndex: 2147483000,\n density: 'comfortable',\n mobileFullscreen: true,\n },\n behavior: {\n startOpen: false,\n closeOnEscape: true,\n closeOnOutsideClick: false,\n showLauncher: true,\n showHeader: true,\n showAvatars: true,\n showTimestamps: false,\n },\n labels: {\n welcomeHeading: 'How can I help?',\n welcomeMessage: '',\n composerPlaceholder: 'Ask a question…',\n send: 'Send',\n stop: 'Stop',\n close: 'Close assistant',\n open: 'Open assistant',\n confirm: 'Confirm',\n cancel: 'Cancel',\n retry: 'Try again',\n unavailable: 'The assistant is temporarily unavailable.',\n sessionExpired: 'Your assistant session expired. Reopen it to continue.',\n },\n suggestedPrompts: [],\n locale: 'en',\n direction: 'auto',\n};\n\nexport function resolveAppearance(input: AssistantConfiguration = {}): ResolvedAssistantAppearance {\n const branding = input.branding;\n const assistant = input.assistant;\n return {\n brand: {\n ...DEFAULT_APPEARANCE.brand,\n ...(branding?.name ? { name: branding.name } : {}),\n logo: themedAsset(branding?.logo),\n avatar: themedAsset(branding?.avatar),\n mark: themedAsset(branding?.mark),\n },\n theme: {\n defaultMode: branding?.colorScheme ?? DEFAULT_APPEARANCE.theme.defaultMode,\n light: resolveTheme('light', branding),\n dark: resolveTheme('dark', branding),\n },\n layout: {\n ...DEFAULT_APPEARANCE.layout,\n ...(branding?.density ? { density: branding.density } : {}),\n ...assistant?.layout,\n },\n behavior: { ...DEFAULT_APPEARANCE.behavior, ...assistant?.behavior },\n labels: { ...DEFAULT_APPEARANCE.labels, ...assistant?.labels },\n suggestedPrompts: assistant?.suggestedPrompts ?? DEFAULT_APPEARANCE.suggestedPrompts,\n ...(assistant?.privacyUrl ? { privacyUrl: assistant.privacyUrl } : {}),\n ...(assistant?.termsUrl ? { termsUrl: assistant.termsUrl } : {}),\n locale: assistant?.locale ?? DEFAULT_APPEARANCE.locale,\n direction: assistant?.direction ?? DEFAULT_APPEARANCE.direction,\n };\n}\n\nfunction themedAsset(asset: AssistantBrandAsset | undefined): {\n readonly light?: string;\n readonly dark?: string;\n} {\n return asset ? { light: asset.uri, dark: asset.darkUri ?? asset.uri } : {};\n}\n\nfunction resolveTheme(\n mode: 'light' | 'dark',\n branding: AssistantConfiguration['branding'],\n): AssistantThemeTokens {\n const defaults = DEFAULT_APPEARANCE.theme[mode];\n const surface = mode === 'light' ? branding?.surface : branding?.surfaceDark;\n const portable = branding?.theme?.[mode];\n const radius = branding?.radius ? radiusValue(branding.radius) : undefined;\n return {\n ...defaults,\n ...(branding?.accent ? { accent: branding.accent } : {}),\n ...(surface ? { page: surface, panel: surface } : {}),\n ...mapPortableTheme(portable),\n ...(radius === undefined\n ? {}\n : {\n panelRadius: radius,\n cardRadius: radius,\n inputRadius: Math.max(0, radius - 2),\n buttonRadius: Math.max(0, radius - 2),\n }),\n ...(branding?.typography === 'serif'\n ? { fontFamily: 'ui-serif, Georgia, serif' }\n : branding?.typography === 'mono'\n ? { fontFamily: defaults.monoFontFamily }\n : {}),\n };\n}\n\nfunction mapPortableTheme(input: BrandThemeOverrides | undefined): Partial<AssistantThemeTokens> {\n if (!input) return {};\n return {\n ...(input.surface ? { page: input.surface, panel: input.surface } : {}),\n ...(input.surfaceRaised ? { elevated: input.surfaceRaised } : {}),\n ...(input.surfaceMuted\n ? { input: input.surfaceMuted, hover: input.surfaceMuted, selected: input.surfaceMuted }\n : {}),\n ...(input.text ? { text: input.text } : {}),\n ...(input.textMuted ? { mutedText: input.textMuted } : {}),\n ...(input.accent ? { accent: input.accent } : {}),\n ...(input.accentText ? { accentText: input.accentText } : {}),\n ...(input.link ? { link: input.link } : {}),\n ...(input.border ? { divider: input.border, widgetFrame: input.border } : {}),\n ...(input.focus ? { focus: input.focus } : {}),\n ...(input.success ? { success: input.success } : {}),\n ...(input.warning ? { warning: input.warning } : {}),\n ...(input.danger ? { danger: input.danger } : {}),\n ...(input.code ? { code: input.code } : {}),\n };\n}\n\nfunction radiusValue(radius: 'none' | 'sm' | 'md' | 'lg'): number {\n if (radius === 'none') return 0;\n if (radius === 'sm') return 8;\n if (radius === 'lg') return 18;\n return 14;\n}\n","import type { AssistantClientContext } from './client.js';\n\n/** Resolve untrusted presentation hints without making them part of verified user or page context. */\nexport function browserClientContext(): AssistantClientContext {\n let timeZone: string | undefined;\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n // Older or restricted browsers may not expose an IANA timezone; the service falls back safely.\n }\n const locale = globalThis.navigator?.language;\n return {\n ...(locale ? { locale } : {}),\n ...(timeZone ? { timeZone } : {}),\n };\n}\n","import type { AssistantJsonValue } from './client.js';\n\ninterface InputRequestCardOptions {\n readonly message: string;\n readonly requestedSchema: Readonly<Record<string, unknown>>;\n readonly labels: {\n readonly submit: string;\n readonly decline: string;\n readonly cancel: string;\n };\n readonly respond: (\n response:\n | { readonly action: 'accept'; readonly content: AssistantJsonValue }\n | { readonly action: 'decline' | 'cancel' },\n ) => Promise<void>;\n}\n\n/** Render the portable MCP form-elicitation subset without interpreting author HTML. */\nexport function createInputRequestCard(options: InputRequestCardOptions): HTMLElement {\n const card = document.createElement('section');\n card.className = 'tool-proposal input-request';\n card.dataset.kind = 'input';\n const form = document.createElement('form');\n const heading = document.createElement('strong');\n heading.textContent = options.message;\n form.append(heading);\n\n const properties = record(options.requestedSchema.properties);\n const required = new Set(\n Array.isArray(options.requestedSchema.required)\n ? options.requestedSchema.required.filter(\n (value): value is string => typeof value === 'string',\n )\n : [],\n );\n const controls = new Map<string, HTMLInputElement | HTMLSelectElement>();\n const touched = new WeakSet<HTMLInputElement | HTMLSelectElement>();\n for (const [name, rawProperty] of Object.entries(properties)) {\n const property = record(rawProperty);\n const label = document.createElement('label');\n const caption = document.createElement('span');\n caption.textContent =\n typeof property.title === 'string' && property.title ? property.title : humanize(name);\n const control = createControl(name, property, required.has(name));\n const markTouched = (): void => {\n touched.add(control);\n updateControlValidity(control, property, required.has(name), touched.has(control));\n };\n control.addEventListener('input', markTouched);\n control.addEventListener('change', markTouched);\n label.append(caption, control);\n form.append(label);\n controls.set(name, control);\n }\n\n const actions = document.createElement('div');\n actions.className = 'proposal-actions';\n const submit = button(options.labels.submit, 'submit');\n const decline = button(options.labels.decline, 'button');\n const cancel = button(options.labels.cancel, 'button');\n const buttons = [submit, decline, cancel];\n const resolve = async (\n response:\n | { readonly action: 'accept'; readonly content: AssistantJsonValue }\n | { readonly action: 'decline' | 'cancel' },\n ): Promise<void> => {\n buttons.forEach((item) => {\n item.disabled = true;\n });\n try {\n await options.respond(response);\n } catch (error) {\n buttons.forEach((item) => {\n item.disabled = false;\n });\n throw error;\n }\n };\n form.addEventListener('submit', (event) => {\n event.preventDefault();\n for (const [name, control] of controls) {\n updateControlValidity(\n control,\n record(properties[name]),\n required.has(name),\n touched.has(control),\n );\n }\n if (!form.reportValidity()) return;\n void resolve({\n action: 'accept',\n content: readContent(controls, properties, required, touched),\n }).catch(() => {});\n });\n decline.addEventListener('click', () => {\n void resolve({ action: 'decline' }).catch(() => {});\n });\n cancel.addEventListener('click', () => {\n void resolve({ action: 'cancel' }).catch(() => {});\n });\n actions.append(submit, decline, cancel);\n form.append(actions);\n card.append(form);\n return card;\n}\n\nfunction createControl(\n name: string,\n property: Readonly<Record<string, unknown>>,\n required: boolean,\n): HTMLInputElement | HTMLSelectElement {\n const choices = stringChoices(property);\n if (choices || property.type === 'array') {\n const select = document.createElement('select');\n select.name = name;\n select.multiple = property.type === 'array';\n const availableChoices = choices ?? arrayChoices(property);\n if (\n !select.multiple &&\n (!required || !availableChoices.some((choice) => choice.value === property.default))\n ) {\n select.append(placeholderOption(availableChoices));\n }\n for (const choice of availableChoices) {\n select.append(option(choice.title, choice.value));\n }\n applySelectDefault(select, property.default);\n updateControlValidity(select, property, required, false);\n return select;\n }\n const input = document.createElement('input');\n input.name = name;\n input.type = inputType(property);\n // JSON Schema `required` means property presence. An empty string and `false` remain present values,\n // while an empty number/date control has no representable JSON value.\n input.required = required && inputNeedsNonEmptyValue(property);\n if (property.type === 'integer') input.step = '1';\n if (typeof property.minimum === 'number') input.min = String(property.minimum);\n if (typeof property.maximum === 'number') input.max = String(property.maximum);\n if (typeof property.minLength === 'number') input.minLength = property.minLength;\n if (typeof property.maxLength === 'number') input.maxLength = property.maxLength;\n if (property.format === 'date-time') input.step = '0.001';\n applyInputDefault(input, property);\n return input;\n}\n\nfunction readContent(\n controls: ReadonlyMap<string, HTMLInputElement | HTMLSelectElement>,\n properties: Readonly<Record<string, unknown>>,\n required: ReadonlySet<string>,\n touched: Readonly<WeakSet<HTMLInputElement | HTMLSelectElement>>,\n): AssistantJsonValue {\n const content: Record<string, AssistantJsonValue> = {};\n for (const [name, control] of controls) {\n const property = record(properties[name]);\n if (control instanceof HTMLSelectElement && control.multiple) {\n const values = [...control.selectedOptions].map((option) => option.value);\n if (shouldIncludeArray(property, required.has(name), touched.has(control), values.length)) {\n content[name] = values;\n }\n } else if (control instanceof HTMLInputElement && control.type === 'checkbox') {\n if (required.has(name) || hasDefault(property) || touched.has(control)) {\n content[name] = control.checked;\n }\n } else if (control instanceof HTMLSelectElement) {\n if (!isPlaceholderSelected(control)) content[name] = control.value;\n } else if (\n control.value !== '' ||\n (property.type === 'string' &&\n (required.has(name) || hasDefault(property) || touched.has(control)))\n ) {\n if (property.format === 'date-time') {\n const value = dateTimeLocalToRfc3339(control.value);\n if (value !== undefined) content[name] = value;\n } else {\n content[name] =\n property.type === 'number' || property.type === 'integer'\n ? Number(control.value)\n : control.value;\n }\n }\n }\n return content;\n}\n\nfunction updateControlValidity(\n control: HTMLInputElement | HTMLSelectElement,\n property: Readonly<Record<string, unknown>>,\n required: boolean,\n touched: boolean,\n): void {\n control.setCustomValidity('');\n if (!(control instanceof HTMLSelectElement)) return;\n if (!control.multiple) {\n control.required = required;\n if (required && isPlaceholderSelected(control)) {\n control.setCustomValidity('Please select an option.');\n }\n return;\n }\n\n const count = control.selectedOptions.length;\n const included = shouldIncludeArray(property, required, touched, count);\n const minimum = integerBound(property.minItems);\n const maximum = integerBound(property.maxItems);\n // HTML's multi-select `required` means one selection, so it only matches a present array whose\n // schema minimum is at least one. Higher cardinality remains a custom JSON Schema constraint.\n control.required = included && minimum !== undefined && minimum > 0;\n if (included && minimum !== undefined && count < minimum) {\n control.setCustomValidity(`Select at least ${minimum} option${minimum === 1 ? '' : 's'}.`);\n } else if (included && maximum !== undefined && count > maximum) {\n control.setCustomValidity(`Select at most ${maximum} option${maximum === 1 ? '' : 's'}.`);\n }\n}\n\nfunction shouldIncludeArray(\n property: Readonly<Record<string, unknown>>,\n required: boolean,\n touched: boolean,\n selectedCount: number,\n): boolean {\n return required || hasDefault(property) || touched || selectedCount > 0;\n}\n\nfunction hasDefault(property: Readonly<Record<string, unknown>>): boolean {\n return Object.hasOwn(property, 'default');\n}\n\nfunction integerBound(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction inputNeedsNonEmptyValue(property: Readonly<Record<string, unknown>>): boolean {\n if (property.type === 'number' || property.type === 'integer') return true;\n if (property.type !== 'string') return false;\n return (\n property.format === 'date' ||\n property.format === 'date-time' ||\n property.format === 'email' ||\n property.format === 'uri' ||\n (typeof property.minLength === 'number' && property.minLength > 0)\n );\n}\n\nfunction isPlaceholderSelected(select: HTMLSelectElement): boolean {\n return select.selectedOptions[0]?.dataset.placeholder === 'true';\n}\n\nfunction stringChoices(\n property: Readonly<Record<string, unknown>>,\n): readonly { readonly value: string; readonly title: string }[] | undefined {\n if (Array.isArray(property.enum) && property.enum.every((value) => typeof value === 'string')) {\n return property.enum.map((value) => ({ value, title: value }));\n }\n return titledChoices(property.oneOf) ?? titledChoices(property.anyOf);\n}\n\nfunction arrayChoices(\n property: Readonly<Record<string, unknown>>,\n): readonly { readonly value: string; readonly title: string }[] {\n return stringChoices(record(property.items)) ?? [];\n}\n\nfunction inputType(property: Readonly<Record<string, unknown>>): string {\n if (property.type === 'boolean') return 'checkbox';\n if (property.type === 'number' || property.type === 'integer') return 'number';\n if (property.format === 'date') return 'date';\n if (property.format === 'date-time') return 'datetime-local';\n if (property.format === 'email') return 'email';\n if (property.format === 'uri') return 'url';\n return 'text';\n}\n\nfunction titledChoices(\n value: unknown,\n): readonly { readonly value: string; readonly title: string }[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const choices = value.map((item) => record(item));\n if (!choices.every((item) => typeof item.const === 'string')) return undefined;\n return choices.map((item) => ({\n value: String(item.const),\n title: typeof item.title === 'string' ? item.title : String(item.const),\n }));\n}\n\nfunction applySelectDefault(select: HTMLSelectElement, value: unknown): void {\n if (select.multiple) {\n const selected = new Set(\n Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [],\n );\n for (const item of select.options) item.selected = selected.has(item.value);\n return;\n }\n if (typeof value === 'string') select.value = value;\n}\n\nfunction applyInputDefault(\n input: HTMLInputElement,\n property: Readonly<Record<string, unknown>>,\n): void {\n const value = property.default;\n if (property.type === 'boolean') {\n if (typeof value === 'boolean') input.checked = value;\n return;\n }\n if (property.type === 'number' || property.type === 'integer') {\n if (typeof value === 'number' && Number.isFinite(value)) input.value = String(value);\n return;\n }\n if (typeof value !== 'string') return;\n if (property.format === 'date-time') {\n input.value = rfc3339ToDateTimeLocal(value) ?? '';\n return;\n }\n input.value = value;\n}\n\nfunction rfc3339ToDateTimeLocal(value: string): string | undefined {\n const instant = new Date(value);\n if (Number.isNaN(instant.valueOf())) return undefined;\n return [\n String(instant.getFullYear()).padStart(4, '0'),\n '-',\n twoDigits(instant.getMonth() + 1),\n '-',\n twoDigits(instant.getDate()),\n 'T',\n twoDigits(instant.getHours()),\n ':',\n twoDigits(instant.getMinutes()),\n ':',\n twoDigits(instant.getSeconds()),\n '.',\n String(instant.getMilliseconds()).padStart(3, '0'),\n ].join('');\n}\n\nfunction dateTimeLocalToRfc3339(value: string): string | undefined {\n const instant = new Date(value);\n return Number.isNaN(instant.valueOf()) ? undefined : instant.toISOString();\n}\n\nfunction twoDigits(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction button(label: string, type: HTMLButtonElement['type']): HTMLButtonElement {\n const element = document.createElement('button');\n element.type = type;\n element.textContent = label;\n return element;\n}\n\nfunction option(label: string, value: string): HTMLOptionElement {\n const element = document.createElement('option');\n element.textContent = label;\n element.value = value;\n return element;\n}\n\nfunction placeholderOption(\n choices: readonly { readonly value: string; readonly title: string }[],\n): HTMLOptionElement {\n let value = '';\n while (choices.some((choice) => choice.value === value)) value += '\\u0000';\n const element = option('', value);\n element.dataset.placeholder = 'true';\n return element;\n}\n\nfunction humanize(value: string): string {\n const words = value.replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2').replaceAll(/[_-]+/g, ' ');\n return words ? `${words[0]?.toUpperCase() ?? ''}${words.slice(1)}` : value;\n}\n\nfunction record(value: unknown): Readonly<Record<string, unknown>> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Readonly<Record<string, unknown>>)\n : {};\n}\n","export type InteractionAction = 'accept' | 'decline' | 'cancel';\n\ninterface InteractionCardOptions {\n readonly tool: string;\n readonly arguments?: Readonly<Record<string, unknown>>;\n readonly labels: {\n readonly accept: string;\n readonly decline: string;\n readonly cancel: string;\n };\n readonly respond: (action: InteractionAction) => Promise<void>;\n}\n\nexport function createInteractionCard(options: InteractionCardOptions): HTMLElement {\n const card = document.createElement('section');\n card.className = 'tool-proposal';\n const label = document.createElement('strong');\n label.textContent = options.tool;\n card.append(label);\n if (options.arguments && Object.keys(options.arguments).length > 0) {\n card.append(createArgumentList(options.arguments));\n }\n const actions = document.createElement('div');\n actions.className = 'proposal-actions';\n const buttons: HTMLButtonElement[] = [];\n for (const [labelText, action] of [\n [options.labels.accept, 'accept'],\n [options.labels.decline, 'decline'],\n [options.labels.cancel, 'cancel'],\n ] as const) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = labelText;\n buttons.push(button);\n button.addEventListener('click', () => {\n for (const candidate of buttons) candidate.disabled = true;\n void options.respond(action).catch(() => {\n for (const candidate of buttons) candidate.disabled = false;\n });\n });\n actions.append(button);\n }\n card.append(actions);\n return card;\n}\n\nfunction createArgumentList(arguments_: Readonly<Record<string, unknown>>): HTMLDListElement {\n const details = document.createElement('dl');\n details.className = 'proposal-arguments';\n for (const [name, value] of Object.entries(arguments_)) {\n const term = document.createElement('dt');\n term.textContent = humanizeArgumentName(name);\n const description = document.createElement('dd');\n description.textContent = formatArgumentValue(value);\n details.append(term, description);\n }\n return details;\n}\n\nfunction humanizeArgumentName(value: string): string {\n const words = value.replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2').replaceAll(/[_-]+/g, ' ');\n return words ? `${words[0]?.toUpperCase() ?? ''}${words.slice(1)}` : value;\n}\n\nfunction formatArgumentValue(value: unknown): string {\n if (value === null) return 'None';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value) ?? '';\n}\n","import type { AssistantConfiguration } from './appearance.js';\nimport type {\n AssistantClientEvent,\n AssistantInteractionResponse,\n AssistantToolCompletedDetail,\n AssistantViewAvailableDetail,\n} from './client.js';\nimport { createInputRequestCard } from './input-request-card.js';\nimport { createInteractionCard } from './interaction-card.js';\nimport type { AssistantErrorDetail } from './transport.js';\n\ninterface AssistantElementEventHost {\n readonly element: HTMLElement;\n readonly messages: () => HTMLElement | undefined;\n readonly appendMessage: (role: 'user' | 'assistant', text: string) => HTMLElement | undefined;\n readonly applyConfiguration: (configuration: AssistantConfiguration) => void;\n readonly labels: () => { readonly confirm: string; readonly cancel: string };\n readonly respond: (id: string, response: AssistantInteractionResponse) => Promise<void>;\n readonly dispatchError: (detail: AssistantErrorDetail) => void;\n}\n\n/** Owns streamed client-event state and its translation into the standard element renderer. */\nexport class AssistantElementEventController {\n readonly #host: AssistantElementEventHost;\n #assistantBody: HTMLElement | undefined;\n #completedTool: AssistantToolCompletedDetail | undefined;\n readonly #proposalCards = new Map<string, HTMLElement>();\n\n constructor(host: AssistantElementEventHost) {\n this.#host = host;\n }\n\n handle(event: AssistantClientEvent): void {\n if (event.event === 'view_available') {\n // Availability is not presentation proof: the standard element neither fetches nor executes\n // arbitrary `ui://` content. Embedders may map this typed identity to a trusted renderer.\n this.#host.element.dispatchEvent(\n new CustomEvent<AssistantViewAvailableDetail>('assistant-view-available', {\n detail: event.data,\n }),\n );\n return;\n }\n if (event.event === 'unrecognized') return;\n const { event: name, data } = event;\n if (name === 'session_started') {\n if (isRecord(data.configuration)) {\n this.#host.applyConfiguration(data.configuration as AssistantConfiguration);\n }\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-session-started', {\n detail: { expiresAt: String(data.expiresAt ?? '') },\n }),\n );\n return;\n }\n if (name === 'session_expired') {\n this.#host.element.dispatchEvent(new CustomEvent('assistant-session-expired'));\n return;\n }\n if (name === 'session_reset') {\n this.resetConversation();\n return;\n }\n if (name === 'context_changed') {\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-context-changed', { detail: { context: data.context } }),\n );\n return;\n }\n if (name === 'model_context_changed') {\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-model-context-changed', {\n detail: { modelContext: data.modelContext },\n }),\n );\n return;\n }\n if (name === 'message_started') {\n this.#assistantBody = undefined;\n this.#host.appendMessage('user', String(data.message ?? ''));\n this.#host.element.dispatchEvent(new CustomEvent('assistant-message-started'));\n return;\n }\n if (name === 'message_completed') {\n this.#assistantBody = undefined;\n this.#host.element.dispatchEvent(new CustomEvent('assistant-message-completed'));\n return;\n }\n if (name === 'interaction_started') {\n this.#assistantBody = undefined;\n this.#completedTool = undefined;\n return;\n }\n if (name === 'interaction_completed') {\n this.#finishInteraction(String(data.id ?? ''), String(data.action ?? 'accept'));\n return;\n }\n if (name === 'content') {\n const body = this.#assistantBody ?? this.#host.appendMessage('assistant', '');\n this.#assistantBody = body;\n if (body) body.textContent += String(data.delta ?? '');\n return;\n }\n if (name === 'tool_proposed' || name === 'interaction_proposed') {\n this.#appendToolProposal(\n String(data.id ?? ''),\n String(data.tool ?? ('title' in data ? data.title : undefined) ?? 'Action'),\n isRecord(data.arguments) ? data.arguments : undefined,\n );\n return;\n }\n if (name === 'input_requested' && isRecord(data.requestedSchema)) {\n this.#appendInputRequest(\n String(data.id ?? ''),\n String(data.message ?? 'More information is required'),\n data.requestedSchema,\n );\n return;\n }\n if (name === 'tool_completed') {\n this.#completedTool = data;\n return;\n }\n if (name === 'error') {\n this.#host.dispatchError({\n code: String(data.code ?? 'stream_failed'),\n ...(typeof data.status === 'number' ? { status: data.status } : {}),\n retryable: data.retryable === true,\n });\n }\n }\n\n resetConversation(): void {\n this.#host.messages()?.replaceChildren();\n this.#proposalCards.clear();\n this.#assistantBody = undefined;\n this.#completedTool = undefined;\n this.#host.element.dispatchEvent(new CustomEvent('assistant-session-reset'));\n }\n\n #finishInteraction(id: string, action: string): void {\n if (this.#completedTool && !this.#assistantBody) {\n this.#host.appendMessage('assistant', JSON.stringify(this.#completedTool.result ?? {}) ?? '');\n }\n this.#proposalCards.get(id)?.remove();\n this.#proposalCards.delete(id);\n if (action === 'accept') {\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-tool-completed', { detail: { id } }),\n );\n }\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-interaction-resolved', { detail: { id, action } }),\n );\n this.#assistantBody = undefined;\n this.#completedTool = undefined;\n }\n\n #appendToolProposal(\n id: string,\n tool: string,\n arguments_: Readonly<Record<string, unknown>> | undefined,\n ): void {\n const messages = this.#host.messages();\n if (!messages || !id) return;\n this.#proposalCards.get(id)?.remove();\n const labels = this.#host.labels();\n const card = createInteractionCard({\n tool,\n ...(arguments_ ? { arguments: arguments_ } : {}),\n labels: {\n accept: labels.confirm,\n decline: 'Decline',\n cancel: labels.cancel,\n },\n respond: (action) => this.#host.respond(id, { action }),\n });\n messages.append(card);\n this.#proposalCards.set(id, card);\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-tool-proposed', { detail: { id, tool, arguments: arguments_ } }),\n );\n }\n\n #appendInputRequest(\n id: string,\n message: string,\n requestedSchema: Readonly<Record<string, unknown>>,\n ): void {\n const messages = this.#host.messages();\n if (!messages || !id) return;\n this.#proposalCards.get(id)?.remove();\n const labels = this.#host.labels();\n const card = createInputRequestCard({\n message,\n requestedSchema,\n labels: {\n submit: labels.confirm,\n decline: 'Decline',\n cancel: labels.cancel,\n },\n respond: (response) => this.#host.respond(id, response),\n });\n messages.append(card);\n this.#proposalCards.set(id, card);\n this.#host.element.dispatchEvent(\n new CustomEvent('assistant-input-requested', {\n detail: { id, message, requestedSchema },\n }),\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","export const ASSISTANT_ELEMENT_STYLES = `<style>\n :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)); }\n :host([data-mode=\"floating\"]) { position: fixed; bottom: 24px; right: 24px; }\n :host([data-mode=\"floating\"][data-position=\"bottom-left\"]) { right: auto; left: 24px; }\n .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; }\n .launcher img { width: 24px; height: 24px; object-fit: contain; }\n .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)); }\n :host([open]) .panel { display: grid; grid-template-rows: auto auto 1fr auto; }\n :host([open]) .launcher { display: none; }\n 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)); }\n header strong { flex: 1; }\n .brand-logo { display: block; max-width: 120px; max-height: 28px; object-fit: contain; }\n button { font: inherit; }\n .close, .send { border: 0; border-radius: var(--ns-assistant-button-radius, var(--ns-assistant-default-button-radius)); cursor: pointer; }\n .close { color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); background: transparent; font-size: 24px; }\n .welcome { padding: calc(var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)) * 1.5); }\n .welcome h2 { margin: 0; font-size: 1.25em; }\n .welcome p { margin: 6px 0 0; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); }\n .suggested-prompts { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); }\n .suggested-prompts:empty { display: none; }\n .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; }\n .messages { min-height: 120px; padding: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); overflow: auto; }\n .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; }\n .message .avatar { float: left; width: 24px; height: 24px; margin-right: 8px; border-radius: 50%; object-fit: cover; }\n .message time { display: block; margin-top: 4px; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); font-size: .75em; }\n .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)); }\n .tool-proposal { display: grid; gap: 10px; 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)); }\n .proposal-arguments { display: grid; grid-template-columns: minmax(90px, auto) 1fr; gap: 4px 10px; margin: 0; font-size: .9em; }\n .proposal-arguments dt { color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); }\n .proposal-arguments dd { margin: 0; overflow-wrap: anywhere; }\n .proposal-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: end; }\n .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; }\n .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)); }\n .input-request form { display: grid; gap: 10px; padding: 0; border: 0; }\n .input-request label { display: grid; gap: 4px; color: var(--ns-assistant-muted-text, var(--ns-assistant-default-muted-text)); font-size: .9em; }\n .input-request input, .input-request select { width: 100%; box-sizing: border-box; padding: 8px 10px; color: var(--ns-assistant-text, var(--ns-assistant-default-text)); background: var(--ns-assistant-input, var(--ns-assistant-default-input)); border: 1px solid var(--ns-assistant-divider, var(--ns-assistant-default-divider)); border-radius: var(--ns-assistant-input-radius, var(--ns-assistant-default-input-radius)); font: inherit; }\n .input-request input[type=\"checkbox\"] { width: auto; justify-self: start; }\n 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)); }\n 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; }\n textarea:focus-visible, button:focus-visible { outline: 3px solid var(--ns-assistant-focus, var(--ns-assistant-default-focus)); outline-offset: 2px; }\n .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)); }\n .legal { display: flex; gap: 12px; justify-content: center; padding: 0 12px 10px; font-size: .8em; }\n .legal:empty { display: none; }\n .legal a { color: var(--ns-assistant-link, var(--ns-assistant-default-link)); }\n :host([data-density=\"compact\"]) .welcome { padding: var(--ns-assistant-spacing, var(--ns-assistant-default-spacing)); }\n @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; } }\n @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; } }\n @media (max-width: 560px) { :host([data-mode=\"floating\"]) { inset: auto 12px 12px; } :host([open]) .panel { width: calc(100vw - 24px); max-height: calc(100vh - 24px); } }\n</style>`;\n","import {\n type AssistantThemeMode,\n type AssistantThemeTokens,\n resolveAppearance,\n} from './appearance.js';\nimport { browserClientContext } from './browser-context.js';\nimport {\n type AssistantClient,\n AssistantClientError,\n type AssistantContext,\n type AssistantInteractionResponse,\n type AssistantModelContextUpdate,\n createAssistantClient,\n} from './client.js';\nimport { AssistantElementEventController } from './element-event-controller.js';\nimport { ASSISTANT_ELEMENT_STYLES } from './element-styles.js';\nimport type { AssistantViewAvailableDetail } from './events.js';\nimport { copyAssistantModelContext } from './model-context.js';\nimport type { AssistantErrorDetail } from './transport.js';\n\nexport const ASSISTANT_TAG_NAME = 'noodle-assistant';\n\ndeclare global {\n interface HTMLElementEventMap {\n 'assistant-view-available': CustomEvent<AssistantViewAvailableDetail>;\n }\n}\n\nconst HTMLElementBase: typeof HTMLElement =\n globalThis.HTMLElement ?? (class {} as unknown as typeof HTMLElement);\n\nexport class NoodleAssistantElement extends HTMLElementBase {\n static readonly observedAttributes = ['open', 'theme'];\n #appearance = resolveAppearance();\n #client: AssistantClient | undefined;\n #clientEndpoint = '';\n #unsubscribeClient: (() => void) | undefined;\n #messages: HTMLElement | undefined;\n #media: MediaQueryList | undefined;\n #context: AssistantContext | undefined;\n #modelContext: AssistantModelContextUpdate | undefined;\n sessionEndpoint = '';\n readonly #events = new AssistantElementEventController({\n element: this,\n messages: () => this.#messages,\n appendMessage: (role, text) => this.#appendMessage(role, text),\n applyConfiguration: (configuration) => {\n this.#appearance = resolveAppearance(configuration);\n this.#render();\n },\n labels: () => ({\n confirm: this.#appearance.labels.confirm,\n cancel: this.#appearance.labels.cancel,\n }),\n respond: (id, response) => this.respond(id, response),\n dispatchError: (detail) => this.#dispatchError(detail),\n });\n\n connectedCallback(): void {\n if (!this.shadowRoot) this.attachShadow({ mode: 'open' });\n if (!this.sessionEndpoint) this.sessionEndpoint = this.getAttribute('session-endpoint') ?? '';\n this.#media = globalThis.matchMedia?.('(prefers-color-scheme: dark)');\n this.#media?.addEventListener('change', this.#handleSystemTheme);\n document.addEventListener('keydown', this.#handleDocumentKeydown);\n document.addEventListener('pointerdown', this.#handleDocumentPointerDown);\n if (this.#appearance.behavior.startOpen) this.setAttribute('open', '');\n this.#render();\n this.dispatchEvent(new CustomEvent('assistant-ready'));\n }\n\n disconnectedCallback(): void {\n this.#client?.abort();\n this.#unsubscribeClient?.();\n this.#client = undefined;\n this.#clientEndpoint = '';\n this.#unsubscribeClient = undefined;\n this.#media?.removeEventListener('change', this.#handleSystemTheme);\n document.removeEventListener('keydown', this.#handleDocumentKeydown);\n document.removeEventListener('pointerdown', this.#handleDocumentPointerDown);\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'theme') this.#applyTheme();\n }\n\n open(): void {\n this.setAttribute('open', '');\n this.dispatchEvent(new CustomEvent('assistant-open'));\n }\n\n close(): void {\n this.removeAttribute('open');\n this.dispatchEvent(new CustomEvent('assistant-close'));\n }\n\n toggle(): void {\n this.hasAttribute('open') ? this.close() : this.open();\n }\n\n focusComposer(): void {\n this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea')?.focus();\n }\n\n resetSession(): void {\n if (this.#client) {\n this.#client.resetSession();\n } else {\n this.#events.resetConversation();\n }\n }\n\n updateContext(context: AssistantContext): void {\n this.#context = { ...context };\n if (this.#client) {\n this.#client.updateContext(this.#context);\n } else {\n this.dispatchEvent(\n new CustomEvent('assistant-context-changed', { detail: { context: this.#context } }),\n );\n }\n }\n\n /** Replace the compact renderer summary attached to subsequent message turns. */\n updateModelContext(update: AssistantModelContextUpdate): void {\n this.#modelContext = copyAssistantModelContext(update);\n if (this.#client) {\n this.#client.updateModelContext(this.#modelContext);\n } else {\n this.dispatchEvent(\n new CustomEvent('assistant-model-context-changed', {\n detail: { modelContext: this.#modelContext },\n }),\n );\n }\n }\n\n async sendMessage(text: string): Promise<void> {\n const message = text.trim();\n if (!message) return;\n try {\n await this.#ensureClient().sendMessage(message);\n } catch (error) {\n this.#dispatchClientError(error, 'turn_failed');\n throw error;\n }\n }\n\n /**\n * Every listener the element attaches to its own DOM must go through this guard: internal UI\n * failures surface as `assistant-error` events (already dispatched by the failing path) and must\n * never escape as unhandled rejections into the embedding page. Programmatic callers use\n * `sendMessage`/`confirmTool` directly and keep the rejection.\n */\n #sendGuarded(text: string): void {\n void this.sendMessage(text).catch(() => {});\n }\n\n async confirmTool(id: string): Promise<void> {\n await this.respond(id, { action: 'accept' });\n }\n\n async respond(id: string, response: AssistantInteractionResponse): Promise<void> {\n try {\n await this.#ensureClient().respond(id, response);\n } catch (error) {\n this.#dispatchClientError(error, 'confirmation_failed');\n throw error;\n }\n }\n\n #handleSystemTheme = (): void => this.#applyTheme();\n\n #handleDocumentKeydown = (event: KeyboardEvent): void => {\n if (\n event.key === 'Escape' &&\n this.hasAttribute('open') &&\n this.#appearance.behavior.closeOnEscape\n ) {\n this.close();\n }\n };\n\n #handleDocumentPointerDown = (event: PointerEvent): void => {\n if (\n this.hasAttribute('open') &&\n this.#appearance.behavior.closeOnOutsideClick &&\n !event.composedPath().includes(this)\n ) {\n this.close();\n }\n };\n\n #ensureClient(): AssistantClient {\n if (this.#client && this.#clientEndpoint === this.sessionEndpoint) return this.#client;\n this.#client?.abort();\n this.#unsubscribeClient?.();\n const client = createAssistantClient({\n sessionEndpoint: this.sessionEndpoint,\n ...(this.#context ? { context: this.#context } : {}),\n clientContext: browserClientContext,\n ...(this.#modelContext ? { modelContext: this.#modelContext } : {}),\n });\n this.#client = client;\n this.#clientEndpoint = this.sessionEndpoint;\n this.#unsubscribeClient = client.subscribe((event) => this.#events.handle(event));\n return client;\n }\n\n #appendMessage(role: 'user' | 'assistant', text: string): HTMLElement | undefined {\n if (!this.#messages) return undefined;\n const message = document.createElement('div');\n message.className = `message ${role}`;\n if (\n role === 'assistant' &&\n this.#appearance.behavior.showAvatars &&\n this.#appearance.brand.avatar[this.#resolvedMode()]\n ) {\n const avatar = document.createElement('img');\n avatar.className = 'avatar';\n avatar.src = this.#appearance.brand.avatar[this.#resolvedMode()] ?? '';\n avatar.alt = '';\n message.append(avatar);\n }\n const body = document.createElement('span');\n body.textContent = text;\n message.append(body);\n if (this.#appearance.behavior.showTimestamps) {\n const timestamp = document.createElement('time');\n timestamp.dateTime = new Date().toISOString();\n timestamp.textContent = new Intl.DateTimeFormat(this.#appearance.locale, {\n hour: 'numeric',\n minute: '2-digit',\n }).format(new Date());\n message.append(timestamp);\n }\n this.#messages.append(message);\n return body;\n }\n\n #dispatchError(detail: AssistantErrorDetail): void {\n this.dispatchEvent(new CustomEvent('assistant-error', { detail }));\n }\n\n #dispatchClientError(error: unknown, fallbackCode: string): void {\n this.#dispatchError(\n error instanceof AssistantClientError\n ? error.detail\n : { code: fallbackCode, retryable: false },\n );\n }\n\n #resolvedMode(): Exclude<AssistantThemeMode, 'auto'> {\n const configured =\n (this.getAttribute('theme') as AssistantThemeMode | null) ??\n this.#appearance.theme.defaultMode;\n return configured === 'auto' ? (this.#media?.matches ? 'dark' : 'light') : configured;\n }\n\n #applyTheme(): void {\n const mode = this.#resolvedMode();\n this.setAttribute('data-theme', mode);\n const tokens = this.#appearance.theme[mode];\n for (const [name, value] of Object.entries(tokens)) {\n this.style.setProperty(\n `--ns-assistant-default-${camelToKebab(name)}`,\n tokenValue(name, value),\n );\n }\n this.style.setProperty(\n '--ns-assistant-default-panel-width',\n `${this.#appearance.layout.panelWidth}px`,\n );\n this.style.setProperty(\n '--ns-assistant-default-min-height',\n `${this.#appearance.layout.panelMinHeight}px`,\n );\n this.style.setProperty(\n '--ns-assistant-default-max-height',\n `${this.#appearance.layout.panelMaxHeight}px`,\n );\n this.style.setProperty(\n '--ns-assistant-default-z-index',\n String(this.#appearance.layout.zIndex),\n );\n const logo = this.shadowRoot?.querySelector<HTMLImageElement>('.brand-logo');\n const logoUrl = this.#appearance.brand.logo[mode];\n if (logo) {\n logo.hidden = !logoUrl;\n if (logoUrl) logo.src = logoUrl;\n }\n }\n\n #render(): void {\n if (!this.shadowRoot) return;\n const conversation = this.#messages ? [...this.#messages.childNodes] : [];\n const appearance = this.#appearance;\n this.setAttribute('role', 'complementary');\n this.setAttribute('aria-label', appearance.brand.name);\n this.setAttribute('lang', appearance.locale);\n this.setAttribute('dir', appearance.direction);\n this.dataset.mode = appearance.layout.mode;\n this.dataset.position = appearance.layout.position;\n this.dataset.density = appearance.layout.density;\n this.toggleAttribute('mobile-fullscreen', appearance.layout.mobileFullscreen);\n this.shadowRoot.innerHTML = `${ASSISTANT_ELEMENT_STYLES}\n <button class=\"launcher\" type=\"button\" aria-label=\"${escapeAttribute(appearance.labels.open)}\"><slot name=\"launcher-icon\">✦</slot></button>\n <section class=\"panel\" aria-label=\"${escapeAttribute(appearance.brand.name)}\">\n <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>\n <div class=\"welcome\"><slot name=\"empty-state\"><h2></h2><p></p></slot></div>\n <div class=\"suggested-prompts\"></div>\n <div class=\"messages\" aria-live=\"polite\"></div>\n <form><slot name=\"composer-leading\"></slot><textarea rows=\"1\"></textarea><button class=\"send\" type=\"submit\"></button><slot name=\"composer-trailing\"></slot></form>\n <nav class=\"legal\" aria-label=\"Legal\"></nav>\n <slot name=\"conversation-footer\"></slot>\n </section>`;\n queryRequired<HTMLElement>(this.shadowRoot, 'strong').textContent = appearance.brand.name;\n const launcherIcon = appearance.brand.mark[this.#resolvedMode()];\n if (launcherIcon) {\n const launcherSlot = queryRequired<HTMLSlotElement>(\n this.shadowRoot,\n 'slot[name=\"launcher-icon\"]',\n );\n const icon = document.createElement('img');\n icon.src = launcherIcon;\n icon.alt = '';\n launcherSlot.replaceChildren(icon);\n }\n const logo = queryRequired<HTMLImageElement>(this.shadowRoot, '.brand-logo');\n const logoUrl = appearance.brand.logo[this.#resolvedMode()];\n if (logoUrl) {\n logo.src = logoUrl;\n logo.alt = appearance.brand.name;\n } else {\n logo.hidden = true;\n }\n queryRequired<HTMLElement>(this.shadowRoot, 'h2').textContent =\n appearance.labels.welcomeHeading;\n queryRequired<HTMLElement>(this.shadowRoot, 'p').textContent = appearance.labels.welcomeMessage;\n const textarea = queryRequired<HTMLTextAreaElement>(this.shadowRoot, 'textarea');\n textarea.placeholder = appearance.labels.composerPlaceholder;\n textarea.setAttribute('aria-label', appearance.labels.composerPlaceholder);\n queryRequired<HTMLElement>(this.shadowRoot, '.send').textContent = appearance.labels.send;\n const prompts = queryRequired<HTMLElement>(this.shadowRoot, '.suggested-prompts');\n for (const prompt of appearance.suggestedPrompts) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = prompt;\n button.addEventListener('click', () => this.#sendGuarded(prompt));\n prompts.append(button);\n }\n if (!appearance.behavior.showLauncher)\n queryRequired<HTMLElement>(this.shadowRoot, '.launcher').hidden = true;\n if (!appearance.behavior.showHeader)\n queryRequired<HTMLElement>(this.shadowRoot, 'header').hidden = true;\n const legal = queryRequired<HTMLElement>(this.shadowRoot, '.legal');\n for (const [label, href] of [\n ['Privacy', appearance.privacyUrl],\n ['Terms', appearance.termsUrl],\n ] as const) {\n if (!href) continue;\n const link = document.createElement('a');\n link.href = href;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.textContent = label;\n legal.append(link);\n }\n this.#messages = this.shadowRoot.querySelector('.messages') ?? undefined;\n this.#messages?.append(...conversation);\n this.shadowRoot.querySelector('.launcher')?.addEventListener('click', () => this.open());\n this.shadowRoot.querySelector('.close')?.addEventListener('click', () => this.close());\n this.shadowRoot.querySelector('form')?.addEventListener('submit', (event) => {\n event.preventDefault();\n const value = textarea.value;\n textarea.value = '';\n this.#sendGuarded(value);\n });\n this.#applyTheme();\n }\n}\n\nexport function registerNoodleAssistant(): void {\n if (globalThis.customElements && !customElements.get(ASSISTANT_TAG_NAME)) {\n customElements.define(ASSISTANT_TAG_NAME, NoodleAssistantElement);\n }\n}\n\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction tokenValue(name: string, value: AssistantThemeTokens[keyof AssistantThemeTokens]): string {\n if (typeof value !== 'number') return value;\n if (name === 'lineHeight' || name === 'motionScale') return String(value);\n return `${value}px`;\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replaceAll('&', '&').replaceAll('\"', '"').replaceAll('<', '<');\n}\n\nfunction queryRequired<T extends Element>(root: ShadowRoot, selector: string): T {\n const element = root.querySelector<T>(selector);\n if (!element) throw new Error(`assistant renderer is missing ${selector}`);\n return element;\n}\n"],"mappings":"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","names":["option","button","button"]}
|