@agent-ui-kit/web-components 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/agent-ui.css +1 -1
  2. package/dist/api.colors.json +2 -2
  3. package/dist/api.colors.yaml +2 -2
  4. package/dist/api.components.json +463 -150
  5. package/dist/api.tokens.json +3 -3
  6. package/dist/api.tokens.yaml +3 -3
  7. package/dist/chunks/{agent-BF_R_HJk.js → agent-XMhz_6OA.js} +27 -22
  8. package/dist/chunks/{agent-BF_R_HJk.js.map → agent-XMhz_6OA.js.map} +1 -1
  9. package/dist/chunks/{meter-Dju8ik6C.js → form-oekEhwja.js} +402 -188
  10. package/dist/chunks/form-oekEhwja.js.map +1 -0
  11. package/dist/components/agent.js +1 -1
  12. package/dist/components/checkbox-group/checkbox-group.d.ts +14 -0
  13. package/dist/components/checkbox-group/index.d.ts +1 -0
  14. package/dist/components/editor.js +1 -1
  15. package/dist/components/form/form.d.ts +12 -0
  16. package/dist/components/form/index.d.ts +1 -0
  17. package/dist/components/graph.js +1 -1
  18. package/dist/components/index.d.ts +2 -0
  19. package/dist/components/noodles/noodle-controller.d.ts +1 -1
  20. package/dist/components.js +89 -87
  21. package/dist/docs/blocks/agent-chat.yaml +33 -25
  22. package/dist/docs/blocks/announcement-card.yaml +14 -10
  23. package/dist/docs/blocks/bpm-process.yaml +216 -4
  24. package/dist/docs/blocks/chart-activity.yaml +12 -10
  25. package/dist/docs/blocks/chart-card.yaml +14 -11
  26. package/dist/docs/blocks/chart-donut.yaml +27 -23
  27. package/dist/docs/blocks/chart-grouped.yaml +14 -11
  28. package/dist/docs/blocks/chart-horizontal.yaml +13 -10
  29. package/dist/docs/blocks/chart-interactive.yaml +20 -17
  30. package/dist/docs/blocks/chart-labeled.yaml +14 -11
  31. package/dist/docs/blocks/checkout-form.yaml +26 -16
  32. package/dist/docs/blocks/clinical-trial.yaml +180 -4
  33. package/dist/docs/blocks/contributors.yaml +17 -11
  34. package/dist/docs/blocks/cyber-threat.yaml +158 -4
  35. package/dist/docs/blocks/dashboard-layout.yaml +25 -18
  36. package/dist/docs/blocks/data-eng-dag.yaml +222 -6
  37. package/dist/docs/blocks/date-picker.yaml +11 -10
  38. package/dist/docs/blocks/ddx-workflow.yaml +202 -6
  39. package/dist/docs/blocks/empty-state.yaml +8 -11
  40. package/dist/docs/blocks/env-variables.yaml +29 -20
  41. package/dist/docs/blocks/feature-upgrade.yaml +25 -18
  42. package/dist/docs/blocks/financial-risk.yaml +161 -4
  43. package/dist/docs/blocks/flow-editor.yaml +27 -18
  44. package/dist/docs/blocks/gen-ai-pipeline.yaml +232 -5
  45. package/dist/docs/blocks/issue-assign.yaml +25 -14
  46. package/dist/docs/blocks/keyboard-shortcuts.yaml +14 -9
  47. package/dist/docs/blocks/login-branded.yaml +62 -23
  48. package/dist/docs/blocks/login-email-only.yaml +14 -13
  49. package/dist/docs/blocks/login-form.yaml +17 -11
  50. package/dist/docs/blocks/login-simple.yaml +18 -12
  51. package/dist/docs/blocks/login-social.yaml +21 -14
  52. package/dist/docs/blocks/login-two-column.yaml +37 -17
  53. package/dist/docs/blocks/marketing-automation.yaml +209 -4
  54. package/dist/docs/blocks/member-list.yaml +23 -18
  55. package/dist/docs/blocks/ml-pipeline.yaml +163 -4
  56. package/dist/docs/blocks/nav-card.yaml +13 -11
  57. package/dist/docs/blocks/notification-list.yaml +18 -13
  58. package/dist/docs/blocks/oncology-pathway.yaml +227 -4
  59. package/dist/docs/blocks/pricing-card.yaml +20 -13
  60. package/dist/docs/blocks/processing-state.yaml +14 -11
  61. package/dist/docs/blocks/profile-card.yaml +18 -12
  62. package/dist/docs/blocks/saas-onboarding.yaml +222 -4
  63. package/dist/docs/blocks/settings-form.yaml +20 -11
  64. package/dist/docs/blocks/settings-panel.yaml +23 -22
  65. package/dist/docs/blocks/sidebar-nav.yaml +23 -15
  66. package/dist/docs/blocks/signup-form.yaml +17 -11
  67. package/dist/docs/blocks/stat-cards.yaml +12 -13
  68. package/dist/docs/blocks/status-card.yaml +20 -17
  69. package/dist/docs/blocks/suggested-labs.yaml +20 -13
  70. package/dist/docs/blocks/supply-chain.yaml +160 -4
  71. package/dist/docs/blocks/survey-card.yaml +21 -13
  72. package/dist/docs/blocks/tabbed-panel.yaml +21 -15
  73. package/dist/docs/blocks/team-empty.yaml +8 -9
  74. package/dist/docs/blocks/usage-billing.yaml +20 -16
  75. package/dist/docs/components/agent-activity.yaml +27 -7
  76. package/dist/docs/components/agent-prompt.yaml +1 -1
  77. package/dist/docs/components/agent-seeds.yaml +1 -1
  78. package/dist/docs/components/breadcrumb.yaml +35 -8
  79. package/dist/docs/components/button.yaml +13 -2
  80. package/dist/docs/components/calendar-picker.yaml +3 -2
  81. package/dist/docs/components/chip.yaml +1 -1
  82. package/dist/docs/components/color-picker.yaml +33 -7
  83. package/dist/docs/components/color-slider.yaml +7 -7
  84. package/dist/docs/components/container.yaml +2 -1
  85. package/dist/docs/components/heading.yaml +4 -0
  86. package/dist/docs/components/index.yaml +11 -1
  87. package/dist/docs/components/input.yaml +10 -9
  88. package/dist/docs/components/meter.yaml +37 -14
  89. package/dist/docs/components/nav-item.yaml +7 -7
  90. package/dist/docs/components/stat.yaml +164 -0
  91. package/dist/docs/components/stepper.yaml +23 -23
  92. package/dist/docs/components/time-field.yaml +35 -2
  93. package/dist/element.js +1 -1
  94. package/dist/reactivity.js +1 -1
  95. package/dist/register.js +299 -297
  96. package/dist/register.js.map +1 -1
  97. package/dist/store.js +1 -1
  98. package/dist/traits.js +2 -2
  99. package/package.json +1 -1
  100. package/dist/chunks/meter-Dju8ik6C.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-BF_R_HJk.js","sources":["../../../../shared/reactivity/graph.ts","../../../../shared/reactivity/signal.ts","../../../../shared/reactivity/computed.ts","../../../../shared/reactivity/effect.ts","../../../../shared/reactivity/batch.ts","../../../../shared/reactivity/untrack.ts","../../src/traits/parse.ts","../../src/traits/registry.ts","../../src/traits/attach.ts","../../src/element/agent-element.ts","../../src/element/define.ts","../../src/element/context.ts","../../src/components/agent/agent-activity.ts","../../src/components/agent/agent-feed.ts","../../src/components/agent/agent-input.ts","../../src/components/agent/agent-message.ts","../../src/components/agent/agent-panel.ts","../../src/components/agent/agent-prompt.ts","../../src/components/agent/agent-seeds.ts","../../src/components/agent/agent-text.ts","../../src/components/agent/agent-thread.ts"],"sourcesContent":["// ── Reactive dependency graph ────────────────────────────────\n//\n// Module-level singletons for reactive tracking.\n// Shared across all signals, computeds, and effects.\n\nlet activeNode: ReactiveNode | EffectNode | null = null\nlet batchDepth = 0\nconst pendingEffects = new Set<EffectNode>()\n\nexport const nodeMap = new WeakMap<object, SourceNode | ReactiveNode>()\nexport const computeStack = new Set<ReactiveNode>()\n\nexport function getActiveNode(): ReactiveNode | EffectNode | null {\n return activeNode\n}\n\nexport function setActiveNode(node: ReactiveNode | EffectNode | null): void {\n activeNode = node\n}\n\nexport function getBatchDepth(): number {\n return batchDepth\n}\n\nexport function incrementBatchDepth(): void {\n batchDepth++\n}\n\nexport function decrementBatchDepth(): void {\n batchDepth--\n}\n\nexport function addPendingEffect(node: EffectNode): void {\n pendingEffects.add(node)\n}\n\nexport class SourceNode {\n _value: unknown\n _subs = new Set<ReactiveNode | EffectNode>()\n\n constructor(value: unknown) {\n this._value = value\n }\n}\n\nexport class ReactiveNode {\n _subs = new Set<ReactiveNode | EffectNode>()\n _deps = new Set<SourceNode | ReactiveNode>()\n _fn: () => unknown\n _value: unknown = undefined\n _dirty = true\n\n constructor(fn: () => unknown) {\n this._fn = fn\n }\n\n _notify(): void {\n if (this._dirty) return\n this._dirty = true\n for (const sub of [...this._subs]) {\n if (sub instanceof ReactiveNode) {\n sub._notify()\n } else {\n if (batchDepth > 0) {\n pendingEffects.add(sub)\n } else {\n runEffect(sub)\n }\n }\n }\n }\n}\n\nexport class EffectNode {\n _deps = new Set<SourceNode | ReactiveNode>()\n _fn: () => void\n _disposed = false\n _running = false\n\n constructor(fn: () => void) {\n this._fn = fn\n }\n}\n\nexport function track(source: SourceNode | ReactiveNode): void {\n if (activeNode === null) return\n source._subs.add(activeNode)\n activeNode._deps.add(source)\n}\n\nexport function cleanup(node: ReactiveNode | EffectNode): void {\n for (const dep of node._deps) {\n dep._subs.delete(node)\n }\n node._deps.clear()\n}\n\nexport function notify(source: SourceNode): void {\n for (const sub of [...source._subs]) {\n if (sub instanceof ReactiveNode) {\n sub._notify()\n } else {\n if (batchDepth > 0) {\n pendingEffects.add(sub)\n } else {\n runEffect(sub)\n }\n }\n }\n}\n\nexport function runEffect(node: EffectNode): void {\n if (node._disposed || node._running) return\n cleanup(node)\n const prev = activeNode\n activeNode = node\n node._running = true\n try {\n node._fn()\n } finally {\n activeNode = prev\n node._running = false\n }\n}\n\nexport function flushEffects(): void {\n let iterations = 0\n while (pendingEffects.size > 0) {\n if (++iterations > 100) {\n throw new Error('Reactive flush limit exceeded (100 iterations). Possible infinite loop.')\n }\n const snapshot = [...pendingEffects]\n pendingEffects.clear()\n for (const node of snapshot) {\n runEffect(node)\n }\n }\n}\n","import type { Signal } from './types.ts'\nimport { SourceNode, track, notify, nodeMap } from './graph.ts'\n\nclass SignalImpl<T> implements Signal<T> {\n readonly [Symbol.toStringTag] = 'Signal' as const\n #node: SourceNode\n\n constructor(node: SourceNode) {\n this.#node = node\n }\n\n get value(): T {\n track(this.#node)\n return this.#node._value as T\n }\n\n set value(next: T) {\n if (Object.is(this.#node._value, next)) return\n this.#node._value = next\n notify(this.#node)\n }\n\n peek(): T {\n return this.#node._value as T\n }\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n const node = new SourceNode(initial)\n const sig = new SignalImpl<T>(node)\n nodeMap.set(sig, node)\n return sig\n}\n","import type { ReadonlySignal } from './types.ts'\nimport {\n ReactiveNode, track, cleanup,\n getActiveNode, setActiveNode,\n computeStack, nodeMap,\n} from './graph.ts'\n\nclass ComputedImpl<T> implements ReadonlySignal<T> {\n readonly [Symbol.toStringTag] = 'Computed' as const\n #node: ReactiveNode\n\n constructor(node: ReactiveNode) {\n this.#node = node\n }\n\n get value(): T {\n track(this.#node)\n if (this.#node._dirty) this.#recompute()\n return this.#node._value as T\n }\n\n peek(): T {\n if (this.#node._dirty) this.#recompute()\n return this.#node._value as T\n }\n\n #recompute(): void {\n const node = this.#node\n if (computeStack.has(node)) {\n throw new Error('Circular computed dependency detected.')\n }\n cleanup(node)\n computeStack.add(node)\n const prev = getActiveNode()\n setActiveNode(node)\n try {\n node._value = node._fn()\n } finally {\n setActiveNode(prev)\n computeStack.delete(node)\n node._dirty = false\n }\n }\n}\n\nexport function computed<T>(fn: () => T): ReadonlySignal<T> {\n const node = new ReactiveNode(fn)\n const comp = new ComputedImpl<T>(node)\n nodeMap.set(comp, node)\n return comp\n}\n","import type { Dispose } from './types.ts'\nimport { EffectNode, cleanup, runEffect } from './graph.ts'\n\nexport function effect(fn: () => void): Dispose {\n const node = new EffectNode(fn)\n runEffect(node)\n return () => {\n if (node._disposed) return\n node._disposed = true\n cleanup(node)\n }\n}\n","import {\n incrementBatchDepth, decrementBatchDepth,\n getBatchDepth, flushEffects,\n} from './graph.ts'\n\nexport function batch(fn: () => void): void {\n incrementBatchDepth()\n try {\n fn()\n } finally {\n decrementBatchDepth()\n if (getBatchDepth() === 0) flushEffects()\n }\n}\n","import { getActiveNode, setActiveNode } from './graph.ts'\n\nexport function untrack<T>(fn: () => T): T {\n const prev = getActiveNode()\n setActiveNode(null)\n try {\n return fn()\n } finally {\n setActiveNode(prev)\n }\n}\n","// ── Trait attribute parser ────────────────────────────────────\n//\n// Parses the `traits` attribute value into TraitEntry[].\n// Supports three forms:\n// \"toggle-scheme\" → single trait, defaults\n// \"toggle-scheme draggable\" → multiple, space-separated\n// \"{ trait: 'toggle-scheme', persist: 'true' }\" → configured\n\nimport type { TraitEntry } from './types.ts'\n\n/** Parse a relaxed JSON-like object (single-quoted keys/values) */\nconst parseRelaxedJson = (raw: string): Record<string, string> => {\n // Convert single quotes to double quotes for JSON.parse\n // Handle: { trait: 'toggle-scheme', scheme: 'system' }\n // Also handle unquoted keys: { trait: 'value' }\n const normalized = raw\n .replace(/'/g, '\"')\n .replace(/(\\w[\\w-]*)(?=\\s*:)/g, '\"$1\"')\n\n try {\n return JSON.parse(normalized)\n } catch {\n console.warn(`[agent-ui] Failed to parse trait config: ${raw}`)\n return {}\n }\n}\n\n/** Parse a single JSON-like entry into a TraitEntry */\nconst parseConfigEntry = (raw: string): TraitEntry | null => {\n const obj = parseRelaxedJson(raw)\n const name = obj['trait']\n if (!name) {\n console.warn(`[agent-ui] Trait config missing \"trait\" key: ${raw}`)\n return null\n }\n\n const config: Record<string, string> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== 'trait') config[k] = String(v)\n }\n return { name, config }\n}\n\n/** Parse the `traits` attribute value into an array of TraitEntry */\nexport const parseTraitsAttribute = (value: string | null): readonly TraitEntry[] => {\n if (!value || !value.trim()) return []\n\n const trimmed = value.trim()\n\n // JSON object form: { trait: '...', ... }\n if (trimmed.startsWith('{')) {\n const entry = parseConfigEntry(trimmed)\n return entry ? [entry] : []\n }\n\n // JSON array form: [{ trait: '...' }, ...]\n if (trimmed.startsWith('[')) {\n try {\n const normalized = trimmed.replace(/'/g, '\"').replace(/(\\w[\\w-]*)(?=\\s*:)/g, '\"$1\"')\n const arr: Record<string, string>[] = JSON.parse(normalized)\n const entries: TraitEntry[] = []\n for (const obj of arr) {\n const name = obj['trait']\n if (!name) continue\n const config: Record<string, string> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== 'trait') config[k] = String(v)\n }\n entries.push({ name, config })\n }\n return entries\n } catch {\n console.warn(`[agent-ui] Failed to parse traits array: ${trimmed}`)\n return []\n }\n }\n\n // Space-separated simple names: \"toggle-scheme draggable\"\n return trimmed.split(/\\s+/).map(name => ({ name, config: {} }))\n}\n","// ── Trait registry ───────────────────────────────────────────\n//\n// Central registry + composition validation.\n// Warns at runtime when traits are used incorrectly.\n\nimport type { TraitDefinition, TraitEntry } from './types.ts'\n\nconst registry = new Map<string, TraitDefinition>()\n\n/** Register a trait definition */\nexport const registerTrait = (def: TraitDefinition): void => {\n if (registry.has(def.name)) {\n console.warn(`[agent-ui] Trait \"${def.name}\" already registered, overwriting.`)\n }\n registry.set(def.name, def)\n}\n\n/** Look up a trait by name */\nexport const getTrait = (name: string): TraitDefinition | undefined => {\n return registry.get(name)\n}\n\n/** Get all registered trait names */\nexport const getTraitNames = (): readonly string[] => {\n return [...registry.keys()]\n}\n\n/** Get registered traits grouped by category */\nexport const getTraitsByCategory = (): ReadonlyMap<string, readonly string[]> => {\n const groups = new Map<string, string[]>()\n for (const def of registry.values()) {\n let list = groups.get(def.category)\n if (!list) {\n list = []\n groups.set(def.category, list)\n }\n list.push(def.name)\n }\n return groups\n}\n\n/**\n * Validate composition rules for a set of traits on one element.\n * Logs warnings for violations. Returns only the valid entries.\n */\nexport const validateComposition = (\n entries: readonly TraitEntry[],\n hostTag: string,\n): readonly { entry: TraitEntry; def: TraitDefinition }[] => {\n const valid: { entry: TraitEntry; def: TraitDefinition }[] = []\n const focusTraits: string[] = []\n const gestureChannels = new Map<string, string>() // channel → trait name\n\n for (const entry of entries) {\n const def = registry.get(entry.name)\n\n if (!def) {\n console.warn(\n `[agent-ui] Unknown trait \"${entry.name}\" on <${hostTag}>. Not in registry.`\n )\n continue\n }\n\n // Focus exclusivity check\n if (def.category === 'focus') {\n if (focusTraits.length > 0) {\n console.warn(\n `[agent-ui] Multiple focus traits on <${hostTag}>: ` +\n `\"${entry.name}\" conflicts with \"${focusTraits[0]}\". ` +\n `Only one focus trait allowed per element.`\n )\n continue\n }\n focusTraits.push(entry.name)\n }\n\n // Gesture channel conflict check\n if (def.category === 'gesture' && def.channel) {\n const existing = gestureChannels.get(def.channel)\n if (existing) {\n console.warn(\n `[agent-ui] Gesture conflict on <${hostTag}>: ` +\n `\"${entry.name}\" and \"${existing}\" both use ${def.channel} channel.`\n )\n continue\n }\n gestureChannels.set(def.channel, entry.name)\n }\n\n valid.push({ entry, def })\n }\n\n return valid\n}\n","// ── attachTrait ──────────────────────────────────────────────\n//\n// Programmatic API for installing a registered trait on any\n// HTMLElement — not just AgentElement. Components like aui-select\n// use this to install popover behavior on child elements.\n//\n// Usage:\n// import { attachTrait } from '#traits'\n// const detach = attachTrait(listEl, 'popover', { anchor: '#trigger' })\n\nimport { effect } from '#reactivity'\nimport type { Dispose } from '#reactivity'\nimport { getTrait } from './registry.ts'\nimport type { TraitContext } from './types.ts'\n\nexport interface AttachTraitOptions {\n /** Config overrides (same keys as declarative trait config) */\n config?: Readonly<Record<string, string>>\n /** Direct element reference for anchor — avoids needing a CSS selector */\n anchorElement?: HTMLElement\n}\n\nlet attachCounter = 0\n\n/**\n * Attach a registered trait to any HTMLElement programmatically.\n * Returns a dispose function that detaches the trait and cleans up.\n */\nexport const attachTrait = (\n target: HTMLElement,\n traitName: string,\n options?: AttachTraitOptions,\n): Dispose => {\n const def = getTrait(traitName)\n if (!def) {\n console.warn(`[agent-ui] attachTrait: unknown trait \"${traitName}\".`)\n return () => {}\n }\n\n const instanceConfig = { ...(options?.config ?? {}) }\n const defaults = def.defaults ?? {}\n const effectDisposers: Dispose[] = []\n\n // If anchorElement is provided, stamp a data attribute and pass\n // the CSS selector so the overlay trait can find it by selector.\n let anchorAttr = ''\n if (options?.anchorElement) {\n anchorAttr = `aui-anchor-${++attachCounter}`\n options.anchorElement.setAttribute('data-aui-anchor', anchorAttr)\n instanceConfig.anchor = `[data-aui-anchor=\"${anchorAttr}\"]`\n }\n\n const ctx: TraitContext = {\n host: target,\n\n addEffect: (fn: () => void) => {\n effectDisposers.push(effect(fn))\n },\n\n emit: (name: string, detail?: Record<string, unknown>) => {\n target.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n detail,\n }))\n },\n\n config: (key: string) => instanceConfig[key] ?? defaults[key],\n\n expose: (key: string, value: string | boolean) => {\n const attr = `data-${def.name}-${key}`\n if (typeof value === 'boolean') {\n if (value) target.setAttribute(attr, '')\n else target.removeAttribute(attr)\n } else {\n target.setAttribute(attr, value)\n }\n },\n\n unexpose: (key: string) => {\n target.removeAttribute(`data-${def.name}-${key}`)\n },\n }\n\n const traitDispose = def.attach(ctx)\n\n return () => {\n traitDispose?.()\n for (const d of effectDisposers) d()\n effectDisposers.length = 0\n // Clean up the anchor data attribute\n if (anchorAttr) {\n options?.anchorElement?.removeAttribute('data-aui-anchor')\n }\n }\n}\n","// ── AgentElement ─────────────────────────────────────────────\n//\n// Base class for all registered agent-ui custom elements.\n// Provides: lifecycle state machine, schema-driven attributes,\n// renewable ready promise, effect ownership, deferChildren.\n\nimport { signal, effect, batch } from '#reactivity'\nimport type { Signal, Dispose } from '#reactivity'\nimport type { LifecycleState, AttributeSchema, AttrDef } from './types.ts'\nimport { parseTraitsAttribute } from '../traits/parse.ts'\nimport { attachTrait } from '../traits/attach.ts'\nimport { validateComposition } from '../traits/registry.ts'\n\n// ── Module-scoped private state ─────────────────────────────\n\n/** Per-instance attribute signal maps, keyed by element instance */\nconst attrSignals = new WeakMap<AgentElement, Map<string, Signal<unknown>>>()\n\n/** Tracks whether schema has been processed for a given constructor */\nconst schemaProcessed = new WeakSet<Function>()\n\n// ── Schema processing ───────────────────────────────────────\n\nexport function setupAttributeSchema(ctor: typeof AgentElement): void {\n if (schemaProcessed.has(ctor)) return\n schemaProcessed.add(ctor)\n\n const schema: AttributeSchema | undefined = (ctor as any).attributes\n if (!schema) return\n\n const keys = Object.keys(schema)\n\n Object.defineProperty(ctor, 'observedAttributes', {\n get() { return keys },\n configurable: true,\n })\n\n for (const name of keys) {\n const def = schema[name]\n if (name in ctor.prototype) continue // don't clobber explicit declarations\n\n Object.defineProperty(ctor.prototype, name, {\n get(this: AgentElement) {\n const map = attrSignals.get(this)\n return map?.get(name)?.value\n },\n set(this: AgentElement, val: unknown) {\n const map = attrSignals.get(this)\n const sig = map?.get(name)\n if (!sig) return\n\n sig.value = val\n\n // Reflect to attribute\n if (def.type === 'boolean') {\n this.toggleAttribute(name, !!val)\n } else {\n const str = String(val)\n if (str === def.default) {\n this.removeAttribute(name)\n } else {\n this.setAttribute(name, str)\n }\n }\n },\n configurable: true,\n enumerable: true,\n })\n }\n}\n\n// ── AgentElement class ──────────────────────────────────────\n\nexport class AgentElement extends HTMLElement {\n /** Override in subclass to declare component attributes */\n static attributes?: AttributeSchema\n\n /** Override in subclass to defer activate() until children are present */\n static deferChildren?: boolean\n\n // ── Lifecycle state ─────────────────────────────────────\n\n #state = signal<LifecycleState>('idle')\n #moveCheck = false\n\n get lifecycleState(): LifecycleState {\n return this.#state.peek()\n }\n\n // ── Ready promise ───────────────────────────────────────\n\n #readyResolve: (() => void) | null = null\n #readyPromise: Promise<void>\n\n get ready(): Promise<void> {\n return this.#readyPromise\n }\n\n // ── Trait ownership ─────────────────────────────────────\n\n #traitDisposers: Dispose[] = []\n\n #attachTraits(): void {\n const raw = this.getAttribute('traits')\n if (!raw) return\n\n const entries = parseTraitsAttribute(raw)\n const validated = validateComposition(entries, this.localName)\n\n for (const { entry } of validated) {\n const dispose = attachTrait(this, entry.name, {\n config: entry.config,\n })\n this.#traitDisposers.push(dispose)\n }\n }\n\n #disposeTraits(): void {\n for (const d of this.#traitDisposers) d()\n this.#traitDisposers.length = 0\n }\n\n // ── Effect ownership ────────────────────────────────────\n\n #effects: Dispose[] = []\n\n addEffect(fn: () => void): Dispose {\n const dispose = effect(fn)\n this.#effects.push(dispose)\n return dispose\n }\n\n #disposeEffects(): void {\n for (const dispose of this.#effects) dispose()\n this.#effects.length = 0\n }\n\n // ── Constructor ─────────────────────────────────────────\n\n constructor() {\n super()\n\n // Create ready promise\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#readyResolve = resolve\n })\n\n // Initialize attribute signals from schema\n const schema: AttributeSchema | undefined =\n (this.constructor as typeof AgentElement).attributes\n if (schema) {\n const map = new Map<string, Signal<unknown>>()\n for (const [name, def] of Object.entries(schema)) {\n map.set(name, signal(def.default))\n }\n attrSignals.set(this, map)\n }\n }\n\n // ── Native callbacks ────────────────────────────────────\n\n connectedCallback(): void {\n const state = this.#state.peek()\n\n // Abort pending exit (DOM move)\n if (state === 'exiting') {\n this.#moveCheck = true\n this.#state.value = 'entering'\n this.#enter()\n return\n }\n\n if (state === 'idle' || state === 'suspended') {\n // Renew ready promise on reconnect\n if (state === 'suspended') {\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#readyResolve = resolve\n })\n }\n this.#state.value = 'entering'\n this.#enter()\n }\n }\n\n disconnectedCallback(): void {\n const state = this.#state.peek()\n if (state !== 'connected' && state !== 'entering') return\n\n this.#state.value = 'exiting'\n this.#moveCheck = false\n\n // Microtask: if connectedCallback fires before this, it was a DOM move\n queueMicrotask(() => {\n if (this.#moveCheck) return // reconnected — was a move\n if (this.#state.peek() !== 'exiting') return\n\n this.#exit()\n })\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n val: string | null,\n ): void {\n const schema: AttributeSchema | undefined =\n (this.constructor as typeof AgentElement).attributes\n if (!schema) return\n\n const def = schema[name]\n if (!def) return\n\n const map = attrSignals.get(this)\n const sig = map?.get(name)\n if (!sig) return\n\n batch(() => {\n if (def.type === 'boolean') {\n const next = val !== null\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n } else if (def.type === 'enum') {\n if (val !== null && !(def as { values: readonly string[] }).values.includes(val)) {\n if (typeof import.meta !== 'undefined') {\n console.warn(\n `[agent-ui] Invalid value \"${val}\" for attribute \"${name}\". ` +\n `Expected one of: ${(def as { values: readonly string[] }).values.join(', ')}`,\n )\n }\n return\n }\n const next = val ?? def.default\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n } else {\n const next = val ?? def.default\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n }\n })\n }\n\n // ── Lifecycle hooks (override in subclass) ──────────────\n\n /** Called when entering the DOM. Return a promise to animate entry. */\n protected willEnter(): Promise<void> | void {}\n\n /** Called after entry is complete. Element is fully interactive. */\n protected didEnter(): void {}\n\n /** Setup hook — create controllers, wire effects. */\n protected activate(): void {}\n\n /** Called when leaving the DOM. Return a promise to animate exit. */\n protected willExit(): Promise<void> | void {}\n\n /** Called after exit is complete. Safe to teardown. */\n protected didExit(): void {}\n\n /** Cleanup hook — destroy controllers. */\n protected dispose(): void {}\n\n // ── Internal lifecycle ──────────────────────────────────\n\n async #enter(): Promise<void> {\n try {\n await this.willEnter()\n } catch {\n // willEnter failed — still proceed to connected\n }\n\n if (this.#state.peek() !== 'entering') return // interrupted\n\n this.#state.value = 'connected'\n\n // deferChildren: wait for children before activate\n const ctor = this.constructor as typeof AgentElement\n if (ctor.deferChildren && this.children.length === 0) {\n this.#waitForChildren()\n } else {\n this.activate()\n this.#attachTraits()\n }\n\n this.didEnter()\n this.#readyResolve?.()\n this.#readyResolve = null\n }\n\n async #exit(): Promise<void> {\n try {\n await this.willExit()\n } catch {\n // willExit failed — still proceed to teardown\n }\n\n if (this.#state.peek() !== 'exiting') return // reconnected mid-exit\n\n this.dispose()\n this.#disposeTraits()\n this.#disposeEffects()\n this.didExit()\n this.#state.value = 'suspended'\n }\n\n #waitForChildren(): void {\n let attempts = 0\n const activate = () => {\n this.activate()\n this.#attachTraits()\n }\n const observer = new MutationObserver(() => {\n if (this.children.length > 0) {\n observer.disconnect()\n activate()\n return\n }\n if (++attempts > 50) {\n observer.disconnect()\n activate()\n }\n })\n observer.observe(this, { childList: true })\n\n queueMicrotask(() => {\n if (this.children.length > 0) {\n observer.disconnect()\n activate()\n }\n })\n }\n}\n","// ── define() registration helper ────────────────────────────\n//\n// Idempotent custom element registration.\n// Processes static attribute schema before registration.\n\nimport { AgentElement, setupAttributeSchema } from './agent-element.ts'\n\nexport function define(\n tag: string,\n ctor: typeof AgentElement,\n): void {\n if (customElements.get(tag)) return\n setupAttributeSchema(ctor)\n customElements.define(tag, ctor)\n}\n","// ── Context system ───────────────────────────────────────────\n//\n// DOM-tree dependency injection via event bubbling.\n// No global state, no import coupling.\n\nimport { signal, effect } from '#reactivity'\nimport type { Signal, Dispose } from '#reactivity'\nimport type { ContextKey } from './types.ts'\n\n// ── Factory ─────────────────────────────────────────────────\n\nexport function createContext<T>(name: string): ContextKey<T> {\n return { name }\n}\n\n// ── Event ───────────────────────────────────────────────────\n\nexport class ContextRequestEvent<T> extends Event {\n constructor(\n public readonly key: ContextKey<T>,\n public readonly callback: (value: T) => void,\n public readonly subscribe = false,\n ) {\n super('context-request', { bubbles: true, composed: true })\n }\n}\n\n// ── Provider ────────────────────────────────────────────────\n\nexport class ContextProvider<T> {\n #host: HTMLElement\n #key: ContextKey<T>\n #signal: Signal<T>\n #subscribers = new Set<(value: T) => void>()\n #effectDispose: Dispose | null = null\n #handleRequest: (e: Event) => void\n\n constructor(host: HTMLElement, key: ContextKey<T>, initialValue: T) {\n this.#host = host\n this.#key = key\n this.#signal = signal(initialValue)\n\n this.#handleRequest = (e: Event) => {\n const req = e as ContextRequestEvent<T>\n if (req.key !== this.#key) return\n e.stopPropagation()\n req.callback(this.#signal.peek())\n if (req.subscribe) {\n this.#subscribers.add(req.callback)\n }\n }\n\n this.#host.addEventListener('context-request', this.#handleRequest)\n\n this.#effectDispose = effect(() => {\n const val = this.#signal.value\n for (const cb of this.#subscribers) cb(val)\n })\n }\n\n setValue(next: T): void {\n this.#signal.value = next\n }\n\n dispose(): void {\n this.#host.removeEventListener('context-request', this.#handleRequest)\n this.#effectDispose?.()\n this.#subscribers.clear()\n }\n}\n\n// ── Consumer ────────────────────────────────────────────────\n\nexport class ContextConsumer<T> {\n #host: HTMLElement\n #key: ContextKey<T>\n #callback: (value: T) => void\n #subscribe: boolean\n\n constructor(\n host: HTMLElement,\n key: ContextKey<T>,\n callback: (value: T) => void,\n subscribe = false,\n ) {\n this.#host = host\n this.#key = key\n this.#callback = callback\n this.#subscribe = subscribe\n this.request()\n }\n\n request(): void {\n this.#host.dispatchEvent(\n new ContextRequestEvent(this.#key, this.#callback, this.#subscribe),\n )\n }\n\n dispose(): void {\n // Consumer has no listeners to clean up — provider holds the subscription\n }\n}\n","// ── aui-agent-activity ──────────────────────────────────────\n//\n// Streaming activity indicator — typing, thinking, or tool-use status.\n//\n// When `active`, shows an animated indicator with elapsed time.\n// When `expandable`, clicking toggles visibility of slotted trace content.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentActivity extends AgentElement {\n static override attributes: AttributeSchema = {\n type: { type: 'enum', values: ['typing', 'thinking', 'tool-use'], default: 'typing' },\n label: { type: 'string', default: '' },\n active: { type: 'boolean', default: false },\n expandable: { type: 'boolean', default: false },\n expanded: { type: 'boolean', default: false },\n }\n\n declare type: string\n declare label: string\n declare active: boolean\n declare expandable: boolean\n declare expanded: boolean\n\n #internals: ElementInternals\n #startTime = 0\n #timerFrame = 0\n #statusEl: HTMLElement | null = null\n #timeEl: HTMLElement | null = null\n #dotsEl: HTMLElement | null = null\n #contentEl: HTMLElement | null = null\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.setAttribute('role', 'status')\n this.setAttribute('aria-live', 'polite')\n\n // Stamp DOM\n this.#stamp()\n\n // Timer: start/stop based on active\n this.addEffect(() => {\n if (this.active) {\n this.#startTimer()\n } else {\n this.#stopTimer()\n }\n })\n\n // Label sync\n this.addEffect(() => {\n if (!this.#statusEl) return\n const text = this.label || defaultLabel(this.type)\n this.#statusEl.textContent = text\n })\n\n // Dots visibility\n this.addEffect(() => {\n if (!this.#dotsEl) return\n this.#dotsEl.hidden = !this.active\n })\n\n // Expandable state\n this.addEffect(() => {\n if (!this.#contentEl) return\n const show = this.expanded && this.expandable\n this.#contentEl.hidden = !show\n })\n\n this.addEventListener('click', this.#onClick)\n }\n\n protected override dispose(): void {\n this.#stopTimer()\n this.removeEventListener('click', this.#onClick)\n this.#statusEl = null\n this.#timeEl = null\n this.#dotsEl = null\n this.#contentEl = null\n }\n\n // ── DOM ───────────────────────────────────────────────────\n\n #stamp(): void {\n // Move existing children into content slot\n const fragment = document.createDocumentFragment()\n while (this.firstChild) fragment.appendChild(this.firstChild)\n\n // Status row\n const row = document.createElement('div')\n row.setAttribute('data-agent-activity-row', '')\n\n this.#timeEl = document.createElement('span')\n this.#timeEl.setAttribute('data-agent-activity-time', '')\n this.#timeEl.textContent = '0s'\n\n const sep = document.createElement('span')\n sep.setAttribute('data-agent-activity-sep', '')\n sep.textContent = '|'\n sep.setAttribute('aria-hidden', 'true')\n\n this.#statusEl = document.createElement('span')\n this.#statusEl.setAttribute('data-agent-activity-label', '')\n\n this.#dotsEl = document.createElement('span')\n this.#dotsEl.setAttribute('data-agent-activity-dots', '')\n this.#dotsEl.setAttribute('aria-hidden', 'true')\n this.#dotsEl.innerHTML = '<i></i><i></i><i></i>'\n\n row.append(this.#timeEl, sep, this.#statusEl, this.#dotsEl)\n\n // Content area (for reasoning trace)\n this.#contentEl = document.createElement('div')\n this.#contentEl.setAttribute('data-agent-activity-content', '')\n this.#contentEl.hidden = true\n this.#contentEl.appendChild(fragment)\n\n this.append(row, this.#contentEl)\n }\n\n // ── Timer ─────────────────────────────────────────────────\n\n #startTimer(): void {\n this.#stopTimer()\n this.#startTime = performance.now()\n this.#tickTimer()\n }\n\n #stopTimer(): void {\n if (this.#timerFrame) {\n cancelAnimationFrame(this.#timerFrame)\n this.#timerFrame = 0\n }\n }\n\n #tickTimer = (): void => {\n if (!this.active || !this.#timeEl) return\n const elapsed = performance.now() - this.#startTime\n this.#timeEl.textContent = formatElapsed(elapsed)\n this.#timerFrame = requestAnimationFrame(this.#tickTimer)\n }\n\n // ── Expand/collapse ───────────────────────────────────────\n\n #onClick = (): void => {\n if (!this.expandable) return\n this.expanded = !this.expanded\n\n this.dispatchEvent(new CustomEvent('aui:activity-toggle', {\n bubbles: true,\n composed: true,\n detail: { expanded: this.expanded },\n }))\n }\n}\n\nfunction defaultLabel(type: string): string {\n switch (type) {\n case 'thinking': return 'Thinking\\u2026'\n case 'tool-use': return 'Using tools\\u2026'\n default: return 'Host is typing\\u2026'\n }\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSec = Math.floor(ms / 1000)\n if (totalSec < 60) return `${totalSec}s`\n const min = Math.floor(totalSec / 60)\n const sec = totalSec % 60\n return `${min}m:${String(sec).padStart(2, '0')}s`\n}\n","// ── aui-agent-feed ──────────────────────────────────────────\n//\n// Scrollable message thread coordinator.\n// Wraps aui-agent-thread groups and manages auto-scroll behavior.\n// When pinned to bottom, new content automatically scrolls into view.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nconst SCROLL_THRESHOLD = 40\n\nexport class AuiAgentFeed extends AgentElement {\n static override attributes: AttributeSchema = {\n 'auto-scroll': { type: 'boolean', default: true },\n scrollable: { type: 'boolean', default: false },\n }\n\n declare 'auto-scroll': boolean\n declare scrollable: boolean\n\n #isPinned = true\n #observer: MutationObserver | null = null\n #scrollRaf = 0\n #internals: ElementInternals\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n get isPinned(): boolean { return this.#isPinned }\n\n /** Scroll to the bottom of the feed. */\n scrollToBottom(smooth = true): void {\n this.scrollTo({\n top: this.scrollHeight,\n behavior: smooth ? 'smooth' : 'instant',\n })\n this.#isPinned = true\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'log'\n this.setAttribute('aria-live', 'polite')\n this.setAttribute('aria-label', 'Conversation')\n\n // Default scrollable unless explicitly removed\n if (!this.hasAttribute('scrollable')) {\n this.setAttribute('scrollable', '')\n }\n\n // Default auto-scroll\n if (!this.hasAttribute('auto-scroll')) {\n this.toggleAttribute('auto-scroll', true)\n }\n\n // React to auto-scroll and scrollable attribute changes\n this.addEffect(() => {\n const _autoScroll = this['auto-scroll'] // track\n const _scrollable = this.scrollable // track\n })\n\n this.addEventListener('scroll', this.#onScroll, { passive: true })\n\n // Watch for new children (messages added) -> auto-scroll\n this.#observer = new MutationObserver(this.#onChildrenChanged)\n this.#observer.observe(this, { childList: true, subtree: true })\n }\n\n protected override dispose(): void {\n this.removeEventListener('scroll', this.#onScroll)\n if (this.#scrollRaf) {\n cancelAnimationFrame(this.#scrollRaf)\n this.#scrollRaf = 0\n }\n this.#observer?.disconnect()\n this.#observer = null\n }\n\n // ── Scroll management ────────────────────────────────────\n\n #onScroll = (): void => {\n const wasPinned = this.#isPinned\n const pinned = this.scrollTop + this.clientHeight >= this.scrollHeight - SCROLL_THRESHOLD\n this.#isPinned = pinned\n\n if (pinned !== wasPinned) {\n this.dispatchEvent(new CustomEvent('aui:feed-scroll', {\n bubbles: true,\n composed: true,\n detail: { isPinned: pinned, scrollTop: this.scrollTop },\n }))\n }\n }\n\n #onChildrenChanged = (): void => {\n if (this['auto-scroll'] && this.#isPinned) {\n // Use rAF to let layout settle before scrolling\n if (this.#scrollRaf) cancelAnimationFrame(this.#scrollRaf)\n this.#scrollRaf = requestAnimationFrame(() => {\n this.#scrollRaf = 0\n this.scrollTo({ top: this.scrollHeight, behavior: 'smooth' })\n })\n }\n }\n}\n","// ── aui-agent-input ─────────────────────────────────────────\n//\n// Chat message input with textarea, submit button, and Enter-to-send.\n// Discovers child aui-textarea and submit aui-button[primary].\n//\n// Cmd/Ctrl+Enter to send by default.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentInput extends AgentElement {\n static override deferChildren = true\n\n static override attributes: AttributeSchema = {\n disabled: { type: 'boolean', default: false },\n busy: { type: 'boolean', default: false },\n 'no-enter-submit': { type: 'boolean', default: false },\n 'no-auto-clear': { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n declare busy: boolean\n declare 'no-enter-submit': boolean\n declare 'no-auto-clear': boolean\n\n #textarea: HTMLElement | null = null\n #submitBtn: HTMLElement | null = null\n\n // ── Public API ────────────────────────────────────────────\n\n get value(): string {\n return (this.#textarea as any)?.value ?? ''\n }\n\n set value(val: string) {\n if (this.#textarea) (this.#textarea as any).value = val\n }\n\n /** Focus the composer textarea. */\n focusComposer(): void {\n this.#textarea?.focus()\n }\n\n /** Blur the composer textarea. */\n blurComposer(): void {\n this.#textarea?.blur()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#discoverChildren()\n\n // Sync initial value from attribute to textarea\n const initialValue = this.getAttribute('value')\n if (initialValue && this.#textarea) {\n (this.#textarea as any).value = initialValue\n }\n\n // Cascade disabled to children reactively\n this.addEffect(() => {\n const isDisabled = this.disabled\n if (this.#textarea) {\n this.#textarea.toggleAttribute('disabled', isDisabled)\n }\n if (this.#submitBtn) {\n if (isDisabled) {\n this.#submitBtn.setAttribute('disabled', '')\n } else {\n this.#syncSubmitEnabled()\n }\n }\n })\n\n // Busy disables submit button but keeps textarea enabled\n this.addEffect(() => {\n const isBusy = this.busy\n if (!this.#submitBtn) return\n if (this.disabled) return // disabled effect owns the button when disabled\n if (isBusy) {\n this.#submitBtn.setAttribute('disabled', '')\n } else {\n this.#syncSubmitEnabled()\n }\n })\n\n this.addEventListener('input', this.#onTextareaInput)\n this.addEventListener('click', this.#onClick)\n this.addEventListener('keydown', this.#onKeydown)\n this.addEventListener('focusin', this.#onFocusIn)\n this.addEventListener('focusout', this.#onFocusOut)\n }\n\n protected override dispose(): void {\n this.removeEventListener('input', this.#onTextareaInput)\n this.removeEventListener('click', this.#onClick)\n this.removeEventListener('keydown', this.#onKeydown)\n this.removeEventListener('focusin', this.#onFocusIn)\n this.removeEventListener('focusout', this.#onFocusOut)\n this.#textarea = null\n this.#submitBtn = null\n }\n\n // ── Child discovery ───────────────────────────────────────\n\n #discoverChildren(): void {\n this.#textarea =\n this.querySelector<HTMLElement>(':scope > aui-textarea') ??\n this.querySelector<HTMLElement>(':scope > aui-agent-prompt > aui-textarea')\n this.#submitBtn =\n this.querySelector<HTMLElement>('[data-submit]') ??\n this.#findLastPrimaryButton()\n }\n\n #findLastPrimaryButton(): HTMLElement | null {\n const actions =\n this.querySelector(':scope > [data-role=\"actions\"]') ??\n this.querySelector(':scope > aui-agent-prompt > [data-role=\"actions\"]')\n if (!actions) {\n // Fall back to finding any primary button\n const primaries = this.querySelectorAll<HTMLElement>('aui-button[primary]')\n return primaries.length ? primaries[primaries.length - 1] : null\n }\n const primaries = actions.querySelectorAll<HTMLElement>('aui-button[primary]')\n return primaries.length ? primaries[primaries.length - 1] : null\n }\n\n // ── Submit button enable/disable based on content ─────────\n\n #syncSubmitEnabled(): void {\n if (!this.#submitBtn || this.disabled) return\n const empty = !this.value.trim()\n if (empty || this.busy) {\n this.#submitBtn.setAttribute('disabled', '')\n this.#submitBtn.removeAttribute('primary')\n this.#submitBtn.removeAttribute('accent')\n } else {\n this.#submitBtn.removeAttribute('disabled')\n this.#submitBtn.setAttribute('primary', '')\n this.#submitBtn.setAttribute('accent', '')\n }\n }\n\n // ── Event handlers ────────────────────────────────────────\n\n #onTextareaInput = (_e: Event): void => {\n if (this.disabled) return\n this.#syncSubmitEnabled()\n }\n\n #onClick = (e: Event): void => {\n if (this.disabled) return\n const target = e.target as HTMLElement\n if (target === this.#submitBtn || this.#submitBtn?.contains(target)) {\n this.#send()\n }\n }\n\n #onFocusIn = (e: FocusEvent): void => {\n const target = e.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n this.dispatchEvent(\n new CustomEvent('aui:composer-focus', { bubbles: true, composed: true }),\n )\n }\n\n #onFocusOut = (e: FocusEvent): void => {\n const target = e.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n this.dispatchEvent(\n new CustomEvent('aui:composer-blur', { bubbles: true, composed: true }),\n )\n }\n\n #onKeydown = (e: Event): void => {\n if (this.disabled) return\n if (this['no-enter-submit']) return\n\n const ke = e as KeyboardEvent\n if (ke.isComposing) return\n\n const target = ke.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n\n if (ke.key === 'Enter' && (ke.metaKey || ke.ctrlKey) && !ke.shiftKey) {\n ke.preventDefault()\n if (this.value.trim()) this.#send()\n }\n }\n\n // ── Send ──────────────────────────────────────────────────\n\n #send(): void {\n const val = this.value.trim()\n if (!val) return\n\n if (this.busy) {\n this.dispatchEvent(\n new CustomEvent('aui:composer-submit-blocked', {\n bubbles: true,\n composed: true,\n detail: { value: val },\n }),\n )\n return\n }\n\n const dispatched = this.dispatchEvent(\n new CustomEvent('aui:send', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { value: val },\n }),\n )\n\n if (dispatched && !this['no-auto-clear']) {\n this.value = ''\n this.#submitBtn?.setAttribute('disabled', '')\n }\n }\n}\n","// ── aui-agent-message ───────────────────────────────────────\n//\n// Individual chat message bubble with action toolbar.\n//\n// Accepts slotted content: aui-agent-text, aui-agent-activity,\n// aui-agent-seeds, or any custom content.\n//\n// Action toolbar appears on hover via CSS anchor positioning\n// (popover below the bubble by default).\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\n// ── Action registry ─────────────────────────────────────────\n\nexport interface AgentMessageActionDef {\n label: string\n icon: string\n}\n\nexport const ACTION_REGISTRY: Record<string, AgentMessageActionDef> = {\n 'copy': { label: 'Copy', icon: 'copy' },\n 'retry': { label: 'Retry', icon: 'arrow-clockwise' },\n 'edit': { label: 'Edit', icon: 'pencil-simple' },\n 'feedback-up': { label: 'Helpful', icon: 'thumbs-up' },\n 'feedback-down': { label: 'Not helpful', icon: 'thumbs-down' },\n 'continue': { label: 'Continue', icon: 'arrow-right' },\n}\n\nexport const ROLE_DEFAULTS: Record<string, string[]> = {\n assistant: ['copy', 'retry', 'feedback-up', 'feedback-down'],\n user: ['edit', 'retry'],\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nlet uidCounter = 0\nfunction uid(prefix: string): string {\n return `${prefix}-${++uidCounter}-${Math.random().toString(36).slice(2, 6)}`\n}\n\n// ── Component ───────────────────────────────────────────────\n\nexport class AuiAgentMessage extends AgentElement {\n static override attributes: AttributeSchema = {\n role: { type: 'string', default: 'assistant' },\n 'message-id': { type: 'string', default: '' },\n timestamp: { type: 'string', default: '' },\n status: { type: 'enum', values: ['sending', 'sent', 'error', 'streaming', 'partial'], default: 'sent' },\n actions: { type: 'string', default: '' },\n 'actions-style': { type: 'enum', values: ['icon', 'label', 'icon-label'], default: 'icon' },\n 'actions-position': { type: 'enum', values: ['below', 'inside'], default: 'below' },\n }\n\n declare role: string\n declare 'message-id': string\n declare timestamp: string\n declare status: string\n declare actions: string\n declare 'actions-style': string\n declare 'actions-position': string\n\n #internals: ElementInternals\n #actionsEl: HTMLElement | null = null\n #isPopoverToolbar = false\n #showTimer = 0\n #hideTimer = 0\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n get messageId(): string { return this.getAttribute('message-id') ?? '' }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n // Hover listeners for popover toolbar\n this.addEventListener('pointerenter', this.#showToolbar)\n this.addEventListener('pointerleave', this.#hideToolbarDelayed)\n\n // Stamp actions toolbar — reactive to role, actions, actionsStyle, actionsPosition, and status\n this.addEffect(() => {\n const role = this.role\n const actionsAttr = this.actions\n const style = this['actions-style']\n const position = this['actions-position']\n const status = this.status\n this.#stampActions(role, actionsAttr || null, style, position, status)\n })\n\n // Sync ARIA\n this.#internals.role = 'article'\n }\n\n protected override dispose(): void {\n this.removeEventListener('pointerenter', this.#showToolbar)\n this.removeEventListener('pointerleave', this.#hideToolbarDelayed)\n clearTimeout(this.#showTimer)\n clearTimeout(this.#hideTimer)\n if (this.#actionsEl) {\n this.#cleanupToolbar()\n this.#actionsEl = null\n }\n }\n\n // ── Popover hover handlers ────────────────────────────────\n\n #showToolbar = (): void => {\n clearTimeout(this.#hideTimer)\n if (!this.#actionsEl || !this.#isPopoverToolbar || this.status === 'partial') return\n clearTimeout(this.#showTimer)\n this.#showTimer = window.setTimeout(() => {\n try { this.#actionsEl?.showPopover() } catch { /* already open */ }\n }, 300)\n }\n\n #hideToolbarDelayed = (): void => {\n if (!this.#isPopoverToolbar || this.status === 'partial') return\n clearTimeout(this.#showTimer)\n clearTimeout(this.#hideTimer)\n this.#hideTimer = window.setTimeout(() => {\n try { this.#actionsEl?.hidePopover() } catch { /* already hidden */ }\n }, 150)\n }\n\n // ── Actions ───────────────────────────────────────────────\n\n #cleanupToolbar(): void {\n if (!this.#actionsEl) return\n if (this.#isPopoverToolbar) {\n this.#actionsEl.removeEventListener('pointerenter', this.#showToolbar)\n this.#actionsEl.removeEventListener('pointerleave', this.#hideToolbarDelayed)\n this.#actionsEl.removeEventListener('focusin', this.#showToolbar)\n this.#actionsEl.removeEventListener('focusout', this.#hideToolbarDelayed)\n try { this.#actionsEl.hidePopover() } catch { /* ok */ }\n this.style.removeProperty('anchor-name')\n this.#isPopoverToolbar = false\n }\n this.#actionsEl.removeEventListener('click', this.#onActionClick)\n this.#actionsEl.remove()\n }\n\n #stampActions(role: string, actionsAttr: string | null, style: string, position: string, status: string): void {\n if (this.#actionsEl) {\n this.#cleanupToolbar()\n this.#actionsEl = null\n }\n clearTimeout(this.#hideTimer)\n\n // Skip if actions=\"none\"\n if (actionsAttr === 'none') return\n\n // Skip if consumer provides a [slot=\"actions\"] child\n if (this.querySelector('[slot=\"actions\"]')) return\n\n // Resolve action list\n let actionList: string[]\n if (actionsAttr) {\n actionList = actionsAttr.split(',').map((s) => s.trim()).filter(Boolean)\n } else {\n actionList = ROLE_DEFAULTS[role] ?? []\n }\n\n // If partial status, append continue action\n if (status === 'partial' && !actionList.includes('continue')) {\n actionList = [...actionList, 'continue']\n }\n\n if (actionList.length === 0) return\n\n const toolbar = document.createElement('div')\n toolbar.setAttribute('data-role', 'actions')\n toolbar.setAttribute('role', 'toolbar')\n toolbar.setAttribute('aria-label', 'Message actions')\n if (style !== 'label') {\n toolbar.setAttribute('data-style', style)\n }\n\n for (const id of actionList) {\n const def = ACTION_REGISTRY[id]\n if (!def) continue\n toolbar.appendChild(this.#actionButton(id, def, style))\n }\n\n if (toolbar.children.length === 0) return\n\n toolbar.addEventListener('click', this.#onActionClick)\n\n if (position === 'below') {\n // Popover toolbar anchored below the message via CSS anchor positioning\n toolbar.setAttribute('popover', 'manual')\n const anchorId = uid('msg')\n this.style.setProperty('anchor-name', `--${anchorId}`)\n toolbar.style.setProperty('position-anchor', `--${anchorId}`)\n\n this.appendChild(toolbar)\n this.#isPopoverToolbar = true\n\n // Keep toolbar open when hovering/focusing it\n toolbar.addEventListener('pointerenter', this.#showToolbar)\n toolbar.addEventListener('pointerleave', this.#hideToolbarDelayed)\n toolbar.addEventListener('focusin', this.#showToolbar)\n toolbar.addEventListener('focusout', this.#hideToolbarDelayed)\n\n // Partial status: always visible\n if (status === 'partial') {\n toolbar.showPopover()\n }\n } else {\n // Inside: append inside the bubble\n this.appendChild(toolbar)\n }\n this.#actionsEl = toolbar\n }\n\n #actionButton(action: string, def: AgentMessageActionDef, style: string): HTMLElement {\n const btn = document.createElement('aui-button')\n btn.setAttribute('ghost', '')\n btn.setAttribute('size', 'sm')\n btn.setAttribute('data-action', action)\n btn.setAttribute('aria-label', def.label)\n\n if (style === 'icon' || style === 'icon-label') {\n const icon = document.createElement('aui-icon')\n icon.setAttribute('name', def.icon)\n icon.setAttribute('slot', 'leading')\n btn.appendChild(icon)\n }\n\n if (style === 'label' || style === 'icon-label') {\n btn.appendChild(document.createTextNode(def.label))\n }\n\n // Handle keyboard activation (fallback if aui-button not registered)\n btn.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n btn.click()\n }\n })\n\n return btn\n }\n\n #onActionClick = (e: Event): void => {\n const target = (e.target as HTMLElement).closest('[data-action]') as HTMLElement | null\n if (!target) return\n const action = target.getAttribute('data-action')\n if (!action) return\n\n e.stopPropagation()\n\n // Continue action fires a separate event\n if (action === 'continue') {\n this.dispatchEvent(new CustomEvent('aui:continue-request', {\n bubbles: true,\n composed: true,\n detail: { messageId: this.messageId },\n }))\n return\n }\n\n this.dispatchEvent(new CustomEvent('aui:message-action', {\n bubbles: true,\n composed: true,\n detail: {\n action,\n messageId: this.messageId,\n },\n }))\n }\n}\n","// ── aui-agent-panel ─────────────────────────────────────────\n//\n// Top-level chat shell that composes header, feed, and input.\n// Discovers child aui-agent-feed and aui-agent-input and\n// coordinates focus and layout. No DOM stamping — just\n// discovers and coordinates existing children.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentPanel extends AgentElement {\n static override attributes: AttributeSchema = {\n 'panel-title': { type: 'string', default: '' },\n 'auto-focus': { type: 'string', default: 'ready' }, // 'ready' | 'open-request' | 'never'\n }\n\n declare 'panel-title': string\n declare 'auto-focus': string\n\n #feed: HTMLElement | null = null\n #input: HTMLElement | null = null\n #internals: ElementInternals\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n /** Delegate focus to the child agent-input composer. */\n focusComposer(): void {\n if (this.#input && 'focusComposer' in this.#input) {\n (this.#input as any).focusComposer()\n }\n }\n\n /** Reference to the discovered feed element. */\n get feed(): HTMLElement | null { return this.#feed }\n\n /** Reference to the discovered input element. */\n get input(): HTMLElement | null { return this.#input }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'region'\n\n // Sync aria-label from panel-title reactively\n this.addEffect(() => {\n const title = this['panel-title']\n this.#internals.ariaLabel = title || 'Chat'\n })\n\n this.#discoverChildren()\n\n // Auto-focus composer when ready\n if (this['auto-focus'] === 'ready') {\n // Defer to let children upgrade\n requestAnimationFrame(() => {\n this.focusComposer()\n })\n }\n }\n\n protected override dispose(): void {\n this.#feed = null\n this.#input = null\n }\n\n // ── Child discovery ───────────────────────────────────────\n\n #discoverChildren(): void {\n this.#feed = this.querySelector<HTMLElement>('aui-agent-feed')\n this.#input = this.querySelector<HTMLElement>('aui-agent-input')\n }\n}\n","// ── aui-agent-prompt ────────────────────────────────────────\n//\n// Visual wrapper/chrome around the textarea in an advanced layout.\n// Provides bordered styling with focus ring when the inner\n// aui-textarea gains focus.\n//\n// Contains aui-textarea and optionally action toolbar buttons.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentPrompt extends AgentElement {\n static override attributes: AttributeSchema = {\n disabled: { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.addEffect(() => {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true')\n } else {\n this.removeAttribute('aria-disabled')\n }\n })\n }\n\n protected override dispose(): void {}\n}\n","// ── aui-agent-seeds ─────────────────────────────────────────\n//\n// Suggestion chips — pre-seeded quick responses.\n//\n// Options can be provided as JSON attribute or via the `options` property.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport interface SeedOption {\n value: string\n label: string\n icon?: string\n}\n\nexport class AuiAgentSeeds extends AgentElement {\n static override attributes: AttributeSchema = {\n options: { type: 'string', default: '' },\n disabled: { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n\n #parsedOptions: SeedOption[] = []\n #containerEl: HTMLElement | null = null\n\n // ── Public API ────────────────────────────────────────────\n\n get options(): SeedOption[] { return this.#parsedOptions }\n set options(val: SeedOption[]) {\n this.#parsedOptions = val\n this.setAttribute('options', JSON.stringify(val))\n this.#renderChips()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.setAttribute('role', 'group')\n this.setAttribute('aria-label', 'Suggestions')\n\n // Parse initial options from attribute\n const optAttr = this.getAttribute('options')\n if (optAttr) {\n try { this.#parsedOptions = JSON.parse(optAttr) }\n catch { this.#parsedOptions = [] }\n }\n\n // React to attribute changes\n this.addEffect(() => {\n const raw = this.getAttribute('options')\n if (raw) {\n try { this.#parsedOptions = JSON.parse(raw) }\n catch { this.#parsedOptions = [] }\n }\n this.#renderChips()\n })\n\n this.addEffect(() => {\n const _disabled = this.disabled // track\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true')\n } else {\n this.removeAttribute('aria-disabled')\n }\n })\n\n // Event delegation: single listener for all chip interactions\n this.addEventListener('click', this.#onChipClick)\n this.addEventListener('keydown', this.#onChipKeydown)\n }\n\n protected override dispose(): void {\n this.removeEventListener('click', this.#onChipClick)\n this.removeEventListener('keydown', this.#onChipKeydown)\n this.#containerEl = null\n }\n\n // ── Event delegation ────────────────────────────────────────\n\n #onChipClick = (e: Event): void => {\n if (this.disabled) return\n const chip = (e.target as Element).closest('[data-seed]')\n if (!chip) return\n const value = chip.getAttribute('data-seed') ?? ''\n const label = chip.querySelector('span:last-child')?.textContent ?? value\n this.dispatchEvent(new CustomEvent('aui:seed-select', {\n bubbles: true,\n composed: true,\n detail: { value, label },\n }))\n }\n\n #onChipKeydown = (e: Event): void => {\n const ke = e as KeyboardEvent\n if (ke.key === 'Enter' || ke.key === ' ') {\n const chip = (ke.target as Element).closest('[data-seed]')\n if (!chip) return\n ke.preventDefault()\n ;(chip as HTMLElement).click()\n }\n }\n\n // ── Rendering ─────────────────────────────────────────────\n\n #renderChips(): void {\n // Clear existing content\n this.textContent = ''\n\n const opts = this.#parsedOptions\n if (opts.length === 0) return\n\n const container = document.createElement('div')\n container.setAttribute('data-agent-seeds-wrap', '')\n\n for (const opt of opts) {\n const chip = document.createElement('span')\n chip.setAttribute('role', 'button')\n chip.setAttribute('tabindex', '0')\n chip.setAttribute('data-seed', opt.value)\n chip.setAttribute('data-agent-seed-chip', '')\n\n if (opt.icon) {\n const icon = document.createElement('aui-icon')\n icon.setAttribute('name', opt.icon)\n chip.appendChild(icon)\n }\n\n const label = document.createElement('span')\n label.textContent = opt.label\n chip.appendChild(label)\n\n container.appendChild(chip)\n }\n\n this.appendChild(container)\n this.#containerEl = container\n }\n}\n","// ── aui-agent-text ──────────────────────────────────────────\n//\n// Rich text message renderer with lightweight markdown support.\n//\n// Renders a markdown subset (paragraphs, headings, lists, code fences,\n// inline code, bold, italic, links, blockquotes) to sanitized HTML.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentText extends AgentElement {\n static override deferChildren = true\n\n static override attributes: AttributeSchema = {\n format: { type: 'enum', values: ['markdown', 'plain'], default: 'markdown' },\n }\n\n declare format: string\n\n #content = ''\n #outputEl: HTMLDivElement | null = null\n #renderTimer = 0\n\n // ── Public API ────────────────────────────────────────────\n\n get content(): string { return this.#content }\n set content(val: string) {\n this.#content = val\n this.#scheduleRender()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n // If element has text content on setup and no content was set via property,\n // use the text content as the source.\n // Read innerText with pre-wrap to preserve newlines from the HTML source.\n if (!this.#content && this.textContent?.trim()) {\n // Temporarily force pre-wrap so innerText preserves line breaks\n const prev = this.style.whiteSpace\n this.style.whiteSpace = 'pre-wrap'\n this.#content = (this.innerText || '').trim()\n this.style.whiteSpace = prev\n }\n\n // Create output container\n this.#outputEl = document.createElement('div')\n this.#outputEl.setAttribute('data-agent-prose', '')\n this.textContent = ''\n this.appendChild(this.#outputEl)\n\n // React to format changes\n this.addEffect(() => {\n const _fmt = this.format // track the signal\n this.#scheduleRender()\n })\n\n // Initial render\n this.#render()\n }\n\n protected override dispose(): void {\n cancelAnimationFrame(this.#renderTimer)\n this.#outputEl = null\n }\n\n // ── Rendering ─────────────────────────────────────────────\n\n #scheduleRender(): void {\n cancelAnimationFrame(this.#renderTimer)\n this.#renderTimer = requestAnimationFrame(() => this.#render())\n }\n\n #render(): void {\n if (!this.#outputEl) return\n const raw = this.#content\n const fmt = this.format\n\n if (fmt === 'plain') {\n this.#outputEl.textContent = raw\n } else {\n this.#outputEl.innerHTML = sanitizeHtml(renderMarkdown(raw))\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Lightweight markdown -> HTML renderer\n// Subset: paragraphs, headings, lists, code fences,\n// inline code, bold, italic, links, blockquotes\n// ═══════════════════════════════════════════════════════\n\nconst ALLOWED_TAGS = new Set([\n 'p', 'br', 'strong', 'em', 'code', 'pre', 'a',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'ul', 'ol', 'li', 'blockquote', 'hr',\n])\n\nfunction escapeHtml(str: string): string {\n return str\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;')\n}\n\nfunction renderInline(text: string): string {\n let out = escapeHtml(text)\n\n // Inline code: `code`\n out = out.replace(/`([^`]+)`/g, '<code>$1</code>')\n\n // Bold: **text** or __text__\n out = out.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n out = out.replace(/__(.+?)__/g, '<strong>$1</strong>')\n\n // Italic: *text* or _text_\n out = out.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n out = out.replace(/(?<!\\w)_(.+?)_(?!\\w)/g, '<em>$1</em>')\n\n // Links: [text](url) — only http/https\n out = out.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g,\n '<a href=\"$2\" rel=\"noopener noreferrer\" target=\"_blank\">$1</a>')\n\n return out\n}\n\nexport function renderMarkdown(src: string): string {\n if (!src) return ''\n\n const lines = src.split('\\n')\n const html: string[] = []\n let i = 0\n\n while (i < lines.length) {\n const line = lines[i]\n\n // Code fence\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim()\n const codeLines: string[] = []\n i += 1\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i])\n i += 1\n }\n i += 1 // skip closing ```\n const langAttr = lang ? ` data-lang=\"${escapeHtml(lang)}\"` : ''\n html.push(`<pre${langAttr}><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`)\n continue\n }\n\n // Heading: # ... ######\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)/)\n if (headingMatch) {\n const level = headingMatch[1].length\n html.push(`<h${level}>${renderInline(headingMatch[2])}</h${level}>`)\n i += 1\n continue\n }\n\n // Horizontal rule\n if (/^---+$/.test(line.trim()) || /^\\*\\*\\*+$/.test(line.trim())) {\n html.push('<hr>')\n i += 1\n continue\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n const quoteLines: string[] = []\n while (i < lines.length && lines[i].startsWith('> ')) {\n quoteLines.push(lines[i].slice(2))\n i += 1\n }\n html.push(`<blockquote>${renderMarkdown(quoteLines.join('\\n'))}</blockquote>`)\n continue\n }\n\n // Unordered list — allow blank lines between items\n if (/^[-*+]\\s/.test(line)) {\n const items: string[] = []\n while (i < lines.length) {\n if (/^[-*+]\\s/.test(lines[i])) {\n items.push(lines[i].replace(/^[-*+]\\s/, ''))\n i += 1\n } else if (!lines[i].trim() && i + 1 < lines.length && /^[-*+]\\s/.test(lines[i + 1])) {\n i += 1\n } else {\n break\n }\n }\n html.push('<ul>' + items.map(item => `<li>${renderInline(item)}</li>`).join('') + '</ul>')\n continue\n }\n\n // Ordered list — allow blank lines between items\n if (/^\\d+\\.\\s/.test(line)) {\n const items: string[] = []\n while (i < lines.length) {\n if (/^\\d+\\.\\s/.test(lines[i])) {\n items.push(lines[i].replace(/^\\d+\\.\\s/, ''))\n i += 1\n } else if (!lines[i].trim() && i + 1 < lines.length && /^\\d+\\.\\s/.test(lines[i + 1])) {\n i += 1\n } else {\n break\n }\n }\n html.push('<ol>' + items.map(item => `<li>${renderInline(item)}</li>`).join('') + '</ol>')\n continue\n }\n\n // Empty line\n if (!line.trim()) {\n i += 1\n continue\n }\n\n // Paragraph: collect contiguous non-empty lines\n const pLines: string[] = []\n while (\n i < lines.length &&\n lines[i].trim() &&\n !lines[i].startsWith('#') &&\n !lines[i].startsWith('```') &&\n !lines[i].startsWith('> ') &&\n !/^[-*+]\\s/.test(lines[i]) &&\n !/^\\d+\\.\\s/.test(lines[i]) &&\n !/^---+$/.test(lines[i].trim())\n ) {\n pLines.push(lines[i])\n i += 1\n }\n if (pLines.length > 0) {\n html.push(`<p>${renderInline(pLines.join('\\n'))}</p>`)\n }\n }\n\n return html.join('')\n}\n\n/** Sanitize rendered HTML — strip any tags not in allowlist. */\nexport function sanitizeHtml(html: string): string {\n return html.replace(/<\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*>/g, (match, tag) => {\n const lower = tag.toLowerCase()\n if (ALLOWED_TAGS.has(lower)) return match\n return ''\n })\n}\n","// ── aui-agent-thread ────────────────────────────────────────\n//\n// Message group — cluster of messages from the same sender.\n//\n// Provides a 2x2 grid layout:\n// - Col 1, row 1-2: avatar (bottom-aligned)\n// - Col 2, row 1: context area (metadata, reasoning, timestamps)\n// - Col 2, row 2: messages area (chat bubbles, flex column)\n//\n// On activate, non-avatar children are sorted into two wrapper divs:\n// - `[data-agent-context]` — non-message children (row 1)\n// - `[data-agent-bubbles]` — `aui-agent-message` children (row 2)\n//\n// A MutationObserver routes dynamically added children into the\n// correct wrapper automatically.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentThread extends AgentElement {\n static override attributes: AttributeSchema = {\n role: { type: 'string', default: '' },\n sender: { type: 'string', default: '' },\n 'avatar-align': { type: 'enum', values: ['top', 'center', 'bottom'], default: '' },\n }\n\n declare role: string\n declare sender: string\n declare 'avatar-align': string\n\n #internals: ElementInternals\n #contextEl: HTMLDivElement | null = null\n #bubblesEl: HTMLDivElement | null = null\n #observer: MutationObserver | null = null\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'group'\n const sender = this.getAttribute('sender')\n if (sender) {\n this.setAttribute('aria-label', `Messages from ${sender}`)\n }\n\n // Re-set aria-label when sender attribute changes\n this.addEffect(() => {\n const s = this.sender // track\n if (s) {\n this.setAttribute('aria-label', `Messages from ${s}`)\n } else {\n this.removeAttribute('aria-label')\n }\n })\n\n this.#wrapChildren()\n\n // Route dynamically added children into the correct wrapper\n this.#observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of m.addedNodes) {\n if (!(node instanceof Element)) continue\n // Skip avatar and our own wrappers\n if (node.localName === 'aui-avatar') continue\n if (node === this.#contextEl || node === this.#bubblesEl) continue\n // Route to correct wrapper\n if (node.localName === 'aui-agent-message') {\n this.#bubblesEl?.appendChild(node)\n } else {\n this.#contextEl?.appendChild(node)\n }\n }\n }\n })\n this.#observer.observe(this, { childList: true })\n }\n\n protected override dispose(): void {\n this.#observer?.disconnect()\n this.#observer = null\n // Unwrap children back to flat DOM\n if (this.#bubblesEl) {\n while (this.#bubblesEl.firstChild) {\n this.appendChild(this.#bubblesEl.firstChild)\n }\n this.#bubblesEl.remove()\n this.#bubblesEl = null\n }\n if (this.#contextEl) {\n while (this.#contextEl.firstChild) {\n this.appendChild(this.#contextEl.firstChild)\n }\n this.#contextEl.remove()\n this.#contextEl = null\n }\n }\n\n // ── DOM wrapping ──────────────────────────────────────────\n\n #wrapChildren(): void {\n const context = document.createElement('div')\n context.setAttribute('data-agent-context', '')\n\n const bubbles = document.createElement('div')\n bubbles.setAttribute('data-agent-bubbles', '')\n\n // Sort children into context vs bubbles (skip avatar)\n const children = Array.from(this.childNodes)\n for (const child of children) {\n if (child instanceof Element && child.localName === 'aui-avatar') continue\n if (child instanceof Element && child.localName === 'aui-agent-message') {\n bubbles.appendChild(child)\n } else {\n context.appendChild(child)\n }\n }\n\n this.appendChild(context)\n this.appendChild(bubbles)\n this.#contextEl = context\n this.#bubblesEl = bubbles\n }\n}\n"],"names":["activeNode","batchDepth","pendingEffects","nodeMap","computeStack","getActiveNode","setActiveNode","node","getBatchDepth","incrementBatchDepth","decrementBatchDepth","SourceNode","value","ReactiveNode","fn","sub","runEffect","EffectNode","track","source","cleanup","dep","notify","prev","flushEffects","iterations","snapshot","SignalImpl","#node","next","signal","initial","sig","ComputedImpl","#recompute","computed","comp","effect","batch","untrack","parseRelaxedJson","raw","normalized","parseConfigEntry","obj","name","config","k","v","parseTraitsAttribute","trimmed","entry","arr","entries","registry","registerTrait","def","getTrait","getTraitNames","getTraitsByCategory","groups","list","validateComposition","hostTag","valid","focusTraits","gestureChannels","existing","attachCounter","attachTrait","target","traitName","options","instanceConfig","defaults","effectDisposers","anchorAttr","ctx","detail","key","attr","traitDispose","d","attrSignals","schemaProcessed","setupAttributeSchema","ctor","schema","keys","val","str","AgentElement","#state","#moveCheck","#readyResolve","#readyPromise","#traitDisposers","#attachTraits","validated","dispose","#disposeTraits","#effects","#disposeEffects","resolve","map","state","#enter","#exit","_old","#waitForChildren","attempts","activate","observer","define","tag","createContext","ContextRequestEvent","callback","subscribe","ContextProvider","#host","#key","#signal","#subscribers","#effectDispose","#handleRequest","host","initialValue","e","req","cb","ContextConsumer","#callback","#subscribe","AuiAgentActivity","#internals","#startTime","#timerFrame","#statusEl","#timeEl","#dotsEl","#contentEl","#stamp","#startTimer","#stopTimer","text","defaultLabel","show","#onClick","fragment","row","sep","#tickTimer","elapsed","formatElapsed","type","ms","totalSec","min","sec","SCROLL_THRESHOLD","AuiAgentFeed","#isPinned","#observer","#scrollRaf","smooth","#onScroll","#onChildrenChanged","wasPinned","pinned","AuiAgentInput","#textarea","#submitBtn","#discoverChildren","isDisabled","#syncSubmitEnabled","isBusy","#onTextareaInput","#onKeydown","#onFocusIn","#onFocusOut","#findLastPrimaryButton","actions","primaries","_e","#send","ke","ACTION_REGISTRY","ROLE_DEFAULTS","uidCounter","uid","prefix","AuiAgentMessage","#actionsEl","#isPopoverToolbar","#showTimer","#hideTimer","#showToolbar","#hideToolbarDelayed","role","actionsAttr","style","position","status","#stampActions","#cleanupToolbar","#onActionClick","actionList","s","toolbar","id","#actionButton","anchorId","action","btn","icon","AuiAgentPanel","#feed","#input","title","AuiAgentPrompt","AuiAgentSeeds","#parsedOptions","#containerEl","#renderChips","optAttr","#onChipClick","#onChipKeydown","chip","label","opts","container","opt","AuiAgentText","#content","#outputEl","#renderTimer","#scheduleRender","#render","sanitizeHtml","renderMarkdown","ALLOWED_TAGS","escapeHtml","renderInline","out","src","lines","html","i","line","lang","codeLines","langAttr","headingMatch","level","quoteLines","items","item","pLines","match","lower","AuiAgentThread","#contextEl","#bubblesEl","sender","#wrapChildren","mutations","m","context","bubbles","children","child"],"mappings":"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"}
1
+ {"version":3,"file":"agent-XMhz_6OA.js","sources":["../../../../shared/reactivity/graph.ts","../../../../shared/reactivity/signal.ts","../../../../shared/reactivity/computed.ts","../../../../shared/reactivity/effect.ts","../../../../shared/reactivity/batch.ts","../../../../shared/reactivity/untrack.ts","../../src/traits/parse.ts","../../src/traits/registry.ts","../../src/traits/attach.ts","../../src/element/agent-element.ts","../../src/element/define.ts","../../src/element/context.ts","../../src/components/agent/agent-activity.ts","../../src/components/agent/agent-feed.ts","../../src/components/agent/agent-input.ts","../../src/components/agent/agent-message.ts","../../src/components/agent/agent-panel.ts","../../src/components/agent/agent-prompt.ts","../../src/components/agent/agent-seeds.ts","../../src/components/agent/agent-text.ts","../../src/components/agent/agent-thread.ts"],"sourcesContent":["// ── Reactive dependency graph ────────────────────────────────\n//\n// Module-level singletons for reactive tracking.\n// Shared across all signals, computeds, and effects.\n\nlet activeNode: ReactiveNode | EffectNode | null = null\nlet batchDepth = 0\nconst pendingEffects = new Set<EffectNode>()\n\nexport const nodeMap = new WeakMap<object, SourceNode | ReactiveNode>()\nexport const computeStack = new Set<ReactiveNode>()\n\nexport function getActiveNode(): ReactiveNode | EffectNode | null {\n return activeNode\n}\n\nexport function setActiveNode(node: ReactiveNode | EffectNode | null): void {\n activeNode = node\n}\n\nexport function getBatchDepth(): number {\n return batchDepth\n}\n\nexport function incrementBatchDepth(): void {\n batchDepth++\n}\n\nexport function decrementBatchDepth(): void {\n batchDepth--\n}\n\nexport function addPendingEffect(node: EffectNode): void {\n pendingEffects.add(node)\n}\n\nexport class SourceNode {\n _value: unknown\n _subs = new Set<ReactiveNode | EffectNode>()\n\n constructor(value: unknown) {\n this._value = value\n }\n}\n\nexport class ReactiveNode {\n _subs = new Set<ReactiveNode | EffectNode>()\n _deps = new Set<SourceNode | ReactiveNode>()\n _fn: () => unknown\n _value: unknown = undefined\n _dirty = true\n\n constructor(fn: () => unknown) {\n this._fn = fn\n }\n\n _notify(): void {\n if (this._dirty) return\n this._dirty = true\n for (const sub of [...this._subs]) {\n if (sub instanceof ReactiveNode) {\n sub._notify()\n } else {\n if (batchDepth > 0) {\n pendingEffects.add(sub)\n } else {\n runEffect(sub)\n }\n }\n }\n }\n}\n\nexport class EffectNode {\n _deps = new Set<SourceNode | ReactiveNode>()\n _fn: () => void\n _disposed = false\n _running = false\n\n constructor(fn: () => void) {\n this._fn = fn\n }\n}\n\nexport function track(source: SourceNode | ReactiveNode): void {\n if (activeNode === null) return\n source._subs.add(activeNode)\n activeNode._deps.add(source)\n}\n\nexport function cleanup(node: ReactiveNode | EffectNode): void {\n for (const dep of node._deps) {\n dep._subs.delete(node)\n }\n node._deps.clear()\n}\n\nexport function notify(source: SourceNode): void {\n for (const sub of [...source._subs]) {\n if (sub instanceof ReactiveNode) {\n sub._notify()\n } else {\n if (batchDepth > 0) {\n pendingEffects.add(sub)\n } else {\n runEffect(sub)\n }\n }\n }\n}\n\nexport function runEffect(node: EffectNode): void {\n if (node._disposed || node._running) return\n cleanup(node)\n const prev = activeNode\n activeNode = node\n node._running = true\n try {\n node._fn()\n } finally {\n activeNode = prev\n node._running = false\n }\n}\n\nexport function flushEffects(): void {\n let iterations = 0\n while (pendingEffects.size > 0) {\n if (++iterations > 100) {\n throw new Error('Reactive flush limit exceeded (100 iterations). Possible infinite loop.')\n }\n const snapshot = [...pendingEffects]\n pendingEffects.clear()\n for (const node of snapshot) {\n runEffect(node)\n }\n }\n}\n","import type { Signal } from './types.ts'\nimport { SourceNode, track, notify, nodeMap } from './graph.ts'\n\nclass SignalImpl<T> implements Signal<T> {\n readonly [Symbol.toStringTag] = 'Signal' as const\n #node: SourceNode\n\n constructor(node: SourceNode) {\n this.#node = node\n }\n\n get value(): T {\n track(this.#node)\n return this.#node._value as T\n }\n\n set value(next: T) {\n if (Object.is(this.#node._value, next)) return\n this.#node._value = next\n notify(this.#node)\n }\n\n peek(): T {\n return this.#node._value as T\n }\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n const node = new SourceNode(initial)\n const sig = new SignalImpl<T>(node)\n nodeMap.set(sig, node)\n return sig\n}\n","import type { ReadonlySignal } from './types.ts'\nimport {\n ReactiveNode, track, cleanup,\n getActiveNode, setActiveNode,\n computeStack, nodeMap,\n} from './graph.ts'\n\nclass ComputedImpl<T> implements ReadonlySignal<T> {\n readonly [Symbol.toStringTag] = 'Computed' as const\n #node: ReactiveNode\n\n constructor(node: ReactiveNode) {\n this.#node = node\n }\n\n get value(): T {\n track(this.#node)\n if (this.#node._dirty) this.#recompute()\n return this.#node._value as T\n }\n\n peek(): T {\n if (this.#node._dirty) this.#recompute()\n return this.#node._value as T\n }\n\n #recompute(): void {\n const node = this.#node\n if (computeStack.has(node)) {\n throw new Error('Circular computed dependency detected.')\n }\n cleanup(node)\n computeStack.add(node)\n const prev = getActiveNode()\n setActiveNode(node)\n try {\n node._value = node._fn()\n } finally {\n setActiveNode(prev)\n computeStack.delete(node)\n node._dirty = false\n }\n }\n}\n\nexport function computed<T>(fn: () => T): ReadonlySignal<T> {\n const node = new ReactiveNode(fn)\n const comp = new ComputedImpl<T>(node)\n nodeMap.set(comp, node)\n return comp\n}\n","import type { Dispose } from './types.ts'\nimport { EffectNode, cleanup, runEffect } from './graph.ts'\n\nexport function effect(fn: () => void): Dispose {\n const node = new EffectNode(fn)\n runEffect(node)\n return () => {\n if (node._disposed) return\n node._disposed = true\n cleanup(node)\n }\n}\n","import {\n incrementBatchDepth, decrementBatchDepth,\n getBatchDepth, flushEffects,\n} from './graph.ts'\n\nexport function batch(fn: () => void): void {\n incrementBatchDepth()\n try {\n fn()\n } finally {\n decrementBatchDepth()\n if (getBatchDepth() === 0) flushEffects()\n }\n}\n","import { getActiveNode, setActiveNode } from './graph.ts'\n\nexport function untrack<T>(fn: () => T): T {\n const prev = getActiveNode()\n setActiveNode(null)\n try {\n return fn()\n } finally {\n setActiveNode(prev)\n }\n}\n","// ── Trait attribute parser ────────────────────────────────────\n//\n// Parses the `traits` attribute value into TraitEntry[].\n// Supports three forms:\n// \"toggle-scheme\" → single trait, defaults\n// \"toggle-scheme draggable\" → multiple, space-separated\n// \"{ trait: 'toggle-scheme', persist: 'true' }\" → configured\n\nimport type { TraitEntry } from './types.ts'\n\n/** Parse a relaxed JSON-like object (single-quoted keys/values) */\nconst parseRelaxedJson = (raw: string): Record<string, string> => {\n // Convert single quotes to double quotes for JSON.parse\n // Handle: { trait: 'toggle-scheme', scheme: 'system' }\n // Also handle unquoted keys: { trait: 'value' }\n const normalized = raw\n .replace(/'/g, '\"')\n .replace(/(\\w[\\w-]*)(?=\\s*:)/g, '\"$1\"')\n\n try {\n return JSON.parse(normalized)\n } catch {\n console.warn(`[agent-ui] Failed to parse trait config: ${raw}`)\n return {}\n }\n}\n\n/** Parse a single JSON-like entry into a TraitEntry */\nconst parseConfigEntry = (raw: string): TraitEntry | null => {\n const obj = parseRelaxedJson(raw)\n const name = obj['trait']\n if (!name) {\n console.warn(`[agent-ui] Trait config missing \"trait\" key: ${raw}`)\n return null\n }\n\n const config: Record<string, string> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== 'trait') config[k] = String(v)\n }\n return { name, config }\n}\n\n/** Parse the `traits` attribute value into an array of TraitEntry */\nexport const parseTraitsAttribute = (value: string | null): readonly TraitEntry[] => {\n if (!value || !value.trim()) return []\n\n const trimmed = value.trim()\n\n // JSON object form: { trait: '...', ... }\n if (trimmed.startsWith('{')) {\n const entry = parseConfigEntry(trimmed)\n return entry ? [entry] : []\n }\n\n // JSON array form: [{ trait: '...' }, ...]\n if (trimmed.startsWith('[')) {\n try {\n const normalized = trimmed.replace(/'/g, '\"').replace(/(\\w[\\w-]*)(?=\\s*:)/g, '\"$1\"')\n const arr: Record<string, string>[] = JSON.parse(normalized)\n const entries: TraitEntry[] = []\n for (const obj of arr) {\n const name = obj['trait']\n if (!name) continue\n const config: Record<string, string> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== 'trait') config[k] = String(v)\n }\n entries.push({ name, config })\n }\n return entries\n } catch {\n console.warn(`[agent-ui] Failed to parse traits array: ${trimmed}`)\n return []\n }\n }\n\n // Space-separated simple names: \"toggle-scheme draggable\"\n return trimmed.split(/\\s+/).map(name => ({ name, config: {} }))\n}\n","// ── Trait registry ───────────────────────────────────────────\n//\n// Central registry + composition validation.\n// Warns at runtime when traits are used incorrectly.\n\nimport type { TraitDefinition, TraitEntry } from './types.ts'\n\nconst registry = new Map<string, TraitDefinition>()\n\n/** Register a trait definition */\nexport const registerTrait = (def: TraitDefinition): void => {\n if (registry.has(def.name)) {\n console.warn(`[agent-ui] Trait \"${def.name}\" already registered, overwriting.`)\n }\n registry.set(def.name, def)\n}\n\n/** Look up a trait by name */\nexport const getTrait = (name: string): TraitDefinition | undefined => {\n return registry.get(name)\n}\n\n/** Get all registered trait names */\nexport const getTraitNames = (): readonly string[] => {\n return [...registry.keys()]\n}\n\n/** Get registered traits grouped by category */\nexport const getTraitsByCategory = (): ReadonlyMap<string, readonly string[]> => {\n const groups = new Map<string, string[]>()\n for (const def of registry.values()) {\n let list = groups.get(def.category)\n if (!list) {\n list = []\n groups.set(def.category, list)\n }\n list.push(def.name)\n }\n return groups\n}\n\n/**\n * Validate composition rules for a set of traits on one element.\n * Logs warnings for violations. Returns only the valid entries.\n */\nexport const validateComposition = (\n entries: readonly TraitEntry[],\n hostTag: string,\n): readonly { entry: TraitEntry; def: TraitDefinition }[] => {\n const valid: { entry: TraitEntry; def: TraitDefinition }[] = []\n const focusTraits: string[] = []\n const gestureChannels = new Map<string, string>() // channel → trait name\n\n for (const entry of entries) {\n const def = registry.get(entry.name)\n\n if (!def) {\n console.warn(\n `[agent-ui] Unknown trait \"${entry.name}\" on <${hostTag}>. Not in registry.`\n )\n continue\n }\n\n // Focus exclusivity check\n if (def.category === 'focus') {\n if (focusTraits.length > 0) {\n console.warn(\n `[agent-ui] Multiple focus traits on <${hostTag}>: ` +\n `\"${entry.name}\" conflicts with \"${focusTraits[0]}\". ` +\n `Only one focus trait allowed per element.`\n )\n continue\n }\n focusTraits.push(entry.name)\n }\n\n // Gesture channel conflict check\n if (def.category === 'gesture' && def.channel) {\n const existing = gestureChannels.get(def.channel)\n if (existing) {\n console.warn(\n `[agent-ui] Gesture conflict on <${hostTag}>: ` +\n `\"${entry.name}\" and \"${existing}\" both use ${def.channel} channel.`\n )\n continue\n }\n gestureChannels.set(def.channel, entry.name)\n }\n\n valid.push({ entry, def })\n }\n\n return valid\n}\n","// ── attachTrait ──────────────────────────────────────────────\n//\n// Programmatic API for installing a registered trait on any\n// HTMLElement — not just AgentElement. Components like aui-select\n// use this to install popover behavior on child elements.\n//\n// Usage:\n// import { attachTrait } from '#traits'\n// const detach = attachTrait(listEl, 'popover', { anchor: '#trigger' })\n\nimport { effect } from '#reactivity'\nimport type { Dispose } from '#reactivity'\nimport { getTrait } from './registry.ts'\nimport type { TraitContext } from './types.ts'\n\nexport interface AttachTraitOptions {\n /** Config overrides (same keys as declarative trait config) */\n config?: Readonly<Record<string, string>>\n /** Direct element reference for anchor — avoids needing a CSS selector */\n anchorElement?: HTMLElement\n}\n\nlet attachCounter = 0\n\n/**\n * Attach a registered trait to any HTMLElement programmatically.\n * Returns a dispose function that detaches the trait and cleans up.\n */\nexport const attachTrait = (\n target: HTMLElement,\n traitName: string,\n options?: AttachTraitOptions,\n): Dispose => {\n const def = getTrait(traitName)\n if (!def) {\n console.warn(`[agent-ui] attachTrait: unknown trait \"${traitName}\".`)\n return () => {}\n }\n\n const instanceConfig = { ...(options?.config ?? {}) }\n const defaults = def.defaults ?? {}\n const effectDisposers: Dispose[] = []\n\n // If anchorElement is provided, stamp a data attribute and pass\n // the CSS selector so the overlay trait can find it by selector.\n let anchorAttr = ''\n if (options?.anchorElement) {\n anchorAttr = `aui-anchor-${++attachCounter}`\n options.anchorElement.setAttribute('data-aui-anchor', anchorAttr)\n instanceConfig.anchor = `[data-aui-anchor=\"${anchorAttr}\"]`\n }\n\n const ctx: TraitContext = {\n host: target,\n\n addEffect: (fn: () => void) => {\n effectDisposers.push(effect(fn))\n },\n\n emit: (name: string, detail?: Record<string, unknown>) => {\n target.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n detail,\n }))\n },\n\n config: (key: string) => instanceConfig[key] ?? defaults[key],\n\n expose: (key: string, value: string | boolean) => {\n const attr = `data-${def.name}-${key}`\n if (typeof value === 'boolean') {\n if (value) target.setAttribute(attr, '')\n else target.removeAttribute(attr)\n } else {\n target.setAttribute(attr, value)\n }\n },\n\n unexpose: (key: string) => {\n target.removeAttribute(`data-${def.name}-${key}`)\n },\n }\n\n const traitDispose = def.attach(ctx)\n\n return () => {\n traitDispose?.()\n for (const d of effectDisposers) d()\n effectDisposers.length = 0\n // Clean up the anchor data attribute\n if (anchorAttr) {\n options?.anchorElement?.removeAttribute('data-aui-anchor')\n }\n }\n}\n","// ── AgentElement ─────────────────────────────────────────────\n//\n// Base class for all registered agent-ui custom elements.\n// Provides: lifecycle state machine, schema-driven attributes,\n// renewable ready promise, effect ownership, deferChildren.\n\nimport { signal, effect, batch } from '#reactivity'\nimport type { Signal, Dispose } from '#reactivity'\nimport type { LifecycleState, AttributeSchema, AttrDef } from './types.ts'\nimport { parseTraitsAttribute } from '../traits/parse.ts'\nimport { attachTrait } from '../traits/attach.ts'\nimport { validateComposition } from '../traits/registry.ts'\n\n// ── Module-scoped private state ─────────────────────────────\n\n/** Per-instance attribute signal maps, keyed by element instance */\nconst attrSignals = new WeakMap<AgentElement, Map<string, Signal<unknown>>>()\n\n/** Tracks whether schema has been processed for a given constructor */\nconst schemaProcessed = new WeakSet<Function>()\n\n// ── Schema processing ───────────────────────────────────────\n\nexport function setupAttributeSchema(ctor: typeof AgentElement): void {\n if (schemaProcessed.has(ctor)) return\n schemaProcessed.add(ctor)\n\n const schema: AttributeSchema | undefined = (ctor as any).attributes\n if (!schema) return\n\n const keys = Object.keys(schema)\n\n Object.defineProperty(ctor, 'observedAttributes', {\n get() { return keys },\n configurable: true,\n })\n\n for (const name of keys) {\n const def = schema[name]\n if (name in ctor.prototype) continue // don't clobber explicit declarations\n\n Object.defineProperty(ctor.prototype, name, {\n get(this: AgentElement) {\n const map = attrSignals.get(this)\n return map?.get(name)?.value\n },\n set(this: AgentElement, val: unknown) {\n const map = attrSignals.get(this)\n const sig = map?.get(name)\n if (!sig) return\n\n sig.value = val\n\n // Reflect to attribute\n if (def.type === 'boolean') {\n this.toggleAttribute(name, !!val)\n } else {\n const str = String(val)\n if (str === def.default) {\n this.removeAttribute(name)\n } else {\n this.setAttribute(name, str)\n }\n }\n },\n configurable: true,\n enumerable: true,\n })\n }\n}\n\n// ── AgentElement class ──────────────────────────────────────\n\nexport class AgentElement extends HTMLElement {\n /** Override in subclass to declare component attributes */\n static attributes?: AttributeSchema\n\n /** Override in subclass to defer activate() until children are present */\n static deferChildren?: boolean\n\n // ── Lifecycle state ─────────────────────────────────────\n\n #state = signal<LifecycleState>('idle')\n #moveCheck = false\n\n get lifecycleState(): LifecycleState {\n return this.#state.peek()\n }\n\n // ── Ready promise ───────────────────────────────────────\n\n #readyResolve: (() => void) | null = null\n #readyPromise: Promise<void>\n\n get ready(): Promise<void> {\n return this.#readyPromise\n }\n\n // ── Trait ownership ─────────────────────────────────────\n\n #traitDisposers: Dispose[] = []\n\n #attachTraits(): void {\n const raw = this.getAttribute('traits')\n if (!raw) return\n\n const entries = parseTraitsAttribute(raw)\n const validated = validateComposition(entries, this.localName)\n\n for (const { entry } of validated) {\n const dispose = attachTrait(this, entry.name, {\n config: entry.config,\n })\n this.#traitDisposers.push(dispose)\n }\n }\n\n #disposeTraits(): void {\n for (const d of this.#traitDisposers) d()\n this.#traitDisposers.length = 0\n }\n\n // ── Effect ownership ────────────────────────────────────\n\n #effects: Dispose[] = []\n\n addEffect(fn: () => void): Dispose {\n const dispose = effect(fn)\n this.#effects.push(dispose)\n return dispose\n }\n\n #disposeEffects(): void {\n for (const dispose of this.#effects) dispose()\n this.#effects.length = 0\n }\n\n // ── Constructor ─────────────────────────────────────────\n\n constructor() {\n super()\n\n // Create ready promise\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#readyResolve = resolve\n })\n\n // Initialize attribute signals from schema\n const schema: AttributeSchema | undefined =\n (this.constructor as typeof AgentElement).attributes\n if (schema) {\n const map = new Map<string, Signal<unknown>>()\n for (const [name, def] of Object.entries(schema)) {\n map.set(name, signal(def.default))\n }\n attrSignals.set(this, map)\n }\n }\n\n // ── Native callbacks ────────────────────────────────────\n\n connectedCallback(): void {\n const state = this.#state.peek()\n\n // Abort pending exit (DOM move)\n if (state === 'exiting') {\n this.#moveCheck = true\n this.#state.value = 'entering'\n this.#enter()\n return\n }\n\n if (state === 'idle' || state === 'suspended') {\n // Renew ready promise on reconnect\n if (state === 'suspended') {\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#readyResolve = resolve\n })\n }\n this.#state.value = 'entering'\n this.#enter()\n }\n }\n\n disconnectedCallback(): void {\n const state = this.#state.peek()\n if (state !== 'connected' && state !== 'entering') return\n\n this.#state.value = 'exiting'\n this.#moveCheck = false\n\n // Microtask: if connectedCallback fires before this, it was a DOM move\n queueMicrotask(() => {\n if (this.#moveCheck) return // reconnected — was a move\n if (this.#state.peek() !== 'exiting') return\n\n this.#exit()\n })\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n val: string | null,\n ): void {\n const schema: AttributeSchema | undefined =\n (this.constructor as typeof AgentElement).attributes\n if (!schema) return\n\n const def = schema[name]\n if (!def) return\n\n const map = attrSignals.get(this)\n const sig = map?.get(name)\n if (!sig) return\n\n batch(() => {\n if (def.type === 'boolean') {\n const next = val !== null\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n } else if (def.type === 'enum') {\n if (val !== null && !(def as { values: readonly string[] }).values.includes(val)) {\n if (typeof import.meta !== 'undefined') {\n console.warn(\n `[agent-ui] Invalid value \"${val}\" for attribute \"${name}\". ` +\n `Expected one of: ${(def as { values: readonly string[] }).values.join(', ')}`,\n )\n }\n return\n }\n const next = val ?? def.default\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n } else {\n const next = val ?? def.default\n if (Object.is(sig.peek(), next)) return\n sig.value = next\n }\n })\n }\n\n // ── Lifecycle hooks (override in subclass) ──────────────\n\n /** Called when entering the DOM. Return a promise to animate entry. */\n protected willEnter(): Promise<void> | void {}\n\n /** Called after entry is complete. Element is fully interactive. */\n protected didEnter(): void {}\n\n /** Setup hook — create controllers, wire effects. */\n protected activate(): void {}\n\n /** Called when leaving the DOM. Return a promise to animate exit. */\n protected willExit(): Promise<void> | void {}\n\n /** Called after exit is complete. Safe to teardown. */\n protected didExit(): void {}\n\n /** Cleanup hook — destroy controllers. */\n protected dispose(): void {}\n\n // ── Internal lifecycle ──────────────────────────────────\n\n async #enter(): Promise<void> {\n try {\n await this.willEnter()\n } catch {\n // willEnter failed — still proceed to connected\n }\n\n if (this.#state.peek() !== 'entering') return // interrupted\n\n this.#state.value = 'connected'\n\n // deferChildren: wait for children before activate\n const ctor = this.constructor as typeof AgentElement\n if (ctor.deferChildren && this.children.length === 0) {\n this.#waitForChildren()\n } else {\n this.activate()\n this.#attachTraits()\n }\n\n this.didEnter()\n this.#readyResolve?.()\n this.#readyResolve = null\n }\n\n async #exit(): Promise<void> {\n try {\n await this.willExit()\n } catch {\n // willExit failed — still proceed to teardown\n }\n\n if (this.#state.peek() !== 'exiting') return // reconnected mid-exit\n\n this.dispose()\n this.#disposeTraits()\n this.#disposeEffects()\n this.didExit()\n this.#state.value = 'suspended'\n }\n\n #waitForChildren(): void {\n let attempts = 0\n const activate = () => {\n this.activate()\n this.#attachTraits()\n }\n const observer = new MutationObserver(() => {\n if (this.children.length > 0) {\n observer.disconnect()\n activate()\n return\n }\n if (++attempts > 50) {\n observer.disconnect()\n activate()\n }\n })\n observer.observe(this, { childList: true })\n\n queueMicrotask(() => {\n if (this.children.length > 0) {\n observer.disconnect()\n activate()\n }\n })\n }\n}\n","// ── define() registration helper ────────────────────────────\n//\n// Idempotent custom element registration.\n// Processes static attribute schema before registration.\n\nimport { AgentElement, setupAttributeSchema } from './agent-element.ts'\n\nexport function define(\n tag: string,\n ctor: typeof AgentElement,\n): void {\n if (customElements.get(tag)) return\n setupAttributeSchema(ctor)\n customElements.define(tag, ctor)\n}\n","// ── Context system ───────────────────────────────────────────\n//\n// DOM-tree dependency injection via event bubbling.\n// No global state, no import coupling.\n\nimport { signal, effect } from '#reactivity'\nimport type { Signal, Dispose } from '#reactivity'\nimport type { ContextKey } from './types.ts'\n\n// ── Factory ─────────────────────────────────────────────────\n\nexport function createContext<T>(name: string): ContextKey<T> {\n return { name }\n}\n\n// ── Event ───────────────────────────────────────────────────\n\nexport class ContextRequestEvent<T> extends Event {\n constructor(\n public readonly key: ContextKey<T>,\n public readonly callback: (value: T) => void,\n public readonly subscribe = false,\n ) {\n super('context-request', { bubbles: true, composed: true })\n }\n}\n\n// ── Provider ────────────────────────────────────────────────\n\nexport class ContextProvider<T> {\n #host: HTMLElement\n #key: ContextKey<T>\n #signal: Signal<T>\n #subscribers = new Set<(value: T) => void>()\n #effectDispose: Dispose | null = null\n #handleRequest: (e: Event) => void\n\n constructor(host: HTMLElement, key: ContextKey<T>, initialValue: T) {\n this.#host = host\n this.#key = key\n this.#signal = signal(initialValue)\n\n this.#handleRequest = (e: Event) => {\n const req = e as ContextRequestEvent<T>\n if (req.key !== this.#key) return\n e.stopPropagation()\n req.callback(this.#signal.peek())\n if (req.subscribe) {\n this.#subscribers.add(req.callback)\n }\n }\n\n this.#host.addEventListener('context-request', this.#handleRequest)\n\n this.#effectDispose = effect(() => {\n const val = this.#signal.value\n for (const cb of this.#subscribers) cb(val)\n })\n }\n\n setValue(next: T): void {\n this.#signal.value = next\n }\n\n dispose(): void {\n this.#host.removeEventListener('context-request', this.#handleRequest)\n this.#effectDispose?.()\n this.#subscribers.clear()\n }\n}\n\n// ── Consumer ────────────────────────────────────────────────\n\nexport class ContextConsumer<T> {\n #host: HTMLElement\n #key: ContextKey<T>\n #callback: (value: T) => void\n #subscribe: boolean\n\n constructor(\n host: HTMLElement,\n key: ContextKey<T>,\n callback: (value: T) => void,\n subscribe = false,\n ) {\n this.#host = host\n this.#key = key\n this.#callback = callback\n this.#subscribe = subscribe\n this.request()\n }\n\n request(): void {\n this.#host.dispatchEvent(\n new ContextRequestEvent(this.#key, this.#callback, this.#subscribe),\n )\n }\n\n dispose(): void {\n // Consumer has no listeners to clean up — provider holds the subscription\n }\n}\n","// ── aui-agent-activity ──────────────────────────────────────\n//\n// Streaming activity indicator — typing, thinking, or tool-use status.\n//\n// When `active`, shows an animated indicator with elapsed time.\n// When `expandable`, clicking toggles visibility of slotted trace content.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentActivity extends AgentElement {\n static override attributes: AttributeSchema = {\n type: { type: 'enum', values: ['typing', 'thinking', 'tool-use'], default: 'typing' },\n label: { type: 'string', default: '' },\n active: { type: 'boolean', default: false },\n expandable: { type: 'boolean', default: false },\n expanded: { type: 'boolean', default: false },\n }\n\n declare type: string\n declare label: string\n declare active: boolean\n declare expandable: boolean\n declare expanded: boolean\n\n #internals: ElementInternals\n #startTime = 0\n #timerFrame = 0\n #statusEl: HTMLElement | null = null\n #timeEl: HTMLElement | null = null\n #dotsEl: HTMLElement | null = null\n #contentEl: HTMLElement | null = null\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.setAttribute('role', 'status')\n this.setAttribute('aria-live', 'polite')\n\n // Stamp DOM\n this.#stamp()\n\n // Timer: start/stop based on active\n this.addEffect(() => {\n if (this.active) {\n this.#startTimer()\n } else {\n this.#stopTimer()\n }\n })\n\n // Label sync\n this.addEffect(() => {\n if (!this.#statusEl) return\n const text = this.label || defaultLabel(this.type)\n this.#statusEl.textContent = text\n })\n\n // Dots visibility\n this.addEffect(() => {\n if (!this.#dotsEl) return\n this.#dotsEl.hidden = !this.active\n })\n\n // Expandable state\n this.addEffect(() => {\n if (!this.#contentEl) return\n const show = this.expanded && this.expandable\n this.#contentEl.hidden = !show\n })\n\n this.addEventListener('click', this.#onClick)\n }\n\n protected override dispose(): void {\n this.#stopTimer()\n this.removeEventListener('click', this.#onClick)\n this.#statusEl = null\n this.#timeEl = null\n this.#dotsEl = null\n this.#contentEl = null\n }\n\n // ── DOM ───────────────────────────────────────────────────\n\n #stamp(): void {\n // Move existing children into content slot\n const fragment = document.createDocumentFragment()\n while (this.firstChild) fragment.appendChild(this.firstChild)\n\n // Status row\n const row = document.createElement('div')\n row.setAttribute('data-agent-activity-row', '')\n\n this.#timeEl = document.createElement('span')\n this.#timeEl.setAttribute('data-agent-activity-time', '')\n this.#timeEl.textContent = '0s'\n\n const sep = document.createElement('span')\n sep.setAttribute('data-agent-activity-sep', '')\n sep.textContent = '|'\n sep.setAttribute('aria-hidden', 'true')\n\n this.#statusEl = document.createElement('span')\n this.#statusEl.setAttribute('data-agent-activity-label', '')\n\n this.#dotsEl = document.createElement('span')\n this.#dotsEl.setAttribute('data-agent-activity-dots', '')\n this.#dotsEl.setAttribute('aria-hidden', 'true')\n this.#dotsEl.innerHTML = '<i></i><i></i><i></i>'\n\n row.append(this.#timeEl, sep, this.#statusEl, this.#dotsEl)\n\n // Content area (for reasoning trace)\n this.#contentEl = document.createElement('div')\n this.#contentEl.setAttribute('data-agent-activity-content', '')\n this.#contentEl.hidden = true\n this.#contentEl.appendChild(fragment)\n\n this.append(row, this.#contentEl)\n }\n\n // ── Timer ─────────────────────────────────────────────────\n\n #startTimer(): void {\n this.#stopTimer()\n this.#startTime = performance.now()\n this.#tickTimer()\n }\n\n #stopTimer(): void {\n if (this.#timerFrame) {\n cancelAnimationFrame(this.#timerFrame)\n this.#timerFrame = 0\n }\n }\n\n #tickTimer = (): void => {\n if (!this.active || !this.#timeEl) return\n const elapsed = performance.now() - this.#startTime\n this.#timeEl.textContent = formatElapsed(elapsed)\n this.#timerFrame = requestAnimationFrame(this.#tickTimer)\n }\n\n // ── Expand/collapse ───────────────────────────────────────\n\n #onClick = (): void => {\n if (!this.expandable) return\n this.expanded = !this.expanded\n\n this.dispatchEvent(new CustomEvent('aui:activity-toggle', {\n bubbles: true,\n composed: true,\n detail: { expanded: this.expanded },\n }))\n }\n}\n\nfunction defaultLabel(type: string): string {\n switch (type) {\n case 'thinking': return 'Thinking\\u2026'\n case 'tool-use': return 'Using tools\\u2026'\n default: return 'Host is typing\\u2026'\n }\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSec = Math.floor(ms / 1000)\n if (totalSec < 60) return `${totalSec}s`\n const min = Math.floor(totalSec / 60)\n const sec = totalSec % 60\n return `${min}m:${String(sec).padStart(2, '0')}s`\n}\n","// ── aui-agent-feed ──────────────────────────────────────────\n//\n// Scrollable message thread coordinator.\n// Wraps aui-agent-thread groups and manages auto-scroll behavior.\n// When pinned to bottom, new content automatically scrolls into view.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nconst SCROLL_THRESHOLD = 40\n\nexport class AuiAgentFeed extends AgentElement {\n static override attributes: AttributeSchema = {\n 'auto-scroll': { type: 'boolean', default: true },\n scrollable: { type: 'boolean', default: false },\n }\n\n declare 'auto-scroll': boolean\n declare scrollable: boolean\n\n #isPinned = true\n #observer: MutationObserver | null = null\n #scrollRaf = 0\n #internals: ElementInternals\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n get isPinned(): boolean { return this.#isPinned }\n\n /** Scroll to the bottom of the feed. */\n scrollToBottom(smooth = true): void {\n this.scrollTo({\n top: this.scrollHeight,\n behavior: smooth ? 'smooth' : 'instant',\n })\n this.#isPinned = true\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'log'\n this.setAttribute('aria-live', 'polite')\n this.setAttribute('aria-label', 'Conversation')\n\n // Default scrollable unless explicitly removed\n if (!this.hasAttribute('scrollable')) {\n this.setAttribute('scrollable', '')\n }\n\n // Default auto-scroll\n if (!this.hasAttribute('auto-scroll')) {\n this.toggleAttribute('auto-scroll', true)\n }\n\n // React to auto-scroll and scrollable attribute changes\n this.addEffect(() => {\n const _autoScroll = this['auto-scroll'] // track\n const _scrollable = this.scrollable // track\n })\n\n this.addEventListener('scroll', this.#onScroll, { passive: true })\n\n // Watch for new children (messages added) -> auto-scroll\n this.#observer = new MutationObserver(this.#onChildrenChanged)\n this.#observer.observe(this, { childList: true, subtree: true })\n }\n\n protected override dispose(): void {\n this.removeEventListener('scroll', this.#onScroll)\n if (this.#scrollRaf) {\n cancelAnimationFrame(this.#scrollRaf)\n this.#scrollRaf = 0\n }\n this.#observer?.disconnect()\n this.#observer = null\n }\n\n // ── Scroll management ────────────────────────────────────\n\n #onScroll = (): void => {\n const wasPinned = this.#isPinned\n const pinned = this.scrollTop + this.clientHeight >= this.scrollHeight - SCROLL_THRESHOLD\n this.#isPinned = pinned\n\n if (pinned !== wasPinned) {\n this.dispatchEvent(new CustomEvent('aui:feed-scroll', {\n bubbles: true,\n composed: true,\n detail: { isPinned: pinned, scrollTop: this.scrollTop },\n }))\n }\n }\n\n #onChildrenChanged = (): void => {\n if (this['auto-scroll'] && this.#isPinned) {\n // Use rAF to let layout settle before scrolling\n if (this.#scrollRaf) cancelAnimationFrame(this.#scrollRaf)\n this.#scrollRaf = requestAnimationFrame(() => {\n this.#scrollRaf = 0\n this.scrollTo({ top: this.scrollHeight, behavior: 'smooth' })\n })\n }\n }\n}\n","// ── aui-agent-input ─────────────────────────────────────────\n//\n// Chat message input with textarea, submit button, and Enter-to-send.\n// Discovers child aui-textarea and submit aui-button[primary].\n//\n// Cmd/Ctrl+Enter to send by default.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentInput extends AgentElement {\n static override deferChildren = true\n\n static override attributes: AttributeSchema = {\n disabled: { type: 'boolean', default: false },\n busy: { type: 'boolean', default: false },\n 'no-enter-submit': { type: 'boolean', default: false },\n 'no-auto-clear': { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n declare busy: boolean\n declare 'no-enter-submit': boolean\n declare 'no-auto-clear': boolean\n\n #textarea: HTMLElement | null = null\n #submitBtn: HTMLElement | null = null\n\n // ── Public API ────────────────────────────────────────────\n\n get value(): string {\n return (this.#textarea as any)?.value ?? ''\n }\n\n set value(val: string) {\n if (this.#textarea) (this.#textarea as any).value = val\n }\n\n /** Focus the composer textarea. */\n focusComposer(): void {\n this.#textarea?.focus()\n }\n\n /** Blur the composer textarea. */\n blurComposer(): void {\n this.#textarea?.blur()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#discoverChildren()\n\n // Sync initial value from attribute to textarea\n const initialValue = this.getAttribute('value')\n if (initialValue && this.#textarea) {\n (this.#textarea as any).value = initialValue\n }\n\n // Cascade disabled to children reactively\n this.addEffect(() => {\n const isDisabled = this.disabled\n if (this.#textarea) {\n this.#textarea.toggleAttribute('disabled', isDisabled)\n }\n if (this.#submitBtn) {\n if (isDisabled) {\n this.#submitBtn.setAttribute('disabled', '')\n } else {\n this.#syncSubmitEnabled()\n }\n }\n })\n\n // Busy disables submit button but keeps textarea enabled\n this.addEffect(() => {\n const isBusy = this.busy\n if (!this.#submitBtn) return\n if (this.disabled) return // disabled effect owns the button when disabled\n if (isBusy) {\n this.#submitBtn.setAttribute('disabled', '')\n } else {\n this.#syncSubmitEnabled()\n }\n })\n\n this.addEventListener('input', this.#onTextareaInput)\n this.addEventListener('click', this.#onClick)\n this.addEventListener('keydown', this.#onKeydown)\n this.addEventListener('focusin', this.#onFocusIn)\n this.addEventListener('focusout', this.#onFocusOut)\n }\n\n protected override dispose(): void {\n this.removeEventListener('input', this.#onTextareaInput)\n this.removeEventListener('click', this.#onClick)\n this.removeEventListener('keydown', this.#onKeydown)\n this.removeEventListener('focusin', this.#onFocusIn)\n this.removeEventListener('focusout', this.#onFocusOut)\n this.#textarea = null\n this.#submitBtn = null\n }\n\n // ── Child discovery ───────────────────────────────────────\n\n #discoverChildren(): void {\n this.#textarea =\n this.querySelector<HTMLElement>(':scope > aui-textarea') ??\n this.querySelector<HTMLElement>(':scope > aui-agent-prompt > aui-textarea')\n this.#submitBtn =\n this.querySelector<HTMLElement>('[data-submit]') ??\n this.#findLastPrimaryButton()\n }\n\n #findLastPrimaryButton(): HTMLElement | null {\n const actions =\n this.querySelector(':scope > [data-role=\"actions\"]') ??\n this.querySelector(':scope > aui-agent-prompt > [data-role=\"actions\"]')\n if (!actions) {\n // Fall back to finding any primary button\n const primaries = this.querySelectorAll<HTMLElement>('aui-button[primary]')\n return primaries.length ? primaries[primaries.length - 1] : null\n }\n const primaries = actions.querySelectorAll<HTMLElement>('aui-button[primary]')\n return primaries.length ? primaries[primaries.length - 1] : null\n }\n\n // ── Submit button enable/disable based on content ─────────\n\n #syncSubmitEnabled(): void {\n if (!this.#submitBtn || this.disabled) return\n const empty = !this.value.trim()\n if (empty || this.busy) {\n this.#submitBtn.setAttribute('disabled', '')\n this.#submitBtn.removeAttribute('primary')\n this.#submitBtn.removeAttribute('accent')\n } else {\n this.#submitBtn.removeAttribute('disabled')\n this.#submitBtn.setAttribute('primary', '')\n this.#submitBtn.setAttribute('accent', '')\n }\n }\n\n // ── Event handlers ────────────────────────────────────────\n\n #onTextareaInput = (_e: Event): void => {\n if (this.disabled) return\n this.#syncSubmitEnabled()\n }\n\n #onClick = (e: Event): void => {\n if (this.disabled) return\n const target = e.target as HTMLElement\n if (target === this.#submitBtn || this.#submitBtn?.contains(target)) {\n this.#send()\n }\n }\n\n #onFocusIn = (e: FocusEvent): void => {\n const target = e.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n this.dispatchEvent(\n new CustomEvent('aui:composer-focus', { bubbles: true, composed: true }),\n )\n }\n\n #onFocusOut = (e: FocusEvent): void => {\n const target = e.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n this.dispatchEvent(\n new CustomEvent('aui:composer-blur', { bubbles: true, composed: true }),\n )\n }\n\n #onKeydown = (e: Event): void => {\n if (this.disabled) return\n if (this['no-enter-submit']) return\n\n const ke = e as KeyboardEvent\n if (ke.isComposing) return\n\n const target = ke.target as HTMLElement\n if (!this.#textarea?.contains(target) && target !== this.#textarea) return\n\n if (ke.key === 'Enter' && (ke.metaKey || ke.ctrlKey) && !ke.shiftKey) {\n ke.preventDefault()\n if (this.value.trim()) this.#send()\n }\n }\n\n // ── Send ──────────────────────────────────────────────────\n\n #send(): void {\n const val = this.value.trim()\n if (!val) return\n\n if (this.busy) {\n this.dispatchEvent(\n new CustomEvent('aui:composer-submit-blocked', {\n bubbles: true,\n composed: true,\n detail: { value: val },\n }),\n )\n return\n }\n\n const dispatched = this.dispatchEvent(\n new CustomEvent('aui:send', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { value: val },\n }),\n )\n\n if (dispatched && !this['no-auto-clear']) {\n this.value = ''\n this.#submitBtn?.setAttribute('disabled', '')\n }\n }\n}\n","// ── aui-agent-message ───────────────────────────────────────\n//\n// Individual chat message bubble with action toolbar.\n//\n// Accepts slotted content: aui-agent-text, aui-agent-activity,\n// aui-agent-seeds, or any custom content.\n//\n// Action toolbar appears on hover via CSS anchor positioning\n// (popover below the bubble by default).\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\n// ── Action registry ─────────────────────────────────────────\n\nexport interface AgentMessageActionDef {\n label: string\n icon: string\n}\n\nexport const ACTION_REGISTRY: Record<string, AgentMessageActionDef> = {\n 'copy': { label: 'Copy', icon: 'copy' },\n 'retry': { label: 'Retry', icon: 'arrow-clockwise' },\n 'edit': { label: 'Edit', icon: 'pencil-simple' },\n 'feedback-up': { label: 'Helpful', icon: 'thumbs-up' },\n 'feedback-down': { label: 'Not helpful', icon: 'thumbs-down' },\n 'continue': { label: 'Continue', icon: 'arrow-right' },\n}\n\nexport const ROLE_DEFAULTS: Record<string, string[]> = {\n assistant: ['copy', 'retry', 'feedback-up', 'feedback-down'],\n user: ['edit', 'retry'],\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nlet uidCounter = 0\nfunction uid(prefix: string): string {\n return `${prefix}-${++uidCounter}-${Math.random().toString(36).slice(2, 6)}`\n}\n\n// ── Component ───────────────────────────────────────────────\n\nexport class AuiAgentMessage extends AgentElement {\n static override attributes: AttributeSchema = {\n role: { type: 'string', default: 'assistant' },\n 'message-id': { type: 'string', default: '' },\n timestamp: { type: 'string', default: '' },\n status: { type: 'enum', values: ['sending', 'sent', 'error', 'streaming', 'partial'], default: 'sent' },\n actions: { type: 'string', default: '' },\n 'actions-style': { type: 'enum', values: ['icon', 'label', 'icon-label'], default: 'icon' },\n 'actions-position': { type: 'enum', values: ['below', 'inside'], default: 'below' },\n }\n\n declare role: string\n declare 'message-id': string\n declare timestamp: string\n declare status: string\n declare actions: string\n declare 'actions-style': string\n declare 'actions-position': string\n\n #internals: ElementInternals\n #actionsEl: HTMLElement | null = null\n #isPopoverToolbar = false\n #showTimer = 0\n #hideTimer = 0\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n get messageId(): string { return this.getAttribute('message-id') ?? '' }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n // Hover listeners for popover toolbar\n this.addEventListener('pointerenter', this.#showToolbar)\n this.addEventListener('pointerleave', this.#hideToolbarDelayed)\n\n // Stamp actions toolbar — reactive to role, actions, actionsStyle, actionsPosition, and status\n this.addEffect(() => {\n const role = this.role\n const actionsAttr = this.actions\n const style = this['actions-style']\n const position = this['actions-position']\n const status = this.status\n this.#stampActions(role, actionsAttr || null, style, position, status)\n })\n\n // Sync ARIA\n this.#internals.role = 'article'\n }\n\n protected override dispose(): void {\n this.removeEventListener('pointerenter', this.#showToolbar)\n this.removeEventListener('pointerleave', this.#hideToolbarDelayed)\n clearTimeout(this.#showTimer)\n clearTimeout(this.#hideTimer)\n if (this.#actionsEl) {\n this.#cleanupToolbar()\n this.#actionsEl = null\n }\n }\n\n // ── Popover hover handlers ────────────────────────────────\n\n #showToolbar = (): void => {\n clearTimeout(this.#hideTimer)\n if (!this.#actionsEl || !this.#isPopoverToolbar || this.status === 'partial') return\n clearTimeout(this.#showTimer)\n this.#showTimer = window.setTimeout(() => {\n try { this.#actionsEl?.showPopover() } catch { /* already open */ }\n }, 300)\n }\n\n #hideToolbarDelayed = (): void => {\n if (!this.#isPopoverToolbar || this.status === 'partial') return\n clearTimeout(this.#showTimer)\n clearTimeout(this.#hideTimer)\n this.#hideTimer = window.setTimeout(() => {\n try { this.#actionsEl?.hidePopover() } catch { /* already hidden */ }\n }, 150)\n }\n\n // ── Actions ───────────────────────────────────────────────\n\n #cleanupToolbar(): void {\n if (!this.#actionsEl) return\n if (this.#isPopoverToolbar) {\n this.#actionsEl.removeEventListener('pointerenter', this.#showToolbar)\n this.#actionsEl.removeEventListener('pointerleave', this.#hideToolbarDelayed)\n this.#actionsEl.removeEventListener('focusin', this.#showToolbar)\n this.#actionsEl.removeEventListener('focusout', this.#hideToolbarDelayed)\n try { this.#actionsEl.hidePopover() } catch { /* ok */ }\n this.style.removeProperty('anchor-name')\n this.#isPopoverToolbar = false\n }\n this.#actionsEl.removeEventListener('click', this.#onActionClick)\n this.#actionsEl.remove()\n }\n\n #stampActions(role: string, actionsAttr: string | null, style: string, position: string, status: string): void {\n if (this.#actionsEl) {\n this.#cleanupToolbar()\n this.#actionsEl = null\n }\n clearTimeout(this.#hideTimer)\n\n // Skip if actions=\"none\"\n if (actionsAttr === 'none') return\n\n // Skip if consumer provides a [slot=\"actions\"] child\n if (this.querySelector('[slot=\"actions\"]')) return\n\n // Resolve action list\n let actionList: string[]\n if (actionsAttr) {\n actionList = actionsAttr.split(',').map((s) => s.trim()).filter(Boolean)\n } else {\n actionList = ROLE_DEFAULTS[role] ?? []\n }\n\n // If partial status, append continue action\n if (status === 'partial' && !actionList.includes('continue')) {\n actionList = [...actionList, 'continue']\n }\n\n if (actionList.length === 0) return\n\n const toolbar = document.createElement('div')\n toolbar.setAttribute('data-role', 'actions')\n toolbar.setAttribute('role', 'toolbar')\n toolbar.setAttribute('aria-label', 'Message actions')\n if (style !== 'label') {\n toolbar.setAttribute('data-style', style)\n }\n\n for (const id of actionList) {\n const def = ACTION_REGISTRY[id]\n if (!def) continue\n toolbar.appendChild(this.#actionButton(id, def, style))\n }\n\n if (toolbar.children.length === 0) return\n\n toolbar.addEventListener('click', this.#onActionClick)\n\n if (position === 'below') {\n // Popover toolbar anchored below the message via CSS anchor positioning\n toolbar.setAttribute('popover', 'manual')\n const anchorId = uid('msg')\n this.style.setProperty('anchor-name', `--${anchorId}`)\n toolbar.style.setProperty('position-anchor', `--${anchorId}`)\n\n this.appendChild(toolbar)\n this.#isPopoverToolbar = true\n\n // Keep toolbar open when hovering/focusing it\n toolbar.addEventListener('pointerenter', this.#showToolbar)\n toolbar.addEventListener('pointerleave', this.#hideToolbarDelayed)\n toolbar.addEventListener('focusin', this.#showToolbar)\n toolbar.addEventListener('focusout', this.#hideToolbarDelayed)\n\n // Partial status: always visible\n if (status === 'partial') {\n toolbar.showPopover()\n }\n } else {\n // Inside: append inside the bubble\n this.appendChild(toolbar)\n }\n this.#actionsEl = toolbar\n }\n\n #actionButton(action: string, def: AgentMessageActionDef, style: string): HTMLElement {\n const btn = document.createElement('aui-button')\n btn.setAttribute('ghost', '')\n btn.setAttribute('size', 'sm')\n btn.setAttribute('data-action', action)\n btn.setAttribute('aria-label', def.label)\n\n if (style === 'icon' || style === 'icon-label') {\n const icon = document.createElement('aui-icon')\n icon.setAttribute('name', def.icon)\n icon.setAttribute('slot', 'leading')\n btn.appendChild(icon)\n }\n\n if (style === 'label' || style === 'icon-label') {\n btn.appendChild(document.createTextNode(def.label))\n }\n\n // Handle keyboard activation (fallback if aui-button not registered)\n btn.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n btn.click()\n }\n })\n\n return btn\n }\n\n #onActionClick = (e: Event): void => {\n const target = (e.target as HTMLElement).closest('[data-action]') as HTMLElement | null\n if (!target) return\n const action = target.getAttribute('data-action')\n if (!action) return\n\n e.stopPropagation()\n\n // Continue action fires a separate event\n if (action === 'continue') {\n this.dispatchEvent(new CustomEvent('aui:continue-request', {\n bubbles: true,\n composed: true,\n detail: { messageId: this.messageId },\n }))\n return\n }\n\n this.dispatchEvent(new CustomEvent('aui:message-action', {\n bubbles: true,\n composed: true,\n detail: {\n action,\n messageId: this.messageId,\n },\n }))\n }\n}\n","// ── aui-agent-panel ─────────────────────────────────────────\n//\n// Top-level chat shell that composes header, feed, and input.\n// Discovers child aui-agent-feed and aui-agent-input and\n// coordinates focus and layout. No DOM stamping — just\n// discovers and coordinates existing children.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentPanel extends AgentElement {\n static override attributes: AttributeSchema = {\n 'panel-title': { type: 'string', default: '' },\n 'auto-focus': { type: 'string', default: 'ready' }, // 'ready' | 'open-request' | 'never'\n }\n\n declare 'panel-title': string\n declare 'auto-focus': string\n\n #feed: HTMLElement | null = null\n #input: HTMLElement | null = null\n #internals: ElementInternals\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Public API ────────────────────────────────────────────\n\n /** Delegate focus to the child agent-input composer. */\n focusComposer(): void {\n if (this.#input && 'focusComposer' in this.#input) {\n (this.#input as any).focusComposer()\n }\n }\n\n /** Reference to the discovered feed element. */\n get feed(): HTMLElement | null { return this.#feed }\n\n /** Reference to the discovered input element. */\n get input(): HTMLElement | null { return this.#input }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'region'\n\n // Sync aria-label from panel-title reactively\n this.addEffect(() => {\n const title = this['panel-title']\n this.#internals.ariaLabel = title || 'Chat'\n })\n\n this.#discoverChildren()\n\n // Auto-focus composer when ready\n if (this['auto-focus'] === 'ready') {\n // Defer to let children upgrade\n requestAnimationFrame(() => {\n this.focusComposer()\n })\n }\n }\n\n protected override dispose(): void {\n this.#feed = null\n this.#input = null\n }\n\n // ── Child discovery ───────────────────────────────────────\n\n #discoverChildren(): void {\n this.#feed = this.querySelector<HTMLElement>('aui-agent-feed')\n this.#input = this.querySelector<HTMLElement>('aui-agent-input')\n }\n}\n","// ── aui-agent-prompt ────────────────────────────────────────\n//\n// Visual wrapper/chrome around the textarea in an advanced layout.\n// Provides bordered styling with focus ring when the inner\n// aui-textarea gains focus.\n//\n// Contains aui-textarea and optionally action toolbar buttons.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentPrompt extends AgentElement {\n static override attributes: AttributeSchema = {\n disabled: { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.addEffect(() => {\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true')\n } else {\n this.removeAttribute('aria-disabled')\n }\n })\n }\n\n protected override dispose(): void {}\n}\n","// ── aui-agent-seeds ─────────────────────────────────────────\n//\n// Suggestion chips — pre-seeded quick responses.\n//\n// Options can be provided as JSON attribute or via the `options` property.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport interface SeedOption {\n value: string\n label: string\n icon?: string\n}\n\nexport class AuiAgentSeeds extends AgentElement {\n static override attributes: AttributeSchema = {\n options: { type: 'string', default: '' },\n disabled: { type: 'boolean', default: false },\n }\n\n declare disabled: boolean\n\n #parsedOptions: SeedOption[] = []\n #containerEl: HTMLElement | null = null\n\n // ── Public API ────────────────────────────────────────────\n\n get options(): SeedOption[] { return this.#parsedOptions }\n set options(val: SeedOption[]) {\n this.#parsedOptions = val\n this.setAttribute('options', JSON.stringify(val))\n this.#renderChips()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.setAttribute('role', 'group')\n this.setAttribute('aria-label', 'Suggestions')\n\n // Parse initial options from attribute\n const optAttr = this.getAttribute('options')\n if (optAttr) {\n try { this.#parsedOptions = JSON.parse(optAttr) }\n catch { this.#parsedOptions = [] }\n }\n\n // React to attribute changes\n this.addEffect(() => {\n const raw = this.getAttribute('options')\n if (raw) {\n try { this.#parsedOptions = JSON.parse(raw) }\n catch { this.#parsedOptions = [] }\n }\n this.#renderChips()\n })\n\n this.addEffect(() => {\n const _disabled = this.disabled // track\n if (this.disabled) {\n this.setAttribute('aria-disabled', 'true')\n } else {\n this.removeAttribute('aria-disabled')\n }\n })\n\n // Event delegation: single listener for all chip interactions\n this.addEventListener('click', this.#onChipClick)\n this.addEventListener('keydown', this.#onChipKeydown)\n }\n\n protected override dispose(): void {\n this.removeEventListener('click', this.#onChipClick)\n this.removeEventListener('keydown', this.#onChipKeydown)\n this.#containerEl = null\n }\n\n // ── Event delegation ────────────────────────────────────────\n\n #onChipClick = (e: Event): void => {\n if (this.disabled) return\n const chip = (e.target as Element).closest('[data-seed]')\n if (!chip) return\n const value = chip.getAttribute('data-seed') ?? ''\n const label = chip.querySelector('span:last-child')?.textContent ?? value\n this.dispatchEvent(new CustomEvent('aui:seed-select', {\n bubbles: true,\n composed: true,\n detail: { value, label },\n }))\n }\n\n #onChipKeydown = (e: Event): void => {\n const ke = e as KeyboardEvent\n if (ke.key === 'Enter' || ke.key === ' ') {\n const chip = (ke.target as Element).closest('[data-seed]')\n if (!chip) return\n ke.preventDefault()\n ;(chip as HTMLElement).click()\n }\n }\n\n // ── Rendering ─────────────────────────────────────────────\n\n #renderChips(): void {\n // Clear existing content\n this.textContent = ''\n\n const opts = this.#parsedOptions\n if (opts.length === 0) return\n\n const container = document.createElement('div')\n container.setAttribute('data-agent-seeds-wrap', '')\n\n for (const opt of opts) {\n const chip = document.createElement('span')\n chip.setAttribute('role', 'button')\n chip.setAttribute('tabindex', '0')\n chip.setAttribute('data-seed', opt.value)\n chip.setAttribute('data-agent-seed-chip', '')\n\n if (opt.icon) {\n const icon = document.createElement('aui-icon')\n icon.setAttribute('name', opt.icon)\n chip.appendChild(icon)\n }\n\n const label = document.createElement('span')\n label.textContent = opt.label\n chip.appendChild(label)\n\n container.appendChild(chip)\n }\n\n this.appendChild(container)\n this.#containerEl = container\n }\n}\n","// ── aui-agent-text ──────────────────────────────────────────\n//\n// Rich text message renderer with lightweight markdown support.\n//\n// Renders a markdown subset (paragraphs, headings, lists, code fences,\n// inline code, bold, italic, links, blockquotes) to sanitized HTML.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentText extends AgentElement {\n static override deferChildren = true\n\n static override attributes: AttributeSchema = {\n format: { type: 'enum', values: ['markdown', 'plain'], default: 'markdown' },\n }\n\n declare format: string\n\n #content = ''\n #outputEl: HTMLDivElement | null = null\n #renderTimer = 0\n\n // ── Public API ────────────────────────────────────────────\n\n get content(): string { return this.#content }\n set content(val: string) {\n this.#content = val\n this.#scheduleRender()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n // If element has text content on setup and no content was set via property,\n // use the text content as the source.\n if (!this.#content) {\n // Prefer <template> child which preserves whitespace/newlines exactly\n const tpl = this.querySelector('template')\n if (tpl) {\n this.#content = tpl.innerHTML.trim()\n } else if (this.textContent?.trim()) {\n // Fallback: read textContent (whitespace may be collapsed by HTML parser)\n const prev = this.style.whiteSpace\n this.style.whiteSpace = 'pre-wrap'\n this.#content = (this.innerText || '').trim()\n this.style.whiteSpace = prev\n }\n }\n\n // Create output container\n this.#outputEl = document.createElement('div')\n this.#outputEl.setAttribute('data-agent-prose', '')\n this.textContent = ''\n this.appendChild(this.#outputEl)\n\n // React to format changes\n this.addEffect(() => {\n const _fmt = this.format // track the signal\n this.#scheduleRender()\n })\n\n // Initial render\n this.#render()\n }\n\n protected override dispose(): void {\n cancelAnimationFrame(this.#renderTimer)\n this.#outputEl = null\n }\n\n // ── Rendering ─────────────────────────────────────────────\n\n #scheduleRender(): void {\n cancelAnimationFrame(this.#renderTimer)\n this.#renderTimer = requestAnimationFrame(() => this.#render())\n }\n\n #render(): void {\n if (!this.#outputEl) return\n const raw = this.#content\n const fmt = this.format\n\n if (fmt === 'plain') {\n this.#outputEl.textContent = raw\n } else {\n this.#outputEl.innerHTML = sanitizeHtml(renderMarkdown(raw))\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════\n// Lightweight markdown -> HTML renderer\n// Subset: paragraphs, headings, lists, code fences,\n// inline code, bold, italic, links, blockquotes\n// ═══════════════════════════════════════════════════════\n\nconst ALLOWED_TAGS = new Set([\n 'p', 'br', 'strong', 'em', 'code', 'pre', 'a',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'ul', 'ol', 'li', 'blockquote', 'hr',\n])\n\nfunction escapeHtml(str: string): string {\n return str\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;')\n}\n\nfunction renderInline(text: string): string {\n let out = escapeHtml(text)\n\n // Inline code: `code`\n out = out.replace(/`([^`]+)`/g, '<code>$1</code>')\n\n // Bold: **text** or __text__\n out = out.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n out = out.replace(/__(.+?)__/g, '<strong>$1</strong>')\n\n // Italic: *text* or _text_\n out = out.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n out = out.replace(/(?<!\\w)_(.+?)_(?!\\w)/g, '<em>$1</em>')\n\n // Links: [text](url) — only http/https\n out = out.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g,\n '<a href=\"$2\" rel=\"noopener noreferrer\" target=\"_blank\">$1</a>')\n\n return out\n}\n\nexport function renderMarkdown(src: string): string {\n if (!src) return ''\n\n const lines = src.split('\\n')\n const html: string[] = []\n let i = 0\n\n while (i < lines.length) {\n const line = lines[i]\n\n // Code fence\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim()\n const codeLines: string[] = []\n i += 1\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i])\n i += 1\n }\n i += 1 // skip closing ```\n const langAttr = lang ? ` data-lang=\"${escapeHtml(lang)}\"` : ''\n html.push(`<pre${langAttr}><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`)\n continue\n }\n\n // Heading: # ... ######\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)/)\n if (headingMatch) {\n const level = headingMatch[1].length\n html.push(`<h${level}>${renderInline(headingMatch[2])}</h${level}>`)\n i += 1\n continue\n }\n\n // Horizontal rule\n if (/^---+$/.test(line.trim()) || /^\\*\\*\\*+$/.test(line.trim())) {\n html.push('<hr>')\n i += 1\n continue\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n const quoteLines: string[] = []\n while (i < lines.length && lines[i].startsWith('> ')) {\n quoteLines.push(lines[i].slice(2))\n i += 1\n }\n html.push(`<blockquote>${renderMarkdown(quoteLines.join('\\n'))}</blockquote>`)\n continue\n }\n\n // Unordered list — allow blank lines between items\n if (/^[-*+]\\s/.test(line)) {\n const items: string[] = []\n while (i < lines.length) {\n if (/^[-*+]\\s/.test(lines[i])) {\n items.push(lines[i].replace(/^[-*+]\\s/, ''))\n i += 1\n } else if (!lines[i].trim() && i + 1 < lines.length && /^[-*+]\\s/.test(lines[i + 1])) {\n i += 1\n } else {\n break\n }\n }\n html.push('<ul>' + items.map(item => `<li>${renderInline(item)}</li>`).join('') + '</ul>')\n continue\n }\n\n // Ordered list — allow blank lines between items\n if (/^\\d+\\.\\s/.test(line)) {\n const items: string[] = []\n while (i < lines.length) {\n if (/^\\d+\\.\\s/.test(lines[i])) {\n items.push(lines[i].replace(/^\\d+\\.\\s/, ''))\n i += 1\n } else if (!lines[i].trim() && i + 1 < lines.length && /^\\d+\\.\\s/.test(lines[i + 1])) {\n i += 1\n } else {\n break\n }\n }\n html.push('<ol>' + items.map(item => `<li>${renderInline(item)}</li>`).join('') + '</ol>')\n continue\n }\n\n // Empty line\n if (!line.trim()) {\n i += 1\n continue\n }\n\n // Paragraph: collect contiguous non-empty lines\n const pLines: string[] = []\n while (\n i < lines.length &&\n lines[i].trim() &&\n !lines[i].startsWith('#') &&\n !lines[i].startsWith('```') &&\n !lines[i].startsWith('> ') &&\n !/^[-*+]\\s/.test(lines[i]) &&\n !/^\\d+\\.\\s/.test(lines[i]) &&\n !/^---+$/.test(lines[i].trim())\n ) {\n pLines.push(lines[i])\n i += 1\n }\n if (pLines.length > 0) {\n html.push(`<p>${renderInline(pLines.join('\\n'))}</p>`)\n }\n }\n\n return html.join('')\n}\n\n/** Sanitize rendered HTML — strip any tags not in allowlist. */\nexport function sanitizeHtml(html: string): string {\n return html.replace(/<\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*>/g, (match, tag) => {\n const lower = tag.toLowerCase()\n if (ALLOWED_TAGS.has(lower)) return match\n return ''\n })\n}\n","// ── aui-agent-thread ────────────────────────────────────────\n//\n// Message group — cluster of messages from the same sender.\n//\n// Provides a 2x2 grid layout:\n// - Col 1, row 1-2: avatar (bottom-aligned)\n// - Col 2, row 1: context area (metadata, reasoning, timestamps)\n// - Col 2, row 2: messages area (chat bubbles, flex column)\n//\n// On activate, non-avatar children are sorted into two wrapper divs:\n// - `[data-agent-context]` — non-message children (row 1)\n// - `[data-agent-bubbles]` — `aui-agent-message` children (row 2)\n//\n// A MutationObserver routes dynamically added children into the\n// correct wrapper automatically.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiAgentThread extends AgentElement {\n static override attributes: AttributeSchema = {\n role: { type: 'string', default: '' },\n sender: { type: 'string', default: '' },\n 'avatar-align': { type: 'enum', values: ['top', 'center', 'bottom'], default: '' },\n }\n\n declare role: string\n declare sender: string\n declare 'avatar-align': string\n\n #internals: ElementInternals\n #contextEl: HTMLDivElement | null = null\n #bubblesEl: HTMLDivElement | null = null\n #observer: MutationObserver | null = null\n\n constructor() {\n super()\n this.#internals = this.attachInternals()\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n protected override activate(): void {\n this.#internals.role = 'group'\n const sender = this.getAttribute('sender')\n if (sender) {\n this.setAttribute('aria-label', `Messages from ${sender}`)\n }\n\n // Re-set aria-label when sender attribute changes\n this.addEffect(() => {\n const s = this.sender // track\n if (s) {\n this.setAttribute('aria-label', `Messages from ${s}`)\n } else {\n this.removeAttribute('aria-label')\n }\n })\n\n this.#wrapChildren()\n\n // Route dynamically added children into the correct wrapper\n this.#observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of m.addedNodes) {\n if (!(node instanceof Element)) continue\n // Skip avatar and our own wrappers\n if (node.localName === 'aui-avatar') continue\n if (node === this.#contextEl || node === this.#bubblesEl) continue\n // Route to correct wrapper\n if (node.localName === 'aui-agent-message') {\n this.#bubblesEl?.appendChild(node)\n } else {\n this.#contextEl?.appendChild(node)\n }\n }\n }\n })\n this.#observer.observe(this, { childList: true })\n }\n\n protected override dispose(): void {\n this.#observer?.disconnect()\n this.#observer = null\n // Unwrap children back to flat DOM\n if (this.#bubblesEl) {\n while (this.#bubblesEl.firstChild) {\n this.appendChild(this.#bubblesEl.firstChild)\n }\n this.#bubblesEl.remove()\n this.#bubblesEl = null\n }\n if (this.#contextEl) {\n while (this.#contextEl.firstChild) {\n this.appendChild(this.#contextEl.firstChild)\n }\n this.#contextEl.remove()\n this.#contextEl = null\n }\n }\n\n // ── DOM wrapping ──────────────────────────────────────────\n\n #wrapChildren(): void {\n const context = document.createElement('div')\n context.setAttribute('data-agent-context', '')\n\n const bubbles = document.createElement('div')\n bubbles.setAttribute('data-agent-bubbles', '')\n\n // Sort children into context vs bubbles (skip avatar)\n const children = Array.from(this.childNodes)\n for (const child of children) {\n if (child instanceof Element && child.localName === 'aui-avatar') continue\n if (child instanceof Element && child.localName === 'aui-agent-message') {\n bubbles.appendChild(child)\n } else {\n context.appendChild(child)\n }\n }\n\n this.appendChild(context)\n this.appendChild(bubbles)\n this.#contextEl = context\n this.#bubblesEl = bubbles\n }\n}\n"],"names":["activeNode","batchDepth","pendingEffects","nodeMap","computeStack","getActiveNode","setActiveNode","node","getBatchDepth","incrementBatchDepth","decrementBatchDepth","SourceNode","value","ReactiveNode","fn","sub","runEffect","EffectNode","track","source","cleanup","dep","notify","prev","flushEffects","iterations","snapshot","SignalImpl","#node","next","signal","initial","sig","ComputedImpl","#recompute","computed","comp","effect","batch","untrack","parseRelaxedJson","raw","normalized","parseConfigEntry","obj","name","config","k","v","parseTraitsAttribute","trimmed","entry","arr","entries","registry","registerTrait","def","getTrait","getTraitNames","getTraitsByCategory","groups","list","validateComposition","hostTag","valid","focusTraits","gestureChannels","existing","attachCounter","attachTrait","target","traitName","options","instanceConfig","defaults","effectDisposers","anchorAttr","ctx","detail","key","attr","traitDispose","d","attrSignals","schemaProcessed","setupAttributeSchema","ctor","schema","keys","val","str","AgentElement","#state","#moveCheck","#readyResolve","#readyPromise","#traitDisposers","#attachTraits","validated","dispose","#disposeTraits","#effects","#disposeEffects","resolve","map","state","#enter","#exit","_old","#waitForChildren","attempts","activate","observer","define","tag","createContext","ContextRequestEvent","callback","subscribe","ContextProvider","#host","#key","#signal","#subscribers","#effectDispose","#handleRequest","host","initialValue","e","req","cb","ContextConsumer","#callback","#subscribe","AuiAgentActivity","#internals","#startTime","#timerFrame","#statusEl","#timeEl","#dotsEl","#contentEl","#stamp","#startTimer","#stopTimer","text","defaultLabel","show","#onClick","fragment","row","sep","#tickTimer","elapsed","formatElapsed","type","ms","totalSec","min","sec","SCROLL_THRESHOLD","AuiAgentFeed","#isPinned","#observer","#scrollRaf","smooth","#onScroll","#onChildrenChanged","wasPinned","pinned","AuiAgentInput","#textarea","#submitBtn","#discoverChildren","isDisabled","#syncSubmitEnabled","isBusy","#onTextareaInput","#onKeydown","#onFocusIn","#onFocusOut","#findLastPrimaryButton","actions","primaries","_e","#send","ke","ACTION_REGISTRY","ROLE_DEFAULTS","uidCounter","uid","prefix","AuiAgentMessage","#actionsEl","#isPopoverToolbar","#showTimer","#hideTimer","#showToolbar","#hideToolbarDelayed","role","actionsAttr","style","position","status","#stampActions","#cleanupToolbar","#onActionClick","actionList","s","toolbar","id","#actionButton","anchorId","action","btn","icon","AuiAgentPanel","#feed","#input","title","AuiAgentPrompt","AuiAgentSeeds","#parsedOptions","#containerEl","#renderChips","optAttr","#onChipClick","#onChipKeydown","chip","label","opts","container","opt","AuiAgentText","#content","#outputEl","#renderTimer","#scheduleRender","tpl","#render","sanitizeHtml","renderMarkdown","ALLOWED_TAGS","escapeHtml","renderInline","out","src","lines","html","i","line","lang","codeLines","langAttr","headingMatch","level","quoteLines","items","item","pLines","match","lower","AuiAgentThread","#contextEl","#bubblesEl","sender","#wrapChildren","mutations","m","context","bubbles","children","child"],"mappings":"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"}